@mndrk/agx 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -105
- package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
- package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +3 -3
- package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page_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_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/linear/issues/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/context/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/options/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/runs/scripted/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/linear-issues/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/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/extract/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/automations/page/react-loadable-manifest.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.rsc +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_full.segment.rsc +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/automations/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/automations.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/board/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/board.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/execution-graph/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/execution-graph.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/folders/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/folders.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page/react-loadable-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/knowledge/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/knowledge/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page/react-loadable-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.js.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]/settings/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.js.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/orphans/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects/orphans/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects/orphans.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.rsc +4 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +4 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_tree.segment.rsc +3 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +3 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/skills.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/thread/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0-zk9w8._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0.01bfe._.js +13 -8
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__00c~p6z._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__019dflu._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__02t.3rm._.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__06zr0ph._.js +6 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__07d._0s._.js +15 -10
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__08xj~a3._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0a0cq38._.js +34 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0asvfdo._.js +35 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0bt7ejs._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0f.~98d._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0g-~-.q._.js +6 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0g7p6pw._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0gj~dap._.js +40 -9
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0hkcw03._.js +8 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0hyu3en._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0i5aw03._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0ke4z91._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0l53ok5._.js +41 -10
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0ll-~cx._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0mh6p.0._.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0nc-lbr._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0p9rl6.._.js +8 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0q~pnp0._.js +6 -6
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0ue0bu5._.js +6 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0unwwyx._.js +12 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0vtkl3q._.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0x6w64i._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0z82z0-._.js +6 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0zrv3p3._.js +16 -11
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0~iknwz._.js +12 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__10d.dhd._.js +46 -15
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__10sw5ia._.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__11yx.ud._.js +33 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__13-nlgu._.js +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__13960a8._.js +14 -9
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_06qet8g._.js +14 -9
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0_0m2ly._.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0a15wtk._.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0fr1qq6._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0g.q2r6._.js +6 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0i7fs.i._.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_01pvj2g._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_agent-participants_ts_0cq15u5._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_db_ts_0twf-w5._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_orchestrator_chat-processor_ts_0c2l_oh._.js +43 -12
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_sqlite-query-adapter_ts_0l95hik._.js +15 -15
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_sqlite-query-adapter_ts_0s5xprd._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_graph_082u-ls._.js +19 -14
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_graph_schedule-runner_ts_07-ozf_._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0_l0fpi.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0gips_c.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0rszt9p.js +10 -6
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0u_5kfo.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_06fnblz._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0140-84._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_03fckp4._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{_0tcjapj._.js → _0ip6k6n._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0jensz1._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0t0p8q5._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0yeuuy1._.js +1 -23
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_03z24q2._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0_ac-.f._.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0a-8i4p._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0k4~c1x._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0ld1uug._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0ms1d6i._.js +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0p_v0ri._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0x.xj52._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0~g2ijr._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_11k_-8~._.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_agents_[id]_page_tsx_06n47n~._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_agents_page_tsx_078reb_._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_linear_page_tsx_0a~n5y8._.js +25 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_page_tsx_0kcaeqi._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_teams_[teamId]_agents_[agentId]_page_tsx_0wm~_~t._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_teams_[teamId]_page_tsx_0iyozfl._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_teams_new_page_tsx_0yqd0a5._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_terminal_page_tsx_01n9qk.._.js +1 -20
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_setup_page_tsx_0ql2qmr._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_PromptJobBoard_tsx_06zob36._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_0k4tfip._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_terminal_TerminalPane_tsx_0l17vs_._.js +22 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_thread_WorkspaceSidebar_tsx_0unv2xp._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/middleware-build-manifest.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1011~1x9nj4ny.js → 0-k2m1ncx7hwx.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0dnw31436wd~..js → 0-pkmgle2s8u8.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/064jfmraty.9h.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/06kru5m9q~r.j.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/06kyg1q0bcz6p.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0_cjth28_11b2.js → 08bdyjcnamzep.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0-olq~7zw3wjy.js → 08xq~uyr6.eqw.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0gj98094p~zn4.js → 0cku81z~3oe6..js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0e7jhy0-52_4k.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0wh6p5~ft5rma.js → 0htc.sqrk_0.c.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ju4xmxwqddw6.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0mm978wb-ueg-.js +6 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0musu8f.4wvxz.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0bchtyu6m.2yv.js → 0muti0yiyhu0t.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0rhps884e-bzu.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0rr3fvwc5ind~.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0sbkkjowkksa6.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0sjz0.o9_33qy.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0srzmg8ivve1g.css +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0fonouj2i9qnb.js → 0swo3_e8.4s7j.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0sysrf3~l~r35.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0t69h-kc701fn.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0v67lnh..wj4z.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{013gtut17~fne.js → 0wb45ol1xrqe~.js} +1 -23
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{00po4v2x~0x_z.js → 0wiw2v8gm-k_-.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0jq0t4zip38wt.js → 0wopevh0s7.8c.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0xm2~gxlt1npd.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1503vb7lb6.g1.js → 0ya124ushze_f.js} +4 -4
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{00e1ihnb6ap3t.js → 0zt2o58c5gytn.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0~idsggr8vqf5.js +59 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0xu_doej_wc-3.js → 0~mcfx41q4znh.js} +3 -3
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/116j4mjz~y42t.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0-vo_x2cxmjm3.js → 12b62py0mq1gm.js} +4 -4
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/12y5i0lh6s73o.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/148.mt80civoz.js +20 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/14m5d270euu_s.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/16h9208kl5~xa.js +16 -0
- package/cloud-runtime/standalone/apps/local/app/agents/[id]/page.tsx +6 -3
- package/cloud-runtime/standalone/apps/local/app/agents/page.tsx +3 -3
- package/cloud-runtime/standalone/apps/local/app/api/chat/route.ts +7 -1
- package/cloud-runtime/standalone/apps/local/app/api/participants/route.ts +9 -9
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/search/route.ts +6 -6
- package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/teams/route.ts +3 -3
- package/cloud-runtime/standalone/apps/local/app/api/prompt-jobs/agents/route.ts +1 -1
- package/cloud-runtime/standalone/apps/local/app/api/schedules/poll/route.ts +11 -2
- package/cloud-runtime/standalone/apps/local/app/page.tsx +72 -14
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/page.tsx +34 -1
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.tsx +6 -3
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/[teamId]/page.tsx +6 -3
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/new/page.tsx +8 -17
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/replace/page.tsx +1 -1
- package/cloud-runtime/standalone/apps/local/app/projects/page.tsx +7 -0
- package/cloud-runtime/standalone/apps/local/app/setup/page.tsx +1 -38
- package/cloud-runtime/standalone/apps/local/components/AutomationsBoard.tsx +8 -4
- package/cloud-runtime/standalone/apps/local/components/EmptyStateCard.tsx +37 -0
- package/cloud-runtime/standalone/apps/local/components/LinearBoard.tsx +103 -770
- package/cloud-runtime/standalone/apps/local/components/PromptJobBoard.tsx +5 -37
- package/cloud-runtime/standalone/apps/local/components/TeamPickerModal.tsx +3 -3
- package/cloud-runtime/standalone/apps/local/components/chat-ui/Composer.tsx +28 -32
- package/cloud-runtime/standalone/apps/local/components/chat-ui/ParticipantBar.tsx +24 -39
- package/cloud-runtime/standalone/apps/local/components/linear/LinearBoardFilters.tsx +343 -0
- package/cloud-runtime/standalone/apps/local/components/linear/TicketRow.tsx +158 -0
- package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveHealthTrend.tsx +45 -61
- package/cloud-runtime/standalone/apps/local/components/projects/RecentlyCompletedCard.tsx +0 -16
- package/cloud-runtime/standalone/apps/local/components/projects/ReplaceAgentsModal.tsx +2 -2
- package/cloud-runtime/standalone/apps/local/components/setup/McpSetupStep.tsx +155 -120
- package/cloud-runtime/standalone/apps/local/components/setup/ProviderStep.tsx +85 -88
- package/cloud-runtime/standalone/apps/local/components/setup/SetupLayout.tsx +6 -4
- package/cloud-runtime/standalone/apps/local/components/terminal/ProjectTerminal.tsx +18 -193
- package/cloud-runtime/standalone/apps/local/components/terminal/TerminalPane.tsx +40 -4
- package/cloud-runtime/standalone/apps/local/components/thread/WorkspaceSidebar.tsx +4 -4
- package/cloud-runtime/standalone/apps/local/components/ui/ResizeHandle.tsx +52 -0
- package/cloud-runtime/standalone/apps/local/hooks/useAutomations.ts +8 -3
- package/cloud-runtime/standalone/apps/local/hooks/useLinearActiveAgents.ts +38 -0
- package/cloud-runtime/standalone/apps/local/hooks/useLinearParticipants.ts +118 -0
- package/cloud-runtime/standalone/apps/local/hooks/usePromptJobs.ts +5 -3
- package/cloud-runtime/standalone/apps/local/hooks/useSetupFlow.ts +6 -81
- package/cloud-runtime/standalone/apps/local/lib/agent-participants.ts +1 -1
- package/cloud-runtime/standalone/apps/local/lib/agent-process-registry.ts +34 -0
- package/cloud-runtime/standalone/apps/local/lib/db.ts +5 -5
- package/cloud-runtime/standalone/apps/local/lib/linear-board-utils.ts +9 -0
- package/cloud-runtime/standalone/apps/local/lib/linear-run-status.ts +88 -0
- package/cloud-runtime/standalone/apps/local/lib/linear-run-store.ts +4 -4
- package/cloud-runtime/standalone/apps/local/lib/sqlite-query-adapter.ts +5 -1
- package/cloud-runtime/standalone/apps/local/lib/team-catalog.ts +60 -60
- package/cloud-runtime/standalone/apps/local/lib/types.ts +1 -1
- package/cloud-runtime/standalone/apps/local/migrations/sqlite_schema.sql +1 -1
- package/cloud-runtime/standalone/apps/local/skills-lock.json +5 -0
- package/cloud-runtime/standalone/apps/local/src/graph/schedule-runner.ts +26 -1
- package/cloud-runtime/standalone/apps/local/src/graph/store.ts +13 -0
- package/cloud-runtime/standalone/apps/local/state/linearBoardPins.ts +45 -0
- package/cloud-runtime/standalone/apps/local/worker/index.js +56 -4
- package/lib/cli/onboarding.js +8 -5
- package/package.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_067eb..._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_00trrg8._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ejzn1e._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0sjchy6._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0w4gpvr._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0x6hh0t._.js +0 -4
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0t6p.qm._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0-wlbe.ripd2w.css +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/014z_yruiincl.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/041-dhls9zkl1.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/069yt_7prdxsp.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0e6rxcxy.l5c8.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ime4btrg-g4l.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0j-nhn61e~nnj.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0jglardpw~5uc.js +0 -37
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0l3v45kd.9is_.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ng6wy4ak35jg.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0n~jhoq~op4e5.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0p-rdas54yo~w.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0pdrpsy-zdxp0.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0p~l5ap6qqx2o.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0tm20~ec~occu.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0w94x-v00osq0.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0xwny92a.ad_i.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/11l2tww5f0hsk.js +0 -20
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/12qohmk-~yrtg.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/14v~9vx3tdv85.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/16fyhcmwlw3th.js +0 -6
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/18e8w~~mvoh5o.js +0 -1
- package/cloud-runtime/standalone/apps/local/components/setup/ProjectStep.tsx +0 -189
- package/cloud-runtime/standalone/apps/local/components/setup/TeamsStep.tsx +0 -500
- /package/cloud-runtime/standalone/apps/local/.next/static/{qPuactsz6OYimwT6dSdHn → ROMPfjQqFXqGHmbybq1eC}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{qPuactsz6OYimwT6dSdHn → ROMPfjQqFXqGHmbybq1eC}/_clientMiddlewareManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{qPuactsz6OYimwT6dSdHn → ROMPfjQqFXqGHmbybq1eC}/_ssgManifest.js +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
4
4
|
import dynamic from "next/dynamic";
|
|
5
|
-
import { ArrowDown, ArrowUp,
|
|
5
|
+
import { ArrowDown, ArrowUp, Clock, FileText, Play, Plus, RefreshCw, Search, Settings, User, X } from "lucide-react";
|
|
6
6
|
import { useUrlSelection } from "@/hooks/useUrlSelection";
|
|
7
7
|
import { useLinearIssues, type LinearIssue } from "@/hooks/useLinearIssues";
|
|
8
8
|
import { useLinearConnection } from "@/hooks/useLinearConnection";
|
|
@@ -18,6 +18,10 @@ import {
|
|
|
18
18
|
loadLinearBoardFilters,
|
|
19
19
|
persistLinearBoardFilters,
|
|
20
20
|
} from "@/state/linearBoardFilters";
|
|
21
|
+
import {
|
|
22
|
+
loadPinnedIssueIds,
|
|
23
|
+
persistPinnedIssueIds,
|
|
24
|
+
} from "@/state/linearBoardPins";
|
|
21
25
|
import {
|
|
22
26
|
loadLinearTicketPanelWidth,
|
|
23
27
|
persistLinearTicketPanelWidth,
|
|
@@ -32,6 +36,24 @@ import { buildLinearExecutionPrompt } from "@/lib/linear-execution-prompt";
|
|
|
32
36
|
import type { Participant } from "@/lib/types";
|
|
33
37
|
import LinearSetup from "@/components/LinearSetup";
|
|
34
38
|
import LinearSettingsModal from "@/components/linear/LinearSettingsModal";
|
|
39
|
+
import {
|
|
40
|
+
getRunDisplayState,
|
|
41
|
+
getRunTitle,
|
|
42
|
+
STATUS_BADGE_STYLES,
|
|
43
|
+
STATUS_DOT_COLORS,
|
|
44
|
+
STATUS_TEXT_COLORS,
|
|
45
|
+
} from "@/lib/linear-run-status";
|
|
46
|
+
import { ResizeHandle } from "@/components/ui/ResizeHandle";
|
|
47
|
+
import {
|
|
48
|
+
FilterSelect,
|
|
49
|
+
IssueStatusSelect,
|
|
50
|
+
MultiFilterPopdown,
|
|
51
|
+
type FilterOption,
|
|
52
|
+
} from "@/components/linear/LinearBoardFilters";
|
|
53
|
+
import { TicketRow } from "@/components/linear/TicketRow";
|
|
54
|
+
import { useLinearParticipants } from "@/hooks/useLinearParticipants";
|
|
55
|
+
import { useLinearActiveAgents } from "@/hooks/useLinearActiveAgents";
|
|
56
|
+
import { agentAvatarUrl } from "@/lib/linear-board-utils";
|
|
35
57
|
|
|
36
58
|
const Composer = dynamic(
|
|
37
59
|
() => import("@/components/chat-ui/Composer").then((module) => module.Composer),
|
|
@@ -42,60 +64,6 @@ function createThreadId() {
|
|
|
42
64
|
return globalThis.crypto?.randomUUID?.() ?? `thread-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
43
65
|
}
|
|
44
66
|
|
|
45
|
-
function ResizeHandle({
|
|
46
|
-
onResize,
|
|
47
|
-
}: {
|
|
48
|
-
onResize: (delta: number) => void;
|
|
49
|
-
}) {
|
|
50
|
-
const dragging = useRef(false);
|
|
51
|
-
const lastX = useRef(0);
|
|
52
|
-
|
|
53
|
-
useEffect(() => {
|
|
54
|
-
if (!dragging.current) return;
|
|
55
|
-
|
|
56
|
-
const onMouseMove = (e: MouseEvent) => {
|
|
57
|
-
const delta = e.clientX - lastX.current;
|
|
58
|
-
lastX.current = e.clientX;
|
|
59
|
-
onResize(delta);
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const onMouseUp = () => {
|
|
63
|
-
dragging.current = false;
|
|
64
|
-
document.body.style.cursor = "";
|
|
65
|
-
document.body.style.userSelect = "";
|
|
66
|
-
window.removeEventListener("mousemove", onMouseMove);
|
|
67
|
-
window.removeEventListener("mouseup", onMouseUp);
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
window.addEventListener("mousemove", onMouseMove);
|
|
71
|
-
window.addEventListener("mouseup", onMouseUp);
|
|
72
|
-
return () => {
|
|
73
|
-
window.removeEventListener("mousemove", onMouseMove);
|
|
74
|
-
window.removeEventListener("mouseup", onMouseUp);
|
|
75
|
-
};
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
return (
|
|
79
|
-
<div
|
|
80
|
-
className="group relative z-10 w-0 shrink-0 cursor-col-resize"
|
|
81
|
-
onMouseDown={(e) => {
|
|
82
|
-
e.preventDefault();
|
|
83
|
-
dragging.current = true;
|
|
84
|
-
lastX.current = e.clientX;
|
|
85
|
-
document.body.style.cursor = "col-resize";
|
|
86
|
-
document.body.style.userSelect = "none";
|
|
87
|
-
}}
|
|
88
|
-
>
|
|
89
|
-
<div className="absolute inset-y-0 -left-0.5 w-1 transition-colors group-hover:bg-[var(--primary)]/40" />
|
|
90
|
-
</div>
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function agentAvatarUrl(id: string, color?: string, size = 20): string {
|
|
95
|
-
const bg = color ? color.replace("#", "") : "e2e8f0";
|
|
96
|
-
return `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${encodeURIComponent(id)}&size=${size}&backgroundColor=${bg}`;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
67
|
function formatRunTime(iso: string): string {
|
|
100
68
|
return new Date(iso).toLocaleTimeString([], {
|
|
101
69
|
hour: "numeric",
|
|
@@ -103,439 +71,8 @@ function formatRunTime(iso: string): string {
|
|
|
103
71
|
});
|
|
104
72
|
}
|
|
105
73
|
|
|
106
|
-
function openLinearIssueTab(issueUrl: string): void {
|
|
107
|
-
const opened = window.open(issueUrl, "_blank", "noopener,noreferrer");
|
|
108
|
-
opened?.focus();
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
type RunDisplayTone = LinearRun["status"] | "ready";
|
|
112
|
-
|
|
113
|
-
function formatRunStatus(status: LinearRun["status"]): string {
|
|
114
|
-
switch (status) {
|
|
115
|
-
case "queued":
|
|
116
|
-
return "queued";
|
|
117
|
-
case "running":
|
|
118
|
-
return "running";
|
|
119
|
-
case "success":
|
|
120
|
-
return "success";
|
|
121
|
-
case "failed":
|
|
122
|
-
return "failed";
|
|
123
|
-
case "cancelled":
|
|
124
|
-
return "cancelled";
|
|
125
|
-
default:
|
|
126
|
-
return status;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function getRunDisplayState(run: LinearRun): {
|
|
131
|
-
label: string;
|
|
132
|
-
tone: RunDisplayTone;
|
|
133
|
-
} {
|
|
134
|
-
if (run.mode === "chat") {
|
|
135
|
-
switch (run.status) {
|
|
136
|
-
case "queued":
|
|
137
|
-
return { label: "starting", tone: "queued" };
|
|
138
|
-
case "running":
|
|
139
|
-
return { label: "thinking", tone: "running" };
|
|
140
|
-
case "success":
|
|
141
|
-
return { label: "ready", tone: "ready" };
|
|
142
|
-
case "failed":
|
|
143
|
-
return { label: "error", tone: "failed" };
|
|
144
|
-
case "cancelled":
|
|
145
|
-
return { label: "stopped", tone: "cancelled" };
|
|
146
|
-
default:
|
|
147
|
-
return { label: formatRunStatus(run.status), tone: run.status };
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return { label: formatRunStatus(run.status), tone: run.status };
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function getRunTitle(run: LinearRun): string {
|
|
155
|
-
const title = run.sessionTitle?.trim();
|
|
156
|
-
if (title) {
|
|
157
|
-
return title;
|
|
158
|
-
}
|
|
159
|
-
return run.mode === "scripted" ? "Scripted session" : "Chat session";
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const STATUS_LABELS: Record<string, string> = {
|
|
163
|
-
"In Progress": "In Prog",
|
|
164
|
-
"In Review": "Review",
|
|
165
|
-
Backlog: "Backlog",
|
|
166
|
-
Todo: "Todo",
|
|
167
|
-
Done: "Done",
|
|
168
|
-
Cancelled: "Cancl.",
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
const STATUS_BADGE_STYLES: Record<RunDisplayTone, string> = {
|
|
172
|
-
queued: "bg-amber-500/10 border-amber-500/20 text-amber-400",
|
|
173
|
-
running: "bg-yellow-500/10 border-yellow-500/20 text-yellow-400",
|
|
174
|
-
ready: "bg-sky-500/10 border-sky-500/20 text-sky-400",
|
|
175
|
-
success: "bg-emerald-500/10 border-emerald-500/20 text-emerald-400",
|
|
176
|
-
failed: "bg-red-500/10 border-red-500/20 text-red-400",
|
|
177
|
-
cancelled: "bg-zinc-500/10 border-zinc-500/20 text-zinc-400",
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
const STATUS_DOT_COLORS: Record<RunDisplayTone, string> = {
|
|
181
|
-
queued: "bg-amber-400",
|
|
182
|
-
running: "bg-yellow-400",
|
|
183
|
-
ready: "bg-sky-400",
|
|
184
|
-
success: "bg-emerald-400",
|
|
185
|
-
failed: "bg-red-400",
|
|
186
|
-
cancelled: "bg-zinc-400",
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
const STATUS_TEXT_COLORS: Record<RunDisplayTone, string> = {
|
|
190
|
-
queued: "text-amber-500",
|
|
191
|
-
running: "text-yellow-500",
|
|
192
|
-
ready: "text-sky-500",
|
|
193
|
-
success: "text-green-500",
|
|
194
|
-
failed: "text-red-500",
|
|
195
|
-
cancelled: "text-[var(--muted-foreground)]",
|
|
196
|
-
};
|
|
197
|
-
|
|
198
74
|
const NEW_SESSION_PANEL_ID = "new";
|
|
199
75
|
|
|
200
|
-
interface FilterOption {
|
|
201
|
-
value: string;
|
|
202
|
-
label: string;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
interface FilterSelectProps {
|
|
206
|
-
label: string;
|
|
207
|
-
value: string;
|
|
208
|
-
options: FilterOption[];
|
|
209
|
-
activeClasses: string;
|
|
210
|
-
onChange: (value: string) => void;
|
|
211
|
-
disabled?: boolean;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
interface FilterPopdownProps extends FilterSelectProps {
|
|
215
|
-
emptyLabel?: string;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
interface MultiFilterPopdownProps {
|
|
219
|
-
label: string;
|
|
220
|
-
values: string[];
|
|
221
|
-
options: FilterOption[];
|
|
222
|
-
activeClasses: string;
|
|
223
|
-
onChange: (value: string[]) => void;
|
|
224
|
-
emptyLabel?: string;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
function FilterSelect({
|
|
228
|
-
label,
|
|
229
|
-
value,
|
|
230
|
-
options,
|
|
231
|
-
activeClasses,
|
|
232
|
-
onChange,
|
|
233
|
-
disabled = false,
|
|
234
|
-
}: FilterSelectProps) {
|
|
235
|
-
const isActive = value.trim().length > 0;
|
|
236
|
-
|
|
237
|
-
return (
|
|
238
|
-
<div className="relative">
|
|
239
|
-
<select
|
|
240
|
-
aria-label={label}
|
|
241
|
-
className={`max-w-[160px] appearance-none rounded-full border bg-transparent px-2.5 py-0.5 pr-6 text-[11px] font-medium outline-none transition-colors disabled:cursor-not-allowed disabled:opacity-60 ${
|
|
242
|
-
isActive
|
|
243
|
-
? activeClasses
|
|
244
|
-
: "border-[var(--card-border)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)]"
|
|
245
|
-
}`}
|
|
246
|
-
value={value}
|
|
247
|
-
disabled={disabled}
|
|
248
|
-
onChange={(event) => onChange(event.target.value)}
|
|
249
|
-
>
|
|
250
|
-
{options.map((option) => (
|
|
251
|
-
<option key={`${label}-${option.value || "all"}`} value={option.value}>
|
|
252
|
-
{option.label}
|
|
253
|
-
</option>
|
|
254
|
-
))}
|
|
255
|
-
</select>
|
|
256
|
-
<ChevronDown
|
|
257
|
-
size={12}
|
|
258
|
-
className="pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-current"
|
|
259
|
-
/>
|
|
260
|
-
</div>
|
|
261
|
-
);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
function IssueStatusSelect({
|
|
265
|
-
status,
|
|
266
|
-
options,
|
|
267
|
-
onChange,
|
|
268
|
-
disabled = false,
|
|
269
|
-
updating = false,
|
|
270
|
-
}: {
|
|
271
|
-
status: string;
|
|
272
|
-
options: FilterOption[];
|
|
273
|
-
onChange: (value: string) => void;
|
|
274
|
-
disabled?: boolean;
|
|
275
|
-
updating?: boolean;
|
|
276
|
-
}) {
|
|
277
|
-
return (
|
|
278
|
-
<div className="relative">
|
|
279
|
-
<select
|
|
280
|
-
aria-label="Ticket status"
|
|
281
|
-
className="max-w-[160px] appearance-none rounded-md border border-[var(--card-border)] bg-[var(--card-bg)] px-2.5 py-1 pr-8 text-xs font-medium text-[var(--foreground)] outline-none transition-colors hover:border-[var(--muted-foreground)] disabled:cursor-not-allowed disabled:opacity-60"
|
|
282
|
-
value={status}
|
|
283
|
-
disabled={disabled || updating}
|
|
284
|
-
onChange={(event) => onChange(event.target.value)}
|
|
285
|
-
>
|
|
286
|
-
{options.map((option) => (
|
|
287
|
-
<option key={`ticket-status-${option.value}`} value={option.value}>
|
|
288
|
-
{option.label}
|
|
289
|
-
</option>
|
|
290
|
-
))}
|
|
291
|
-
</select>
|
|
292
|
-
{updating ? (
|
|
293
|
-
<RefreshCw
|
|
294
|
-
size={12}
|
|
295
|
-
className="pointer-events-none absolute right-6 top-1/2 -translate-y-1/2 animate-spin text-[var(--muted-foreground)]"
|
|
296
|
-
/>
|
|
297
|
-
) : null}
|
|
298
|
-
<ChevronDown
|
|
299
|
-
size={12}
|
|
300
|
-
className="pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)]"
|
|
301
|
-
/>
|
|
302
|
-
</div>
|
|
303
|
-
);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function FilterPopdown({
|
|
307
|
-
label,
|
|
308
|
-
value,
|
|
309
|
-
options,
|
|
310
|
-
activeClasses,
|
|
311
|
-
onChange,
|
|
312
|
-
emptyLabel,
|
|
313
|
-
}: FilterPopdownProps) {
|
|
314
|
-
const [open, setOpen] = useState(false);
|
|
315
|
-
const wrapperRef = useRef<HTMLDivElement | null>(null);
|
|
316
|
-
const selectedOption = options.find((option) => option.value === value) ?? null;
|
|
317
|
-
const isActive = value.trim().length > 0;
|
|
318
|
-
const buttonLabel = selectedOption?.label ?? emptyLabel ?? label;
|
|
319
|
-
|
|
320
|
-
useEffect(() => {
|
|
321
|
-
if (!open) {
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
const handlePointerDown = (event: PointerEvent) => {
|
|
326
|
-
if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {
|
|
327
|
-
setOpen(false);
|
|
328
|
-
}
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
document.addEventListener("pointerdown", handlePointerDown);
|
|
332
|
-
return () => document.removeEventListener("pointerdown", handlePointerDown);
|
|
333
|
-
}, [open]);
|
|
334
|
-
|
|
335
|
-
useEffect(() => {
|
|
336
|
-
setOpen(false);
|
|
337
|
-
}, [value]);
|
|
338
|
-
|
|
339
|
-
return (
|
|
340
|
-
<div className="relative" ref={wrapperRef}>
|
|
341
|
-
<button
|
|
342
|
-
type="button"
|
|
343
|
-
aria-label={label}
|
|
344
|
-
aria-haspopup="listbox"
|
|
345
|
-
aria-expanded={open}
|
|
346
|
-
className={`flex max-w-[180px] items-center gap-1 rounded-full border px-2.5 py-0.5 text-[11px] font-medium transition-colors ${
|
|
347
|
-
isActive
|
|
348
|
-
? activeClasses
|
|
349
|
-
: "border-[var(--card-border)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)]"
|
|
350
|
-
}`}
|
|
351
|
-
onClick={() => setOpen((current) => !current)}
|
|
352
|
-
>
|
|
353
|
-
<span className="max-w-[132px] truncate">{buttonLabel}</span>
|
|
354
|
-
<ChevronDown size={12} className={`shrink-0 transition-transform ${open ? "rotate-180" : ""}`} />
|
|
355
|
-
</button>
|
|
356
|
-
{open ? (
|
|
357
|
-
<div
|
|
358
|
-
role="listbox"
|
|
359
|
-
aria-label={`${label} options`}
|
|
360
|
-
className="absolute left-0 top-full z-50 mt-1 min-w-[220px] overflow-hidden rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] p-1 shadow-lg backdrop-blur-sm"
|
|
361
|
-
>
|
|
362
|
-
{options.map((option) => {
|
|
363
|
-
const isSelected = option.value === value;
|
|
364
|
-
return (
|
|
365
|
-
<button
|
|
366
|
-
key={`${label}-${option.value || "all"}`}
|
|
367
|
-
type="button"
|
|
368
|
-
role="option"
|
|
369
|
-
aria-selected={isSelected}
|
|
370
|
-
className={`flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs transition-colors ${
|
|
371
|
-
isSelected
|
|
372
|
-
? "bg-[var(--background)] font-medium text-[var(--foreground)]"
|
|
373
|
-
: "text-[var(--muted-foreground)] hover:bg-[var(--background)] hover:text-[var(--foreground)]"
|
|
374
|
-
}`}
|
|
375
|
-
onClick={() => onChange(option.value)}
|
|
376
|
-
>
|
|
377
|
-
<span
|
|
378
|
-
className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${
|
|
379
|
-
isSelected
|
|
380
|
-
? "border-blue-500 bg-blue-500 text-white"
|
|
381
|
-
: "border-[var(--card-border)]"
|
|
382
|
-
}`}
|
|
383
|
-
>
|
|
384
|
-
{isSelected ? <Check size={10} /> : null}
|
|
385
|
-
</span>
|
|
386
|
-
<span className="min-w-0 flex-1 truncate">{option.label}</span>
|
|
387
|
-
</button>
|
|
388
|
-
);
|
|
389
|
-
})}
|
|
390
|
-
</div>
|
|
391
|
-
) : null}
|
|
392
|
-
</div>
|
|
393
|
-
);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
function MultiFilterPopdown({
|
|
397
|
-
label,
|
|
398
|
-
values,
|
|
399
|
-
options,
|
|
400
|
-
activeClasses,
|
|
401
|
-
onChange,
|
|
402
|
-
emptyLabel,
|
|
403
|
-
}: MultiFilterPopdownProps) {
|
|
404
|
-
const [open, setOpen] = useState(false);
|
|
405
|
-
const wrapperRef = useRef<HTMLDivElement | null>(null);
|
|
406
|
-
const selectedOptions = options.filter(
|
|
407
|
-
(option) => option.value && values.includes(option.value)
|
|
408
|
-
);
|
|
409
|
-
const isActive = selectedOptions.length > 0;
|
|
410
|
-
const buttonLabel = (() => {
|
|
411
|
-
if (selectedOptions.length === 0) {
|
|
412
|
-
return emptyLabel ?? label;
|
|
413
|
-
}
|
|
414
|
-
if (selectedOptions.length === options.length) {
|
|
415
|
-
return emptyLabel ?? label;
|
|
416
|
-
}
|
|
417
|
-
if (selectedOptions.length === 1) {
|
|
418
|
-
return selectedOptions[0]?.label ?? (emptyLabel ?? label);
|
|
419
|
-
}
|
|
420
|
-
const lowerLabel = label.toLowerCase();
|
|
421
|
-
return `${selectedOptions.length} ${lowerLabel}${lowerLabel.endsWith("s") ? "es" : "s"}`;
|
|
422
|
-
})();
|
|
423
|
-
|
|
424
|
-
useEffect(() => {
|
|
425
|
-
if (!open) {
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
const handlePointerDown = (event: PointerEvent) => {
|
|
430
|
-
if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {
|
|
431
|
-
setOpen(false);
|
|
432
|
-
}
|
|
433
|
-
};
|
|
434
|
-
|
|
435
|
-
document.addEventListener("pointerdown", handlePointerDown);
|
|
436
|
-
return () => document.removeEventListener("pointerdown", handlePointerDown);
|
|
437
|
-
}, [open]);
|
|
438
|
-
|
|
439
|
-
const toggleValue = useCallback(
|
|
440
|
-
(nextValue: string) => {
|
|
441
|
-
if (!nextValue) {
|
|
442
|
-
onChange([]);
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
const nextValues = values.includes(nextValue)
|
|
447
|
-
? values.filter((value) => value !== nextValue)
|
|
448
|
-
: [...values, nextValue];
|
|
449
|
-
onChange(nextValues);
|
|
450
|
-
},
|
|
451
|
-
[onChange, values]
|
|
452
|
-
);
|
|
453
|
-
|
|
454
|
-
return (
|
|
455
|
-
<div className="relative" ref={wrapperRef}>
|
|
456
|
-
<button
|
|
457
|
-
type="button"
|
|
458
|
-
aria-label={label}
|
|
459
|
-
aria-haspopup="listbox"
|
|
460
|
-
aria-expanded={open}
|
|
461
|
-
className={`flex max-w-[180px] items-center gap-1 rounded-full border px-2.5 py-0.5 text-[11px] font-medium transition-colors ${
|
|
462
|
-
isActive
|
|
463
|
-
? activeClasses
|
|
464
|
-
: "border-[var(--card-border)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)]"
|
|
465
|
-
}`}
|
|
466
|
-
onClick={() => setOpen((current) => !current)}
|
|
467
|
-
>
|
|
468
|
-
<span className="max-w-[132px] truncate">{buttonLabel}</span>
|
|
469
|
-
<ChevronDown size={12} className={`shrink-0 transition-transform ${open ? "rotate-180" : ""}`} />
|
|
470
|
-
</button>
|
|
471
|
-
{open ? (
|
|
472
|
-
<div
|
|
473
|
-
role="listbox"
|
|
474
|
-
aria-label={`${label} options`}
|
|
475
|
-
aria-multiselectable="true"
|
|
476
|
-
className="absolute left-0 top-full z-50 mt-1 min-w-[240px] overflow-hidden rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] p-1 shadow-lg backdrop-blur-sm"
|
|
477
|
-
>
|
|
478
|
-
<button
|
|
479
|
-
type="button"
|
|
480
|
-
role="option"
|
|
481
|
-
aria-selected={!isActive}
|
|
482
|
-
className={`flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs transition-colors ${
|
|
483
|
-
!isActive
|
|
484
|
-
? "bg-[var(--background)] font-medium text-[var(--foreground)]"
|
|
485
|
-
: "text-[var(--muted-foreground)] hover:bg-[var(--background)] hover:text-[var(--foreground)]"
|
|
486
|
-
}`}
|
|
487
|
-
onClick={() => onChange([])}
|
|
488
|
-
>
|
|
489
|
-
<span
|
|
490
|
-
className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${
|
|
491
|
-
!isActive
|
|
492
|
-
? "border-blue-500 bg-blue-500 text-white"
|
|
493
|
-
: "border-[var(--card-border)]"
|
|
494
|
-
}`}
|
|
495
|
-
>
|
|
496
|
-
{!isActive ? <Check size={10} /> : null}
|
|
497
|
-
</span>
|
|
498
|
-
<span className="min-w-0 flex-1 truncate">{emptyLabel ?? label}</span>
|
|
499
|
-
</button>
|
|
500
|
-
{selectedOptions.length > 0 ? (
|
|
501
|
-
<div className="px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-[0.12em] text-[var(--muted-foreground)]">
|
|
502
|
-
Selected
|
|
503
|
-
</div>
|
|
504
|
-
) : null}
|
|
505
|
-
{options.filter((option) => option.value).map((option) => {
|
|
506
|
-
const isSelected = values.includes(option.value);
|
|
507
|
-
return (
|
|
508
|
-
<button
|
|
509
|
-
key={`${label}-${option.value}`}
|
|
510
|
-
type="button"
|
|
511
|
-
role="option"
|
|
512
|
-
aria-selected={isSelected}
|
|
513
|
-
className={`flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs transition-colors ${
|
|
514
|
-
isSelected
|
|
515
|
-
? "bg-[var(--background)] font-medium text-[var(--foreground)]"
|
|
516
|
-
: "text-[var(--muted-foreground)] hover:bg-[var(--background)] hover:text-[var(--foreground)]"
|
|
517
|
-
}`}
|
|
518
|
-
onClick={() => toggleValue(option.value)}
|
|
519
|
-
>
|
|
520
|
-
<span
|
|
521
|
-
className={`flex h-4 w-4 shrink-0 items-center justify-center rounded border ${
|
|
522
|
-
isSelected
|
|
523
|
-
? "border-blue-500 bg-blue-500 text-white"
|
|
524
|
-
: "border-[var(--card-border)]"
|
|
525
|
-
}`}
|
|
526
|
-
>
|
|
527
|
-
{isSelected ? <Check size={10} /> : null}
|
|
528
|
-
</span>
|
|
529
|
-
<span className="min-w-0 flex-1 truncate">{option.label}</span>
|
|
530
|
-
</button>
|
|
531
|
-
);
|
|
532
|
-
})}
|
|
533
|
-
</div>
|
|
534
|
-
) : null}
|
|
535
|
-
</div>
|
|
536
|
-
);
|
|
537
|
-
}
|
|
538
|
-
|
|
539
76
|
interface CycleOption {
|
|
540
77
|
id: string;
|
|
541
78
|
number: number;
|
|
@@ -1075,134 +612,6 @@ function ThreadMessageList({
|
|
|
1075
612
|
);
|
|
1076
613
|
}
|
|
1077
614
|
|
|
1078
|
-
function TicketRow({
|
|
1079
|
-
issue,
|
|
1080
|
-
selected,
|
|
1081
|
-
onSelect,
|
|
1082
|
-
activeAgents,
|
|
1083
|
-
participants,
|
|
1084
|
-
}: {
|
|
1085
|
-
issue: LinearIssue;
|
|
1086
|
-
selected: boolean;
|
|
1087
|
-
onSelect: () => void;
|
|
1088
|
-
activeAgents?: Array<{ agentId: string; agentName: string }>;
|
|
1089
|
-
participants?: Participant[];
|
|
1090
|
-
}) {
|
|
1091
|
-
const [copied, setCopied] = useState(false);
|
|
1092
|
-
const copyResetTimeoutRef = useRef<number | null>(null);
|
|
1093
|
-
|
|
1094
|
-
useEffect(() => {
|
|
1095
|
-
return () => {
|
|
1096
|
-
if (copyResetTimeoutRef.current) {
|
|
1097
|
-
window.clearTimeout(copyResetTimeoutRef.current);
|
|
1098
|
-
}
|
|
1099
|
-
};
|
|
1100
|
-
}, []);
|
|
1101
|
-
|
|
1102
|
-
const handleCopyUrl = useCallback(async (event: React.MouseEvent<HTMLButtonElement>) => {
|
|
1103
|
-
event.stopPropagation();
|
|
1104
|
-
if (!issue.url) {
|
|
1105
|
-
return;
|
|
1106
|
-
}
|
|
1107
|
-
|
|
1108
|
-
try {
|
|
1109
|
-
await navigator.clipboard.writeText(issue.url);
|
|
1110
|
-
setCopied(true);
|
|
1111
|
-
if (copyResetTimeoutRef.current) {
|
|
1112
|
-
window.clearTimeout(copyResetTimeoutRef.current);
|
|
1113
|
-
}
|
|
1114
|
-
copyResetTimeoutRef.current = window.setTimeout(() => {
|
|
1115
|
-
setCopied(false);
|
|
1116
|
-
}, 1500) as unknown as number;
|
|
1117
|
-
} catch (error) {
|
|
1118
|
-
console.error("Failed to copy Linear issue URL:", error);
|
|
1119
|
-
setCopied(false);
|
|
1120
|
-
}
|
|
1121
|
-
}, [issue.url]);
|
|
1122
|
-
|
|
1123
|
-
const handleOpenIssue = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {
|
|
1124
|
-
event.stopPropagation();
|
|
1125
|
-
if (!issue.url) {
|
|
1126
|
-
return;
|
|
1127
|
-
}
|
|
1128
|
-
openLinearIssueTab(issue.url);
|
|
1129
|
-
}, [issue.url]);
|
|
1130
|
-
|
|
1131
|
-
const shortStatus = STATUS_LABELS[issue.status] ?? issue.status.slice(0, 6);
|
|
1132
|
-
return (
|
|
1133
|
-
<div
|
|
1134
|
-
className={`group relative flex cursor-pointer items-center gap-3 px-4 py-2.5 text-sm transition-colors ${
|
|
1135
|
-
selected
|
|
1136
|
-
? "bg-[var(--card-bg)]"
|
|
1137
|
-
: "hover:bg-[var(--card-bg)]/50"
|
|
1138
|
-
}`}
|
|
1139
|
-
onClick={onSelect}
|
|
1140
|
-
role="button"
|
|
1141
|
-
tabIndex={0}
|
|
1142
|
-
onKeyDown={(event) => {
|
|
1143
|
-
if (event.key === "Enter" || event.key === " ") {
|
|
1144
|
-
event.preventDefault();
|
|
1145
|
-
onSelect();
|
|
1146
|
-
}
|
|
1147
|
-
}}
|
|
1148
|
-
>
|
|
1149
|
-
{selected && (
|
|
1150
|
-
<div className="absolute left-0 top-0 bottom-0 w-[3px] rounded-r-full bg-blue-500" />
|
|
1151
|
-
)}
|
|
1152
|
-
<span className="w-24 shrink-0 whitespace-nowrap font-mono text-xs text-[var(--muted-foreground)]">
|
|
1153
|
-
{issue.identifier}
|
|
1154
|
-
</span>
|
|
1155
|
-
<span className={`min-w-0 flex-1 truncate text-xs ${selected ? "font-medium text-[var(--foreground)]" : "text-[var(--muted-foreground)]"}`}>
|
|
1156
|
-
{issue.title}
|
|
1157
|
-
</span>
|
|
1158
|
-
<span className="shrink-0 text-xs text-[var(--muted-foreground)]">
|
|
1159
|
-
{shortStatus}
|
|
1160
|
-
</span>
|
|
1161
|
-
{activeAgents && activeAgents.length > 0 && (
|
|
1162
|
-
<span className="inline-flex items-center -space-x-1 shrink-0">
|
|
1163
|
-
{activeAgents.slice(0, 3).map((agent) => {
|
|
1164
|
-
const participant = participants?.find((p) => p.id === agent.agentId);
|
|
1165
|
-
return (
|
|
1166
|
-
<span key={agent.agentId} className="relative inline-block" title={participant?.name ?? agent.agentName}>
|
|
1167
|
-
<img src={agentAvatarUrl(agent.agentId, participant?.color, 16)} alt={participant?.name ?? agent.agentName} className="h-3 w-3 rounded-full ring-[1.5px] ring-[var(--app-shell-pane)]" />
|
|
1168
|
-
<span className="absolute -bottom-px -right-px h-1.5 w-1.5 rounded-full bg-green-500 ring-[1px] ring-[var(--app-shell-pane)]" />
|
|
1169
|
-
</span>
|
|
1170
|
-
);
|
|
1171
|
-
})}
|
|
1172
|
-
</span>
|
|
1173
|
-
)}
|
|
1174
|
-
<div className="flex shrink-0 items-center gap-1">
|
|
1175
|
-
<button
|
|
1176
|
-
type="button"
|
|
1177
|
-
className={`flex h-6 w-6 shrink-0 items-center justify-center rounded text-[var(--muted-foreground)] transition-all hover:bg-zinc-700 hover:text-[var(--foreground)] ${
|
|
1178
|
-
selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"
|
|
1179
|
-
} ${issue.url ? "" : "cursor-not-allowed opacity-40 hover:bg-transparent hover:text-[var(--muted-foreground)]"}`}
|
|
1180
|
-
onClick={(event) => {
|
|
1181
|
-
void handleCopyUrl(event);
|
|
1182
|
-
}}
|
|
1183
|
-
title={copied ? "Copied ticket URL" : "Copy ticket URL"}
|
|
1184
|
-
aria-label={copied ? "Copied ticket URL" : "Copy ticket URL"}
|
|
1185
|
-
disabled={!issue.url}
|
|
1186
|
-
>
|
|
1187
|
-
{copied ? <Check size={10} className="text-emerald-400" /> : <Link2 size={10} />}
|
|
1188
|
-
</button>
|
|
1189
|
-
<button
|
|
1190
|
-
type="button"
|
|
1191
|
-
className={`flex h-6 w-6 shrink-0 items-center justify-center rounded text-[var(--muted-foreground)] transition-all hover:bg-zinc-700 hover:text-[var(--foreground)] ${
|
|
1192
|
-
selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"
|
|
1193
|
-
} ${issue.url ? "" : "cursor-not-allowed opacity-40 hover:bg-transparent hover:text-[var(--muted-foreground)]"}`}
|
|
1194
|
-
onClick={handleOpenIssue}
|
|
1195
|
-
title={issue.url ? "Open this Linear ticket in a new tab" : "This ticket does not have a Linear URL"}
|
|
1196
|
-
aria-label={issue.url ? "Open this Linear ticket in a new tab" : "This ticket does not have a Linear URL"}
|
|
1197
|
-
disabled={!issue.url}
|
|
1198
|
-
>
|
|
1199
|
-
<ExternalLink size={10} />
|
|
1200
|
-
</button>
|
|
1201
|
-
</div>
|
|
1202
|
-
</div>
|
|
1203
|
-
);
|
|
1204
|
-
}
|
|
1205
|
-
|
|
1206
615
|
interface LinearBoardProps {
|
|
1207
616
|
projectId?: string;
|
|
1208
617
|
projectSlug?: string;
|
|
@@ -1242,10 +651,11 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
1242
651
|
const [sortBy, setSortBy] = useState<"activity" | "identifier" | "status" | "created">("activity");
|
|
1243
652
|
const [sortDir, setSortDir] = useState<"asc" | "desc">("desc");
|
|
1244
653
|
const [hasActivity, setHasActivity] = useState(false);
|
|
654
|
+
const [pinnedIssueIds, setPinnedIssueIds] = useState<Set<string>>(() => loadPinnedIssueIds(projectSlug));
|
|
1245
655
|
const [selectedIssueFallback, setSelectedIssueFallback] = useState<LinearIssue | null>(null);
|
|
1246
656
|
const [updatingIssueId, setUpdatingIssueId] = useState<string | null>(null);
|
|
1247
|
-
const
|
|
1248
|
-
const
|
|
657
|
+
const { participants } = useLinearParticipants(projectId);
|
|
658
|
+
const { issueActiveAgents } = useLinearActiveAgents(projectId);
|
|
1249
659
|
const [pickerIssue, setPickerIssue] = useState<LinearIssue | null>(null);
|
|
1250
660
|
const [pickerAnchor, setPickerAnchor] = useState<{ top: number; left: number } | null>(null);
|
|
1251
661
|
const [touchPanelTab, setTouchPanelTab] = useState<"runs" | "ticket">("runs");
|
|
@@ -1265,6 +675,19 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
1265
675
|
searchDebounceRef.current = setTimeout(() => setDebouncedSearch(value), 300);
|
|
1266
676
|
}, []);
|
|
1267
677
|
|
|
678
|
+
const togglePin = useCallback((issueId: string) => {
|
|
679
|
+
setPinnedIssueIds((prev) => {
|
|
680
|
+
const next = new Set(prev);
|
|
681
|
+
if (next.has(issueId)) {
|
|
682
|
+
next.delete(issueId);
|
|
683
|
+
} else {
|
|
684
|
+
next.add(issueId);
|
|
685
|
+
}
|
|
686
|
+
persistPinnedIssueIds(projectSlug, next);
|
|
687
|
+
return next;
|
|
688
|
+
});
|
|
689
|
+
}, [projectSlug]);
|
|
690
|
+
|
|
1268
691
|
useEffect(() => {
|
|
1269
692
|
return () => {
|
|
1270
693
|
if (searchDebounceRef.current) {
|
|
@@ -1285,6 +708,7 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
1285
708
|
setSortBy(storedFilters.sortBy);
|
|
1286
709
|
setSortDir(storedFilters.sortDir);
|
|
1287
710
|
setHasActivity(storedFilters.hasActivity);
|
|
711
|
+
setPinnedIssueIds(loadPinnedIssueIds(projectSlug));
|
|
1288
712
|
}, [projectSlug]);
|
|
1289
713
|
|
|
1290
714
|
useEffect(() => {
|
|
@@ -1411,7 +835,7 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
1411
835
|
loadMore,
|
|
1412
836
|
refresh: refreshIssues,
|
|
1413
837
|
updateIssue,
|
|
1414
|
-
} = useLinearIssues(filters, connected, { projectSlug });
|
|
838
|
+
} = useLinearIssues(filters, connected && filterOptionsLoaded, { projectSlug });
|
|
1415
839
|
const selectedIssueFromList = useMemo(
|
|
1416
840
|
() => (selectedIssueId ? issues.find((issue) => issue.id === selectedIssueId) ?? null : null),
|
|
1417
841
|
[issues, selectedIssueId],
|
|
@@ -1419,6 +843,21 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
1419
843
|
const selectedIssue =
|
|
1420
844
|
selectedIssueFromList ??
|
|
1421
845
|
(selectedIssueFallback?.id === selectedIssueId ? selectedIssueFallback : null);
|
|
846
|
+
|
|
847
|
+
const sortedIssues = useMemo(() => {
|
|
848
|
+
if (pinnedIssueIds.size === 0) return issues;
|
|
849
|
+
const pinned: LinearIssue[] = [];
|
|
850
|
+
const unpinned: LinearIssue[] = [];
|
|
851
|
+
for (const issue of issues) {
|
|
852
|
+
if (pinnedIssueIds.has(issue.id)) {
|
|
853
|
+
pinned.push(issue);
|
|
854
|
+
} else {
|
|
855
|
+
unpinned.push(issue);
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
return [...pinned, ...unpinned];
|
|
859
|
+
}, [issues, pinnedIssueIds]);
|
|
860
|
+
|
|
1422
861
|
const {
|
|
1423
862
|
runs,
|
|
1424
863
|
loading: runsLoading,
|
|
@@ -1604,128 +1043,6 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
1604
1043
|
setTouchPanelTab("runs");
|
|
1605
1044
|
}, [isTouchLayout, runs.length, selectedIssue, selectedRun, selectedRunId]);
|
|
1606
1045
|
|
|
1607
|
-
useEffect(() => {
|
|
1608
|
-
let cancelled = false;
|
|
1609
|
-
|
|
1610
|
-
async function loadParticipants() {
|
|
1611
|
-
try {
|
|
1612
|
-
const participantsResponse = await fetch("/api/participants");
|
|
1613
|
-
const allParticipants = participantsResponse.ok
|
|
1614
|
-
? ((await participantsResponse.json()) as Participant[])
|
|
1615
|
-
: [];
|
|
1616
|
-
|
|
1617
|
-
if (!projectId) {
|
|
1618
|
-
if (!cancelled) setParticipants(allParticipants);
|
|
1619
|
-
return;
|
|
1620
|
-
}
|
|
1621
|
-
|
|
1622
|
-
// Check if the linear worker has a team configured
|
|
1623
|
-
const workerParams = new URLSearchParams();
|
|
1624
|
-
workerParams.set("projectId", projectId);
|
|
1625
|
-
const workerResponse = await fetch(`/api/linear/worker?${workerParams}`).catch(() => null);
|
|
1626
|
-
const workerData = workerResponse?.ok ? await workerResponse.json().catch(() => null) : null;
|
|
1627
|
-
const workerTeamId: string | undefined = workerData?.job?.teamId || undefined;
|
|
1628
|
-
|
|
1629
|
-
if (workerTeamId) {
|
|
1630
|
-
// Use the team's agents as participants
|
|
1631
|
-
const teamAgentsResponse = await fetch(
|
|
1632
|
-
`/api/projects/${encodeURIComponent(projectId)}/teams/${encodeURIComponent(workerTeamId)}/agents`
|
|
1633
|
-
);
|
|
1634
|
-
if (teamAgentsResponse.ok) {
|
|
1635
|
-
const teamData = await teamAgentsResponse.json();
|
|
1636
|
-
const teamAgentIds: string[] = Array.isArray(teamData.agents)
|
|
1637
|
-
? teamData.agents
|
|
1638
|
-
.sort((a: { routing_order?: number }, b: { routing_order?: number }) =>
|
|
1639
|
-
(a.routing_order ?? 0) - (b.routing_order ?? 0)
|
|
1640
|
-
)
|
|
1641
|
-
.map((agent: { agent_id?: string }) => agent.agent_id)
|
|
1642
|
-
.filter((value: unknown): value is string => typeof value === "string" && value.trim().length > 0)
|
|
1643
|
-
: [];
|
|
1644
|
-
if (teamAgentIds.length > 0) {
|
|
1645
|
-
const teamOrderIndex = new Map(teamAgentIds.map((id, index) => [id, index]));
|
|
1646
|
-
const teamParticipants = allParticipants
|
|
1647
|
-
.filter((participant) => teamOrderIndex.has(participant.id))
|
|
1648
|
-
.sort(
|
|
1649
|
-
(left, right) =>
|
|
1650
|
-
(teamOrderIndex.get(left.id) ?? Number.MAX_SAFE_INTEGER) -
|
|
1651
|
-
(teamOrderIndex.get(right.id) ?? Number.MAX_SAFE_INTEGER)
|
|
1652
|
-
);
|
|
1653
|
-
if (!cancelled && teamParticipants.length > 0) {
|
|
1654
|
-
setParticipants(teamParticipants);
|
|
1655
|
-
return;
|
|
1656
|
-
}
|
|
1657
|
-
}
|
|
1658
|
-
}
|
|
1659
|
-
}
|
|
1660
|
-
|
|
1661
|
-
// Fallback: use project agents
|
|
1662
|
-
const projectAgentsResponse = await fetch(
|
|
1663
|
-
`/api/projects/${encodeURIComponent(projectId)}/agents`
|
|
1664
|
-
);
|
|
1665
|
-
if (!projectAgentsResponse.ok) {
|
|
1666
|
-
if (!cancelled) setParticipants(allParticipants);
|
|
1667
|
-
return;
|
|
1668
|
-
}
|
|
1669
|
-
|
|
1670
|
-
const projectData = await projectAgentsResponse.json();
|
|
1671
|
-
const orderedAgentIds: string[] = Array.isArray(projectData.agents)
|
|
1672
|
-
? projectData.agents
|
|
1673
|
-
.map((agent: { agent_id?: string }) => agent.agent_id)
|
|
1674
|
-
.filter((value: unknown): value is string => typeof value === "string" && value.trim().length > 0)
|
|
1675
|
-
: [];
|
|
1676
|
-
const orderIndex = new Map(orderedAgentIds.map((id, index) => [id, index]));
|
|
1677
|
-
const scopedParticipants = allParticipants
|
|
1678
|
-
.filter((participant) => orderIndex.has(participant.id))
|
|
1679
|
-
.sort(
|
|
1680
|
-
(left, right) =>
|
|
1681
|
-
(orderIndex.get(left.id) ?? Number.MAX_SAFE_INTEGER) -
|
|
1682
|
-
(orderIndex.get(right.id) ?? Number.MAX_SAFE_INTEGER)
|
|
1683
|
-
);
|
|
1684
|
-
|
|
1685
|
-
if (!cancelled) {
|
|
1686
|
-
setParticipants(scopedParticipants);
|
|
1687
|
-
}
|
|
1688
|
-
} catch {
|
|
1689
|
-
if (!cancelled) {
|
|
1690
|
-
setParticipants([]);
|
|
1691
|
-
}
|
|
1692
|
-
}
|
|
1693
|
-
}
|
|
1694
|
-
|
|
1695
|
-
void loadParticipants();
|
|
1696
|
-
|
|
1697
|
-
return () => {
|
|
1698
|
-
cancelled = true;
|
|
1699
|
-
};
|
|
1700
|
-
}, [projectId]);
|
|
1701
|
-
|
|
1702
|
-
useEffect(() => {
|
|
1703
|
-
let cancelled = false;
|
|
1704
|
-
|
|
1705
|
-
async function fetchActiveAgents() {
|
|
1706
|
-
try {
|
|
1707
|
-
const params = new URLSearchParams();
|
|
1708
|
-
if (projectId) params.set("projectId", projectId);
|
|
1709
|
-
const res = await fetch(`/api/linear/issues/active-agents?${params}`);
|
|
1710
|
-
if (!res.ok || cancelled) return;
|
|
1711
|
-
const data = await res.json();
|
|
1712
|
-
const map = new Map<string, Array<{ agentId: string; agentName: string }>>();
|
|
1713
|
-
for (const entry of data.agents ?? []) {
|
|
1714
|
-
const list = map.get(entry.issueId) ?? [];
|
|
1715
|
-
list.push({ agentId: entry.agentId, agentName: entry.agentName });
|
|
1716
|
-
map.set(entry.issueId, list);
|
|
1717
|
-
}
|
|
1718
|
-
if (!cancelled) setIssueActiveAgents(map);
|
|
1719
|
-
} catch {
|
|
1720
|
-
// ignore
|
|
1721
|
-
}
|
|
1722
|
-
}
|
|
1723
|
-
|
|
1724
|
-
void fetchActiveAgents();
|
|
1725
|
-
const interval = setInterval(() => void fetchActiveAgents(), 5000);
|
|
1726
|
-
return () => { cancelled = true; clearInterval(interval); };
|
|
1727
|
-
}, [projectId]);
|
|
1728
|
-
|
|
1729
1046
|
useEffect(() => {
|
|
1730
1047
|
if (!showRunScripts) {
|
|
1731
1048
|
return;
|
|
@@ -1986,21 +1303,29 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
1986
1303
|
</div>
|
|
1987
1304
|
) : (
|
|
1988
1305
|
<>
|
|
1989
|
-
{
|
|
1990
|
-
<
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
}
|
|
2002
|
-
|
|
2003
|
-
|
|
1306
|
+
{sortedIssues.map((issue, idx) => (
|
|
1307
|
+
<React.Fragment key={issue.id}>
|
|
1308
|
+
{pinnedIssueIds.size > 0 &&
|
|
1309
|
+
!pinnedIssueIds.has(issue.id) &&
|
|
1310
|
+
(idx === 0 || pinnedIssueIds.has(sortedIssues[idx - 1].id)) && (
|
|
1311
|
+
<div className="mx-4 border-t border-amber-500/20" />
|
|
1312
|
+
)}
|
|
1313
|
+
<TicketRow
|
|
1314
|
+
issue={issue}
|
|
1315
|
+
selected={selectedIssue?.id === issue.id}
|
|
1316
|
+
pinned={pinnedIssueIds.has(issue.id)}
|
|
1317
|
+
activeAgents={issueActiveAgents.get(issue.id)}
|
|
1318
|
+
participants={participants}
|
|
1319
|
+
onSelect={() => {
|
|
1320
|
+
setTouchPanelTab("runs");
|
|
1321
|
+
pushSelection({
|
|
1322
|
+
issue: issue.id,
|
|
1323
|
+
run: null,
|
|
1324
|
+
});
|
|
1325
|
+
}}
|
|
1326
|
+
onTogglePin={() => togglePin(issue.id)}
|
|
1327
|
+
/>
|
|
1328
|
+
</React.Fragment>
|
|
2004
1329
|
))}
|
|
2005
1330
|
{hasMore ? (
|
|
2006
1331
|
<div
|
|
@@ -2304,20 +1629,28 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
2304
1629
|
</div>
|
|
2305
1630
|
) : (
|
|
2306
1631
|
<>
|
|
2307
|
-
{
|
|
2308
|
-
<
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
}
|
|
2319
|
-
|
|
2320
|
-
|
|
1632
|
+
{sortedIssues.map((issue, idx) => (
|
|
1633
|
+
<React.Fragment key={issue.id}>
|
|
1634
|
+
{pinnedIssueIds.size > 0 &&
|
|
1635
|
+
!pinnedIssueIds.has(issue.id) &&
|
|
1636
|
+
(idx === 0 || pinnedIssueIds.has(sortedIssues[idx - 1].id)) && (
|
|
1637
|
+
<div className="mx-4 border-t border-amber-500/20" />
|
|
1638
|
+
)}
|
|
1639
|
+
<TicketRow
|
|
1640
|
+
issue={issue}
|
|
1641
|
+
selected={selectedIssue?.id === issue.id}
|
|
1642
|
+
pinned={pinnedIssueIds.has(issue.id)}
|
|
1643
|
+
activeAgents={issueActiveAgents.get(issue.id)}
|
|
1644
|
+
participants={participants}
|
|
1645
|
+
onSelect={() =>
|
|
1646
|
+
pushSelection({
|
|
1647
|
+
issue: issue.id,
|
|
1648
|
+
run: null,
|
|
1649
|
+
})
|
|
1650
|
+
}
|
|
1651
|
+
onTogglePin={() => togglePin(issue.id)}
|
|
1652
|
+
/>
|
|
1653
|
+
</React.Fragment>
|
|
2321
1654
|
))}
|
|
2322
1655
|
{hasMore ? (
|
|
2323
1656
|
<div
|
|
@@ -2549,8 +1882,8 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
|
|
|
2549
1882
|
/>
|
|
2550
1883
|
<span className="flex flex-col">
|
|
2551
1884
|
<span className="font-medium text-[var(--foreground)]">{agent.name}</span>
|
|
2552
|
-
{agent.
|
|
2553
|
-
<span className="text-[10px] text-[var(--muted-foreground)]">{agent.
|
|
1885
|
+
{agent.role ? (
|
|
1886
|
+
<span className="text-[10px] text-[var(--muted-foreground)]">{agent.role}</span>
|
|
2554
1887
|
) : null}
|
|
2555
1888
|
</span>
|
|
2556
1889
|
</button>
|