@mndrk/agx 2.4.9 → 2.4.10

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.
Files changed (205) hide show
  1. package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
  2. package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +2 -2
  3. package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
  4. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +2 -2
  5. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
  6. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.html +2 -2
  12. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.rsc +1 -1
  13. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  14. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  15. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  16. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  17. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  18. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  19. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.html +2 -2
  20. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.rsc +1 -1
  21. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_full.segment.rsc +1 -1
  22. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  23. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_index.segment.rsc +1 -1
  24. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_tree.segment.rsc +1 -1
  25. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +1 -1
  26. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents.segment.rsc +1 -1
  27. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
  28. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
  29. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/export/route.js.nft.json +1 -1
  30. package/cloud-runtime/standalone/apps/local/.next/server/app/api/chat/route.js.nft.json +1 -1
  31. package/cloud-runtime/standalone/apps/local/.next/server/app/api/file-search/route.js.nft.json +1 -1
  32. package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js.nft.json +1 -1
  33. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/scheduled-tasks/route.js.nft.json +1 -1
  34. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.nft.json +1 -1
  35. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/search/route.js.nft.json +1 -1
  36. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/teams/route.js.nft.json +1 -1
  37. package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/poll/route.js.nft.json +1 -1
  38. package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/check/[id]/route.js.nft.json +1 -1
  39. package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/route.js.nft.json +1 -1
  40. package/cloud-runtime/standalone/apps/local/.next/server/app/api/queue/route.js.nft.json +1 -1
  41. package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
  42. package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
  43. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/assign/route.js.nft.json +1 -1
  44. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/available/route.js.nft.json +1 -1
  45. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/detail/route.js.nft.json +1 -1
  46. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/history/route.js.nft.json +1 -1
  47. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/learn/route.js.nft.json +1 -1
  48. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/route.js.nft.json +1 -1
  49. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -1
  50. package/cloud-runtime/standalone/apps/local/.next/server/app/api/status/route.js.nft.json +1 -1
  51. package/cloud-runtime/standalone/apps/local/.next/server/app/api/summarize/route.js.nft.json +1 -1
  52. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
  53. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
  54. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js.nft.json +1 -1
  55. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  56. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/route.js.nft.json +1 -1
  57. package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
  58. package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/route.js.nft.json +1 -1
  59. package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/recap/route.js.nft.json +1 -1
  60. package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/scripted/route.js.nft.json +1 -1
  61. package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/status/route.js.nft.json +1 -1
  62. package/cloud-runtime/standalone/apps/local/.next/server/app/api/update-check/route.js.nft.json +1 -1
  63. package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
  64. package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +2 -2
  65. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  66. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +2 -2
  67. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_head.segment.rsc +1 -1
  68. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_index.segment.rsc +1 -1
  69. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  70. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.html +2 -2
  71. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.rsc +1 -1
  72. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_full.segment.rsc +1 -1
  73. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_head.segment.rsc +1 -1
  74. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_index.segment.rsc +1 -1
  75. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_tree.segment.rsc +1 -1
  76. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github/select-repos/__PAGE__.segment.rsc +1 -1
  77. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github/select-repos.segment.rsc +1 -1
  78. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github.segment.rsc +1 -1
  79. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations.segment.rsc +1 -1
  80. package/cloud-runtime/standalone/apps/local/.next/server/app/page_client-reference-manifest.js +1 -1
  81. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page.js.nft.json +1 -1
  82. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
  83. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page.js.nft.json +1 -1
  84. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
  85. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.nft.json +1 -1
  86. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
  87. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
  88. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
  89. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/notifications/page.js.nft.json +1 -1
  90. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/notifications/page_client-reference-manifest.js +1 -1
  91. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.js.nft.json +1 -1
  92. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page_client-reference-manifest.js +1 -1
  93. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page.js.nft.json +1 -1
  94. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page_client-reference-manifest.js +1 -1
  95. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  96. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  97. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/prs/page.js.nft.json +1 -1
  98. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/prs/page_client-reference-manifest.js +1 -1
  99. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.js.nft.json +1 -1
  100. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
  101. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page.js.nft.json +1 -1
  102. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page_client-reference-manifest.js +1 -1
  103. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page.js.nft.json +1 -1
  104. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page_client-reference-manifest.js +1 -1
  105. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page.js.nft.json +1 -1
  106. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page_client-reference-manifest.js +1 -1
  107. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page.js.nft.json +1 -1
  108. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page_client-reference-manifest.js +1 -1
  109. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page.js.nft.json +1 -1
  110. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page_client-reference-manifest.js +1 -1
  111. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page.js.nft.json +1 -1
  112. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page_client-reference-manifest.js +1 -1
  113. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
  114. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
  115. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page.js.nft.json +1 -1
  116. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page_client-reference-manifest.js +1 -1
  117. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page.js.nft.json +1 -1
  118. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page_client-reference-manifest.js +1 -1
  119. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page.js.nft.json +1 -1
  120. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page_client-reference-manifest.js +1 -1
  121. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page.js.nft.json +1 -1
  122. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page_client-reference-manifest.js +1 -1
  123. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page.js.nft.json +1 -1
  124. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  125. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.html +2 -2
  126. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.rsc +2 -2
  127. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_full.segment.rsc +2 -2
  128. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  129. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_index.segment.rsc +1 -1
  130. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
  131. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
  132. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  133. package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  134. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.html +2 -2
  135. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.rsc +2 -2
  136. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +2 -2
  137. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  138. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_index.segment.rsc +1 -1
  139. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
  140. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +2 -2
  141. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  142. package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
  143. package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +1 -1
  144. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +1 -1
  145. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
  146. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +1 -1
  147. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +1 -1
  148. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +1 -1
  149. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
  150. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__8917bc4c._.js +1 -1
  151. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_22ab9b7c._.js +1 -1
  152. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__7a31a76d._.js +3 -0
  153. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__9193284e._.js +1 -1
  154. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__c0bc6058._.js +7 -0
  155. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_988d29c0._.js +1 -1
  156. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_page_tsx_76330306._.js +1 -1
  157. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_page_tsx_b5cec607._.js +5 -5
  158. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_setup_page_tsx_9a67cfaf._.js +1 -1
  159. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_ProjectModal_tsx_c447494c._.js +3 -0
  160. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_TrackerBoard_tsx_98970bab._.js +1 -1
  161. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_eec36ab6._.js +1 -1
  162. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_fed01721._.js +1 -1
  163. package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
  164. package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
  165. package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +2 -2
  166. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
  167. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
  168. package/cloud-runtime/standalone/apps/local/.next/static/chunks/23b7c6b08d8bf807.js +1 -0
  169. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{d6a9cc66254693b8.js → 46add4300ec4ed84.js} +1 -1
  170. package/cloud-runtime/standalone/apps/local/.next/static/chunks/5709a6f7c5c182d6.js +1 -0
  171. package/cloud-runtime/standalone/apps/local/.next/static/chunks/9ac96f1f33a266f9.js +1 -0
  172. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{8b87c2521c519a1f.js → afad1102543847bf.js} +1 -1
  173. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{c9a2c4b55bb76f4f.js → b27f760849f14f13.js} +5 -5
  174. package/cloud-runtime/standalone/apps/local/.next/static/chunks/b53629835d2a70f0.js +16 -0
  175. package/cloud-runtime/standalone/apps/local/.next/static/chunks/bb99cb03648e6fae.js +1 -0
  176. package/cloud-runtime/standalone/apps/local/.next/static/chunks/c8c0c4b13e08bb14.js +1 -0
  177. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{3fce625820bc2bd4.js → de56d09bb0de7dd5.js} +2 -2
  178. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1585dd5f9ec4866a.js → e5fdfbbe9bae1f03.js} +1 -1
  179. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{90dd4ab03ab145d1.js → f007705fe5db26f1.js} +1 -1
  180. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/route.ts +4 -1
  181. package/cloud-runtime/standalone/apps/local/app/api/projects/payload.ts +23 -9
  182. package/cloud-runtime/standalone/apps/local/app/api/projects/route.ts +4 -1
  183. package/cloud-runtime/standalone/apps/local/app/page.tsx +2 -2
  184. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/page.tsx +1 -1
  185. package/cloud-runtime/standalone/apps/local/app/projects/page.tsx +7 -3
  186. package/cloud-runtime/standalone/apps/local/components/ProjectModal.tsx +111 -91
  187. package/cloud-runtime/standalone/apps/local/components/TrackerBoard.tsx +2 -2
  188. package/cloud-runtime/standalone/apps/local/components/project-repo-validation.ts +65 -0
  189. package/cloud-runtime/standalone/apps/local/components/setup/McpSetupStep.tsx +1 -1
  190. package/cloud-runtime/standalone/apps/local/components/setup/ProviderStep.tsx +2 -2
  191. package/cloud-runtime/standalone/apps/local/components/thread/WorkspaceSidebar.tsx +6 -2
  192. package/cloud-runtime/standalone/apps/local/components/tracking/TrackerSetup.tsx +2 -2
  193. package/cloud-runtime/standalone/apps/local/worker/index.js +3 -1
  194. package/package.json +1 -1
  195. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__636799fb._.js +0 -3
  196. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__e02a457c._.js +0 -3
  197. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_ae1a134f._.js +0 -7
  198. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0d22a723b9b96e65.js +0 -1
  199. package/cloud-runtime/standalone/apps/local/.next/static/chunks/1bc8cc9cbb99c1ed.js +0 -1
  200. package/cloud-runtime/standalone/apps/local/.next/static/chunks/c352706a0ad7e35d.js +0 -1
  201. package/cloud-runtime/standalone/apps/local/.next/static/chunks/cf33cb29946990e3.js +0 -16
  202. package/cloud-runtime/standalone/apps/local/.next/static/chunks/e3bdd1e0f385114e.js +0 -1
  203. /package/cloud-runtime/standalone/apps/local/.next/static/{EGpM0P8xAEWKkoW-3Ib69 → x7w3oijN4B1r7IvTuL96T}/_buildManifest.js +0 -0
  204. /package/cloud-runtime/standalone/apps/local/.next/static/{EGpM0P8xAEWKkoW-3Ib69 → x7w3oijN4B1r7IvTuL96T}/_clientMiddlewareManifest.json +0 -0
  205. /package/cloud-runtime/standalone/apps/local/.next/static/{EGpM0P8xAEWKkoW-3Ib69 → x7w3oijN4B1r7IvTuL96T}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  import { NextRequest, NextResponse } from "next/server";
