@mndrk/agx 2.4.6 → 2.4.8

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 (364) hide show
  1. package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
  2. package/cloud-runtime/standalone/apps/local/.next/app-path-routes-manifest.json +4 -0
  3. package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +2 -2
  4. package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
  5. package/cloud-runtime/standalone/apps/local/.next/routes-manifest.json +33 -0
  6. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +2 -2
  7. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
  8. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.html +2 -2
  15. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.rsc +2 -2
  16. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  17. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  18. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  19. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  21. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page.js.nft.json +1 -1
  23. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  24. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page.js.nft.json +1 -1
  25. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  26. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.html +2 -2
  27. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.rsc +3 -3
  28. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_full.segment.rsc +3 -3
  29. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  30. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_index.segment.rsc +2 -2
  31. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
  32. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +2 -2
  33. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents.segment.rsc +1 -1
  34. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
  35. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
  36. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/export/route.js.nft.json +1 -1
  37. package/cloud-runtime/standalone/apps/local/.next/server/app/api/chat/route.js.nft.json +1 -1
  38. package/cloud-runtime/standalone/apps/local/.next/server/app/api/file-search/route.js.nft.json +1 -1
  39. package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js.nft.json +1 -1
  40. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/activities/route.js +1 -1
  41. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/activities/route.js.nft.json +1 -1
  42. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/notes/[noteId]/route.js.nft.json +1 -1
  43. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/notes/route.js.nft.json +1 -1
  44. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route/app-paths-manifest.json +3 -0
  45. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route/build-manifest.json +11 -0
  46. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route/server-reference-manifest.json +4 -0
  47. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route.js +13 -0
  48. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route.js.map +5 -0
  49. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route.js.nft.json +1 -0
  50. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/program/route_client-reference-manifest.js +2 -0
  51. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/route.js.nft.json +1 -1
  52. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/scheduled-tasks/route.js.nft.json +1 -1
  53. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/validate/route.js.nft.json +1 -1
  54. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.nft.json +1 -1
  55. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  56. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/search/route.js.nft.json +1 -1
  57. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/teams/route.js.nft.json +1 -1
  58. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route/app-paths-manifest.json +3 -0
  59. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route/build-manifest.json +11 -0
  60. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route/server-reference-manifest.json +4 -0
  61. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route.js +11 -0
  62. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route.js.map +5 -0
  63. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route.js.nft.json +1 -0
  64. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/export/route_client-reference-manifest.js +2 -0
  65. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route/app-paths-manifest.json +3 -0
  66. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route/build-manifest.json +11 -0
  67. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route/server-reference-manifest.json +4 -0
  68. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route.js +11 -0
  69. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route.js.map +5 -0
  70. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route.js.nft.json +1 -0
  71. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/workspace/import/route_client-reference-manifest.js +2 -0
  72. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/route.js.nft.json +1 -1
  73. package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/poll/route.js.nft.json +1 -1
  74. package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/check/[id]/route.js.nft.json +1 -1
  75. package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/route.js.nft.json +1 -1
  76. package/cloud-runtime/standalone/apps/local/.next/server/app/api/queue/route.js.nft.json +1 -1
  77. package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
  78. package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
  79. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/assign/route.js.nft.json +1 -1
  80. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/available/route.js.nft.json +1 -1
  81. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/detail/route.js.nft.json +1 -1
  82. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/history/route.js.nft.json +1 -1
  83. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/learn/route.js.nft.json +1 -1
  84. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/route.js.nft.json +1 -1
  85. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -1
  86. package/cloud-runtime/standalone/apps/local/.next/server/app/api/status/route.js.nft.json +1 -1
  87. package/cloud-runtime/standalone/apps/local/.next/server/app/api/summarize/route.js.nft.json +1 -1
  88. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
  89. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
  90. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js.nft.json +1 -1
  91. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  92. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/route.js.nft.json +1 -1
  93. package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
  94. package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/route.js.nft.json +1 -1
  95. package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/items/[id]/recap/route.js.nft.json +1 -1
  96. package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/runs/scripted/route.js.nft.json +1 -1
  97. package/cloud-runtime/standalone/apps/local/.next/server/app/api/trackers/[tracker]/status/route.js.nft.json +1 -1
  98. package/cloud-runtime/standalone/apps/local/.next/server/app/api/update-check/route.js.nft.json +1 -1
  99. package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
  100. package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +3 -3
  101. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  102. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +3 -3
  103. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_head.segment.rsc +1 -1
  104. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_index.segment.rsc +2 -2
  105. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  106. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos/page_client-reference-manifest.js +1 -1
  107. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.html +2 -2
  108. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.rsc +2 -2
  109. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_full.segment.rsc +2 -2
  110. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_head.segment.rsc +1 -1
  111. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_index.segment.rsc +2 -2
  112. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_tree.segment.rsc +2 -2
  113. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github/select-repos/__PAGE__.segment.rsc +1 -1
  114. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github/select-repos.segment.rsc +1 -1
  115. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github.segment.rsc +1 -1
  116. package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations.segment.rsc +1 -1
  117. package/cloud-runtime/standalone/apps/local/.next/server/app/page_client-reference-manifest.js +1 -1
  118. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page.js.nft.json +1 -1
  119. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
  120. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page.js.nft.json +1 -1
  121. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
  122. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.nft.json +1 -1
  123. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
  124. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
  125. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
  126. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/notifications/page.js.nft.json +1 -1
  127. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/notifications/page_client-reference-manifest.js +1 -1
  128. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.js.nft.json +1 -1
  129. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page_client-reference-manifest.js +1 -1
  130. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page.js.nft.json +1 -1
  131. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page_client-reference-manifest.js +1 -1
  132. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  133. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  134. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/prs/page.js.nft.json +1 -1
  135. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/prs/page_client-reference-manifest.js +1 -1
  136. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.js.nft.json +1 -1
  137. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
  138. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page.js.nft.json +1 -1
  139. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page_client-reference-manifest.js +1 -1
  140. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page.js.nft.json +1 -1
  141. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page_client-reference-manifest.js +1 -1
  142. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page.js.nft.json +1 -1
  143. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page_client-reference-manifest.js +1 -1
  144. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page.js.nft.json +1 -1
  145. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page_client-reference-manifest.js +1 -1
  146. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page.js.nft.json +1 -1
  147. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page_client-reference-manifest.js +1 -1
  148. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page.js.nft.json +1 -1
  149. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page_client-reference-manifest.js +1 -1
  150. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
  151. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
  152. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/app-paths-manifest.json +3 -0
  153. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/build-manifest.json +18 -0
  154. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/next-font-manifest.json +11 -0
  155. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/react-loadable-manifest.json +1 -0
  156. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page/server-reference-manifest.json +4 -0
  157. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page.js +16 -0
  158. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page.js.map +5 -0
  159. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page.js.nft.json +1 -0
  160. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page_client-reference-manifest.js +2 -0
  161. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page.js.nft.json +1 -1
  162. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page_client-reference-manifest.js +1 -1
  163. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page.js.nft.json +1 -1
  164. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page_client-reference-manifest.js +1 -1
  165. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page.js.nft.json +1 -1
  166. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page_client-reference-manifest.js +1 -1
  167. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page.js.nft.json +1 -1
  168. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  169. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.html +2 -2
  170. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.rsc +3 -3
  171. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_full.segment.rsc +3 -3
  172. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  173. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  174. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  175. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
  176. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  177. package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page.js.nft.json +1 -1
  178. package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  179. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.html +2 -2
  180. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.rsc +3 -3
  181. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +3 -3
  182. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  183. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_index.segment.rsc +2 -2
  184. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  185. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +2 -2
  186. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  187. package/cloud-runtime/standalone/apps/local/.next/server/app/status/page_client-reference-manifest.js +1 -1
  188. package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
  189. package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +2 -2
  190. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +2 -2
  191. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
  192. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +2 -2
  193. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +2 -2
  194. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +1 -1
  195. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
  196. package/cloud-runtime/standalone/apps/local/.next/server/app-paths-manifest.json +4 -0
  197. package/cloud-runtime/standalone/apps/local/.next/server/chunks/30bdd_server_app_api_projects_[id]_workspace_export_route_actions_e161f108.js +3 -0
  198. package/cloud-runtime/standalone/apps/local/.next/server/chunks/30bdd_server_app_api_projects_[id]_workspace_import_route_actions_10d2bce2.js +3 -0
  199. package/cloud-runtime/standalone/apps/local/.next/server/chunks/7255d_app_api_projects_[id]_objectives_[objectiveId]_program_route_actions_e6cdbc76.js +3 -0
  200. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__1563ebff._.js +2 -2
  201. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__3fdd57cb._.js +1 -1
  202. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__45af4365._.js +1 -1
  203. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__683b7ad7._.js +1 -1
  204. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__736d5859._.js +1 -1
  205. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__96b5ea56._.js +3 -0
  206. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__ba72d342._.js +5 -5
  207. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__c3188470._.js +1 -1
  208. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__eb69343e._.js +3 -0
  209. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_1d99e7a5._.js +1 -1
  210. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_29a06140._.js +1 -1
  211. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_4d88e4dc._.js +91 -0
  212. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_4dec65a2._.js +1 -1
  213. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_50e3a6e3._.js +1 -1
  214. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_56a2544c._.js +1 -1
  215. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_5843a1a1._.js +1 -1
  216. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_a15e73a6._.js +1 -1
  217. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_bd72806a._.js +1 -1
  218. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_c101ba9e._.js +1 -1
  219. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_c530bd77._.js +11 -0
  220. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_d69937f2._.js +91 -0
  221. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_e2867b32._.js +3 -0
  222. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_e32b0cab._.js +91 -0
  223. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_5ab8f104._.js +1 -1
  224. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_db_ts_77c23d6c._.js +1 -1
  225. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0da96_local__next-internal_server_app_projects_[slug]_thread_page_actions_3ceeb59b.js +3 -0
  226. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__1e0fd816._.js +3 -0
  227. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__42499ecf._.js +3 -0
  228. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__5f31e40b._.js +3 -0
  229. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__636799fb._.js +3 -0
  230. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__4bf7d5b9._.js → [root-of-the-server]__74436f61._.js} +2 -2
  231. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__9434d6d7._.js +3 -0
  232. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__bd339da0._.js +3 -0
  233. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__d08d7899._.js +3 -0
  234. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__e02a457c._.js +3 -0
  235. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__e3a1fef0._.js +3 -0
  236. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__f802e7d1._.js +3 -0
  237. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__ff96bb77._.js +3 -0
  238. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_6a2ba8f0._.js +3 -0
  239. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_7cb6b08a._.js +3 -0
  240. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_a0f42923._.js +7 -0
  241. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_a93c1059._.js +3 -0
  242. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_components_PromptJobBoard_tsx_281b2873._.js → apps_local_04cb9fd5._.js} +3 -3
  243. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_15502af8._.js +3 -0
  244. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_16eaf7ae._.js +3 -0
  245. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_3c11c068._.js +8 -0
  246. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_89b49aad._.js +7 -0
  247. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_988d29c0._.js +1 -1
  248. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_ae1a134f._.js +7 -0
  249. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_agents_page_tsx_2a02508d._.js +1 -1
  250. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_folders_page_tsx_72fb68e5._.js +1 -1
  251. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_layout_tsx_3bb31889._.js +1 -1
  252. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_page_tsx_76330306._.js +1 -1
  253. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_b8e580cc._.js +4 -0
  254. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_TrackerBoard_tsx_98970bab._.js +2 -2
  255. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_app_projects_[slug]_thread_[threadId]_page_tsx_2a1d1d5e._.js → apps_local_components_chat-ui_ChatContainer_tsx_47371955._.js} +2 -2
  256. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_751ab3d3._.js +3 -3
  257. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_eb223411._.js +18 -0
  258. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_eec36ab6._.js +1 -1
  259. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_7d1abfbf._.js → apps_local_f1c9872a._.js} +2 -2
  260. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_fed01721._.js +1 -1
  261. package/cloud-runtime/standalone/apps/local/.next/server/functions-config-manifest.json +3 -0
  262. package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
  263. package/cloud-runtime/standalone/apps/local/.next/server/next-font-manifest.js +1 -1
  264. package/cloud-runtime/standalone/apps/local/.next/server/next-font-manifest.json +4 -0
  265. package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
  266. package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +2 -2
  267. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
  268. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
  269. package/cloud-runtime/standalone/apps/local/.next/static/chunks/08e75b35d6c52269.js +1 -0
  270. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0d22a723b9b96e65.js +1 -0
  271. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{cb19d71dd7ffb935.js → 1585dd5f9ec4866a.js} +1 -1
  272. package/cloud-runtime/standalone/apps/local/.next/static/chunks/1bc8cc9cbb99c1ed.js +1 -0
  273. package/cloud-runtime/standalone/apps/local/.next/static/chunks/2586c0baa16e9a0d.js +16 -0
  274. package/cloud-runtime/standalone/apps/local/.next/static/chunks/2aa24a251622fd06.js +5 -0
  275. package/cloud-runtime/standalone/apps/local/.next/static/chunks/39513207112d6828.js +1 -0
  276. package/cloud-runtime/standalone/apps/local/.next/static/chunks/3fce625820bc2bd4.js +16 -0
  277. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{8d8fe711583a59f0.js → 41ae15220fc19bf7.js} +2 -2
  278. package/cloud-runtime/standalone/apps/local/.next/static/chunks/67b36c70b72e0e10.js +1 -0
  279. package/cloud-runtime/standalone/apps/local/.next/static/chunks/7bfbfcd072f8d61e.js +20 -0
  280. package/cloud-runtime/standalone/apps/local/.next/static/chunks/7cf26dd04166f32f.js +6 -0
  281. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{74e3a3e93be78db8.js → 8b87c2521c519a1f.js} +9 -9
  282. package/cloud-runtime/standalone/apps/local/.next/static/chunks/90dd4ab03ab145d1.js +16 -0
  283. package/cloud-runtime/standalone/apps/local/.next/static/chunks/93749b45e2700808.js +16 -0
  284. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{48feca51cf97c8a7.js → 9bb8f1406365af81.js} +1 -1
  285. package/cloud-runtime/standalone/apps/local/.next/static/chunks/b4aa71020acae46f.js +16 -0
  286. package/cloud-runtime/standalone/apps/local/.next/static/chunks/c352706a0ad7e35d.js +1 -0
  287. package/cloud-runtime/standalone/apps/local/.next/static/chunks/c5436b2b7e8f0ca9.js +16 -0
  288. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1600dd6ff8607d8f.js → c9a2c4b55bb76f4f.js} +6 -6
  289. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1fbcd40dccee738f.js → cf33cb29946990e3.js} +2 -2
  290. package/cloud-runtime/standalone/apps/local/.next/static/chunks/d6a9cc66254693b8.js +1 -0
  291. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{9e703dd5d95e9557.js → e3bdd1e0f385114e.js} +1 -1
  292. package/cloud-runtime/standalone/apps/local/.next/static/chunks/ed606d6f94457578.css +1 -0
  293. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{6ffcd12eabd7c65e.js → f71d73895d228547.js} +1 -1
  294. package/cloud-runtime/standalone/apps/local/.next/static/chunks/f750d2f1882d31a8.js +5 -0
  295. package/cloud-runtime/standalone/apps/local/app/api/automations/route.ts +2 -10
  296. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/objectives/[objectiveId]/program/route.ts +77 -0
  297. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/workspace/export/route.ts +35 -0
  298. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/workspace/import/route.ts +91 -0
  299. package/cloud-runtime/standalone/apps/local/app/api/prompt-jobs/route.ts +1 -8
  300. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/layout.tsx +1 -1
  301. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/thread/page.tsx +14 -0
  302. package/cloud-runtime/standalone/apps/local/components/AutomationsBoard.tsx +15 -15
  303. package/cloud-runtime/standalone/apps/local/components/PromptJobBoard.tsx +7 -12
  304. package/cloud-runtime/standalone/apps/local/components/TrackerBoard.tsx +39 -1
  305. package/cloud-runtime/standalone/apps/local/components/projects/FoldersSummaryCard.tsx +51 -196
  306. package/cloud-runtime/standalone/apps/local/components/projects/FoldersView.tsx +662 -784
  307. package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveScheduledTasksPanel.tsx +7 -10
  308. package/cloud-runtime/standalone/apps/local/components/projects/ProjectHome.tsx +4 -4
  309. package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx +118 -0
  310. package/cloud-runtime/standalone/apps/local/components/projects/ProjectSettings.tsx +81 -7
  311. package/cloud-runtime/standalone/apps/local/components/thread/WorkspaceSidebar.tsx +13 -3
  312. package/cloud-runtime/standalone/apps/local/components/tracking/TrackerSetup.tsx +22 -14
  313. package/cloud-runtime/standalone/apps/local/hooks/useProjectWorkspace.ts +117 -0
  314. package/cloud-runtime/standalone/apps/local/lib/db/projects.ts +14 -10
  315. package/cloud-runtime/standalone/apps/local/lib/project-workspace.ts +80 -0
  316. package/cloud-runtime/standalone/apps/local/lib/task-context.ts +39 -4
  317. package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/github/adapter.tsx +40 -4
  318. package/cloud-runtime/standalone/apps/local/lib/workspace-yaml.ts +164 -0
  319. package/cloud-runtime/standalone/apps/local/src/objectives/program/index.ts +7 -0
  320. package/cloud-runtime/standalone/apps/local/src/objectives/program/repository.ts +60 -0
  321. package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/objective-worker.ts +12 -0
  322. package/cloud-runtime/standalone/apps/local/src/scheduling/status.ts +42 -0
  323. package/cloud-runtime/standalone/apps/local/worker/index.js +14 -9
  324. package/lib/commands/workspace.js +145 -7
  325. package/package.json +1 -1
  326. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_09d85861._.js +0 -91
  327. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_25136564._.js +0 -11
  328. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_2caf4398._.js +0 -91
  329. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_31ca7a35._.js +0 -91
  330. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/9fb8c_lucide-react_dist_esm_icons_8c8ee1bc._.js +0 -3
  331. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__23838f87._.js +0 -3
  332. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__3b4708d5._.js +0 -3
  333. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__49cbf624._.js +0 -3
  334. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__49cdd178._.js +0 -3
  335. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__55ed4ff9._.js +0 -3
  336. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__7a31a76d._.js +0 -3
  337. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__a61463b8._.js +0 -7
  338. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__bb42490f._.js +0 -3
  339. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__ee9351f9._.js +0 -3
  340. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ecd68e8._.js +0 -3
  341. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_347d036d._.js +0 -7
  342. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_5c140c38._.js +0 -7
  343. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_f99c22fd._.js +0 -3
  344. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_30d021de._.js +0 -3
  345. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_3b90cb76._.js +0 -18
  346. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_9f36c765._.js +0 -3
  347. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_8cc1a335._.js +0 -3
  348. package/cloud-runtime/standalone/apps/local/.next/static/chunks/1d8b2726979134e5.js +0 -16
  349. package/cloud-runtime/standalone/apps/local/.next/static/chunks/692103d55fcd0328.js +0 -5
  350. package/cloud-runtime/standalone/apps/local/.next/static/chunks/6952b44e247d594a.js +0 -16
  351. package/cloud-runtime/standalone/apps/local/.next/static/chunks/6bfdc40a24e65ca2.js +0 -1
  352. package/cloud-runtime/standalone/apps/local/.next/static/chunks/7ff071e8a33d2fd8.js +0 -16
  353. package/cloud-runtime/standalone/apps/local/.next/static/chunks/87e4fb11329a358d.js +0 -1
  354. package/cloud-runtime/standalone/apps/local/.next/static/chunks/92467c495ad08a85.js +0 -5
  355. package/cloud-runtime/standalone/apps/local/.next/static/chunks/941f7f3626ec442c.js +0 -16
  356. package/cloud-runtime/standalone/apps/local/.next/static/chunks/94a66d2d19268d25.js +0 -5
  357. package/cloud-runtime/standalone/apps/local/.next/static/chunks/add53c2fe147af75.css +0 -1
  358. package/cloud-runtime/standalone/apps/local/.next/static/chunks/b35865f64b56d6f4.js +0 -1
  359. package/cloud-runtime/standalone/apps/local/.next/static/chunks/d662272e49df1950.js +0 -20
  360. package/cloud-runtime/standalone/apps/local/.next/static/chunks/e0d68c6af17c8c87.js +0 -1
  361. package/cloud-runtime/standalone/apps/local/.next/static/chunks/f154e2ed7753f8ee.js +0 -16
  362. /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → O3Yu8lY-DN5fauB8GipIL}/_buildManifest.js +0 -0
  363. /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → O3Yu8lY-DN5fauB8GipIL}/_clientMiddlewareManifest.json +0 -0
  364. /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → O3Yu8lY-DN5fauB8GipIL}/_ssgManifest.js +0 -0
