@mndrk/agx 2.4.6 → 2.4.7

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 (357) 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_4d88e4dc._.js +91 -0
  211. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_4dec65a2._.js +1 -1
  212. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_50e3a6e3._.js +1 -1
  213. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_56a2544c._.js +1 -1
  214. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_5843a1a1._.js +1 -1
  215. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_a15e73a6._.js +1 -1
  216. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_bd72806a._.js +1 -1
  217. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_c101ba9e._.js +1 -1
  218. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_c530bd77._.js +11 -0
  219. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_d69937f2._.js +91 -0
  220. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_e2867b32._.js +3 -0
  221. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_e32b0cab._.js +91 -0
  222. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_5ab8f104._.js +1 -1
  223. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_db_ts_77c23d6c._.js +1 -1
  224. 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
  225. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__1e0fd816._.js +3 -0
  226. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__42499ecf._.js +3 -0
  227. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__5f31e40b._.js +3 -0
  228. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__636799fb._.js +3 -0
  229. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__4bf7d5b9._.js → [root-of-the-server]__74436f61._.js} +2 -2
  230. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__9434d6d7._.js +3 -0
  231. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__bd339da0._.js +3 -0
  232. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__d08d7899._.js +3 -0
  233. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__e02a457c._.js +3 -0
  234. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__e3a1fef0._.js +3 -0
  235. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__f802e7d1._.js +3 -0
  236. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__ff96bb77._.js +3 -0
  237. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_6a2ba8f0._.js +3 -0
  238. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_7cb6b08a._.js +3 -0
  239. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_a0f42923._.js +7 -0
  240. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_a93c1059._.js +3 -0
  241. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_components_PromptJobBoard_tsx_281b2873._.js → apps_local_04cb9fd5._.js} +3 -3
  242. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_15502af8._.js +3 -0
  243. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_16eaf7ae._.js +3 -0
  244. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_3c11c068._.js +8 -0
  245. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_89b49aad._.js +7 -0
  246. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_988d29c0._.js +1 -1
  247. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_ae1a134f._.js +7 -0
  248. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_agents_page_tsx_2a02508d._.js +1 -1
  249. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_folders_page_tsx_72fb68e5._.js +1 -1
  250. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_layout_tsx_3bb31889._.js +1 -1
  251. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_page_tsx_76330306._.js +1 -1
  252. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_b8e580cc._.js +4 -0
  253. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_TrackerBoard_tsx_98970bab._.js +2 -2
  254. 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
  255. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_751ab3d3._.js +3 -3
  256. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_eb223411._.js +18 -0
  257. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_7d1abfbf._.js → apps_local_f1c9872a._.js} +2 -2
  258. package/cloud-runtime/standalone/apps/local/.next/server/functions-config-manifest.json +3 -0
  259. package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
  260. package/cloud-runtime/standalone/apps/local/.next/server/next-font-manifest.js +1 -1
  261. package/cloud-runtime/standalone/apps/local/.next/server/next-font-manifest.json +4 -0
  262. package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
  263. package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +2 -2
  264. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
  265. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
  266. package/cloud-runtime/standalone/apps/local/.next/static/chunks/08e75b35d6c52269.js +1 -0
  267. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0d22a723b9b96e65.js +1 -0
  268. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{cb19d71dd7ffb935.js → 1585dd5f9ec4866a.js} +1 -1
  269. package/cloud-runtime/standalone/apps/local/.next/static/chunks/1bc8cc9cbb99c1ed.js +1 -0
  270. package/cloud-runtime/standalone/apps/local/.next/static/chunks/2586c0baa16e9a0d.js +16 -0
  271. package/cloud-runtime/standalone/apps/local/.next/static/chunks/2aa24a251622fd06.js +5 -0
  272. package/cloud-runtime/standalone/apps/local/.next/static/chunks/39513207112d6828.js +1 -0
  273. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{74e3a3e93be78db8.js → 40857295bb9226c4.js} +7 -7
  274. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{8d8fe711583a59f0.js → 41ae15220fc19bf7.js} +2 -2
  275. package/cloud-runtime/standalone/apps/local/.next/static/chunks/5092f14c2bf43204.js +16 -0
  276. package/cloud-runtime/standalone/apps/local/.next/static/chunks/5159169343ce6d2f.css +1 -0
  277. package/cloud-runtime/standalone/apps/local/.next/static/chunks/67b36c70b72e0e10.js +1 -0
  278. package/cloud-runtime/standalone/apps/local/.next/static/chunks/7bfbfcd072f8d61e.js +20 -0
  279. package/cloud-runtime/standalone/apps/local/.next/static/chunks/7cf26dd04166f32f.js +6 -0
  280. package/cloud-runtime/standalone/apps/local/.next/static/chunks/90dcb743d23feeca.js +16 -0
  281. package/cloud-runtime/standalone/apps/local/.next/static/chunks/93749b45e2700808.js +16 -0
  282. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{48feca51cf97c8a7.js → 9bb8f1406365af81.js} +1 -1
  283. package/cloud-runtime/standalone/apps/local/.next/static/chunks/b4aa71020acae46f.js +16 -0
  284. package/cloud-runtime/standalone/apps/local/.next/static/chunks/c352706a0ad7e35d.js +1 -0
  285. package/cloud-runtime/standalone/apps/local/.next/static/chunks/c5436b2b7e8f0ca9.js +16 -0
  286. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1600dd6ff8607d8f.js → c9a2c4b55bb76f4f.js} +6 -6
  287. package/cloud-runtime/standalone/apps/local/.next/static/chunks/d6a9cc66254693b8.js +1 -0
  288. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{9e703dd5d95e9557.js → e3bdd1e0f385114e.js} +1 -1
  289. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{6ffcd12eabd7c65e.js → f71d73895d228547.js} +1 -1
  290. package/cloud-runtime/standalone/apps/local/.next/static/chunks/f750d2f1882d31a8.js +5 -0
  291. package/cloud-runtime/standalone/apps/local/app/api/automations/route.ts +2 -10
  292. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/objectives/[objectiveId]/program/route.ts +77 -0
  293. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/workspace/export/route.ts +35 -0
  294. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/workspace/import/route.ts +91 -0
  295. package/cloud-runtime/standalone/apps/local/app/api/prompt-jobs/route.ts +1 -8
  296. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/layout.tsx +1 -1
  297. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/thread/page.tsx +14 -0
  298. package/cloud-runtime/standalone/apps/local/components/AutomationsBoard.tsx +15 -15
  299. package/cloud-runtime/standalone/apps/local/components/PromptJobBoard.tsx +7 -12
  300. package/cloud-runtime/standalone/apps/local/components/projects/FoldersSummaryCard.tsx +51 -196
  301. package/cloud-runtime/standalone/apps/local/components/projects/FoldersView.tsx +662 -784
  302. package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveScheduledTasksPanel.tsx +7 -10
  303. package/cloud-runtime/standalone/apps/local/components/projects/ProjectHome.tsx +4 -4
  304. package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx +118 -0
  305. package/cloud-runtime/standalone/apps/local/components/projects/ProjectSettings.tsx +81 -7
  306. package/cloud-runtime/standalone/apps/local/components/thread/WorkspaceSidebar.tsx +13 -3
  307. package/cloud-runtime/standalone/apps/local/hooks/useProjectWorkspace.ts +117 -0
  308. package/cloud-runtime/standalone/apps/local/lib/db/projects.ts +14 -10
  309. package/cloud-runtime/standalone/apps/local/lib/project-workspace.ts +80 -0
  310. package/cloud-runtime/standalone/apps/local/lib/task-context.ts +39 -4
  311. package/cloud-runtime/standalone/apps/local/lib/workspace-yaml.ts +164 -0
  312. package/cloud-runtime/standalone/apps/local/src/objectives/program/index.ts +7 -0
  313. package/cloud-runtime/standalone/apps/local/src/objectives/program/repository.ts +60 -0
  314. package/cloud-runtime/standalone/apps/local/src/prompt-scheduler/objective-worker.ts +12 -0
  315. package/cloud-runtime/standalone/apps/local/src/scheduling/status.ts +42 -0
  316. package/cloud-runtime/standalone/apps/local/worker/index.js +14 -9
  317. package/lib/commands/workspace.js +145 -7
  318. package/package.json +1 -1
  319. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_09d85861._.js +0 -91
  320. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_25136564._.js +0 -11
  321. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_2caf4398._.js +0 -91
  322. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_31ca7a35._.js +0 -91
  323. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/9fb8c_lucide-react_dist_esm_icons_8c8ee1bc._.js +0 -3
  324. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__23838f87._.js +0 -3
  325. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__3b4708d5._.js +0 -3
  326. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__49cbf624._.js +0 -3
  327. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__49cdd178._.js +0 -3
  328. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__55ed4ff9._.js +0 -3
  329. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__7a31a76d._.js +0 -3
  330. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__a61463b8._.js +0 -7
  331. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__bb42490f._.js +0 -3
  332. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__ee9351f9._.js +0 -3
  333. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ecd68e8._.js +0 -3
  334. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_347d036d._.js +0 -7
  335. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_5c140c38._.js +0 -7
  336. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_f99c22fd._.js +0 -3
  337. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_30d021de._.js +0 -3
  338. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_3b90cb76._.js +0 -18
  339. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_9f36c765._.js +0 -3
  340. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_8cc1a335._.js +0 -3
  341. package/cloud-runtime/standalone/apps/local/.next/static/chunks/1d8b2726979134e5.js +0 -16
  342. package/cloud-runtime/standalone/apps/local/.next/static/chunks/692103d55fcd0328.js +0 -5
  343. package/cloud-runtime/standalone/apps/local/.next/static/chunks/6952b44e247d594a.js +0 -16
  344. package/cloud-runtime/standalone/apps/local/.next/static/chunks/6bfdc40a24e65ca2.js +0 -1
  345. package/cloud-runtime/standalone/apps/local/.next/static/chunks/7ff071e8a33d2fd8.js +0 -16
  346. package/cloud-runtime/standalone/apps/local/.next/static/chunks/87e4fb11329a358d.js +0 -1
  347. package/cloud-runtime/standalone/apps/local/.next/static/chunks/92467c495ad08a85.js +0 -5
  348. package/cloud-runtime/standalone/apps/local/.next/static/chunks/941f7f3626ec442c.js +0 -16
  349. package/cloud-runtime/standalone/apps/local/.next/static/chunks/94a66d2d19268d25.js +0 -5
  350. package/cloud-runtime/standalone/apps/local/.next/static/chunks/add53c2fe147af75.css +0 -1
  351. package/cloud-runtime/standalone/apps/local/.next/static/chunks/b35865f64b56d6f4.js +0 -1
  352. package/cloud-runtime/standalone/apps/local/.next/static/chunks/d662272e49df1950.js +0 -20
  353. package/cloud-runtime/standalone/apps/local/.next/static/chunks/e0d68c6af17c8c87.js +0 -1
  354. package/cloud-runtime/standalone/apps/local/.next/static/chunks/f154e2ed7753f8ee.js +0 -16
  355. /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → xVMVGrzDjtD1H0bGL76NJ}/_buildManifest.js +0 -0
  356. /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → xVMVGrzDjtD1H0bGL76NJ}/_clientMiddlewareManifest.json +0 -0
  357. /package/cloud-runtime/standalone/apps/local/.next/static/{fipnHmd6JPn9sTuFdYS0y → xVMVGrzDjtD1H0bGL76NJ}/_ssgManifest.js +0 -0