2
2
  import { db } from "@/lib/db-instance";
3
- import { buildProjectUpdatePayload } from "../payload";
3
+ import { buildProjectUpdatePayload, InvalidProjectPayloadError } from "../payload";
4
4
  import { LOCAL_USER } from "@/lib/auth-mode";
5
5
  import { PROJECT_OBJECTIVES_METADATA_KEY, readProjectObjectivesWorkspace } from "@/lib/project-objectives";
6
6
  import { getObjectiveRepository } from "@/src/objectives/repository";
@@ -98,6 +98,9 @@ export async function PATCH(request: NextRequest, { params }: { params: ParamsAr
98
98
 
99
99
  return NextResponse.json({ project: hydrateProjectObjectiveMetadata(project) });
100
100
  } catch (err) {
101
+ if (err instanceof InvalidProjectPayloadError) {
102
+ return NextResponse.json({ error: err.message }, { status: 400 });
103
+ }
101
104
  logger.error("Error updating project", logger.formatError(err));
102
105
  return NextResponse.json({ error: "Failed to update project" }, { status: 500 });
103
106
  }
@@ -1,5 +1,12 @@
1
1
  import type { ProjectInput, ProjectRepoInput, ProjectUpdatePayload } from "@/lib/db-adapter.interface";
2
2
 
3
+ export class InvalidProjectPayloadError extends Error {
4
+ constructor(message: string) {
5
+ super(message);
6
+ this.name = "InvalidProjectPayloadError";
7
+ }
8
+ }
9
+
3
10
  function toOptionalString(value: unknown): string | undefined {
4
11
  if (typeof value !== "string") return undefined;
5
12
  const trimmed = value.trim();
@@ -23,16 +30,28 @@ function parseProjectRepos(value: unknown): ProjectRepoInput[] | undefined {
23
30
  if (!Array.isArray(value)) return undefined;
24
31
 
25
32
  const repos: ProjectRepoInput[] = [];
26
- value.forEach((item) => {
33
+ value.forEach((item, index) => {
27
34
  if (!item || typeof item !== "object") return;
28
35
 
29
36
  const rawName = (item as Record<string, unknown>).name;
37
+ const rawPath = (item as Record<string, unknown>).path;
30
38
  const name = typeof rawName === "string" ? rawName.trim() : "";
31
- if (!name) return;
39
+ const path = typeof rawPath === "string" ? rawPath.trim() : "";
40
+
41
+ if (!name && !path) return;
42
+ if (!name) {
43
+ throw new InvalidProjectPayloadError(
44
+ `Folder name is required for repos[${index}] when a local path is provided`
45
+ );
46
+ }
47
+ if (!path) {
48
+ throw new InvalidProjectPayloadError(
49
+ `Local path is required for repos[${index}] when a folder name is provided`
50
+ );
51
+ }
32
52
 
33
53
  const repo: Partial<ProjectRepoInput> = { name };
34
54
  const rawId = (item as Record<string, unknown>).id;
35
- const rawPath = (item as Record<string, unknown>).path;
36
55
  const rawGitUrl = (item as Record<string, unknown>).git_url;
37
56
  const rawNotes = (item as Record<string, unknown>).notes;
38
57
 
@@ -40,12 +59,7 @@ function parseProjectRepos(value: unknown): ProjectRepoInput[] | undefined {
40
59
  repo.id = rawId.trim();
41
60
  }
42
61
 
43
- if (typeof rawPath === "string" && rawPath.trim()) {
44
- repo.path = rawPath.trim();
45
- } else {
46
- // Path is mandatory
47
- return;
48
- }
62
+ repo.path = path;
49
63
 
50
64
  if (typeof rawGitUrl === "string" && rawGitUrl.trim()) {
51
65
  repo.git_url = rawGitUrl.trim();
@@ -1,6 +1,6 @@
1
1
  import { NextRequest, NextResponse } from "next/server";
2
2
  import { db } from "@/lib/db-instance";
3
- import { buildProjectInput } from "./payload";
3
+ import { buildProjectInput, InvalidProjectPayloadError } from "./payload";
4
4
  import { LOCAL_USER } from "@/lib/auth-mode";
5
5
  import { hydrateProjectsObjectiveMetadata } from "./objective-metadata";
6
6
  import { logger } from "@/lib/logger";
@@ -57,6 +57,9 @@ export async function POST(request: NextRequest) {
57
57
  const project = await db.createProject(userId, projectInput);
58
58
  return NextResponse.json({ project }, { status: 201 });
59
59
  } catch (error) {
60
+ if (error instanceof InvalidProjectPayloadError) {
61
+ return NextResponse.json({ error: error.message }, { status: 400 });
62
+ }
60
63
  logger.error("Error creating project", logger.formatError(error));
61
64
  if (isMissingProjectsSchemaError(error)) {
62
65
  return NextResponse.json(
@@ -79,7 +79,7 @@ export default function Home() {
79
79
  <EmptyStateCard
80
80
  icon={<FolderPlus className="w-6 h-6 text-[var(--foreground)]" />}
81
81
  title="Create your first project"
82
- description="A project groups your repos, teams, and automations. Create one to start working with agents."
82
+ description="A project groups your tickets, repos, and PRs — plus the agent teams that work them. Create one to get started."
83
83
  ctaLabel="Create a project"
84
84
  ctaHref="/projects?new=1"
85
85
  />
@@ -92,7 +92,7 @@ export default function Home() {
92
92
  <EmptyStateCard
93
93
  icon={<Users className="w-6 h-6 text-[var(--foreground)]" />}
94
94
  title={`Add a team to ${state.projectName}`}
95
- description="Teams give your project the agents that will actually do the work. Add one to get started."
95
+ description="Teams are the agents that work through your tickets and PRs. Add one to start shipping."
96
96
  ctaLabel="Add a team"
97
97
  ctaHref={`/projects/${state.projectSlug}/teams/new`}
98
98
  />
@@ -47,7 +47,7 @@ export default function ProjectPage({
47
47
  <EmptyStateCard
48
48
  icon={<Users className="w-6 h-6 text-[var(--foreground)]" />}
49
49
  title={`Add a team to ${project.name}`}
50
- description="Teams give your project the agents that will actually do the work. Add one to get started."
50
+ description="Teams are the agents that work through your tickets and PRs. Add one to start shipping."
51
51
  ctaLabel="Add a team"
52
52
  ctaHref={`/projects/${project.slug}/teams/new`}
53
53
  />
@@ -5,6 +5,10 @@ import { useRouter, useSearchParams } from "next/navigation";
5
5
  import Layout from "@/components/Layout";
6
6
  import ProjectCard from "@/components/ProjectCard";
7
7
  import ProjectModal, { useProjectFormState, createProjectPayload } from "@/components/ProjectModal";
8
+ import {
9
+ findInvalidProjectRepoDraft,
10
+ formatInvalidProjectRepoDraftMessage,
11
+ } from "@/components/project-repo-validation";
8
12
  import TaskList from "@/components/TaskList";
9
13
  import { Task } from "@/components/TaskCard";
10
14
  import { useTasks } from "@/hooks/useTasks";
@@ -91,9 +95,9 @@ export default function ProjectsPage() {
91
95
  return;
92
96
  }
93
97
 
94
- const invalidRepo = modalRepos.find(r => r.name.trim() && !r.path.trim());
98
+ const invalidRepo = findInvalidProjectRepoDraft(modalRepos);
95
99
  if (invalidRepo) {
96
- setModalFormError(`Local path is required for folder "${invalidRepo.name}"`);
100
+ setModalFormError(formatInvalidProjectRepoDraftMessage(invalidRepo));
97
101
  return;
98
102
  }
99
103
 
@@ -169,7 +173,7 @@ export default function ProjectsPage() {
169
173
  </div>
170
174
  <h2 className="text-2xl font-bold mb-2">You have no projects</h2>
171
175
  <p className="text-[var(--muted-foreground)] text-center max-w-sm mb-8 leading-relaxed">
172
- Create your first project to start organizing your tasks and connecting your folders.
176
+ Create your first project to connect your tickets, repos, and agent teams — and start shipping PRs.
173
177
  </p>
174
178
  <button
175
179
  onClick={openNewProjectModal}
@@ -3,6 +3,12 @@
3
3
  import { useCallback, useEffect, useRef, useState } from "react";
4
4
  import { ProjectWithRepos } from "@/hooks/useProjects";
5
5
  import DirectoryBrowser from "@/components/DirectoryBrowser";
6
+ import {
7
+ findInvalidProjectRepoDraft,
8
+ formatInvalidProjectRepoDraftMessage,
9
+ getProjectRepoValidationIssue,
10
+ isCompleteProjectRepoDraft,
11
+ } from "@/components/project-repo-validation";
6
12
 
7
13
  export interface ProjectFormState {
8
14
  name: string;
@@ -99,8 +105,13 @@ export function createProjectPayload(
99
105
  form: ProjectFormState,
100
106
  repos: RepoDraft[]
101
107
  ) {
108
+ const invalidRepo = findInvalidProjectRepoDraft(repos);
109
+ if (invalidRepo) {
110
+ throw new Error(formatInvalidProjectRepoDraftMessage(invalidRepo));
111
+ }
112
+
102
113
  const repoPayload = repos
103
- .filter((repo) => repo.name.trim() && repo.path.trim())
114
+ .filter((repo) => isCompleteProjectRepoDraft(repo))
104
115
  .map((repo) => ({
105
116
  ...(repo.id ? { id: repo.id } : {}),
106
117
  name: repo.name.trim(),
@@ -229,107 +240,116 @@ function ProjectFormFields({
229
240
  </button>
230
241
  </div>
231
242
  <div className="space-y-4">
232
- {repos.map((repo, index) => (
233
- <div key={index} className="p-4 rounded-2xl border border-[var(--card-border)] bg-[var(--muted)]/20 space-y-3 relative group">
234
- <div className="flex items-center justify-between">
235
- <div>
236
- <div className="text-xs font-bold text-[var(--foreground)] uppercase">Folder #{index + 1}</div>
237
- {isEditingProject && !isRepoExpanded(index) ? (
238
- <div className="mt-1 text-sm text-[var(--muted-foreground)]">
239
- <div>{repo.name || "Unnamed folder"}</div>
240
- <div className="truncate">{repo.path || "No local path set"}</div>
241
- </div>
242
- ) : null}
243
- </div>
244
- <div className="flex items-center gap-3">
245
- {isEditingProject && (
246
- <button
247
- type="button"
248
- onClick={() => toggleRepoExpanded(index)}
249
- className="text-xs font-semibold text-[var(--primary)] hover:underline"
250
- disabled={isSubmitting}
251
- >
252
- {isRepoExpanded(index) ? "Done" : "Edit"}
253
- </button>
254
- )}
255
- {repos.length > 1 && (
256
- <button
257
- type="button"
258
- onClick={() => onRemoveRepo(index)}
259
- className="text-xs font-semibold text-[var(--destructive)] hover:underline"
260
- disabled={isSubmitting}
261
- >
262
- Remove
263
- </button>
264
- )}
265
- </div>
266
- </div>
267
- {isRepoExpanded(index) ? (
268
- <div className="grid gap-3 md:grid-cols-2">
269
- <input
270
- value={repo.name}
271
- onChange={(e) => onRepoChange(index, "name", e.target.value)}
272
- placeholder="Name (e.g. Frontend, API Docs, Design System)"
273
- className="input text-sm"
274
- disabled={isSubmitting}
275
- />
276
- <div className="space-y-1">
277
- <div className="flex items-center gap-2">
278
- <input
279
- value={repo.path}
280
- onChange={(e) => onRepoChange(index, "path", e.target.value)}
281
- placeholder="Local path to folder"
282
- className={`input text-sm flex-1${repo.name.trim() && !repo.path.trim() ? " border-[var(--destructive)]/50 ring-1 ring-[var(--destructive)]/20" : ""}`}
243
+ {repos.map((repo, index) => {
244
+ const validationIssue = getProjectRepoValidationIssue(repo);
245
+
246
+ return (
247
+ <div key={index} className="p-4 rounded-2xl border border-[var(--card-border)] bg-[var(--muted)]/20 space-y-3 relative group">
248
+ <div className="flex items-center justify-between">
249
+ <div>
250
+ <div className="text-xs font-bold text-[var(--foreground)] uppercase">Folder #{index + 1}</div>
251
+ {isEditingProject && !isRepoExpanded(index) ? (
252
+ <div className="mt-1 text-sm text-[var(--muted-foreground)]">
253
+ <div>{repo.name || "Unnamed folder"}</div>
254
+ <div className="truncate">{repo.path || "No local path set"}</div>
255
+ </div>
256
+ ) : null}
257
+ </div>
258
+ <div className="flex items-center gap-3">
259
+ {isEditingProject && (
260
+ <button
261
+ type="button"
262
+ onClick={() => toggleRepoExpanded(index)}
263
+ className="text-xs font-semibold text-[var(--primary)] hover:underline"
283
264
  disabled={isSubmitting}
284
- />
265
+ >
266
+ {isRepoExpanded(index) ? "Done" : "Edit"}
267
+ </button>
268
+ )}
269
+ {repos.length > 1 && (
285
270
  <button
286
271
  type="button"
287
- onClick={async () => {
288
- try {
289
- const res = await fetch("/api/filesystem/pick-folder", { method: "POST" });
290
- const data = await res.json();
291
- if (data.path) {
292
- onRepoChange(index, "path", data.path);
293
- }
294
- } catch {
295
- setBrowsingRepoIndex(browsingRepoIndex === index ? null : index);
296
- }
297
- }}
298
- className="px-3 py-2 rounded-xl border border-[var(--card-border)] bg-[var(--muted)]/30 hover:bg-[var(--muted)]/60 transition-colors text-xs font-semibold text-[var(--muted-foreground)] whitespace-nowrap"
272
+ onClick={() => onRemoveRepo(index)}
273
+ className="text-xs font-semibold text-[var(--destructive)] hover:underline"
299
274
  disabled={isSubmitting}
300
275
  >
301
- Browse
276
+ Remove
302
277
  </button>
303
- </div>
304
- {repo.name.trim() && !repo.path.trim() && (
305
- <p className="text-[11px] text-[var(--destructive)]">Local path is required</p>
306
278
  )}
307
279
  </div>
308
- {browsingRepoIndex === index && (
280
+ </div>
281
+ {isRepoExpanded(index) ? (
282
+ <div className="grid gap-3 md:grid-cols-2">
283
+ <div className="space-y-1">
284
+ <input
285
+ value={repo.name}
286
+ onChange={(e) => onRepoChange(index, "name", e.target.value)}
287
+ placeholder="Name (e.g. Frontend, API Docs, Design System)"
288
+ className={`input text-sm w-full${validationIssue === "missing_name" ? " border-[var(--destructive)]/50 ring-1 ring-[var(--destructive)]/20" : ""}`}
289
+ disabled={isSubmitting}
290
+ />
291
+ {validationIssue === "missing_name" && (
292
+ <p className="text-[11px] text-[var(--destructive)]">Folder name is required</p>
293
+ )}
294
+ </div>
295
+ <div className="space-y-1">
296
+ <div className="flex items-center gap-2">
297
+ <input
298
+ value={repo.path}
299
+ onChange={(e) => onRepoChange(index, "path", e.target.value)}
300
+ placeholder="Local path to folder"
301
+ className={`input text-sm flex-1${validationIssue === "missing_path" ? " border-[var(--destructive)]/50 ring-1 ring-[var(--destructive)]/20" : ""}`}
302
+ disabled={isSubmitting}
303
+ />
304
+ <button
305
+ type="button"
306
+ onClick={async () => {
307
+ try {
308
+ const res = await fetch("/api/filesystem/pick-folder", { method: "POST" });
309
+ const data = await res.json();
310
+ if (data.path) {
311
+ onRepoChange(index, "path", data.path);
312
+ }
313
+ } catch {
314
+ setBrowsingRepoIndex(browsingRepoIndex === index ? null : index);
315
+ }
316
+ }}
317
+ className="px-3 py-2 rounded-xl border border-[var(--card-border)] bg-[var(--muted)]/30 hover:bg-[var(--muted)]/60 transition-colors text-xs font-semibold text-[var(--muted-foreground)] whitespace-nowrap"
318
+ disabled={isSubmitting}
319
+ >
320
+ Browse
321
+ </button>
322
+ </div>
323
+ {validationIssue === "missing_path" && (
324
+ <p className="text-[11px] text-[var(--destructive)]">Local path is required</p>
325
+ )}
326
+ </div>
327
+ {browsingRepoIndex === index && (
328
+ <div className="md:col-span-2">
329
+ <DirectoryBrowser
330
+ initialPath={repo.path || ""}
331
+ onSelect={(selectedPath) => {
332
+ onRepoChange(index, "path", selectedPath);
333
+ setBrowsingRepoIndex(null);
334
+ }}
335
+ onCancel={() => setBrowsingRepoIndex(null)}
336
+ />
337
+ </div>
338
+ )}
309
339
  <div className="md:col-span-2">
310
- <DirectoryBrowser
311
- initialPath={repo.path || ""}
312
- onSelect={(selectedPath) => {
313
- onRepoChange(index, "path", selectedPath);
314
- setBrowsingRepoIndex(null);
315
- }}
316
- onCancel={() => setBrowsingRepoIndex(null)}
340
+ <textarea
341
+ value={repo.notes}
342
+ onChange={(e) => onRepoChange(index, "notes", e.target.value)}
343
+ placeholder="Notes for this folder — e.g. coding conventions, deploy steps, ownership, doc standards..."
344
+ className="input text-sm w-full min-h-24 resize-y"
345
+ disabled={isSubmitting}
317
346
  />
318
347
  </div>
319
- )}
320
- <div className="md:col-span-2">
321
- <textarea
322
- value={repo.notes}
323
- onChange={(e) => onRepoChange(index, "notes", e.target.value)}
324
- placeholder="Notes for this folder — e.g. coding conventions, deploy steps, ownership, doc standards..."
325
- className="input text-sm w-full min-h-24 resize-y"
326
- disabled={isSubmitting}
327
- />
328
348
  </div>
329
- </div>
330
- ) : null}
331
- </div>
332
- ))}
349
+ ) : null}
350
+ </div>
351
+ );
352
+ })}
333
353
  </div>
334
354
  </div>
335
355
  </div>
@@ -408,7 +428,7 @@ export default function ProjectModal({
408
428
  };
409
429
  }, [editingProject]);
410
430
 
411
- const hasIncompleteRepo = repos.some(r => r.name.trim() && !r.path.trim());
431
+ const hasIncompleteRepo = Boolean(findInvalidProjectRepoDraft(repos));
412
432
  const isFormInvalid = !form.name.trim() || hasIncompleteRepo;
413
433
 
414
434
  if (!isOpen) return null;
@@ -1904,7 +1904,7 @@ export default function TrackerBoard({ trackerType, projectId, projectSlug, init
1904
1904
  />
1905
1905
  ) : isAwaitingRestore ? null : participants.length === 0 ? (
1906
1906
  <div className="flex h-full items-center justify-center text-xs text-[var(--muted-foreground)]">
1907
- Add at least one agent to this project to start a session.
1907
+ Add an agent team so you can pick a ticket and start shipping.
1908
1908
  </div>
1909
1909
  ) : (
1910
1910
  <TicketPanel
@@ -2518,7 +2518,7 @@ export default function TrackerBoard({ trackerType, projectId, projectSlug, init
2518
2518
  </div>
2519
2519
  ) : isAwaitingRestore ? null : participants.length === 0 ? (
2520
2520
  <div className="flex h-full items-center justify-center text-xs text-[var(--muted-foreground)]">
2521
- Add at least one agent to this project to start a session.
2521
+ Add an agent team so you can pick a ticket and start shipping.
2522
2522
  </div>
2523
2523
  ) : (
2524
2524
  <TicketPanel
@@ -0,0 +1,65 @@
1
+ "use client";
2
+
3
+ export interface ProjectRepoDraftLike {
4
+ name: string;
5
+ path: string;
6
+ }
7
+
8
+ export type ProjectRepoValidationIssue = "missing_name" | "missing_path";
9
+
10
+ export interface InvalidProjectRepoDraft<T extends ProjectRepoDraftLike = ProjectRepoDraftLike> {
11
+ index: number;
12
+ issue: ProjectRepoValidationIssue;
13
+ repo: T;
14
+ }
15
+
16
+ function trimRepoFields(repo: ProjectRepoDraftLike) {
17
+ return {
18
+ name: repo.name.trim(),
19
+ path: repo.path.trim(),
20
+ };
21
+ }
22
+
23
+ export function getProjectRepoValidationIssue(
24
+ repo: ProjectRepoDraftLike
25
+ ): ProjectRepoValidationIssue | null {
26
+ const { name, path } = trimRepoFields(repo);
27
+
28
+ if (!name && !path) {
29
+ return null;
30
+ }
31
+ if (!name) {
32
+ return "missing_name";
33
+ }
34
+ if (!path) {
35
+ return "missing_path";
36
+ }
37
+ return null;
38
+ }
39
+
40
+ export function findInvalidProjectRepoDraft<T extends ProjectRepoDraftLike>(
41
+ repos: T[]
42
+ ): InvalidProjectRepoDraft<T> | null {
43
+ for (const [index, repo] of repos.entries()) {
44
+ const issue = getProjectRepoValidationIssue(repo);
45
+ if (issue) {
46
+ return { index, issue, repo };
47
+ }
48
+ }
49
+ return null;
50
+ }
51
+
52
+ export function isCompleteProjectRepoDraft(repo: ProjectRepoDraftLike): boolean {
53
+ const { name, path } = trimRepoFields(repo);
54
+ return Boolean(name && path);
55
+ }
56
+
57
+ export function formatInvalidProjectRepoDraftMessage(
58
+ invalidRepo: InvalidProjectRepoDraft
59
+ ): string {
60
+ const { issue, repo } = invalidRepo;
61
+ if (issue === "missing_name") {
62
+ return `Folder name is required for local path "${repo.path.trim()}"`;
63
+ }
64
+ return `Local path is required for folder "${repo.name.trim()}"`;
65
+ }
@@ -17,7 +17,7 @@ const MCP_SERVERS: McpServer[] = [
17
17
  {
18
18
  id: "linear",
19
19
  name: "Linear",
20
- description: "Read and update tickets so agents can track work in Linear during execution.",
20
+ description: "So your Linear tickets show up in AGX and agents can move them through to a PR.",
21
21
  docsUrl: "https://linear.app/docs/mcp",
22
22
  },
23
23
  ];
@@ -161,8 +161,8 @@ export function ProviderStep({ clis, readyState, authenticatedCount, totalCount,
161
161
  <div className="text-center mb-8">
162
162
  <h1 className="text-[24px] font-bold text-[var(--foreground)] tracking-tight">Connect a Provider</h1>
163
163
  <p className="mt-2 text-[14px] text-[var(--muted-foreground)] leading-relaxed">
164
- AGX orchestrates AI agents across multiple providers.<br />
165
- Connect at least one to get started.
164
+ AGX runs AI-assisted dev work across your tickets, repos, and PRs.<br />
165
+ Connect one or more providers to power the agents that do the work.
166
166
  </p>
167
167
  </div>
168
168
 
@@ -35,6 +35,10 @@ import { useFocusManagement } from "@/hooks/useFocusManagement";
35
35
  import type { SidebarStageResult } from "@/hooks/useSidebarStage";
36
36
  import { agentAvatarUrl, AgentForm, type AgentFormData } from "@/components/chat-ui/ParticipantBar";
37
37
  import ProjectModal, { createProjectPayload, useProjectFormState } from "@/components/ProjectModal";
38
+ import {
39
+ findInvalidProjectRepoDraft,
40
+ formatInvalidProjectRepoDraftMessage,
41
+ } from "@/components/project-repo-validation";
38
42
  import { readProjectObjectivesWorkspace } from "@/lib/project-objectives";
39
43
  import { TaskTrackingNav } from "@/components/tracking/TaskTrackingNav";
40
44
  import { LinearIcon } from "@/lib/tracker/adapters/linear/linear-icon";
@@ -455,9 +459,9 @@ export function WorkspaceSidebar({
455
459
  projectFormState.setFormError("Project name is required");
456
460
  return;
457
461
  }
458
- const invalidRepo = projectFormState.repos.find((repo) => repo.name.trim() && !repo.path.trim());
462
+ const invalidRepo = findInvalidProjectRepoDraft(projectFormState.repos);
459
463
  if (invalidRepo) {
460
- projectFormState.setFormError(`Local path is required for folder "${invalidRepo.name}"`);
464
+ projectFormState.setFormError(formatInvalidProjectRepoDraftMessage(invalidRepo));
461
465
  return;
462
466
  }
463
467
  projectFormState.setFormError(null);
@@ -82,7 +82,7 @@ export default function TrackerSetup({
82
82
  <div className="space-y-2">
83
83
  <h3 className="text-xl font-bold text-foreground capitalize">{trackerType} Connected</h3>
84
84
  <p className="text-sm text-muted-foreground leading-relaxed">
85
- Your {trackerType} workspace is successfully connected. The agent can now sync issues and manage your backlog.
85
+ Your {trackerType} tickets now live in AGX. Assign them to agents, review the work, and ship PRs from one window.
86
86
  </p>
87
87
  </div>
88
88
  <div className="mt-2 px-4 py-1.5 rounded-full bg-background border text-xs font-medium text-muted-foreground flex items-center gap-2">
@@ -130,7 +130,7 @@ export default function TrackerSetup({
130
130
  <span className="text-sm font-medium">MCP Server</span>
131
131
  </div>
132
132
  <p className="text-xs text-muted-foreground leading-relaxed -mt-2">
133
- Install the {trackerType} MCP server so agents can access {trackerType} directly.
133
+ Connect your {trackerType} workspace so your tickets show up in AGX and agents can work them through to a PR.
134
134
  </p>
135
135
  {activeClis.map((cli) => {
136
136
  const label = CLI_LABELS[cli];
@@ -426,6 +426,7 @@ function writeDebugLog(event, payload) {
426
426
  var import_fs2, import_os2, import_path2, AGX_DATA_DIR, DEBUG_LOG_PATH;
427
427
  var init_debug_log = __esm({
428
428
  "apps/local/lib/debug-log.ts"() {
429
+ "use strict";
429
430
  import_fs2 = __toESM(require("fs"));
430
431
  import_os2 = __toESM(require("os"));
431
432
  import_path2 = __toESM(require("path"));
@@ -10478,7 +10479,6 @@ ${skills}
10478
10479
  var import_child_process2, import_fs10, import_os10, import_path10, isNonEmptyString, CliRunError, createRawParser, extractClaudeAssistantText, createClaudeStreamJsonParser, createGeminiStreamJsonParser, extractCodexAssistantText, createCodexJsonParser, createThoughtFilterParser, AGX_WRAPPED_PROVIDERS;
10479
10480
  var init_cli_runner = __esm({
10480
10481
  "apps/local/lib/cli-runner.ts"() {
10481
- "use strict";
10482
10482
  import_child_process2 = require("child_process");
10483
10483
  import_fs10 = __toESM(require("fs"));
10484
10484
  import_os10 = __toESM(require("os"));
@@ -10489,6 +10489,8 @@ var init_cli_runner = __esm({
10489
10489
  init_scheduled_task_skill();
10490
10490
  isNonEmptyString = (value) => typeof value === "string" && value.trim().length > 0;
10491
10491
  CliRunError = class extends Error {
10492
+ exitCode;
10493
+ logs;
10492
10494
  constructor(message, exitCode, logs) {
10493
10495
  super(message);
10494
10496
  this.name = "CliRunError";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mndrk/agx",
3
- "version": "2.4.9",
3
+ "version": "2.4.10",
4
4
  "description": "The workflow surface for AI-assisted dev work across Jira/Linear, GitHub, and Claude/Codex",
5
5
  "engines": {
6
6
  "node": ">=22.16.0"
@@ -1,3 +0,0 @@
1
- module.exports=[556704,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},419920,(a,b,c)=>{"use strict";b.exports=a.r(433430).vendored.contexts.HooksClientContext},731042,(a,b,c)=>{"use strict";b.exports=a.r(433430).vendored.contexts.ServerInsertedHtml},120635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},263841,(a,b,c)=>{"use strict";b.exports=a.r(433430).vendored.contexts.AppRouterContext},234154,(a,b,c)=>{"use strict";b.exports=a.r(433430).vendored["react-ssr"].ReactServerDOMTurbopackClient},285320,a=>{"use strict";let b=(0,a.i(831709).default)("arrow-left",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);a.s(["ArrowLeft",()=>b],285320)},654340,a=>{"use strict";let b=(0,a.i(831709).default)("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);a.s(["Activity",()=>b],654340)},296037,a=>{"use strict";var b=a.i(786220);function c(a,d={}){let[e,f]=(0,b.useState)([]),[g,h]=(0,b.useState)(!0),[i,j]=(0,b.useState)(null),k=(0,b.useRef)(!1),l=d.requireProjectId??!1,m=d.includeObjectiveJobs??!1,n=d.objectiveId?.trim()||null,o=(0,b.useCallback)(async()=>{if(l&&!a){f([]),j(null),h(!1),k.current=!0;return}try{k.current||h(!0);let b=new URLSearchParams;a&&b.set("projectId",a),n&&b.set("objectiveId",n),m&&b.set("includeObjectiveJobs","true");let c=b.toString(),d=await fetch(`/api/prompt-jobs${c?`?${c}`:""}`);if(!d.ok)throw Error(`Failed to fetch: ${d.status}`);let e=await d.json();f(e.jobs??[]),j(null)}catch(a){j(a instanceof Error?a.message:String(a))}finally{h(!1),k.current=!0}},[m,n,a,l]);(0,b.useEffect)(()=>{k.current=!1,o();let a=setInterval(o,1e4);return()=>clearInterval(a)},[o]);let p=(0,b.useCallback)(async a=>{let b=await fetch("/api/prompt-jobs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!b.ok)return null;let{job:c}=await b.json();return await o(),c?.id??null},[o]),q=(0,b.useCallback)(async(a,b)=>{let c=await fetch(`/api/prompt-jobs/${a}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)});return c.ok&&await o(),c.ok},[o]),r=(0,b.useCallback)(async a=>{let b=await fetch(`/api/prompt-jobs/${a}`,{method:"DELETE"});if(b.ok)return await o(),{ok:!0};let c=await b.json().catch(()=>({}));return{ok:!1,error:c.error||c.message||`Failed to delete scheduled task (${b.status})`}},[o]),s=(0,b.useCallback)(async a=>{let b="active"===a.state?"paused":"active",c=await fetch(`/api/prompt-jobs/${a.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:b})});return c.ok&&await o(),c.ok},[o]),t=(0,b.useCallback)(async a=>{let b=await fetch("/api/prompt-jobs/poll",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jobId:a})});return b.ok&&await o(),b.ok},[o]),u=(0,b.useCallback)(async a=>{let b=await fetch(`/api/prompt-jobs/${a}/cancel`,{method:"POST"});return b.ok&&await o(),b.ok},[o]);return{jobs:e,loading:g,error:i,refresh:o,createJob:p,updateJob:q,deleteJob:r,toggleJob:s,runNow:t,cancelRun:u,fetchRuns:(0,b.useCallback)(async a=>{let b=await fetch(`/api/prompt-jobs/${a}/runs`);return b.ok?(await b.json()).runs??[]:[]},[])}}a.s(["usePromptJobs",()=>c])}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__636799fb._.js.map