@@ -0,0 +1,77 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ import { loadProjectObjectiveContext } from "../../_shared";
3
+ import { readProgram, writeProgram } from "@/src/objectives/program";
4
+ import { logger } from "@/lib/logger";
5
+
6
+ export const runtime = "nodejs";
7
+ export const dynamic = "force-dynamic";
8
+
9
+ type RouteContext = { params: Promise<{ id: string; objectiveId: string }> };
10
+
11
+ async function resolveParams(params: RouteContext["params"]) {
12
+ const resolved = await params;
13
+ const projectId = typeof resolved?.id === "string" ? resolved.id.trim() : "";
14
+ const objectiveId =
15
+ typeof resolved?.objectiveId === "string" ? resolved.objectiveId.trim() : "";
16
+ if (!projectId || !objectiveId) return null;
17
+ return { projectId, objectiveId };
18
+ }
19
+
20
+ export async function GET(_request: NextRequest, context: RouteContext) {
21
+ try {
22
+ const resolved = await resolveParams(context.params);
23
+ if (!resolved) {
24
+ return NextResponse.json({ error: "Objective not found" }, { status: 404 });
25
+ }
26
+
27
+ const objectiveContext = await loadProjectObjectiveContext(
28
+ resolved.projectId,
29
+ resolved.objectiveId,
30
+ );
31
+ if (!objectiveContext) {
32
+ return NextResponse.json({ error: "Objective not found" }, { status: 404 });
33
+ }
34
+
35
+ const { project, objective } = objectiveContext;
36
+ const slug = project.slug ?? project.id;
37
+ const program = readProgram(slug, objective.key);
38
+
39
+ return NextResponse.json({ program });
40
+ } catch (error) {
41
+ logger.error("Failed to load program", logger.formatError(error));
42
+ return NextResponse.json({ error: "Failed to load program" }, { status: 500 });
43
+ }
44
+ }
45
+
46
+ export async function PUT(request: NextRequest, context: RouteContext) {
47
+ try {
48
+ const resolved = await resolveParams(context.params);
49
+ if (!resolved) {
50
+ return NextResponse.json({ error: "Objective not found" }, { status: 404 });
51
+ }
52
+
53
+ const objectiveContext = await loadProjectObjectiveContext(
54
+ resolved.projectId,
55
+ resolved.objectiveId,
56
+ );
57
+ if (!objectiveContext) {
58
+ return NextResponse.json({ error: "Objective not found" }, { status: 404 });
59
+ }
60
+
61
+ const rawBody = await request.json().catch(() => null);
62
+ if (!rawBody || typeof rawBody !== "object" || Array.isArray(rawBody)) {
63
+ return NextResponse.json({ error: "Invalid program payload" }, { status: 400 });
64
+ }
65
+ const body = rawBody as Record<string, unknown>;
66
+ const content = typeof body.content === "string" ? body.content : "";
67
+
68
+ const { project, objective } = objectiveContext;
69
+ const slug = project.slug ?? project.id;
70
+ const program = writeProgram(slug, objective.key, content);
71
+
72
+ return NextResponse.json({ program });
73
+ } catch (error) {
74
+ logger.error("Failed to save program", logger.formatError(error));
75
+ return NextResponse.json({ error: "Failed to save program" }, { status: 500 });
76
+ }
77
+ }
@@ -0,0 +1,35 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ import { getProjectWithRepos, getProjectWorkspaceEntries } from "@/lib/db";
3
+ import { logger } from "@/lib/logger";
4
+ import { serializeWorkspace } from "@/lib/workspace-yaml";
5
+
6
+ export const runtime = "nodejs";
7
+ export const dynamic = "force-dynamic";
8
+
9
+ type RouteContext = { params: Promise<{ id: string }> };
10
+
11
+ /** GET /api/projects/[id]/workspace/export — export workspace map YAML */
12
+ export async function GET(_request: NextRequest, context: RouteContext) {
13
+ try {
14
+ const { id: projectIdOrSlug } = await context.params;
15
+ const project = await getProjectWithRepos(projectIdOrSlug);
16
+ if (!project) {
17
+ return NextResponse.json({ error: "Project not found" }, { status: 404 });
18
+ }
19
+
20
+ const entries = await getProjectWorkspaceEntries(project.id);
21
+ const yaml = serializeWorkspace(entries);
22
+ const filename = `workspace-${project.slug || project.id}.yaml`;
23
+
24
+ return new NextResponse(yaml, {
25
+ status: 200,
26
+ headers: {
27
+ "Content-Type": "text/yaml; charset=utf-8",
28
+ "Content-Disposition": `attachment; filename="${filename}"`,
29
+ },
30
+ });
31
+ } catch (error) {
32
+ logger.error("Error exporting workspace YAML", logger.formatError(error));
33
+ return NextResponse.json({ error: "Failed to export workspace YAML" }, { status: 500 });
34
+ }
35
+ }
@@ -0,0 +1,91 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ import {
3
+ createWorkspaceEntry,
4
+ getProjectWithRepos,
5
+ getProjectWorkspace,
6
+ getProjectWorkspaceEntries,
7
+ updateWorkspaceEntry,
8
+ } from "@/lib/db";
9
+ import { logger } from "@/lib/logger";
10
+ import { deserializeWorkspace } from "@/lib/workspace-yaml";
11
+
12
+ export const runtime = "nodejs";
13
+ export const dynamic = "force-dynamic";
14
+
15
+ type RouteContext = { params: Promise<{ id: string }> };
16
+
17
+ function workspaceKey(category: string, name: string): string {
18
+ return `${category}\u0000${name}`;
19
+ }
20
+
21
+ /** POST /api/projects/[id]/workspace/import — import workspace map YAML */
22
+ export async function POST(request: NextRequest, context: RouteContext) {
23
+ try {
24
+ const { id: projectIdOrSlug } = await context.params;
25
+ const project = await getProjectWithRepos(projectIdOrSlug);
26
+ if (!project) {
27
+ return NextResponse.json({ error: "Project not found" }, { status: 404 });
28
+ }
29
+
30
+ const yamlBody = await request.text();
31
+ if (!yamlBody.trim()) {
32
+ return NextResponse.json({ error: "Empty request body" }, { status: 400 });
33
+ }
34
+
35
+ let doc;
36
+ try {
37
+ doc = deserializeWorkspace(yamlBody);
38
+ } catch (error) {
39
+ const message = error instanceof Error ? error.message : "Invalid YAML";
40
+ return NextResponse.json({ error: message }, { status: 400 });
41
+ }
42
+
43
+ const existingEntries = await getProjectWorkspaceEntries(project.id);
44
+ const existingByKey = new Map(
45
+ existingEntries.map((entry) => [workspaceKey(entry.category, entry.name), entry]),
46
+ );
47
+
48
+ const nextSortOrderByCategory = new Map<string, number>();
49
+ let created = 0;
50
+ let updated = 0;
51
+
52
+ for (const entry of doc.entries) {
53
+ const key = workspaceKey(entry.category, entry.name);
54
+ const sort_order = nextSortOrderByCategory.get(entry.category) ?? 0;
55
+ nextSortOrderByCategory.set(entry.category, sort_order + 1);
56
+
57
+ const existing = existingByKey.get(key);
58
+ if (existing) {
59
+ await updateWorkspaceEntry(project.id, existing.id, {
60
+ purpose: entry.purpose,
61
+ sort_order,
62
+ });
63
+ updated += 1;
64
+ continue;
65
+ }
66
+
67
+ await createWorkspaceEntry(project.id, {
68
+ category: entry.category,
69
+ name: entry.name,
70
+ path: null,
71
+ purpose: entry.purpose,
72
+ sort_order,
73
+ });
74
+ created += 1;
75
+ }
76
+
77
+ const workspace = await getProjectWorkspace(project.id);
78
+ return NextResponse.json({
79
+ success: true,
80
+ summary: {
81
+ created,
82
+ updated,
83
+ total: doc.entries.length,
84
+ },
85
+ workspace,
86
+ });
87
+ } catch (error) {
88
+ logger.error("Error importing workspace YAML", logger.formatError(error));
89
+ return NextResponse.json({ error: "Failed to import workspace YAML" }, { status: 500 });
90
+ }
91
+ }
@@ -4,7 +4,6 @@ import { OBJECTIVE_WORKER_DEFAULT_PROMPT } from '@/src/prompt-scheduler/objectiv
4
4
  import { TASK_WORKER_DEFAULT_PROMPT as LINEAR_WORKER_DEFAULT_PROMPT } from '@/src/prompt-scheduler/task-worker-job';
