@mndrk/agx 2.4.2 → 2.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
- package/cloud-runtime/standalone/apps/local/.next/app-path-routes-manifest.json +5 -0
- package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
- package/cloud-runtime/standalone/apps/local/.next/routes-manifest.json +41 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/export/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/file-search/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/scheduled-tasks/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/search/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/teams/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/poll/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/check/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/assign/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/available/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/detail/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/history/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/learn/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/summarize/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/comments/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/comments/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/auth/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/auth/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/callback/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/callback/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/groups/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/groups/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/activity/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/activity/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/recap/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/recap/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/route.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/[id]/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/labels/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/mcp-setup/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/mcp-setup/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/bulk/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/metadata/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/options/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/options/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/[id]/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/[id]/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/scripted/route.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/scripted/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route.js.map +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/stats/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/status/route.js +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/token/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/token/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/token-receive/route.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/token-receive/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/worker/route.js +6 -6
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/worker/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/connections/route.js +7 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/connections/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/api/update-check/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page/react-loadable-manifest.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page/react-loadable-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page/react-loadable-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app-paths-manifest.json +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/083c9_next-internal_server_app_api_trackers_[tracker]_metadata_route_actions_c83fcc1a.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/30bdd_server_app_api_trackers_[tracker]_labels_[id]_route_actions_2646388d.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/30bdd_server_app_api_trackers_[tracker]_metadata_bulk_route_actions_f43e6831.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0e04eca4._.js +40 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0fbbaf2d._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__10a90219._.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__1d970ad0._.js +40 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/{[root-of-the-server]__2ab23e45._.js → [root-of-the-server]__2eb13697._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__3a038592._.js +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__3b27260f._.js +23 -8
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__498d8b2d._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__580ddcca._.js +40 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__5da8d281._.js +129 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__68b692c4._.js +9 -9
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__76030d44._.js +40 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__7db7c421._.js +20 -5
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__7fcbb0c2._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__ba72d342._.js +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__d8cc43c7._.js +22 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__f598d976._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__f7a936d9._.js +21 -6
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_1a4cb196._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_5e5f36c4._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_8f9f647d._.js +28 -13
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_9f0fd451._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_d256aa32._.js +28 -25
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_e1f4d9ad._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_f8b3abae._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_orchestrator_chat-processor_ts_46384f36._.js +12 -12
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_tracker_tracker-run-store_ts_5aa9592e._.js +22 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ebff2__next-internal_server_app_api_trackers_[tracker]_labels_route_actions_8ba41152.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ebff2__next-internal_server_app_api_trackers_[tracker]_stats_route_actions_7da4ccde.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__799f4d13._.js → [root-of-the-server]__2af44092._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__452cb0f0._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__489568b4._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__4ec098a0._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__53bd50df._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__7774a40c._.js +3 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__b8484b0e._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__51edc9b6._.js → [root-of-the-server]__bd05ee09._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_8c4beba9._.js +7 -0
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_5eebb5cb._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_35d90b5d._.js → apps_local_bbb7b83b._.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_TrackerBoard_tsx_98970bab._.js +6 -6
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_chat-ui_f0554cb4._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_751ab3d3._.js +7 -7
- package/cloud-runtime/standalone/apps/local/.next/server/functions-config-manifest.json +5 -0
- package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0243e7d015db440d.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/42a62b80b32a97f7.js +9 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/5d047fc7267a8f53.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/7148feb61274d431.css +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/716e1716d526ded9.js +46 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{77cea126364aab3c.js → 7353a3a1fcd5825c.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/8b91e7692a899f00.js +20 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/9acdd370e9daca0d.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{6c777fe66e042eec.js → 9df45611d6c84e02.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{6c278ae4535b6d5c.js → 9e2208153f276f8c.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/a084c6475513e6fe.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/aa6db7c91c1ccd5f.js +16 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d5607ac80145f3b7.js +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d590384ce3045a12.js +5 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{d5b14e14665024a9.js → d5c307b52fd87861.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/f4acf76cb6c82c73.js +16 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/labels/[id]/route.ts +23 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/labels/route.ts +41 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/metadata/bulk/route.ts +68 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/metadata/route.ts +31 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/options/route.ts +1 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/[tracker]/stats/route.ts +20 -0
- package/cloud-runtime/standalone/apps/local/app/api/trackers/connections/route.ts +46 -2
- package/cloud-runtime/standalone/apps/local/app/projects/[slug]/tracking/connect/page.tsx +41 -11
- package/cloud-runtime/standalone/apps/local/components/TrackerBoard.tsx +609 -85
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx +204 -49
- package/cloud-runtime/standalone/apps/local/components/tracker/FibonacciPicker.tsx +41 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/FolderRow.tsx +1 -1
- package/cloud-runtime/standalone/apps/local/components/tracker/LabelPicker.tsx +118 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/LabelSettings.tsx +104 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/PromptPopover.tsx +64 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/SelectionBar.tsx +276 -23
- package/cloud-runtime/standalone/apps/local/components/tracker/StatusGroupRow.tsx +50 -0
- package/cloud-runtime/standalone/apps/local/components/tracker/TicketPanel.tsx +14 -2
- package/cloud-runtime/standalone/apps/local/components/tracker/TicketRow.tsx +147 -7
- package/cloud-runtime/standalone/apps/local/components/tracker/TrackerSettingsModal.tsx +14 -2
- package/cloud-runtime/standalone/apps/local/components/ui/ResizeHandle.tsx +15 -22
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerConnections.ts +29 -1
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerIssueStats.ts +52 -0
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerItemMetadata.ts +67 -0
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerItemsMetadata.ts +51 -0
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerLabels.ts +74 -0
- package/cloud-runtime/standalone/apps/local/hooks/useTrackerRuns.ts +5 -0
- package/cloud-runtime/standalone/apps/local/lib/agent-process-registry.ts +8 -2
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/jira/adapter.tsx +1 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/jira/issues.ts +1 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/linear/adapter.tsx +1 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/linear/client.ts +5 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/linear/issues.ts +1 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/connections.ts +46 -15
- package/cloud-runtime/standalone/apps/local/lib/tracker/tracker-adapter.ts +2 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/tracker-item-metadata-store.ts +262 -0
- package/cloud-runtime/standalone/apps/local/lib/tracker/tracker-item-store.ts +10 -3
- package/cloud-runtime/standalone/apps/local/lib/tracker/tracker-run-store.ts +42 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/objective-worker.ts +7 -0
- package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/task-worker.ts +7 -0
- package/cloud-runtime/standalone/apps/local/state/trackerBoardFilters.ts +4 -0
- package/cloud-runtime/standalone/apps/local/worker/index.js +6 -2
- package/package.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__847236fb._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_80b34b78._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__30bf097e._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__46ae9d33._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__50fd8680._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__8059a285._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__886953ec._.js +0 -7
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__97160565._.js +0 -3
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/0876dfd6ce07abaf.js +0 -9
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/1ec83777a9abd420.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/286758b0fd546c68.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/a72ed5cb3feb0d51.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/b02c180ad1d968eb.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/b048a4812b51f97a.js +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/c63d97c917d96f47.js +0 -46
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/d3bf70e2fbdc0ae5.js +0 -5
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/dd5a56eea2d4c067.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/dd7d7c382389b8b9.js +0 -16
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/e72724fd8225ec39.js +0 -20
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/ec92e3bd6c2db6e6.css +0 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/ffcc32453866d0c2.js +0 -1
- /package/cloud-runtime/standalone/apps/local/.next/static/{QEldoF1LdgJqO0PgpmUmx → 3-6VaSnGGXdV-2eV44RDK}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{QEldoF1LdgJqO0PgpmUmx → 3-6VaSnGGXdV-2eV44RDK}/_clientMiddlewareManifest.json +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{QEldoF1LdgJqO0PgpmUmx → 3-6VaSnGGXdV-2eV44RDK}/_ssgManifest.js +0 -0
|
@@ -97,12 +97,18 @@ function getDb(): DatabaseSync {
|
|
|
97
97
|
PRIMARY KEY (thread_id, id)
|
|
98
98
|
)
|
|
99
99
|
`);
|
|
100
|
-
// Migrate: rename linear_runs → tracker_runs if old table exists
|
|
100
|
+
// Migrate: rename linear_runs → tracker_runs if old table exists and new one doesn't
|
|
101
101
|
const hasOldTable = (db.prepare(
|
|
102
102
|
"SELECT name FROM sqlite_master WHERE type='table' AND name='linear_runs'"
|
|
103
103
|
).get() as { name: string } | undefined);
|
|
104
|
-
|
|
104
|
+
const hasNewTable = (db.prepare(
|
|
105
|
+
"SELECT name FROM sqlite_master WHERE type='table' AND name='tracker_runs'"
|
|
106
|
+
).get() as { name: string } | undefined);
|
|
107
|
+
if (hasOldTable && !hasNewTable) {
|
|
105
108
|
db.exec("ALTER TABLE linear_runs RENAME TO tracker_runs");
|
|
109
|
+
} else if (hasOldTable && hasNewTable) {
|
|
110
|
+
// Both exist (likely a partial prior migration) — drop the stale old table
|
|
111
|
+
db.exec("DROP TABLE linear_runs");
|
|
106
112
|
}
|
|
107
113
|
db.exec(`
|
|
108
114
|
CREATE TABLE IF NOT EXISTS tracker_runs (
|
|
@@ -43,6 +43,7 @@ export function JiraIcon({ className }: { className?: string }) {
|
|
|
43
43
|
export class JiraAdapter implements TrackerAdapter {
|
|
44
44
|
type = "jira" as const;
|
|
45
45
|
displayName = "Jira Cloud";
|
|
46
|
+
groupLabel = "Sprint";
|
|
46
47
|
icon = JiraIcon;
|
|
47
48
|
|
|
48
49
|
getAuthUrl(projectId: string): string {
|
|
@@ -77,6 +77,7 @@ function cycleToGroup(cycle: LinearCycle): TrackerGroup {
|
|
|
77
77
|
export class LinearAdapter implements TrackerAdapter {
|
|
78
78
|
type = "linear" as const;
|
|
79
79
|
displayName = "Linear";
|
|
80
|
+
groupLabel = "Cycle";
|
|
80
81
|
icon = LinearIcon;
|
|
81
82
|
|
|
82
83
|
getAuthUrl(projectId: string): string {
|
|
@@ -98,6 +98,7 @@ interface RawLinearIssueNode {
|
|
|
98
98
|
title: string;
|
|
99
99
|
description: string | null;
|
|
100
100
|
url: string | null;
|
|
101
|
+
createdAt: string;
|
|
101
102
|
updatedAt: string;
|
|
102
103
|
state: LinearIssueState | null;
|
|
103
104
|
assignee: LinearIssueAssignee | null;
|
|
@@ -184,6 +185,7 @@ export interface LinearIssueNode {
|
|
|
184
185
|
title: string;
|
|
185
186
|
description: string | null;
|
|
186
187
|
url: string | null;
|
|
188
|
+
createdAt: string;
|
|
187
189
|
updatedAt: string;
|
|
188
190
|
state: Promise<LinearIssueState | null>;
|
|
189
191
|
assignee: Promise<LinearIssueAssignee | null>;
|
|
@@ -490,6 +492,7 @@ export class LinearClient {
|
|
|
490
492
|
title
|
|
491
493
|
description
|
|
492
494
|
url
|
|
495
|
+
createdAt
|
|
493
496
|
updatedAt
|
|
494
497
|
state { name }
|
|
495
498
|
assignee { id name email }
|
|
@@ -516,6 +519,7 @@ export class LinearClient {
|
|
|
516
519
|
title: issue.title,
|
|
517
520
|
description: issue.description,
|
|
518
521
|
url: issue.url,
|
|
522
|
+
createdAt: issue.createdAt,
|
|
519
523
|
updatedAt: issue.updatedAt,
|
|
520
524
|
state: Promise.resolve(issue.state),
|
|
521
525
|
assignee: Promise.resolve(issue.assignee),
|
|
@@ -581,6 +585,7 @@ export class LinearClient {
|
|
|
581
585
|
title
|
|
582
586
|
description
|
|
583
587
|
url
|
|
588
|
+
createdAt
|
|
584
589
|
updatedAt
|
|
585
590
|
state { name }
|
|
586
591
|
assignee { id name email }
|
|
@@ -279,6 +279,7 @@ export async function pullLinearIssues(input: {
|
|
|
279
279
|
cycleId: cycle?.id ?? null,
|
|
280
280
|
cycleName: cycle?.name ?? null,
|
|
281
281
|
cycleNumber: cycle?.number ?? null,
|
|
282
|
+
createdAt: issue.createdAt,
|
|
282
283
|
updatedAt: issue.updatedAt,
|
|
283
284
|
} satisfies CachedLinearIssueInput;
|
|
284
285
|
})
|
|
@@ -18,50 +18,81 @@ function ensureDir(filePath: string): void {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
if (!projectId) return [];
|
|
21
|
+
function readConnectionsFile(projectId: string): { connections: TrackerConnection[]; defaultTracker?: string } {
|
|
22
|
+
if (!projectId) return { connections: [] };
|
|
23
23
|
const filePath = getConnectionsPath(projectId);
|
|
24
24
|
try {
|
|
25
25
|
const raw = readFileSync(filePath, "utf8");
|
|
26
26
|
const data = JSON.parse(raw);
|
|
27
|
-
return
|
|
27
|
+
return {
|
|
28
|
+
connections: Array.isArray(data.connections) ? data.connections : [],
|
|
29
|
+
defaultTracker: typeof data.defaultTracker === "string" ? data.defaultTracker : undefined,
|
|
30
|
+
};
|
|
28
31
|
} catch {
|
|
29
|
-
return [];
|
|
32
|
+
return { connections: [] };
|
|
30
33
|
}
|
|
31
34
|
}
|
|
32
35
|
|
|
36
|
+
function writeConnectionsFile(
|
|
37
|
+
projectId: string,
|
|
38
|
+
connections: TrackerConnection[],
|
|
39
|
+
defaultTracker: string | undefined
|
|
40
|
+
): void {
|
|
41
|
+
const filePath = getConnectionsPath(projectId);
|
|
42
|
+
ensureDir(filePath);
|
|
43
|
+
const payload: { connections: TrackerConnection[]; defaultTracker?: string } = { connections };
|
|
44
|
+
if (defaultTracker) payload.defaultTracker = defaultTracker;
|
|
45
|
+
writeFileSync(filePath, JSON.stringify(payload, null, 2), "utf8");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function listTrackerConnections(projectId: string): TrackerConnection[] {
|
|
49
|
+
return readConnectionsFile(projectId).connections;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function getDefaultTrackerType(projectId: string): string | null {
|
|
53
|
+
const data = readConnectionsFile(projectId);
|
|
54
|
+
const typeExists = (t: string) => data.connections.some((c) => c.type === t);
|
|
55
|
+
if (data.defaultTracker && typeExists(data.defaultTracker)) return data.defaultTracker;
|
|
56
|
+
// Fall back to the only connected tracker, if exactly one is configured.
|
|
57
|
+
return data.connections.length === 1 ? data.connections[0].type : null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function setDefaultTrackerType(projectId: string, trackerType: string | null): void {
|
|
61
|
+
if (!projectId) return;
|
|
62
|
+
const data = readConnectionsFile(projectId);
|
|
63
|
+
const next = trackerType && data.connections.some((c) => c.type === trackerType) ? trackerType : undefined;
|
|
64
|
+
writeConnectionsFile(projectId, data.connections, next);
|
|
65
|
+
}
|
|
66
|
+
|
|
33
67
|
export function addTrackerConnection(
|
|
34
68
|
projectId: string,
|
|
35
69
|
connection: TrackerConnection
|
|
36
70
|
): void {
|
|
37
71
|
if (!projectId) return;
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
const connections = listTrackerConnections(projectId);
|
|
41
|
-
// Prevent duplicates — update existing connection of same type
|
|
72
|
+
const data = readConnectionsFile(projectId);
|
|
73
|
+
const connections = data.connections.slice();
|
|
42
74
|
const existing = connections.findIndex((c) => c.type === connection.type);
|
|
43
75
|
if (existing >= 0) {
|
|
44
76
|
connections[existing] = connection;
|
|
45
77
|
} else {
|
|
46
78
|
connections.push(connection);
|
|
47
79
|
}
|
|
48
|
-
|
|
80
|
+
writeConnectionsFile(projectId, connections, data.defaultTracker);
|
|
49
81
|
}
|
|
50
82
|
|
|
51
83
|
export function removeTrackerConnection(projectId: string, trackerType: string): void {
|
|
52
84
|
if (!projectId) return;
|
|
53
|
-
const
|
|
54
|
-
const connections =
|
|
55
|
-
|
|
56
|
-
);
|
|
85
|
+
const data = readConnectionsFile(projectId);
|
|
86
|
+
const connections = data.connections.filter((c) => c.type !== trackerType);
|
|
87
|
+
const nextDefault = data.defaultTracker === trackerType ? undefined : data.defaultTracker;
|
|
57
88
|
if (connections.length === 0) {
|
|
89
|
+
const filePath = getConnectionsPath(projectId);
|
|
58
90
|
try {
|
|
59
91
|
unlinkSync(filePath);
|
|
60
92
|
} catch {
|
|
61
93
|
// already gone
|
|
62
94
|
}
|
|
63
95
|
} else {
|
|
64
|
-
|
|
65
|
-
writeFileSync(filePath, JSON.stringify({ connections }, null, 2), "utf8");
|
|
96
|
+
writeConnectionsFile(projectId, connections, nextDefault);
|
|
66
97
|
}
|
|
67
98
|
}
|
|
@@ -29,6 +29,8 @@ export interface TrackerAdapter {
|
|
|
29
29
|
type: string;
|
|
30
30
|
/** Human-readable name, e.g. 'Linear' or 'Jira Cloud' */
|
|
31
31
|
displayName: string;
|
|
32
|
+
/** Label for the group filter, e.g. 'Cycle' (Linear), 'Sprint' (Jira) */
|
|
33
|
+
groupLabel?: string;
|
|
32
34
|
/** Icon component to render in the sidebar and headers */
|
|
33
35
|
icon: ComponentType<{ className?: string }>;
|
|
34
36
|
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import "server-only";
|
|
2
|
+
|
|
3
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
4
|
+
import { promises as fs } from "node:fs";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { pragmaSet, transaction } from "../sqlite-compat";
|
|
8
|
+
|
|
9
|
+
const TRACKER_DIR =
|
|
10
|
+
process.env.AGX_TRACKER_DIR?.trim() ||
|
|
11
|
+
path.join(process.env.AGX_DATA_DIR || path.join(os.homedir(), ".agx"), "tracker");
|
|
12
|
+
const DB_PATH = path.join(TRACKER_DIR, "items.sqlite");
|
|
13
|
+
|
|
14
|
+
const FIBONACCI = [1, 2, 3, 5, 8, 13, 21] as const;
|
|
15
|
+
export type FibonacciEstimate = (typeof FIBONACCI)[number];
|
|
16
|
+
export const FIBONACCI_VALUES: readonly number[] = FIBONACCI;
|
|
17
|
+
|
|
18
|
+
export interface ItemMetadata {
|
|
19
|
+
labels: string[];
|
|
20
|
+
estimate: number | null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface LabelDefinition {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
color: string | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function withDb<T>(run: (db: DatabaseSync) => T): Promise<T> {
|
|
30
|
+
await fs.mkdir(TRACKER_DIR, { recursive: true });
|
|
31
|
+
const db = new (process.getBuiltinModule("node:sqlite") as typeof import("node:sqlite")).DatabaseSync(DB_PATH);
|
|
32
|
+
pragmaSet(db, "journal_mode = WAL");
|
|
33
|
+
try {
|
|
34
|
+
db.exec(`
|
|
35
|
+
CREATE TABLE IF NOT EXISTS tracker_item_metadata (
|
|
36
|
+
issue_id TEXT NOT NULL,
|
|
37
|
+
project_id TEXT NOT NULL,
|
|
38
|
+
labels_json TEXT NOT NULL DEFAULT '[]',
|
|
39
|
+
estimate INTEGER,
|
|
40
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
41
|
+
PRIMARY KEY (issue_id, project_id)
|
|
42
|
+
);
|
|
43
|
+
CREATE TABLE IF NOT EXISTS tracker_label_definitions (
|
|
44
|
+
id TEXT PRIMARY KEY,
|
|
45
|
+
project_id TEXT NOT NULL,
|
|
46
|
+
name TEXT NOT NULL,
|
|
47
|
+
color TEXT,
|
|
48
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
49
|
+
UNIQUE(project_id, name)
|
|
50
|
+
);
|
|
51
|
+
`);
|
|
52
|
+
return run(db);
|
|
53
|
+
} finally {
|
|
54
|
+
db.close();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function parseLabels(json: string | null): string[] {
|
|
59
|
+
if (!json) return [];
|
|
60
|
+
try {
|
|
61
|
+
const parsed = JSON.parse(json);
|
|
62
|
+
return Array.isArray(parsed) ? parsed.filter((l: unknown) => typeof l === "string" && l.trim()) : [];
|
|
63
|
+
} catch {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function getItemMetadata(projectId: string, issueId: string): Promise<ItemMetadata> {
|
|
69
|
+
return withDb((db) => {
|
|
70
|
+
const row = db.prepare(
|
|
71
|
+
"SELECT labels_json, estimate FROM tracker_item_metadata WHERE project_id = ? AND issue_id = ?"
|
|
72
|
+
).get(projectId, issueId) as { labels_json: string; estimate: number | null } | undefined;
|
|
73
|
+
if (!row) return { labels: [], estimate: null };
|
|
74
|
+
return { labels: parseLabels(row.labels_json), estimate: row.estimate };
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export async function setItemMetadata(
|
|
79
|
+
projectId: string,
|
|
80
|
+
issueId: string,
|
|
81
|
+
update: { labels?: string[]; estimate?: number | null }
|
|
82
|
+
): Promise<ItemMetadata> {
|
|
83
|
+
return withDb((db) => {
|
|
84
|
+
const existing = db.prepare(
|
|
85
|
+
"SELECT labels_json, estimate FROM tracker_item_metadata WHERE project_id = ? AND issue_id = ?"
|
|
86
|
+
).get(projectId, issueId) as { labels_json: string; estimate: number | null } | undefined;
|
|
87
|
+
|
|
88
|
+
const labels = update.labels ?? parseLabels(existing?.labels_json ?? null);
|
|
89
|
+
const estimate = update.estimate !== undefined ? update.estimate : (existing?.estimate ?? null);
|
|
90
|
+
|
|
91
|
+
db.prepare(`
|
|
92
|
+
INSERT INTO tracker_item_metadata (issue_id, project_id, labels_json, estimate, updated_at)
|
|
93
|
+
VALUES (?, ?, ?, ?, datetime('now'))
|
|
94
|
+
ON CONFLICT(issue_id, project_id) DO UPDATE SET
|
|
95
|
+
labels_json = excluded.labels_json,
|
|
96
|
+
estimate = excluded.estimate,
|
|
97
|
+
updated_at = excluded.updated_at
|
|
98
|
+
`).run(issueId, projectId, JSON.stringify(labels), estimate);
|
|
99
|
+
|
|
100
|
+
return { labels, estimate };
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export async function bulkGetItemMetadata(
|
|
105
|
+
projectId: string,
|
|
106
|
+
issueIds: string[]
|
|
107
|
+
): Promise<Map<string, ItemMetadata>> {
|
|
108
|
+
if (issueIds.length === 0) return new Map();
|
|
109
|
+
return withDb((db) => {
|
|
110
|
+
const placeholders = issueIds.map(() => "?").join(", ");
|
|
111
|
+
const rows = db.prepare(
|
|
112
|
+
`SELECT issue_id, labels_json, estimate FROM tracker_item_metadata
|
|
113
|
+
WHERE project_id = ? AND issue_id IN (${placeholders})`
|
|
114
|
+
).all(projectId, ...issueIds) as Array<{ issue_id: string; labels_json: string; estimate: number | null }>;
|
|
115
|
+
|
|
116
|
+
const result = new Map<string, ItemMetadata>();
|
|
117
|
+
for (const row of rows) {
|
|
118
|
+
result.set(row.issue_id, { labels: parseLabels(row.labels_json), estimate: row.estimate });
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export async function bulkSetEstimate(
|
|
125
|
+
projectId: string,
|
|
126
|
+
issueIds: string[],
|
|
127
|
+
estimate: number | null
|
|
128
|
+
): Promise<void> {
|
|
129
|
+
if (issueIds.length === 0) return;
|
|
130
|
+
return withDb((db) => {
|
|
131
|
+
transaction(db, () => {
|
|
132
|
+
const stmt = db.prepare(`
|
|
133
|
+
INSERT INTO tracker_item_metadata (issue_id, project_id, estimate, updated_at)
|
|
134
|
+
VALUES (?, ?, ?, datetime('now'))
|
|
135
|
+
ON CONFLICT(issue_id, project_id) DO UPDATE SET
|
|
136
|
+
estimate = excluded.estimate,
|
|
137
|
+
updated_at = excluded.updated_at
|
|
138
|
+
`);
|
|
139
|
+
for (const issueId of issueIds) {
|
|
140
|
+
stmt.run(issueId, projectId, estimate);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export async function bulkAddLabels(
|
|
147
|
+
projectId: string,
|
|
148
|
+
issueIds: string[],
|
|
149
|
+
labelsToAdd: string[]
|
|
150
|
+
): Promise<void> {
|
|
151
|
+
if (issueIds.length === 0 || labelsToAdd.length === 0) return;
|
|
152
|
+
return withDb((db) => {
|
|
153
|
+
transaction(db, () => {
|
|
154
|
+
for (const issueId of issueIds) {
|
|
155
|
+
const row = db.prepare(
|
|
156
|
+
"SELECT labels_json FROM tracker_item_metadata WHERE project_id = ? AND issue_id = ?"
|
|
157
|
+
).get(projectId, issueId) as { labels_json: string } | undefined;
|
|
158
|
+
|
|
159
|
+
const existing = parseLabels(row?.labels_json ?? null);
|
|
160
|
+
const merged = Array.from(new Set([...existing, ...labelsToAdd]));
|
|
161
|
+
|
|
162
|
+
db.prepare(`
|
|
163
|
+
INSERT INTO tracker_item_metadata (issue_id, project_id, labels_json, updated_at)
|
|
164
|
+
VALUES (?, ?, ?, datetime('now'))
|
|
165
|
+
ON CONFLICT(issue_id, project_id) DO UPDATE SET
|
|
166
|
+
labels_json = excluded.labels_json,
|
|
167
|
+
updated_at = excluded.updated_at
|
|
168
|
+
`).run(issueId, projectId, JSON.stringify(merged));
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export async function bulkRemoveLabel(
|
|
175
|
+
projectId: string,
|
|
176
|
+
issueIds: string[],
|
|
177
|
+
label: string
|
|
178
|
+
): Promise<void> {
|
|
179
|
+
if (issueIds.length === 0 || !label.trim()) return;
|
|
180
|
+
return withDb((db) => {
|
|
181
|
+
transaction(db, () => {
|
|
182
|
+
for (const issueId of issueIds) {
|
|
183
|
+
const row = db.prepare(
|
|
184
|
+
"SELECT labels_json FROM tracker_item_metadata WHERE project_id = ? AND issue_id = ?"
|
|
185
|
+
).get(projectId, issueId) as { labels_json: string } | undefined;
|
|
186
|
+
|
|
187
|
+
if (!row) continue;
|
|
188
|
+
const existing = parseLabels(row.labels_json);
|
|
189
|
+
const filtered = existing.filter((l) => l !== label);
|
|
190
|
+
|
|
191
|
+
db.prepare(
|
|
192
|
+
"UPDATE tracker_item_metadata SET labels_json = ?, updated_at = datetime('now') WHERE project_id = ? AND issue_id = ?"
|
|
193
|
+
).run(JSON.stringify(filtered), projectId, issueId);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export async function listLabelDefinitions(projectId: string): Promise<LabelDefinition[]> {
|
|
200
|
+
return withDb((db) => {
|
|
201
|
+
const rows = db.prepare(
|
|
202
|
+
"SELECT id, name, color FROM tracker_label_definitions WHERE project_id = ? ORDER BY name ASC"
|
|
203
|
+
).all(projectId) as Array<{ id: string; name: string; color: string | null }>;
|
|
204
|
+
return rows;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export async function createLabelDefinition(
|
|
209
|
+
projectId: string,
|
|
210
|
+
name: string,
|
|
211
|
+
color?: string | null
|
|
212
|
+
): Promise<LabelDefinition> {
|
|
213
|
+
const id = globalThis.crypto?.randomUUID?.() ?? `label-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
214
|
+
const trimmedName = name.trim();
|
|
215
|
+
if (!trimmedName) throw new Error("Label name is required");
|
|
216
|
+
|
|
217
|
+
return withDb((db) => {
|
|
218
|
+
db.prepare(
|
|
219
|
+
"INSERT INTO tracker_label_definitions (id, project_id, name, color) VALUES (?, ?, ?, ?)"
|
|
220
|
+
).run(id, projectId, trimmedName, color?.trim() || null);
|
|
221
|
+
return { id, name: trimmedName, color: color?.trim() || null };
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export async function deleteLabelDefinition(projectId: string, id: string): Promise<void> {
|
|
226
|
+
return withDb((db) => {
|
|
227
|
+
db.prepare(
|
|
228
|
+
"DELETE FROM tracker_label_definitions WHERE id = ? AND project_id = ?"
|
|
229
|
+
).run(id, projectId);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export async function listAllLabels(projectId: string): Promise<Array<{ name: string; color: string | null; defined: boolean }>> {
|
|
234
|
+
return withDb((db) => {
|
|
235
|
+
const definitions = db.prepare(
|
|
236
|
+
"SELECT name, color FROM tracker_label_definitions WHERE project_id = ? ORDER BY name ASC"
|
|
237
|
+
).all(projectId) as Array<{ name: string; color: string | null }>;
|
|
238
|
+
|
|
239
|
+
const metadataRows = db.prepare(
|
|
240
|
+
"SELECT labels_json FROM tracker_item_metadata WHERE project_id = ?"
|
|
241
|
+
).all(projectId) as Array<{ labels_json: string }>;
|
|
242
|
+
|
|
243
|
+
const definedNames = new Set(definitions.map((d) => d.name));
|
|
244
|
+
const allUsed = new Set<string>();
|
|
245
|
+
for (const row of metadataRows) {
|
|
246
|
+
for (const label of parseLabels(row.labels_json)) {
|
|
247
|
+
allUsed.add(label);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const result: Array<{ name: string; color: string | null; defined: boolean }> = [];
|
|
252
|
+
for (const def of definitions) {
|
|
253
|
+
result.push({ name: def.name, color: def.color, defined: true });
|
|
254
|
+
}
|
|
255
|
+
for (const name of allUsed) {
|
|
256
|
+
if (!definedNames.has(name)) {
|
|
257
|
+
result.push({ name, color: null, defined: false });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return result;
|
|
261
|
+
});
|
|
262
|
+
}
|
|
@@ -40,6 +40,7 @@ interface TrackerItemRow {
|
|
|
40
40
|
cycle_number: number | null;
|
|
41
41
|
priority: string | null;
|
|
42
42
|
metadata_json: string | null;
|
|
43
|
+
created_at: string | null;
|
|
43
44
|
updated_at: string;
|
|
44
45
|
pulled_at: number;
|
|
45
46
|
}
|
|
@@ -75,6 +76,7 @@ export interface CachedTrackerItemRecord {
|
|
|
75
76
|
cycleNumber: number | null;
|
|
76
77
|
priority: string | null;
|
|
77
78
|
metadata: Record<string, unknown>;
|
|
79
|
+
createdAt: string | null;
|
|
78
80
|
updatedAt: string;
|
|
79
81
|
pulledAt: string;
|
|
80
82
|
}
|
|
@@ -102,6 +104,7 @@ export interface CachedTrackerItemInput {
|
|
|
102
104
|
cycleNumber?: number | null;
|
|
103
105
|
priority?: string | null;
|
|
104
106
|
metadata?: Record<string, unknown>;
|
|
107
|
+
createdAt?: string | null;
|
|
105
108
|
updatedAt: string;
|
|
106
109
|
}
|
|
107
110
|
|
|
@@ -211,6 +214,7 @@ function mapRow(row: TrackerItemRow): CachedTrackerItemRecord {
|
|
|
211
214
|
cycleNumber: row.cycle_number,
|
|
212
215
|
priority: row.priority,
|
|
213
216
|
metadata: row.metadata_json ? JSON.parse(row.metadata_json) : {},
|
|
217
|
+
createdAt: row.created_at,
|
|
214
218
|
updatedAt: row.updated_at,
|
|
215
219
|
pulledAt: toIso(row.pulled_at),
|
|
216
220
|
};
|
|
@@ -384,6 +388,7 @@ async function withTrackerItemDatabase<T>(run: (db: DatabaseSync) => T): Promise
|
|
|
384
388
|
ensureColumn(db, "tracker_items", "status_category", "status_category TEXT NOT NULL DEFAULT 'todo'");
|
|
385
389
|
ensureColumn(db, "tracker_items", "priority", "priority TEXT");
|
|
386
390
|
ensureColumn(db, "tracker_items", "metadata_json", "metadata_json TEXT");
|
|
391
|
+
ensureColumn(db, "tracker_items", "created_at", "created_at TEXT");
|
|
387
392
|
|
|
388
393
|
return run(db);
|
|
389
394
|
} finally {
|
|
@@ -411,8 +416,8 @@ export async function replaceCachedTrackerItems(input: {
|
|
|
411
416
|
labels_json, url, status, status_category,
|
|
412
417
|
assignee_id, assignee_name, assignee_email, is_assigned_to_me,
|
|
413
418
|
team_id, team_name, team_key, cycle_id, cycle_name, cycle_number,
|
|
414
|
-
priority, metadata_json, updated_at, pulled_at
|
|
415
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
419
|
+
priority, metadata_json, created_at, updated_at, pulled_at
|
|
420
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
416
421
|
ON CONFLICT(issue_id) DO UPDATE SET
|
|
417
422
|
tracker_type = excluded.tracker_type,
|
|
418
423
|
tracker_id = excluded.tracker_id,
|
|
@@ -435,6 +440,7 @@ export async function replaceCachedTrackerItems(input: {
|
|
|
435
440
|
cycle_number = excluded.cycle_number,
|
|
436
441
|
priority = excluded.priority,
|
|
437
442
|
metadata_json = excluded.metadata_json,
|
|
443
|
+
created_at = excluded.created_at,
|
|
438
444
|
updated_at = excluded.updated_at,
|
|
439
445
|
pulled_at = excluded.pulled_at
|
|
440
446
|
`);
|
|
@@ -464,6 +470,7 @@ export async function replaceCachedTrackerItems(input: {
|
|
|
464
470
|
toOptionalNumber(issue.cycleNumber ?? null),
|
|
465
471
|
toOptionalString(issue.priority ?? null),
|
|
466
472
|
issue.metadata ? JSON.stringify(issue.metadata) : null,
|
|
473
|
+
toOptionalString(issue.createdAt ?? null),
|
|
467
474
|
issue.updatedAt.trim(),
|
|
468
475
|
pulledAtMs
|
|
469
476
|
);
|
|
@@ -693,7 +700,7 @@ export async function listCachedTrackerItems(
|
|
|
693
700
|
orderClause = `ORDER BY LOWER(status) ${dirSql}, identifier ASC`;
|
|
694
701
|
break;
|
|
695
702
|
case "created":
|
|
696
|
-
orderClause = `ORDER BY
|
|
703
|
+
orderClause = `ORDER BY COALESCE(created_at, updated_at) ${dirSql}, identifier ASC`;
|
|
697
704
|
break;
|
|
698
705
|
default:
|
|
699
706
|
orderClause = `ORDER BY updated_at ${dirSql}, identifier ASC`;
|
|
@@ -510,6 +510,48 @@ export async function getIssueActivityMap(
|
|
|
510
510
|
});
|
|
511
511
|
}
|
|
512
512
|
|
|
513
|
+
export interface IssueStats {
|
|
514
|
+
issueId: string;
|
|
515
|
+
sessions: number;
|
|
516
|
+
messages: number;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
export async function getIssueStats(
|
|
520
|
+
projectId?: string | null
|
|
521
|
+
): Promise<IssueStats[]> {
|
|
522
|
+
return withTrackerRunDatabase((db) => {
|
|
523
|
+
const hasProject = projectId?.trim();
|
|
524
|
+
const sql = hasProject
|
|
525
|
+
? `SELECT tr.issue_id,
|
|
526
|
+
COUNT(DISTINCT tr.id) AS sessions,
|
|
527
|
+
COALESCE(SUM(mc.cnt), 0) AS messages
|
|
528
|
+
FROM tracker_runs tr
|
|
529
|
+
LEFT JOIN (
|
|
530
|
+
SELECT thread_id, COUNT(*) AS cnt FROM messages GROUP BY thread_id
|
|
531
|
+
) mc ON mc.thread_id = tr.thread_id
|
|
532
|
+
WHERE tr.project_id = ?
|
|
533
|
+
GROUP BY tr.issue_id`
|
|
534
|
+
: `SELECT tr.issue_id,
|
|
535
|
+
COUNT(DISTINCT tr.id) AS sessions,
|
|
536
|
+
COALESCE(SUM(mc.cnt), 0) AS messages
|
|
537
|
+
FROM tracker_runs tr
|
|
538
|
+
LEFT JOIN (
|
|
539
|
+
SELECT thread_id, COUNT(*) AS cnt FROM messages GROUP BY thread_id
|
|
540
|
+
) mc ON mc.thread_id = tr.thread_id
|
|
541
|
+
GROUP BY tr.issue_id`;
|
|
542
|
+
|
|
543
|
+
const rows = hasProject
|
|
544
|
+
? (db.prepare(sql).all(projectId!.trim()) as unknown as Array<{ issue_id: string; sessions: number; messages: number }>)
|
|
545
|
+
: (db.prepare(sql).all() as unknown as Array<{ issue_id: string; sessions: number; messages: number }>);
|
|
546
|
+
|
|
547
|
+
return rows.map((row) => ({
|
|
548
|
+
issueId: row.issue_id,
|
|
549
|
+
sessions: row.sessions,
|
|
550
|
+
messages: row.messages,
|
|
551
|
+
}));
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
|
|
513
555
|
export interface IssueActiveAgent {
|
|
514
556
|
issueId: string;
|
|
515
557
|
agentId: string;
|
|
@@ -379,6 +379,13 @@ export async function executeObjectiveWorker(opts: {
|
|
|
379
379
|
? (parsed.decision as string).trim().toLowerCase()
|
|
380
380
|
: '';
|
|
381
381
|
const action = rawAction === 'work' ? 'work_ticket' : rawAction;
|
|
382
|
+
if (!action) {
|
|
383
|
+
const raw = controllerResult.output ?? '';
|
|
384
|
+
console.warn(
|
|
385
|
+
`[objective-worker] empty action from controller (job=${opts.job.id}, outputLen=${raw.length}, parsed=${parsed ? 'object' : 'null'}):`,
|
|
386
|
+
raw.slice(0, 500),
|
|
387
|
+
);
|
|
388
|
+
}
|
|
382
389
|
const reason = typeof parsed?.reason === 'string' ? parsed.reason.trim() : '';
|
|
383
390
|
const objectiveProgress = normalizeAssessmentProgress(parsed?.objectiveProgress);
|
|
384
391
|
const objectiveStatus = normalizeAssessmentStatus(parsed?.objectiveStatus);
|
|
@@ -336,6 +336,13 @@ export async function executeTaskWorker(opts: {
|
|
|
336
336
|
? (parsed.decision as string).trim().toLowerCase()
|
|
337
337
|
: '';
|
|
338
338
|
const action = rawAction === 'work' ? 'work_ticket' : rawAction;
|
|
339
|
+
if (!action) {
|
|
340
|
+
const raw = controllerResult.output ?? '';
|
|
341
|
+
console.warn(
|
|
342
|
+
`[task-worker] empty action from controller (job=${opts.job.id}, outputLen=${raw.length}, parsed=${parsed ? 'object' : 'null'}):`,
|
|
343
|
+
raw.slice(0, 500),
|
|
344
|
+
);
|
|
345
|
+
}
|
|
339
346
|
const reason = typeof parsed?.reason === 'string' ? parsed.reason.trim() : '';
|
|
340
347
|
|
|
341
348
|
// Phase 4: Act - dispatch action
|
|
@@ -5,6 +5,7 @@ export interface TrackerBoardFilters {
|
|
|
5
5
|
assigneeIds: string[];
|
|
6
6
|
statusCategories: string[];
|
|
7
7
|
groupIds: string[];
|
|
8
|
+
labelNames: string[];
|
|
8
9
|
sortBy: "activity" | "identifier" | "status" | "created";
|
|
9
10
|
sortDir: "asc" | "desc";
|
|
10
11
|
hasActivity: boolean;
|
|
@@ -15,6 +16,7 @@ const DEFAULT_TRACKER_BOARD_FILTERS: TrackerBoardFilters = {
|
|
|
15
16
|
assigneeIds: [],
|
|
16
17
|
statusCategories: [],
|
|
17
18
|
groupIds: [],
|
|
19
|
+
labelNames: [],
|
|
18
20
|
sortBy: "activity",
|
|
19
21
|
sortDir: "desc",
|
|
20
22
|
hasActivity: false,
|
|
@@ -69,6 +71,7 @@ export function loadTrackerBoardFilters(
|
|
|
69
71
|
assigneeIds: normalizeStringArray(parsed.assigneeIds),
|
|
70
72
|
statusCategories: normalizeStringArray(parsed.statusCategories),
|
|
71
73
|
groupIds: normalizeStringArray(parsed.groupIds),
|
|
74
|
+
labelNames: normalizeStringArray(parsed.labelNames),
|
|
72
75
|
sortBy: ["activity", "identifier", "status", "created"].includes(parsed.sortBy as string)
|
|
73
76
|
? (parsed.sortBy as TrackerBoardFilters["sortBy"])
|
|
74
77
|
: DEFAULT_TRACKER_BOARD_FILTERS.sortBy,
|
|
@@ -101,6 +104,7 @@ export function persistTrackerBoardFilters(
|
|
|
101
104
|
assigneeIds: normalizeStringArray(filters.assigneeIds),
|
|
102
105
|
statusCategories: normalizeStringArray(filters.statusCategories),
|
|
103
106
|
groupIds: normalizeStringArray(filters.groupIds),
|
|
107
|
+
labelNames: normalizeStringArray(filters.labelNames),
|
|
104
108
|
sortBy: filters.sortBy || "activity",
|
|
105
109
|
sortDir: filters.sortDir || "desc",
|
|
106
110
|
hasActivity: !!filters.hasActivity,
|
|
@@ -11199,8 +11199,13 @@ function getDb2() {
|
|
|
11199
11199
|
const hasOldTable = db2.prepare(
|
|
11200
11200
|
"SELECT name FROM sqlite_master WHERE type='table' AND name='linear_runs'"
|
|
11201
11201
|
).get();
|
|
11202
|
-
|
|
11202
|
+
const hasNewTable = db2.prepare(
|
|
11203
|
+
"SELECT name FROM sqlite_master WHERE type='table' AND name='tracker_runs'"
|
|
11204
|
+
).get();
|
|
11205
|
+
if (hasOldTable && !hasNewTable) {
|
|
11203
11206
|
db2.exec("ALTER TABLE linear_runs RENAME TO tracker_runs");
|
|
11207
|
+
} else if (hasOldTable && hasNewTable) {
|
|
11208
|
+
db2.exec("DROP TABLE linear_runs");
|
|
11204
11209
|
}
|
|
11205
11210
|
db2.exec(`
|
|
11206
11211
|
CREATE TABLE IF NOT EXISTS tracker_runs (
|
|
@@ -24121,7 +24126,6 @@ function parseNaturalSchedule(input) {
|
|
|
24121
24126
|
var PATTERNS;
|
|
24122
24127
|
var init_nl_schedule = __esm({
|
|
24123
24128
|
"apps/local/src/graph/nl-schedule.ts"() {
|
|
24124
|
-
"use strict";
|
|
24125
24129
|
PATTERNS = [
|
|
24126
24130
|
// "every N seconds" → intervalMs only (sub-minute)
|
|
24127
24131
|
{
|