@@ -3,6 +3,7 @@
3
3
  import { useCallback, useEffect, useMemo, useState } from "react";
4
4
  import { Check, Clock, Pause, Pencil, Play, Plus, Terminal, Trash2, XCircle } from "lucide-react";
5
5
  import { usePromptJobs } from "@/hooks/usePromptJobs";
6
+ import { isScheduledRunOverdue } from "@/src/scheduling/status";
6
7
  import { cronToHuman } from "@/src/graph/nl-schedule";
7
8
  import type { PromptJob, PromptRun } from "@/src/prompt-scheduler/types";
8
9
  import {
@@ -30,16 +31,12 @@ function formatCadence(job: Pick<PromptJob, "cadence" | "cronExpr">): string {
30
31
  return cronToHuman(job.cronExpr || source) ?? source;
31
32
  }
32
33
 
33
- function isJobOverdue(job: Pick<PromptJob, "nextRunAt" | "lastRunAt" | "prevScheduledAt" | "state">): boolean {
34
- if (job.state !== "active") return false;
35
- if (job.nextRunAt !== null && job.nextRunAt - Date.now() < 0) {
36
- if (job.lastRunAt && job.lastRunAt >= job.nextRunAt) return false;
37
- return true;
38
- }
39
- if (job.prevScheduledAt && job.lastRunAt) {
40
- return job.lastRunAt > job.prevScheduledAt + 5 * 60_000;
41
- }
42
- return false;
34
+ function isJobOverdue(job: Pick<PromptJob, "nextRunAt" | "lastRunAt" | "state">): boolean {
35
+ return isScheduledRunOverdue({
36
+ state: job.state,
37
+ nextScheduledAt: job.nextRunAt,
38
+ lastCompletedAt: job.lastRunAt,
39
+ });
43
40
  }
44
41
 
45
42
  function formatNextRun(epochMs: number | null, state: PromptJob["state"]): string {
@@ -22,10 +22,7 @@ interface ProjectHomeProps {
22
22
  export function ProjectHome({
23
23
  projectId,
24
24
  projectSlug,
25
- projectName,
26
25
  projectDescription,
27
- projectMetadata,
28
- repos,
29
26
  threadIds,
30
27
  }: ProjectHomeProps) {
31
28
  const router = useRouter();
@@ -77,7 +74,10 @@ export function ProjectHome({
77
74
 
78
75
  {/* Project context — no label */}
79
76
  <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
80
- <FoldersSummaryCard projectId={projectId} repos={repos} />
77
+ <FoldersSummaryCard
78
+ projectId={projectId}
79
+ onViewAll={() => router.push(`/projects/${projectSlug}/folders`)}
80
+ />
81
81
  <TeamsSummaryCard
82
82
  projectId={projectId}
83
83
  onViewAll={() => router.push(`/projects/${projectSlug}/teams`)}
@@ -1705,6 +1705,10 @@ export function ProjectObjectiveDetail({
1705
1705
  const [availableTrackers, setAvailableTrackers] = useState<{ type: string; displayName: string }[]>([]);
1706
1706
  const [defaultTrackerType, setDefaultTrackerType] = useState<string | null>(null);
1707
1707
  const [workingOnObjective, setWorkingOnObjective] = useState(false);
1708
+ const [programContent, setProgramContent] = useState<string | null>(null);
1709
+ const [programPath, setProgramPath] = useState<string | null>(null);
1710
+ const [programDraft, setProgramDraft] = useState<string | null>(null);
1711
+ const [isSavingProgram, setIsSavingProgram] = useState(false);
1708
1712
  const detailScrollRef = useRef<HTMLDivElement | null>(null);
1709
1713
  const [showBackToTop, setShowBackToTop] = useState(false);
1710
1714
 
@@ -1788,6 +1792,49 @@ export function ProjectObjectiveDetail({
1788
1792
  fetchNotes();
1789
1793
  }, [fetchNotes]);
1790
1794
 
1795
+ const fetchProgram = useCallback(async () => {
1796
+ if (!project?.id || !objective?.id) return;
1797
+ try {
1798
+ const res = await fetch(
1799
+ `/api/projects/${project.id}/objectives/${objective.id}/program`,
1800
+ );
1801
+ if (res.ok) {
1802
+ const data = await res.json();
1803
+ setProgramContent(data.program?.content ?? null);
1804
+ setProgramPath(data.program?.path ?? null);
1805
+ }
1806
+ } catch {
1807
+ // Silently fail — panel will show empty state
1808
+ }
1809
+ }, [project?.id, objective?.id]);
1810
+
1811
+ useEffect(() => {
1812
+ fetchProgram();
1813
+ }, [fetchProgram]);
1814
+
1815
+ const saveProgram = useCallback(async () => {
1816
+ if (!project?.id || !objective?.id || programDraft === null) return;
1817
+ setIsSavingProgram(true);
1818
+ try {
1819
+ const res = await fetch(
1820
+ `/api/projects/${project.id}/objectives/${objective.id}/program`,
1821
+ {
1822
+ method: "PUT",
1823
+ headers: { "Content-Type": "application/json" },
1824
+ body: JSON.stringify({ content: programDraft }),
1825
+ },
1826
+ );
1827
+ if (res.ok) {
1828
+ const data = await res.json();
1829
+ setProgramContent(data.program?.content ?? null);
1830
+ setProgramPath(data.program?.path ?? null);
1831
+ setProgramDraft(null);
1832
+ }
1833
+ } finally {
1834
+ setIsSavingProgram(false);
1835
+ }
1836
+ }, [project?.id, objective?.id, programDraft]);
1837
+
1791
1838
  // Refetch when switching to notes tab (in case notes changed elsewhere)
1792
1839
  useEffect(() => {
1793
1840
  if (activeTab === "notes") {
@@ -2307,6 +2354,77 @@ export function ProjectObjectiveDetail({
2307
2354
 
2308
2355
  </div>
2309
2356
 
2357
+ {/* Program — objective-level prompt (goal / definition of better / blast radius) */}
2358
+ <div className="mb-6 rounded-xl border border-[var(--border)] bg-[var(--card-bg)]">
2359
+ <div className="flex items-center justify-between border-b border-[var(--border)] px-4 py-2.5">
2360
+ <div className="flex items-center gap-2">
2361
+ <FileText size={14} className="text-[var(--muted-foreground)]" />
2362
+ <span className="text-xs font-semibold uppercase tracking-wider text-[var(--muted-foreground)]">
2363
+ Program
2364
+ </span>
2365
+ {programPath ? (
2366
+ <span className="font-mono text-[10px] text-[var(--muted-foreground)] opacity-70">
2367
+ {programPath.replace(/^.*\/\.agx\//, "~/.agx/")}
2368
+ </span>
2369
+ ) : null}
2370
+ </div>
2371
+ {programDraft === null ? (
2372
+ <button
2373
+ type="button"
2374
+ onClick={() => setProgramDraft(programContent ?? "")}
2375
+ className="rounded-md p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]"
2376
+ aria-label="Edit program"
2377
+ >
2378
+ <Pencil size={14} />
2379
+ </button>
2380
+ ) : (
2381
+ <div className="flex items-center gap-1">
2382
+ <button
2383
+ type="button"
2384
+ onClick={() => void saveProgram()}
2385
+ disabled={isSavingProgram}
2386
+ className="rounded-md p-1 text-[var(--primary)] transition-colors hover:bg-[var(--status-in-progress-bg)] disabled:opacity-50"
2387
+ aria-label="Save program"
2388
+ >
2389
+ <Check size={14} />
2390
+ </button>
2391
+ <button
2392
+ type="button"
2393
+ onClick={() => setProgramDraft(null)}
2394
+ className="rounded-md p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)]"
2395
+ aria-label="Cancel editing"
2396
+ >
2397
+ <X size={14} />
2398
+ </button>
2399
+ </div>
2400
+ )}
2401
+ </div>
2402
+ <div className="px-4 py-3">
2403
+ {programDraft !== null ? (
2404
+ <textarea
2405
+ autoFocus
2406
+ value={programDraft}
2407
+ onChange={(e) => setProgramDraft(e.target.value)}
2408
+ rows={8}
2409
+ placeholder={
2410
+ "Goal: why this exists\n\nDefinition of better: the metric or signal that says we're done\n\nBlast radius: paths/systems in scope, what's off-limits\n\nNotes: things we've learned"
2411
+ }
2412
+ className="w-full resize-y rounded-md border border-[var(--border)] bg-[var(--background)] px-3 py-2 font-mono text-xs text-[var(--foreground)] outline-none focus:border-[var(--primary)]"
2413
+ />
2414
+ ) : programContent && programContent.trim().length > 0 ? (
2415
+ <div className="prose prose-sm max-w-none text-sm text-[var(--foreground)]">
2416
+ <Markdown content={programContent} />
2417
+ </div>
2418
+ ) : (
2419
+ <p className="text-sm text-[var(--muted-foreground)]">
2420
+ No program yet. Define what <em>better</em> looks like for this
2421
+ objective — the metric, the scope, any constraints. Agents read this
2422
+ before every run, and will ask for it in chat if it&apos;s missing.
2423
+ </p>
2424
+ )}
2425
+ </div>
2426
+ </div>
2427
+
2310
2428
  {/* Work on objective */}
2311
2429
  <div className="mb-6">
2312
2430
  <button
@@ -1,16 +1,15 @@
1
1
  "use client";
2
2
 
3
+ import type { ChangeEvent } from "react";
3
4
  import { useCallback, useRef, useState } from "react";
4
5
  import { useRouter } from "next/navigation";
5
6
  import {
6
- Settings,
7
7
  FolderGit2,
8
8
  Download,
9
9
  Upload,
10
10
  Trash2,
11
11
  AlertTriangle,
12
12
  Plus,
13
- X,
14
13
  } from "lucide-react";
15
14
  import type { ProjectWithAgents, ProjectRepoInput } from "@/hooks/useProjects";
16
15
 
@@ -106,15 +105,17 @@ export function ProjectSettings({ project, onUpdate, onDelete }: ProjectSettings
106
105
  );
107
106
 
108
107
  // --- Team Config ---
109
- const fileInputRef = useRef<HTMLInputElement>(null);
108
+ const teamFileInputRef = useRef<HTMLInputElement>(null);
110
109
  const [teamStatus, setTeamStatus] = useState<string | null>(null);
110
+ const workspaceFileInputRef = useRef<HTMLInputElement>(null);
111
+ const [workspaceStatus, setWorkspaceStatus] = useState<string | null>(null);
111
112
 
112
113
  const handleExportYaml = useCallback(() => {
113
114
  window.open(`/api/projects/${project.id}/teams/export`, "_blank");
114
115
  }, [project.id]);
115
116
 
116
117
  const handleImportYaml = useCallback(
117
- async (e: React.ChangeEvent<HTMLInputElement>) => {
118
+ async (e: ChangeEvent<HTMLInputElement>) => {
118
119
  const file = e.target.files?.[0];
119
120
  if (!file) return;
120
121
 
@@ -137,12 +138,46 @@ export function ProjectSettings({ project, onUpdate, onDelete }: ProjectSettings
137
138
  }
138
139
 
139
140
  // Reset file input
140
- if (fileInputRef.current) fileInputRef.current.value = "";
141
+ if (teamFileInputRef.current) teamFileInputRef.current.value = "";
141
142
  setTimeout(() => setTeamStatus(null), 4000);
142
143
  },
143
144
  [project.id],
144
145
  );
145
146
 
147
+ const handleExportWorkspaceYaml = useCallback(() => {
148
+ window.open(`/api/projects/${project.id}/workspace/export`, "_blank");
149
+ }, [project.id]);
150
+
151
+ const handleImportWorkspaceYaml = useCallback(
152
+ async (e: ChangeEvent<HTMLInputElement>) => {
153
+ const file = e.target.files?.[0];
154
+ if (!file) return;
155
+
156
+ try {
157
+ const content = await file.text();
158
+ const res = await fetch(`/api/projects/${project.id}/workspace/import`, {
159
+ method: "POST",
160
+ headers: { "Content-Type": "application/x-yaml" },
161
+ body: content,
162
+ });
163
+
164
+ if (res.ok) {
165
+ setWorkspaceStatus("Import successful");
166
+ router.refresh();
167
+ } else {
168
+ const body = await res.json().catch(() => ({}));
169
+ setWorkspaceStatus(`Import failed: ${body.error || res.statusText}`);
170
+ }
171
+ } catch {
172
+ setWorkspaceStatus("Import failed");
173
+ }
174
+
175
+ if (workspaceFileInputRef.current) workspaceFileInputRef.current.value = "";
176
+ setTimeout(() => setWorkspaceStatus(null), 4000);
177
+ },
178
+ [project.id, router],
179
+ );
180
+
146
181
  // --- Danger Zone ---
147
182
  const [confirmDelete, setConfirmDelete] = useState(false);
148
183
  const [deleting, setDeleting] = useState(false);
@@ -309,7 +344,7 @@ export function ProjectSettings({ project, onUpdate, onDelete }: ProjectSettings
309
344
  <Upload className="w-4 h-4" />
310
345
  Import YAML
311
346
  <input
312
- ref={fileInputRef}
347
+ ref={teamFileInputRef}
313
348
  type="file"
314
349
  accept=".yaml,.yml"
315
350
  onChange={handleImportYaml}
@@ -319,7 +354,46 @@ export function ProjectSettings({ project, onUpdate, onDelete }: ProjectSettings
319
354
  </div>
320
355
  </section>
321
356
 
322
- {/* Section 4: Danger Zone */}
357
+ {/* Section 4: Workspace Map YAML */}
358
+ <section className="rounded-2xl border border-zinc-800 bg-zinc-900/50 p-6 space-y-4">
359
+ <div className="flex items-center justify-between border-b border-zinc-800 pb-3">
360
+ <h2 className="text-sm font-bold uppercase tracking-widest text-zinc-400">
361
+ Workspace Map YAML
362
+ </h2>
363
+ {workspaceStatus && (
364
+ <span className="text-xs text-zinc-500">{workspaceStatus}</span>
365
+ )}
366
+ </div>
367
+
368
+ <p className="text-sm text-zinc-500">
369
+ Export the portable workspace map structure without local paths, or import a shared YAML skeleton that
370
+ teammates can map on this machine.
371
+ </p>
372
+
373
+ <div className="flex items-center gap-3">
374
+ <button
375
+ onClick={handleExportWorkspaceYaml}
376
+ className="flex items-center gap-2 px-4 py-2 rounded-xl border border-zinc-700 bg-zinc-800/50 hover:bg-zinc-800 transition-colors text-sm text-zinc-300"
377
+ >
378
+ <Download className="w-4 h-4" />
379
+ Export YAML
380
+ </button>
381
+
382
+ <label className="flex items-center gap-2 px-4 py-2 rounded-xl border border-zinc-700 bg-zinc-800/50 hover:bg-zinc-800 transition-colors text-sm text-zinc-300 cursor-pointer">
383
+ <Upload className="w-4 h-4" />
384
+ Import YAML
385
+ <input
386
+ ref={workspaceFileInputRef}
387
+ type="file"
388
+ accept=".yaml,.yml"
389
+ onChange={handleImportWorkspaceYaml}
390
+ className="hidden"
391
+ />
392
+ </label>
393
+ </div>
394
+ </section>
395
+
396
+ {/* Section 5: Danger Zone */}
323
397
  <section className="rounded-2xl border border-red-900/50 bg-zinc-900/50 p-6 space-y-4">
324
398
  <div className="flex items-center gap-2 border-b border-red-900/30 pb-3">
325
399
  <AlertTriangle className="w-4 h-4 text-red-500" />
@@ -832,7 +832,7 @@ export function WorkspaceSidebar({
832
832
  </RailTooltip>
833
833
  )}
834
834
  {stageShow.folders && (
835
- <RailTooltip label="Folders">
835
+ <RailTooltip label="Workspace Map">
836
836
  <Link href={`/projects/${collapsedSlug}/folders`} className={`workspace-sidebar__rail-icon${activeProjectView === "folders" ? " workspace-sidebar__rail-icon--active" : ""}`}>
837
837
  <FolderGit2 size={16} />
838
838
  </Link>
@@ -1098,7 +1098,17 @@ export function WorkspaceSidebar({
1098
1098
  </span>
1099
1099
  )}
1100
1100
  </button>
1101
- ) : null}
1101
+ ) : (
1102
+ <Link
1103
+ href={`/projects/${selectedProject.slug}/thread`}
1104
+ onClick={closeTouchDrawer}
1105
+ className={`workspace-sidebar__nav-item ${isActiveProjectThread ? "workspace-sidebar__nav-item--active" : ""}`}
1106
+ aria-current={isActiveProjectThread ? "page" : undefined}
1107
+ >
1108
+ <MessageSquare size={14} className="flex-shrink-0 text-[var(--muted-foreground)]" />
1109
+ <span className="workspace-sidebar__workspace-title text-sm">Chat</span>
1110
+ </Link>
1111
+ )}
1102
1112
  </div>
1103
1113
  </div>
1104
1114
  </div>
@@ -1132,7 +1142,7 @@ export function WorkspaceSidebar({
1132
1142
  aria-current={isActiveProjectFolders ? "page" : undefined}
1133
1143
  >
1134
1144
  <FolderGit2 size={14} className="flex-shrink-0 text-[var(--muted-foreground)]" />
1135
- <span className="workspace-sidebar__workspace-title text-sm">Folders</span>
1145
+ <span className="workspace-sidebar__workspace-title text-sm">Workspace Map</span>
1136
1146
  </Link>
1137
1147
  </div>
1138
1148
  )}
@@ -0,0 +1,117 @@
1
+ "use client";
2
+
3
+ import { useCallback, useEffect, useState } from "react";
4
+ import type { WorkspaceEntry } from "@/lib/db/types";
5
+ import type { ProjectWorkspace } from "@/lib/project-workspace";
6
+ import { countWorkspaceEntries } from "@/lib/project-workspace";
7
+
8
+ interface CreateWorkspaceEntryInput {
9
+ category: string;
10
+ name: string;
11
+ path?: string | null;
12
+ purpose?: string | null;
13
+ }
14
+
15
+ interface UpdateWorkspaceEntryInput {
16
+ name?: string;
17
+ path?: string | null;
18
+ purpose?: string | null;
19
+ sort_order?: number;
20
+ }
21
+
22
+ async function readErrorMessage(response: Response, fallback: string): Promise<string> {
23
+ const body = await response.json().catch(() => ({}));
24
+ return typeof body.error === "string" ? body.error : fallback;
25
+ }
26
+
27
+ export function useProjectWorkspace(projectId: string) {
28
+ const [workspace, setWorkspace] = useState<ProjectWorkspace>({});
29
+ const [isLoading, setIsLoading] = useState(false);
30
+ const [error, setError] = useState<Error | null>(null);
31
+
32
+ const fetchWorkspace = useCallback(async () => {
33
+ if (!projectId) {
34
+ setWorkspace({});
35
+ setIsLoading(false);
36
+ setError(null);
37
+ return;
38
+ }
39
+
40
+ setIsLoading(true);
41
+ try {
42
+ const response = await fetch(`/api/projects/${projectId}/workspace`);
43
+ if (!response.ok) {
44
+ throw new Error(await readErrorMessage(response, "Failed to fetch workspace map"));
45
+ }
46
+ const data = await response.json();
47
+ setWorkspace(data.workspace ?? {});
48
+ setError(null);
49
+ } catch (err) {
50
+ setError(err instanceof Error ? err : new Error("Unknown error"));
51
+ } finally {
52
+ setIsLoading(false);
53
+ }
54
+ }, [projectId]);
55
+
56
+ useEffect(() => {
57
+ void fetchWorkspace();
58
+ }, [fetchWorkspace]);
59
+
60
+ const createEntry = useCallback(
61
+ async (input: CreateWorkspaceEntryInput) => {
62
+ const response = await fetch(`/api/projects/${projectId}/workspace`, {
63
+ method: "POST",
64
+ headers: { "Content-Type": "application/json" },
65
+ body: JSON.stringify(input),
66
+ });
67
+ if (!response.ok) {
68
+ throw new Error(await readErrorMessage(response, "Failed to create workspace entry"));
69
+ }
70
+ const data = await response.json();
71
+ await fetchWorkspace();
72
+ return data.entry as WorkspaceEntry;
73
+ },
74
+ [fetchWorkspace, projectId],
75
+ );
76
+
77
+ const updateEntry = useCallback(
78
+ async (entryId: string, updates: UpdateWorkspaceEntryInput) => {
79
+ const response = await fetch(`/api/projects/${projectId}/workspace/${entryId}`, {
80
+ method: "PATCH",
81
+ headers: { "Content-Type": "application/json" },
82
+ body: JSON.stringify(updates),
83
+ });
84
+ if (!response.ok) {
85
+ throw new Error(await readErrorMessage(response, "Failed to update workspace entry"));
86
+ }
87
+ const data = await response.json();
88
+ await fetchWorkspace();
89
+ return data.entry as WorkspaceEntry;
90
+ },
91
+ [fetchWorkspace, projectId],
92
+ );
93
+
94
+ const deleteEntry = useCallback(
95
+ async (entryId: string) => {
96
+ const response = await fetch(`/api/projects/${projectId}/workspace/${entryId}`, {
97
+ method: "DELETE",
98
+ });
99
+ if (!response.ok) {
100
+ throw new Error(await readErrorMessage(response, "Failed to delete workspace entry"));
101
+ }
102
+ await fetchWorkspace();
103
+ },
104
+ [fetchWorkspace, projectId],
105
+ );
106
+
107
+ return {
108
+ workspace,
109
+ entryCount: countWorkspaceEntries(workspace),
110
+ isLoading,
111
+ error,
112
+ refetch: fetchWorkspace,
113
+ createEntry,
114
+ updateEntry,
115
+ deleteEntry,
116
+ };
117
+ }
@@ -582,6 +582,15 @@ export async function getProjectForThread(threadId: string): Promise<string | nu
582
582
  }
583
583
 
584
584
  export async function getProjectWorkspace(projectId: string): Promise<Record<string, WorkspaceEntry[]>> {
585
+ const entries = await getProjectWorkspaceEntries(projectId);
586
+ return entries.reduce<Record<string, WorkspaceEntry[]>>((acc, entry) => {
587
+ if (!acc[entry.category]) acc[entry.category] = [];
588
+ acc[entry.category].push(entry);
589
+ return acc;
590
+ }, {});
591
+ }
592
+
593
+ export async function getProjectWorkspaceEntries(projectId: string): Promise<WorkspaceEntry[]> {
585
594
  const db = createAdminDbClient();
586
595
  const { data, error } = await db
587
596
  .from("workspace_entries")
@@ -592,20 +601,15 @@ export async function getProjectWorkspace(projectId: string): Promise<Record<str
592
601
  .order("name", { ascending: true });
593
602
 
594
603
  if (error) {
595
- if (isMissingRelationError(error, "workspace_entries")) return {};
604
+ if (isMissingRelationError(error, "workspace_entries")) return [];
596
605
  throw error;
597
606
  }
598
- const entries = (data || []) as WorkspaceEntry[];
599
- return entries.reduce<Record<string, WorkspaceEntry[]>>((acc, entry) => {
600
- if (!acc[entry.category]) acc[entry.category] = [];
601
- acc[entry.category].push(entry);
602
- return acc;
603
- }, {});
607
+ return (data || []) as WorkspaceEntry[];
604
608
  }
605
609
 
606
610
  export async function createWorkspaceEntry(
607
611
  projectId: string,
608
- entry: { category: string; name: string; path?: string; purpose?: string }
612
+ entry: { category: string; name: string; path?: string | null; purpose?: string | null; sort_order?: number }
609
613
  ): Promise<WorkspaceEntry> {
610
614
  const db = createAdminDbClient();
611
615
  const id = randomUUID();
@@ -619,7 +623,7 @@ export async function createWorkspaceEntry(
619
623
  name: entry.name,
620
624
  path: entry.path || null,
621
625
  purpose: entry.purpose || null,
622
- sort_order: 0,
626
+ sort_order: entry.sort_order ?? 0,
623
627
  created_at: now,
624
628
  updated_at: now,
625
629
  })
@@ -641,6 +645,7 @@ export async function updateWorkspaceEntry(
641
645
  if (updates.path !== undefined) payload.path = updates.path;
642
646
  if (updates.purpose !== undefined) payload.purpose = updates.purpose;
643
647
  if (updates.sort_order !== undefined) payload.sort_order = updates.sort_order;
648
+ payload.updated_at = new Date().toISOString();
644
649
 
645
650
  const { data, error } = await db
646
651
  .from("workspace_entries")
@@ -689,4 +694,3 @@ export async function getWorkspaceMapForContext(
689
694
  purpose: (row.purpose as string) || null,
690
695
  }));
691
696
  }
692
-
@@ -0,0 +1,80 @@
1
+ import type { WorkspaceEntry } from "@/lib/db/types";
2
+ import {
3
+ DEFAULT_WORKSPACE_CATEGORIES,
4
+ getWorkspaceCategory,
5
+ WORKSPACE_CATEGORY_IDS,
6
+ } from "@/lib/workspace-categories";
7
+
8
+ export type ProjectWorkspace = Record<string, WorkspaceEntry[]>;
9
+
10
+ export interface WorkspaceCategoryGroup {
11
+ id: string;
12
+ label: string;
13
+ entries: WorkspaceEntry[];
14
+ isPreset: boolean;
15
+ isEmpty: boolean;
16
+ }
17
+
18
+ export function isPresetWorkspaceCategory(category: string): boolean {
19
+ return WORKSPACE_CATEGORY_IDS.includes(category as (typeof WORKSPACE_CATEGORY_IDS)[number]);
20
+ }
21
+
22
+ export function formatWorkspaceCategoryLabel(category: string): string {
23
+ const trimmed = category.trim();
24
+ const preset = trimmed ? getWorkspaceCategory(trimmed as (typeof WORKSPACE_CATEGORY_IDS)[number]) : null;
25
+ if (preset) return preset.label;
26
+ if (!trimmed) return "Custom";
27
+
28
+ return trimmed
29
+ .replace(/[_-]+/g, " ")
30
+ .replace(/\s+/g, " ")
31
+ .replace(/\b\w/g, (char) => char.toUpperCase());
32
+ }
33
+
34
+ function sortEntries(entries: WorkspaceEntry[]): WorkspaceEntry[] {
35
+ return [...entries].sort((left, right) => {
36
+ if (left.sort_order !== right.sort_order) {
37
+ return left.sort_order - right.sort_order;
38
+ }
39
+ return left.name.localeCompare(right.name);
40
+ });
41
+ }
42
+
43
+ export function countWorkspaceEntries(workspace: ProjectWorkspace): number {
44
+ return Object.values(workspace).reduce((total, entries) => total + entries.length, 0);
45
+ }
46
+
47
+ export function buildWorkspaceCategoryGroups(
48
+ workspace: ProjectWorkspace,
49
+ extraCategories: string[] = [],
50
+ ): WorkspaceCategoryGroup[] {
51
+ const presetGroups: WorkspaceCategoryGroup[] = DEFAULT_WORKSPACE_CATEGORIES.map((category) => {
52
+ const entries = sortEntries(workspace[category.id] ?? []);
53
+ return {
54
+ id: category.id,
55
+ label: category.label,
56
+ entries,
57
+ isPreset: true,
58
+ isEmpty: entries.length === 0,
59
+ };
60
+ });
61
+
62
+ const customCategoryIds = [...new Set([...Object.keys(workspace), ...extraCategories])]
63
+ .map((category) => category.trim())
64
+ .filter((category) => category.length > 0)
65
+ .filter((category) => !isPresetWorkspaceCategory(category))
66
+ .sort((left, right) => formatWorkspaceCategoryLabel(left).localeCompare(formatWorkspaceCategoryLabel(right)));
67
+
68
+ const customGroups: WorkspaceCategoryGroup[] = customCategoryIds.map((category) => {
69
+ const entries = sortEntries(workspace[category] ?? []);
70
+ return {
71
+ id: category,
72
+ label: formatWorkspaceCategoryLabel(category),
73
+ entries,
74
+ isPreset: false,
75
+ isEmpty: entries.length === 0,
76
+ };
77
+ });
78
+
79
+ return [...presetGroups, ...customGroups];
80
+ }