5
5
  import {
6
6
  computeNextRun,
7
- computePrevRun,
8
7
  normalizeLegacyConditionSchedule,
9
8
  parseCadence,
10
9
  } from '@/src/prompt-scheduler/cron';
@@ -81,13 +80,7 @@ export async function GET(req: NextRequest) {
81
80
  }
82
81
  }
83
82
 
84
- const enriched = jobs.map((job) => {
85
- const cronExpr = job.cronExpr || job.cadence;
86
- const prevScheduledAt = cronExpr ? computePrevRun(cronExpr) : null;
87
- return { ...job, prevScheduledAt };
88
- });
89
-
90
- return NextResponse.json({ count: enriched.length, jobs: enriched });
83
+ return NextResponse.json({ count: jobs.length, jobs });
91
84
  } catch (error) {
92
85
  logger.error('Failed to list prompt jobs', logger.formatError(error));
93
86
  return NextResponse.json(
@@ -232,7 +232,7 @@ function ProjectLayoutContent({
232
232
  onClick={() => router.push(`/projects/${slug}/${activeProjectView === "thread" ? "" : activeProjectView}`)}
233
233
  className="text-xs text-[var(--foreground)] hover:text-[var(--muted-foreground)] transition-colors"
234
234
  >
235
- {{ objectives: "Objectives", teams: "Teams", folders: "Folders", "env-vars": "Environment Variables", notifications: "Notifications", linear: "Tasks", automations: "Scheduled Jobs", thread: "Chat", terminal: "Terminal" }[activeProjectView] ?? activeProjectView}
235
+ {{ objectives: "Objectives", teams: "Teams", folders: "Workspace Map", "env-vars": "Environment Variables", notifications: "Notifications", linear: "Tasks", automations: "Scheduled Jobs", thread: "Chat", terminal: "Terminal" }[activeProjectView] ?? activeProjectView}
236
236
  </button>
237
237
  <span id="topbar-breadcrumb" className="contents" />
238
238
  </>
@@ -0,0 +1,14 @@
1
+ "use client";
2
+
3
+ import { use } from "react";
4
+ import { ChatContainer } from "@/components/chat-ui/ChatContainer";
5
+
6
+ export default function ProjectChatPage({
7
+ params,
8
+ }: {
9
+ params: Promise<{ slug: string }>;
10
+ }) {
11
+ const { slug } = use(params);
12
+
13
+ return <ChatContainer projectSlug={slug} showSidebar={false} />;
14
+ }
@@ -14,6 +14,7 @@ import {
14
14
  AlertTriangle,
15
15
  } from "lucide-react";
16
16
  import { useAutomations, type AutomationItem } from "@/hooks/useAutomations";
17
+ import { isIntervalScheduleOverdue, isScheduledRunOverdue } from "@/src/scheduling/status";
17
18
  import type { GraphSchedule } from "@/src/graph/types";
18
19
  import { cronToHuman } from "@/src/graph/nl-schedule";
19
20
 
@@ -33,22 +34,21 @@ function formatCadence(schedule: GraphSchedule): string {
33
34
  }
34
35
 
35
36
  function isScheduleOverdue(schedule: GraphSchedule): boolean {
36
- if (schedule.state !== "active" || schedule.tickInProgress) return false;
37
- // Case 1: next tick is in the past and hasn't run yet
38
- if (schedule.nextTickAt) {
39
- if (schedule.nextTickAt - Date.now() >= 0) return false;
40
- if (schedule.lastTickAt && schedule.lastTickAt >= schedule.nextTickAt) {
41
- // Task ran, but check if it ran late vs previous scheduled time
42
- if (schedule.prevScheduledAt && schedule.lastTickAt > schedule.prevScheduledAt + 5 * 60_000) {
43
- return true;
44
- }
45
- return false;
46
- }
47
- return true;
37
+ if (schedule.nextTickAt != null) {
38
+ return isScheduledRunOverdue({
39
+ state: schedule.state,
40
+ nextScheduledAt: schedule.nextTickAt,
41
+ lastCompletedAt: schedule.lastTickAt,
42
+ inProgress: schedule.tickInProgress,
43
+ });
48
44
  }
49
- // Case 2: interval-based — check if overdue
50
- if (schedule.lastTickAt) return schedule.lastTickAt + schedule.intervalMs - Date.now() < 0;
51
- return false;
45
+
46
+ return isIntervalScheduleOverdue({
47
+ state: schedule.state,
48
+ lastCompletedAt: schedule.lastTickAt,
49
+ intervalMs: schedule.intervalMs,
50
+ inProgress: schedule.tickInProgress,
51
+ });
52
52
  }
53
53
 
54
54
  function formatNextRun(schedule: GraphSchedule): string {
@@ -36,6 +36,7 @@ import type {
36
36
  PromptJobExecutionMode,
37
37
  } from "@/src/prompt-scheduler/types";
38
38
  import { cronToHuman } from "@/src/graph/nl-schedule";
39
+ import { isScheduledRunOverdue } from "@/src/scheduling/status";
39
40
  import { ScheduleConditionPicker } from "@/components/scheduling/ScheduleConditionPicker";
40
41
  import {
41
42
  TASK_WORKER_DEFAULT_PROMPT as LINEAR_WORKER_DEFAULT_PROMPT,
@@ -69,18 +70,12 @@ const RichTextEditor = dynamic(() => import("@/components/RichTextEditor"), {
69
70
 
70
71
  // ── Helpers ──────────────────────────────────────────────────────────────────
71
72
 
72
- function isJobOverdue(job: { nextRunAt: number | null; lastRunAt: number | null; prevScheduledAt?: number | null; state: string }): boolean {
73
- if (job.state !== "active") return false;
74
- // Case 1: next run is in the past and hasn't run yet
75
- if (job.nextRunAt !== null && job.nextRunAt - Date.now() < 0) {
76
- if (job.lastRunAt && job.lastRunAt >= job.nextRunAt) return false;
77
- return true;
78
- }
79
- // Case 2: task ran, but late — compare last run against previous scheduled time
80
- if (job.prevScheduledAt && job.lastRunAt) {
81
- return job.lastRunAt > job.prevScheduledAt + 5 * 60_000; // 5 min grace
82
- }
83
- return false;
73
+ function isJobOverdue(job: Pick<PromptJob, "nextRunAt" | "lastRunAt" | "state">): boolean {
74
+ return isScheduledRunOverdue({
75
+ state: job.state,
76
+ nextScheduledAt: job.nextRunAt,
77
+ lastCompletedAt: job.lastRunAt,
78
+ });
84
79
  }
85
80
 
86
81
  function formatNextRun(epochMs: number | null, state: string): string {
@@ -165,6 +165,38 @@ function ThreadMessageList({
165
165
  [participants]
166
166
  );
167
167
 
168
+ const scrollContainerRef = useRef<HTMLDivElement>(null);
169
+ const [showJumpToLatest, setShowJumpToLatest] = useState(false);
170
+
171
+ useEffect(() => {
172
+ const container = scrollContainerRef.current;
173
+ if (!container) return;
174
+ const handleScroll = () => {
175
+ const { scrollTop, scrollHeight, clientHeight } = container;
176
+ const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
177
+ setShowJumpToLatest(distanceFromBottom > 200);
178
+ };
179
+ container.addEventListener("scroll", handleScroll, { passive: true });
180
+ return () => container.removeEventListener("scroll", handleScroll);
181
+ }, []);
182
+
183
+ const jumpToLatest = useCallback(() => {
184
+ const container = scrollContainerRef.current;
185
+ if (!container) return;
186
+ container.scrollTo({ top: container.scrollHeight, behavior: "smooth" });
187
+ }, []);
188
+
189
+ const prevMessageCountRef = useRef(0);
190
+ useEffect(() => {
191
+ if (messages.length > prevMessageCountRef.current) {
192
+ scrollContainerRef.current?.scrollTo({
193
+ top: scrollContainerRef.current.scrollHeight,
194
+ behavior: "smooth",
195
+ });
196
+ }
197
+ prevMessageCountRef.current = messages.length;
198
+ }, [messages.length]);
199
+
168
200
  const activeRunStatuses = new Set(["queued", "running", "awaiting_user", "blocked"]);
169
201
  const isWorking =
170
202
  chatRuns.some((entry) => activeRunStatuses.has(entry.status)) ||
@@ -267,7 +299,7 @@ function ThreadMessageList({
267
299
  </div>
268
300
  </header>
269
301
 
270
- <div className="min-h-0 flex-1 overflow-y-auto px-6 py-6 pb-64">
302
+ <div ref={scrollContainerRef} className="min-h-0 flex-1 overflow-y-auto px-6 py-6 pb-64">
271
303
  {messages.length === 0 ? (
272
304
  <div className="py-8 text-center text-xs text-[var(--muted-foreground)]">
273
305
  {run.status === "queued" || run.status === "running"
@@ -359,6 +391,12 @@ function ThreadMessageList({
359
391
  )}
360
392
  </div>
361
393
 
394
+ <JumpToLatestButton
395
+ visible={showJumpToLatest && messages.length > 10}
396
+ onClick={jumpToLatest}
397
+ offsetClassName="bottom-40"
398
+ />
399
+
362
400
  <div className="absolute bottom-3 left-3 right-3 p-2">
363
401
  {run.rootMessageId ? (
364
402
  <Composer
@@ -1,228 +1,83 @@
1
1
  "use client";
2
2
 
3
- import { useEffect, useState } from "react";
4
- import { FolderGit2, ArrowRight, Pencil, Plus, Trash2, X } from "lucide-react";
5
- import { useProjects, type ProjectRepoInput } from "@/hooks/useProjects";
6
-
7
- interface Repo {
8
- id: string;
9
- name: string;
10
- path?: string;
11
- git_url?: string;
12
- }
3
+ import { ArrowRight, FolderGit2, FolderOpen } from "lucide-react";
4
+ import { useProjectWorkspace } from "@/hooks/useProjectWorkspace";
5
+ import { buildWorkspaceCategoryGroups } from "@/lib/project-workspace";
13
6
 
14
7
  interface FoldersSummaryCardProps {
15
8
  projectId: string;
16
- repos: Repo[];
17
9
  onViewAll?: () => void;
18
10
  }
19
11
 
20
- export function FoldersSummaryCard({ projectId, repos, onViewAll }: FoldersSummaryCardProps) {
21
- const { updateProject } = useProjects();
22
- const [items, setItems] = useState(repos);
23
- const [isAdding, setIsAdding] = useState(false);
24
- const [editingId, setEditingId] = useState<string | null>(null);
25
- const [draftName, setDraftName] = useState("");
26
- const [draftPath, setDraftPath] = useState("");
27
- const [status, setStatus] = useState<string | null>(null);
28
-
29
- useEffect(() => {
30
- setItems(repos);
31
- }, [repos]);
32
-
33
- const setFeedback = (message: string) => {
34
- setStatus(message);
35
- window.setTimeout(() => setStatus(null), 2500);
36
- };
37
-
38
- const toPayload = (nextRepos: Repo[]): ProjectRepoInput[] =>
39
- nextRepos.map((repo) => ({
40
- id: repo.id,
41
- name: repo.name,
42
- path: repo.path,
43
- git_url: repo.git_url,
44
- }));
45
-
46
- const resetDraft = () => {
47
- setDraftName("");
48
- setDraftPath("");
49
- setEditingId(null);
50
- setIsAdding(false);
51
- };
52
-
53
- const startAdd = () => {
54
- setEditingId(null);
55
- setDraftName("");
56
- setDraftPath("");
57
- setIsAdding(true);
58
- };
59
-
60
- const startEdit = (repo: Repo) => {
61
- setIsAdding(false);
62
- setEditingId(repo.id);
63
- setDraftName(repo.name);
64
- setDraftPath(repo.path ?? "");
65
- };
66
-
67
- const handleSaveNew = async () => {
68
- const name = draftName.trim();
69
- const path = draftPath.trim();
70
- if (!name || !path) return;
71
-
72
- const nextItems = [...items, { id: `tmp-${Date.now()}`, name, path }];
73
- setItems(nextItems);
74
- resetDraft();
75
- try {
76
- await updateProject(projectId, {
77
- repos: [...toPayload(items), { name, path }],
78
- });
79
- setFeedback("Folder added");
80
- } catch {
81
- setItems(items);
82
- setFeedback("Failed to add folder");
83
- }
84
- };
85
-
86
- const handleSaveEdit = async (repoId: string) => {
87
- const name = draftName.trim();
88
- const path = draftPath.trim();
89
- if (!name || !path) return;
90
-
91
- const previousItems = items;
92
- const nextItems = items.map((repo) => (repo.id === repoId ? { ...repo, name, path } : repo));
93
- setItems(nextItems);
94
- resetDraft();
95
- try {
96
- await updateProject(projectId, {
97
- repos: toPayload(nextItems),
98
- });
99
- setFeedback("Folder updated");
100
- } catch {
101
- setItems(previousItems);
102
- setFeedback("Failed to update folder");
103
- }
104
- };
105
-
106
- const handleDelete = async (repoId: string) => {
107
- const previousItems = items;
108
- const nextItems = items.filter((repo) => repo.id !== repoId);
109
- setItems(nextItems);
110
- if (editingId === repoId) {
111
- resetDraft();
112
- }
113
- try {
114
- await updateProject(projectId, {
115
- repos: toPayload(nextItems),
116
- });
117
- setFeedback("Folder deleted");
118
- } catch {
119
- setItems(previousItems);
120
- setFeedback("Failed to delete folder");
121
- }
122
- };
12
+ export function FoldersSummaryCard({ projectId, onViewAll }: FoldersSummaryCardProps) {
13
+ const { workspace, entryCount, isLoading, error } = useProjectWorkspace(projectId);
14
+ const visibleGroups = buildWorkspaceCategoryGroups(workspace).filter((group) => group.entries.length > 0).slice(0, 3);
123
15
 
124
16
  return (
125
17
  <div className="rounded-2xl border border-[var(--card-border)] bg-[var(--card-bg)] p-4">
126
- <div className="flex items-center justify-between mb-3">
18
+ <div className="mb-3 flex items-center justify-between">
127
19
  <div className="flex items-center gap-2">
128
20
  <FolderGit2 className="h-4 w-4 text-[var(--muted-foreground)]" />
129
- <span className="text-sm font-medium text-[var(--foreground)]">Folders</span>
130
- {items.length > 0 && (
21
+ <span className="text-sm font-medium text-[var(--foreground)]">Workspace Map</span>
22
+ {entryCount > 0 && (
131
23
  <span className="rounded-full bg-[var(--secondary)] px-2 py-0.5 text-xs text-[var(--muted-foreground)]">
132
- {items.length}
24
+ {entryCount}
133
25
  </span>
134
26
  )}
135
27
  </div>
136
- <div className="flex items-center gap-2">
28
+ {onViewAll && (
137
29
  <button
138
30
  type="button"
139
- onClick={startAdd}
31
+ onClick={onViewAll}
140
32
  className="flex items-center gap-1 text-xs text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]"
141
33
  >
142
- <Plus className="w-3 h-3" />
143
- Add
34
+ View all <ArrowRight className="h-3 w-3" />
144
35
  </button>
145
- {onViewAll && (
146
- <button onClick={onViewAll} className="flex items-center gap-1 text-xs text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]">
147
- View all <ArrowRight className="w-3 h-3" />
148
- </button>
149
- )}
150
- </div>
36
+ )}
151
37
  </div>
152
38
 
153
- {status && <p className="mb-3 text-xs text-[var(--muted-foreground)]">{status}</p>}
39
+ {isLoading && (
40
+ <p className="text-sm text-[var(--muted-foreground)]">Loading workspace map...</p>
41
+ )}
154
42
 
155
- {(isAdding || editingId) && (
156
- <div className="mb-3 space-y-2 rounded-xl border border-[var(--border)] bg-[var(--secondary)] p-3">
157
- <input
158
- value={draftName}
159
- onChange={(e) => setDraftName(e.target.value)}
160
- className="input w-full text-sm"
161
- placeholder="Folder name"
162
- autoFocus
163
- />
164
- <input
165
- value={draftPath}
166
- onChange={(e) => setDraftPath(e.target.value)}
167
- className="input w-full text-sm"
168
- placeholder="Local path"
169
- />
170
- <div className="flex items-center gap-2">
171
- <button
172
- type="button"
173
- onClick={() => {
174
- if (editingId) {
175
- void handleSaveEdit(editingId);
176
- } else {
177
- void handleSaveNew();
178
- }
179
- }}
180
- disabled={!draftName.trim() || !draftPath.trim()}
181
- className="rounded-lg bg-[var(--foreground)] px-3 py-1.5 text-xs font-medium text-[var(--background)] disabled:opacity-40"
182
- >
183
- Save
184
- </button>
185
- <button
186
- type="button"
187
- onClick={resetDraft}
188
- className="flex items-center gap-1 rounded-lg px-2 py-1.5 text-xs text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]"
189
- >
190
- <X className="w-3 h-3" />
191
- Cancel
192
- </button>
193
- </div>
194
- </div>
43
+ {!isLoading && error && (
44
+ <p className="text-sm text-[var(--destructive)]">Unable to load the workspace map right now.</p>
195
45
  )}
196
46
 
197
- {items.length === 0 ? (
198
- <p className="text-sm text-[var(--muted-foreground)]">No folders linked</p>
199
- ) : (
200
- <div className="space-y-2">
201
- {items.slice(0, 5).map((repo) => (
202
- <div key={repo.id} className="flex items-center gap-2 text-sm">
203
- <FolderGit2 className="h-4 w-4 shrink-0 text-[var(--muted-foreground)]" />
204
- <div className="min-w-0 flex-1">
205
- <div className="truncate text-[var(--foreground)]">{repo.name}</div>
206
- {repo.path && (
207
- <div className="truncate text-xs text-[var(--muted-foreground)]">{repo.path}</div>
47
+ {!isLoading && !error && entryCount === 0 && (
48
+ <p className="text-sm text-[var(--muted-foreground)]">
49
+ No workspace locations mapped yet. Add repositories, docs, or scripts so agents know where to work.
50
+ </p>
51
+ )}
52
+
53
+ {!isLoading && !error && entryCount > 0 && (
54
+ <div className="space-y-3">
55
+ {visibleGroups.map((group) => (
56
+ <div key={group.id} className="rounded-xl border border-[var(--border)] bg-[var(--secondary)]/30 px-3 py-2.5">
57
+ <div className="mb-2 flex items-center justify-between gap-2">
58
+ <span className="text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]">
59
+ {group.label}
60
+ </span>
61
+ <span className="text-[11px] text-[var(--muted-foreground)]">{group.entries.length}</span>
62
+ </div>
63
+ <div className="space-y-2">
64
+ {group.entries.slice(0, 2).map((entry) => (
65
+ <div key={entry.id} className="flex items-start gap-2 text-sm">
66
+ <FolderOpen className="mt-0.5 h-3.5 w-3.5 shrink-0 text-[var(--muted-foreground)]" />
67
+ <div className="min-w-0 flex-1">
68
+ <div className="truncate text-[var(--foreground)]">{entry.name}</div>
69
+ <div className="truncate text-xs text-[var(--muted-foreground)]">
70
+ {entry.path || entry.purpose || "No path set yet"}
71
+ </div>
72
+ </div>
73
+ </div>
74
+ ))}
75
+ {group.entries.length > 2 && (
76
+ <p className="text-xs text-[var(--muted-foreground)]">
77
+ + {group.entries.length - 2} more
78
+ </p>
208
79
  )}
209
80
  </div>
210
- <button
211
- type="button"
212
- onClick={() => startEdit(repo)}
213
- className="p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]"
214
- aria-label={`Edit ${repo.name}`}
215
- >
216
- <Pencil className="w-3 h-3" />
217
- </button>
218
- <button
219
- type="button"
220
- onClick={() => void handleDelete(repo.id)}
221
- className="p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--destructive)]"
222
- aria-label={`Delete ${repo.name}`}
223
- >
224
- <Trash2 className="w-3 h-3" />
225
- </button>
226
81
  </div>
227
82
  ))}
228
83
  </div>