@mndrk/agx 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
  2. package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +3 -3
  3. package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
  4. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +1 -1
  5. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
  6. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.html +2 -2
  13. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.rsc +2 -2
  14. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  15. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  17. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  21. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  22. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.html +2 -2
  23. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.rsc +2 -2
  24. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_full.segment.rsc +2 -2
  25. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  26. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_index.segment.rsc +2 -2
  27. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
  28. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +1 -1
  29. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents.segment.rsc +1 -1
  30. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
  31. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
  32. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/export/route.js.nft.json +1 -1
  33. package/cloud-runtime/standalone/apps/local/.next/server/app/api/chat/route.js.nft.json +1 -1
  34. package/cloud-runtime/standalone/apps/local/.next/server/app/api/file-search/route.js.nft.json +1 -1
  35. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/[id]/route.js.nft.json +1 -1
  36. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/context/route.js.nft.json +1 -1
  37. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/route.js.nft.json +1 -1
  38. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/options/route.js.nft.json +1 -1
  39. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/runs/scripted/route.js.nft.json +1 -1
  40. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/status/route.js.nft.json +1 -1
  41. package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js.nft.json +1 -1
  42. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/linear-issues/route.js.nft.json +1 -1
  43. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/scheduled-tasks/route.js.nft.json +1 -1
  44. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.nft.json +1 -1
  45. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/search/route.js.nft.json +1 -1
  46. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/teams/route.js.nft.json +1 -1
  47. package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/poll/route.js.nft.json +1 -1
  48. package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/check/[id]/route.js.nft.json +1 -1
  49. package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/route.js.nft.json +1 -1
  50. package/cloud-runtime/standalone/apps/local/.next/server/app/api/queue/route.js.nft.json +1 -1
  51. package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
  52. package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
  53. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/assign/route.js.nft.json +1 -1
  54. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/available/route.js.nft.json +1 -1
  55. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/detail/route.js.nft.json +1 -1
  56. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/history/route.js.nft.json +1 -1
  57. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/learn/route.js.nft.json +1 -1
  58. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/route.js.nft.json +1 -1
  59. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -1
  60. package/cloud-runtime/standalone/apps/local/.next/server/app/api/status/route.js.nft.json +1 -1
  61. package/cloud-runtime/standalone/apps/local/.next/server/app/api/summarize/route.js.nft.json +1 -1
  62. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
  63. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
  64. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js.nft.json +1 -1
  65. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  66. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/extract/route.js.nft.json +1 -1
  67. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/route.js.nft.json +1 -1
  68. package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
  69. package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/route.js.nft.json +1 -1
  70. package/cloud-runtime/standalone/apps/local/.next/server/app/automations/page_client-reference-manifest.js +1 -1
  71. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.html +2 -2
  72. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.rsc +5 -5
  73. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_full.segment.rsc +5 -5
  74. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_head.segment.rsc +1 -1
  75. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_index.segment.rsc +2 -2
  76. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_tree.segment.rsc +3 -3
  77. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/automations/__PAGE__.segment.rsc +3 -3
  78. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/automations.segment.rsc +1 -1
  79. package/cloud-runtime/standalone/apps/local/.next/server/app/board/page_client-reference-manifest.js +1 -1
  80. package/cloud-runtime/standalone/apps/local/.next/server/app/board.html +2 -2
  81. package/cloud-runtime/standalone/apps/local/.next/server/app/board.rsc +2 -2
  82. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_full.segment.rsc +2 -2
  83. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_head.segment.rsc +1 -1
  84. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_index.segment.rsc +2 -2
  85. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  86. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/board/__PAGE__.segment.rsc +1 -1
  87. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/board.segment.rsc +1 -1
  88. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page.js.nft.json +1 -1
  89. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page_client-reference-manifest.js +1 -1
  90. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.html +2 -2
  91. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.rsc +3 -3
  92. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_full.segment.rsc +3 -3
  93. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_head.segment.rsc +1 -1
  94. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_index.segment.rsc +2 -2
  95. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_tree.segment.rsc +2 -2
  96. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/execution-graph/__PAGE__.segment.rsc +2 -2
  97. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/execution-graph.segment.rsc +1 -1
  98. package/cloud-runtime/standalone/apps/local/.next/server/app/folders/page_client-reference-manifest.js +1 -1
  99. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.html +2 -2
  100. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.rsc +2 -2
  101. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_full.segment.rsc +2 -2
  102. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_head.segment.rsc +1 -1
  103. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_index.segment.rsc +2 -2
  104. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_tree.segment.rsc +2 -2
  105. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/folders/__PAGE__.segment.rsc +1 -1
  106. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/folders.segment.rsc +1 -1
  107. package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
  108. package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +2 -2
  109. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  110. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +2 -2
  111. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_head.segment.rsc +1 -1
  112. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_index.segment.rsc +2 -2
  113. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  114. package/cloud-runtime/standalone/apps/local/.next/server/app/page_client-reference-manifest.js +1 -1
  115. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
  116. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
  117. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
  118. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
  119. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/knowledge/page_client-reference-manifest.js +1 -1
  120. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page.js.nft.json +1 -1
  121. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page_client-reference-manifest.js +1 -1
  122. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.js.nft.json +1 -1
  123. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page_client-reference-manifest.js +1 -1
  124. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page.js.nft.json +1 -1
  125. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page_client-reference-manifest.js +1 -1
  126. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  127. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
  128. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
  129. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page_client-reference-manifest.js +1 -1
  130. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page_client-reference-manifest.js +1 -1
  131. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page_client-reference-manifest.js +1 -1
  132. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page_client-reference-manifest.js +1 -1
  133. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page_client-reference-manifest.js +1 -1
  134. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page_client-reference-manifest.js +1 -1
  135. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
  136. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
  137. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans/page_client-reference-manifest.js +1 -1
  138. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.html +2 -2
  139. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.rsc +2 -2
  140. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_full.segment.rsc +2 -2
  141. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_head.segment.rsc +1 -1
  142. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_index.segment.rsc +2 -2
  143. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_tree.segment.rsc +2 -2
  144. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects/orphans/__PAGE__.segment.rsc +1 -1
  145. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects/orphans.segment.rsc +1 -1
  146. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects.segment.rsc +1 -1
  147. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  148. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.html +2 -2
  149. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.rsc +2 -2
  150. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_full.segment.rsc +2 -2
  151. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  152. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  153. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  154. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +1 -1
  155. package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  156. package/cloud-runtime/standalone/apps/local/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  157. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.html +2 -2
  158. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.rsc +2 -2
  159. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  160. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  161. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  162. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  163. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  164. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  165. package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  166. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.html +2 -2
  167. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.rsc +2 -2
  168. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +2 -2
  169. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  170. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_index.segment.rsc +2 -2
  171. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  172. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
  173. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  174. package/cloud-runtime/standalone/apps/local/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  175. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.html +2 -2
  176. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.rsc +2 -2
  177. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_full.segment.rsc +2 -2
  178. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_head.segment.rsc +1 -1
  179. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_index.segment.rsc +2 -2
  180. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_tree.segment.rsc +2 -2
  181. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +1 -1
  182. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/skills.segment.rsc +1 -1
  183. package/cloud-runtime/standalone/apps/local/.next/server/app/status/page.js.nft.json +1 -1
  184. package/cloud-runtime/standalone/apps/local/.next/server/app/status/page_client-reference-manifest.js +1 -1
  185. package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
  186. package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +3 -3
  187. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +3 -3
  188. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
  189. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +2 -2
  190. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +2 -2
  191. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +2 -2
  192. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
  193. package/cloud-runtime/standalone/apps/local/.next/server/app/thread/[id]/page.js.nft.json +1 -1
  194. package/cloud-runtime/standalone/apps/local/.next/server/app/thread/[id]/page_client-reference-manifest.js +1 -1
  195. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_067eb..._.js +3 -0
  196. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__039h7r.._.js +18 -0
  197. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0lno3km._.js +3 -0
  198. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__0fl7_-o._.js → [root-of-the-server]__0nqqk26._.js} +2 -2
  199. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{[root-of-the-server]__0j9m72.._.js → [root-of-the-server]__0tqn-o5._.js} +2 -2
  200. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0~nm7b6._.js +3 -0
  201. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{_064h43p._.js → _05xj_bp._.js} +2 -2
  202. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{apps_local_0nvzo3y._.js → apps_local_04dh2yh._.js} +2 -2
  203. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_layout_tsx_0aaa3~t._.js +1 -1
  204. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_linear_page_tsx_0a~n5y8._.js +2 -2
  205. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_PromptJobBoard_tsx_06zob36._.js +1 -1
  206. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_chat-ui_ChatContainer_tsx_0c9fjtl._.js +1 -1
  207. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_0k4tfip._.js +1 -1
  208. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_thread_WorkspaceSidebar_tsx_0unv2xp._.js +1 -1
  209. package/cloud-runtime/standalone/apps/local/.next/server/middleware-build-manifest.js +3 -3
  210. package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
  211. package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
  212. package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +1 -1
  213. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
  214. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
  215. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0e307b-0c2jbx.js → 0-cets4_axpvm.js} +1 -1
  216. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0-wlbe.ripd2w.css +1 -0
  217. package/cloud-runtime/standalone/apps/local/.next/static/chunks/00e1ihnb6ap3t.js +16 -0
  218. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{119v0-idpg-cv.js → 0_cjth28_11b2.js} +1 -1
  219. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0e6rxcxy.l5c8.js +1 -0
  220. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ime4btrg-g4l.js +1 -0
  221. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0jrkacz_dyem6.js → 0jglardpw~5uc.js} +5 -5
  222. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0tt1oh112yv-l.js → 0jq0t4zip38wt.js} +1 -1
  223. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0kn66yvx08813.css +1 -0
  224. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{07646a0h94826.js → 0l89kxqcf86on.js} +2 -2
  225. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ng6wy4ak35jg.js +1 -0
  226. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0n~jhoq~op4e5.js +16 -0
  227. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0stvi5btlxl4m.js → 0xu_doej_wc-3.js} +1 -1
  228. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{16d~es6h6k~rj.js → 16fyhcmwlw3th.js} +1 -1
  229. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0uve8xrt~0a2e.js → 18e8w~~mvoh5o.js} +1 -1
  230. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/layout.tsx +1 -1
  231. package/cloud-runtime/standalone/apps/local/components/PromptJobBoard.tsx +3 -2
  232. package/cloud-runtime/standalone/apps/local/components/linear/LinearSettingsModal.tsx +9 -3
  233. package/cloud-runtime/standalone/apps/local/components/linear/LinearWorkerConfig.tsx +65 -30
  234. package/cloud-runtime/standalone/apps/local/components/linear/LinearWorkerRunLog.tsx +190 -0
  235. package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveScheduledTasksPanel.tsx +38 -34
  236. package/cloud-runtime/standalone/apps/local/components/thread/WorkspaceSidebar.tsx +118 -17
  237. package/cloud-runtime/standalone/apps/local/styles/workspaceSidebar.css +71 -2
  238. package/cloud-runtime/standalone/apps/local/worker/index.js +2 -2
  239. package/package.json +1 -1
  240. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_0tvwux2._.js +0 -3
  241. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__006vr7.._.js +0 -3
  242. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0d18x53._.js +0 -18
  243. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__0z7nw_r._.js +0 -3
  244. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0-_ukhpeg429c.js +0 -16
  245. package/cloud-runtime/standalone/apps/local/.next/static/chunks/04yoml2rqnuot.js +0 -16
  246. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0_mrpyqcoyb_5.js +0 -1
  247. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0edewt9l~cs~k.css +0 -1
  248. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0f7i3ae1ynhf3.css +0 -1
  249. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0r0c9y6.8.m5p.js +0 -1
  250. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0zw85-xl9ysjs.js +0 -1
  251. /package/cloud-runtime/standalone/apps/local/.next/static/{RnYHmEXBwXJjVrVVx2CuP → qPuactsz6OYimwT6dSdHn}/_buildManifest.js +0 -0
  252. /package/cloud-runtime/standalone/apps/local/.next/static/{RnYHmEXBwXJjVrVVx2CuP → qPuactsz6OYimwT6dSdHn}/_clientMiddlewareManifest.js +0 -0
  253. /package/cloud-runtime/standalone/apps/local/.next/static/{RnYHmEXBwXJjVrVVx2CuP → qPuactsz6OYimwT6dSdHn}/_ssgManifest.js +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useCallback, useEffect, useRef, useState } from "react";
4
4
  import dynamic from "next/dynamic";
5
- import { ChevronDown, ChevronRight, Pause, Play, RefreshCw } from "lucide-react";
5
+ import { ChevronDown, ChevronRight, Play, RefreshCw } from "lucide-react";
6
6
  import { ScheduleConditionPicker, SimpleDropdown } from "@/components/scheduling/ScheduleConditionPicker";
7
7
  import {
8
8
  LINEAR_WORKER_DEFAULT_PROMPT,
@@ -21,6 +21,7 @@ interface TeamOption {
21
21
 
22
22
  interface LinearWorkerConfigProps {
23
23
  projectId?: string;
24
+ onJobLoaded?: (jobId: string | null) => void;
24
25
  }
25
26
 
26
27
  function formatNextRun(
@@ -87,6 +88,7 @@ function CollapsibleSection({
87
88
 
88
89
  export default function LinearWorkerConfig({
89
90
  projectId,
91
+ onJobLoaded,
90
92
  }: LinearWorkerConfigProps) {
91
93
  const [job, setJob] = useState<PromptJob | null>(null);
92
94
  const [teams, setTeams] = useState<TeamOption[]>([]);
@@ -120,13 +122,16 @@ export default function LinearWorkerConfig({
120
122
  setCadence(data.job.cronExpr || data.job.cadence || "*/30 * * * *");
121
123
  setCondition(data.job.condition || "");
122
124
  setTeamId(data.job.teamId || "");
125
+ onJobLoaded?.(data.job.id);
126
+ } else {
127
+ onJobLoaded?.(null);
123
128
  }
124
129
  } catch {
125
130
  // ignore
126
131
  } finally {
127
132
  setLoading(false);
128
133
  }
129
- }, [projectId]);
134
+ }, [projectId, onJobLoaded]);
130
135
 
131
136
  const fetchTeams = useCallback(async () => {
132
137
  if (!projectId) return;
@@ -216,6 +221,26 @@ export default function LinearWorkerConfig({
216
221
  }
217
222
  }, [job, projectId, handleSave]);
218
223
 
224
+ const [runningNow, setRunningNow] = useState(false);
225
+
226
+ const handleRunNow = useCallback(async () => {
227
+ if (!job) return;
228
+ setRunningNow(true);
229
+ try {
230
+ await fetch("/api/prompt-jobs/poll", {
231
+ method: "POST",
232
+ headers: { "Content-Type": "application/json" },
233
+ body: JSON.stringify({ jobId: job.id }),
234
+ });
235
+ // Refresh status after triggering
236
+ setTimeout(fetchWorker, 1000);
237
+ } catch {
238
+ // ignore
239
+ } finally {
240
+ setRunningNow(false);
241
+ }
242
+ }, [job, fetchWorker]);
243
+
219
244
  if (loading) {
220
245
  return (
221
246
  <div className="flex items-center gap-2 py-12 justify-center text-sm text-[var(--muted-foreground)]">
@@ -234,15 +259,6 @@ export default function LinearWorkerConfig({
234
259
  <div className="flex items-center gap-4 text-xs text-[var(--muted-foreground)]">
235
260
  {job && (
236
261
  <>
237
- <span
238
- className={`rounded-full border px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.16em] ${
239
- isActive
240
- ? "border-emerald-500/30 bg-emerald-500/10 text-emerald-400"
241
- : "border-yellow-500/30 bg-yellow-500/10 text-yellow-400"
242
- }`}
243
- >
244
- {job.state}
245
- </span>
246
262
  <span>
247
263
  Next: <span className="text-[var(--foreground)]">{formatNextRun(job.nextRunAt, job.state)}</span>
248
264
  </span>
@@ -260,26 +276,45 @@ export default function LinearWorkerConfig({
260
276
  </>
261
277
  )}
262
278
  </div>
263
- <button
264
- type="button"
265
- disabled={saving}
266
- onClick={handleToggle}
267
- className={`flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-xs font-medium transition-colors ${
268
- isActive
269
- ? "border-yellow-500/30 bg-yellow-500/10 text-yellow-400 hover:bg-yellow-500/20"
270
- : "border-emerald-500/30 bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20"
271
- }`}
272
- >
273
- {isActive ? (
274
- <>
275
- <Pause size={12} /> Pause
276
- </>
277
- ) : (
278
- <>
279
- <Play size={12} /> {job ? "Resume" : "Enable"}
280
- </>
279
+ <div className="flex items-center gap-3">
280
+ {/* Run Now button */}
281
+ {job && (
282
+ <button
283
+ type="button"
284
+ disabled={runningNow || saving}
285
+ onClick={handleRunNow}
286
+ className="flex items-center gap-1.5 rounded-lg border border-blue-500/30 bg-blue-500/10 px-3 py-1.5 text-xs font-medium text-blue-400 transition-colors hover:bg-blue-500/20 disabled:opacity-40"
287
+ >
288
+ {runningNow ? (
289
+ <RefreshCw size={12} className="animate-spin" />
290
+ ) : (
291
+ <Play size={12} />
292
+ )}
293
+ Run now
294
+ </button>
281
295
  )}
282
- </button>
296
+ {/* Enable / Disable toggle */}
297
+ <button
298
+ type="button"
299
+ disabled={saving}
300
+ onClick={handleToggle}
301
+ className="relative flex items-center gap-2.5 rounded-lg border border-[var(--card-border)] bg-[var(--muted)] px-3 py-1.5 text-xs font-medium text-[var(--foreground)] transition-colors hover:border-[var(--muted-foreground)]"
302
+ >
303
+ {/* Toggle track */}
304
+ <span
305
+ className={`relative inline-flex h-4 w-7 shrink-0 items-center rounded-full transition-colors ${
306
+ isActive ? "bg-emerald-500" : "bg-[var(--card-border)]"
307
+ }`}
308
+ >
309
+ <span
310
+ className={`inline-block h-3 w-3 rounded-full bg-white transition-transform ${
311
+ isActive ? "translate-x-3.5" : "translate-x-0.5"
312
+ }`}
313
+ />
314
+ </span>
315
+ {isActive ? "Enabled" : "Disabled"}
316
+ </button>
317
+ </div>
283
318
  </div>
284
319
 
285
320
  {/* Main layout: Left (prompts) | Right (config) */}
@@ -0,0 +1,190 @@
1
+ "use client";
2
+
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { RefreshCw, CheckCircle2, XCircle, Clock, Loader2, Ban } from "lucide-react";
5
+ import type { PromptRun } from "@/src/prompt-scheduler/types";
6
+
7
+ interface LinearWorkerRunLogProps {
8
+ jobId: string | null;
9
+ }
10
+
11
+ function StatusIcon({ status }: { status: PromptRun["status"] }) {
12
+ switch (status) {
13
+ case "success":
14
+ return <CheckCircle2 size={14} className="text-emerald-400" />;
15
+ case "failed":
16
+ return <XCircle size={14} className="text-red-400" />;
17
+ case "running":
18
+ return <Loader2 size={14} className="text-blue-400 animate-spin" />;
19
+ case "queued":
20
+ return <Clock size={14} className="text-yellow-400" />;
21
+ case "cancelled":
22
+ return <Ban size={14} className="text-[var(--muted-foreground)]" />;
23
+ default:
24
+ return <Clock size={14} className="text-[var(--muted-foreground)]" />;
25
+ }
26
+ }
27
+
28
+ function statusLabel(status: PromptRun["status"]): string {
29
+ return status.charAt(0).toUpperCase() + status.slice(1);
30
+ }
31
+
32
+ function statusColor(status: PromptRun["status"]): string {
33
+ switch (status) {
34
+ case "success":
35
+ return "text-emerald-400";
36
+ case "failed":
37
+ return "text-red-400";
38
+ case "running":
39
+ return "text-blue-400";
40
+ case "queued":
41
+ return "text-yellow-400";
42
+ case "cancelled":
43
+ return "text-[var(--muted-foreground)]";
44
+ default:
45
+ return "text-[var(--muted-foreground)]";
46
+ }
47
+ }
48
+
49
+ function formatDuration(ms: number | null): string {
50
+ if (ms === null) return "—";
51
+ if (ms < 1000) return `${ms}ms`;
52
+ if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
53
+ if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m ${Math.round((ms % 60_000) / 1000)}s`;
54
+ return `${Math.round(ms / 3_600_000)}h ${Math.round((ms % 3_600_000) / 60_000)}m`;
55
+ }
56
+
57
+ function formatTime(iso: string | null): string {
58
+ if (!iso) return "—";
59
+ const d = new Date(iso);
60
+ return d.toLocaleString(undefined, {
61
+ month: "short",
62
+ day: "numeric",
63
+ hour: "2-digit",
64
+ minute: "2-digit",
65
+ second: "2-digit",
66
+ });
67
+ }
68
+
69
+ export default function LinearWorkerRunLog({ jobId }: LinearWorkerRunLogProps) {
70
+ const [runs, setRuns] = useState<PromptRun[]>([]);
71
+ const [loading, setLoading] = useState(true);
72
+ const [expandedId, setExpandedId] = useState<string | null>(null);
73
+ const initialFetch = useRef(false);
74
+
75
+ const fetchRuns = useCallback(async () => {
76
+ if (!jobId) {
77
+ setLoading(false);
78
+ return;
79
+ }
80
+ try {
81
+ const res = await fetch(`/api/prompt-jobs/${jobId}/runs`);
82
+ if (!res.ok) return;
83
+ const data = await res.json();
84
+ setRuns(data.runs ?? []);
85
+ } catch {
86
+ // ignore
87
+ } finally {
88
+ setLoading(false);
89
+ }
90
+ }, [jobId]);
91
+
92
+ useEffect(() => {
93
+ if (!initialFetch.current) {
94
+ initialFetch.current = true;
95
+ fetchRuns();
96
+ }
97
+ }, [fetchRuns]);
98
+
99
+ // Poll for updates
100
+ useEffect(() => {
101
+ const interval = setInterval(fetchRuns, 10_000);
102
+ return () => clearInterval(interval);
103
+ }, [fetchRuns]);
104
+
105
+ if (!jobId) {
106
+ return (
107
+ <div className="flex items-center justify-center py-16 text-sm text-[var(--muted-foreground)]">
108
+ No worker configured yet. Enable the worker to see run history.
109
+ </div>
110
+ );
111
+ }
112
+
113
+ if (loading) {
114
+ return (
115
+ <div className="flex items-center gap-2 py-12 justify-center text-sm text-[var(--muted-foreground)]">
116
+ <RefreshCw size={14} className="animate-spin" />
117
+ Loading run history...
118
+ </div>
119
+ );
120
+ }
121
+
122
+ if (runs.length === 0) {
123
+ return (
124
+ <div className="flex items-center justify-center py-16 text-sm text-[var(--muted-foreground)]">
125
+ No runs yet. The worker will log runs here once it starts executing.
126
+ </div>
127
+ );
128
+ }
129
+
130
+ return (
131
+ <div className="flex flex-col gap-1">
132
+ {/* Header */}
133
+ <div className="grid grid-cols-[minmax(0,1fr)_100px_140px_140px_90px] gap-3 px-4 py-2 text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest border-b border-[var(--card-border)]">
134
+ <span>Status</span>
135
+ <span>Duration</span>
136
+ <span>Started</span>
137
+ <span>Finished</span>
138
+ <span>Run ID</span>
139
+ </div>
140
+
141
+ {/* Rows */}
142
+ <div className="max-h-[60vh] overflow-y-auto">
143
+ {runs.map((run) => (
144
+ <div key={run.id}>
145
+ <button
146
+ type="button"
147
+ onClick={() => setExpandedId(expandedId === run.id ? null : run.id)}
148
+ className="grid w-full grid-cols-[minmax(0,1fr)_100px_140px_140px_90px] gap-3 px-4 py-2.5 text-left text-sm transition-colors hover:bg-[var(--card-bg)] rounded-lg"
149
+ >
150
+ <span className={`flex items-center gap-2 font-medium ${statusColor(run.status)}`}>
151
+ <StatusIcon status={run.status} />
152
+ {statusLabel(run.status)}
153
+ </span>
154
+ <span className="text-[var(--muted-foreground)]">
155
+ {formatDuration(run.durationMs)}
156
+ </span>
157
+ <span className="text-[var(--muted-foreground)]">
158
+ {formatTime(run.startedAt)}
159
+ </span>
160
+ <span className="text-[var(--muted-foreground)]">
161
+ {formatTime(run.finishedAt)}
162
+ </span>
163
+ <span className="text-[var(--muted-foreground)] font-mono text-xs truncate">
164
+ {run.id.slice(0, 8)}
165
+ </span>
166
+ </button>
167
+
168
+ {/* Expanded detail */}
169
+ {expandedId === run.id && (run.output || run.error) && (
170
+ <div className="mx-4 mb-2 rounded-lg border border-[var(--card-border)] bg-[var(--muted)] overflow-hidden">
171
+ {run.error && (
172
+ <div className="px-4 py-3 border-b border-[var(--card-border)]">
173
+ <div className="text-[10px] font-semibold text-red-400 uppercase tracking-widest mb-1">Error</div>
174
+ <pre className="text-xs text-red-300 whitespace-pre-wrap font-mono">{run.error}</pre>
175
+ </div>
176
+ )}
177
+ {run.output && (
178
+ <div className="px-4 py-3">
179
+ <div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1">Output</div>
180
+ <pre className="text-xs text-[var(--foreground)] whitespace-pre-wrap font-mono max-h-[300px] overflow-y-auto">{run.output}</pre>
181
+ </div>
182
+ )}
183
+ </div>
184
+ )}
185
+ </div>
186
+ ))}
187
+ </div>
188
+ </div>
189
+ );
190
+ }
@@ -577,41 +577,45 @@ export function ObjectiveScheduledTasksPanel({
577
577
  const isFailed = run.status === "failed";
578
578
  const isRunning = run.status === "running";
579
579
  return (
580
- <div
581
- key={run.id}
582
- className="flex items-center gap-3 py-2 px-2 rounded-md text-xs"
583
- >
584
- <span
585
- className={`flex size-5 shrink-0 items-center justify-center rounded-full border ${
586
- isSuccess
587
- ? "border-emerald-500/40 text-emerald-400"
588
- : isFailed
589
- ? "border-[var(--status-failed-border)] text-[var(--destructive)]"
590
- : isRunning
591
- ? "border-sky-500/40 text-sky-400"
592
- : "border-[var(--border)] text-[var(--muted-foreground)]"
593
- }`}
594
- >
595
- {isSuccess ? (
596
- <Check className="h-3 w-3" />
597
- ) : isFailed ? (
598
- <XCircle className="h-3 w-3" />
599
- ) : (
600
- <span className={`block size-1.5 rounded-full ${isRunning ? "bg-sky-400 animate-pulse" : "bg-current"}`} />
601
- )}
602
- </span>
603
- <span className="truncate text-[var(--muted-foreground)]">
604
- {run.jobName}
605
- </span>
606
- <span className="ml-auto shrink-0 text-[11px] text-[var(--muted-foreground)]">
607
- {formatDateTime(ts)}
608
- </span>
609
- {run.durationMs != null && (
610
- <span className="shrink-0 font-mono text-[11px] text-[var(--muted-foreground)]">
611
- {run.durationMs < 1000
612
- ? `${run.durationMs}ms`
613
- : `${Math.round(run.durationMs / 1000)}s`}
580
+ <div key={run.id} className="py-2 px-2 rounded-md text-xs">
581
+ <div className="flex items-center gap-3">
582
+ <span
583
+ className={`flex size-5 shrink-0 items-center justify-center rounded-full border ${
584
+ isSuccess
585
+ ? "border-emerald-500/40 text-emerald-400"
586
+ : isFailed
587
+ ? "border-[var(--status-failed-border)] text-[var(--destructive)]"
588
+ : isRunning
589
+ ? "border-sky-500/40 text-sky-400"
590
+ : "border-[var(--border)] text-[var(--muted-foreground)]"
591
+ }`}
592
+ >
593
+ {isSuccess ? (
594
+ <Check className="h-3 w-3" />
595
+ ) : isFailed ? (
596
+ <XCircle className="h-3 w-3" />
597
+ ) : (
598
+ <span className={`block size-1.5 rounded-full ${isRunning ? "bg-sky-400 animate-pulse" : "bg-current"}`} />
599
+ )}
614
600
  </span>
601
+ <span className="truncate text-[var(--muted-foreground)]">
602
+ {run.jobName}
603
+ </span>
604
+ <span className="ml-auto shrink-0 text-[11px] text-[var(--muted-foreground)]">
605
+ {formatDateTime(ts)}
606
+ </span>
607
+ {run.durationMs != null && (
608
+ <span className="shrink-0 font-mono text-[11px] text-[var(--muted-foreground)]">
609
+ {run.durationMs < 1000
610
+ ? `${run.durationMs}ms`
611
+ : `${Math.round(run.durationMs / 1000)}s`}
612
+ </span>
613
+ )}
614
+ </div>
615
+ {isFailed && run.error && (
616
+ <p className="mt-1 ml-8 text-[11px] leading-snug text-[var(--destructive)] opacity-80 line-clamp-2">
617
+ {run.error}
618
+ </p>
615
619
  )}
616
620
  </div>
617
621
  );
@@ -87,6 +87,35 @@ function WorkspaceSidebarBrandLogo({ compact = false }: { compact?: boolean }) {
87
87
  );
88
88
  }
89
89
 
90
+ function RailTooltip({ label, children }: { label: string; children: React.ReactElement }) {
91
+ const ref = useRef<HTMLDivElement>(null);
92
+ const [pos, setPos] = useState<{ top: number; left: number } | null>(null);
93
+
94
+ const show = () => {
95
+ const el = ref.current;
96
+ if (!el) return;
97
+ const rect = el.getBoundingClientRect();
98
+ setPos({ top: rect.top + rect.height / 2, left: rect.right + 8 });
99
+ };
100
+ const hide = () => setPos(null);
101
+
102
+ return (
103
+ <div ref={ref} onMouseEnter={show} onMouseLeave={hide} style={{ display: "contents" }}>
104
+ {children}
105
+ {pos &&
106
+ createPortal(
107
+ <div
108
+ className="workspace-sidebar__rail-tooltip"
109
+ style={{ top: pos.top, left: pos.left, transform: "translateY(-50%)" }}
110
+ >
111
+ {label}
112
+ </div>,
113
+ document.body,
114
+ )}
115
+ </div>
116
+ );
117
+ }
118
+
90
119
  function ProjectDropdown({
91
120
  projects,
92
121
  activeProjectId,
@@ -127,7 +156,7 @@ function ProjectDropdown({
127
156
  }, [open]);
128
157
 
129
158
  return (
130
- <div className="px-3 pt-3 pb-2" ref={dropdownRef}>
159
+ <div className="relative px-3 pt-3 pb-2" ref={dropdownRef}>
131
160
  <button
132
161
  type="button"
133
162
  onClick={() => setOpen(!open)}
@@ -139,7 +168,7 @@ function ProjectDropdown({
139
168
  </button>
140
169
 
141
170
  {open && (
142
- <div className="mt-1 rounded-lg border border-[var(--app-shell-border)] bg-[var(--app-shell-elevated)] shadow-lg overflow-hidden">
171
+ <div className="absolute left-3 right-3 z-50 mt-1 rounded-lg border border-[var(--app-shell-border)] bg-[var(--app-shell-elevated)] shadow-lg overflow-hidden">
143
172
  <div className="p-2 border-b border-[var(--app-shell-border)]">
144
173
  <div className="flex items-center gap-2 rounded-md border border-[var(--app-shell-border)] bg-[var(--app-shell-subtle)] px-2 py-1.5">
145
174
  <Search size={12} className="flex-shrink-0 text-[var(--muted-foreground)]" />
@@ -695,6 +724,9 @@ export function WorkspaceSidebar({
695
724
  return null;
696
725
  }
697
726
 
727
+ const collapsedProject = nonDefaultProjects.find((p) => p.id === activeProjectId) ?? nonDefaultProjects[0];
728
+ const collapsedSlug = collapsedProject?.slug;
729
+
698
730
  return (
699
731
  <aside
700
732
  id="workspace-sidebar"
@@ -712,21 +744,90 @@ export function WorkspaceSidebar({
712
744
  <WorkspaceSidebarBrandLogo compact />
713
745
  </button>
714
746
  </div>
747
+
748
+ {collapsedSlug && (
749
+ <nav className="workspace-sidebar__collapsed-rail">
750
+ <RailTooltip label="Home">
751
+ <Link href={`/projects/${collapsedSlug}`} className={`workspace-sidebar__rail-icon${activeProjectView === "home" ? " workspace-sidebar__rail-icon--active" : ""}`}>
752
+ <Home size={16} />
753
+ </Link>
754
+ </RailTooltip>
755
+
756
+ <div className="workspace-sidebar__rail-separator" />
757
+
758
+ <RailTooltip label="Objectives">
759
+ <Link href={`/projects/${collapsedSlug}/objectives`} className={`workspace-sidebar__rail-icon${activeProjectView === "objectives" ? " workspace-sidebar__rail-icon--active" : ""}`}>
760
+ <Target size={16} />
761
+ </Link>
762
+ </RailTooltip>
763
+ <RailTooltip label="Linear">
764
+ <Link href={`/projects/${collapsedSlug}/linear`} className={`workspace-sidebar__rail-icon${activeProjectView === "linear" ? " workspace-sidebar__rail-icon--active" : ""}`}>
765
+ <LinearIcon size={16} />
766
+ </Link>
767
+ </RailTooltip>
768
+ <RailTooltip label="Scheduled Tasks">
769
+ <Link href={`/projects/${collapsedSlug}/automations`} className={`workspace-sidebar__rail-icon${activeProjectView === "automations" ? " workspace-sidebar__rail-icon--active" : ""}`}>
770
+ <Zap size={16} />
771
+ </Link>
772
+ </RailTooltip>
773
+
774
+ <div className="workspace-sidebar__rail-separator" />
775
+
776
+ <RailTooltip label="Terminal">
777
+ <Link href={`/projects/${collapsedSlug}/terminal`} className={`workspace-sidebar__rail-icon${activeProjectView === "terminal" ? " workspace-sidebar__rail-icon--active" : ""}`}>
778
+ <TerminalSquare size={16} />
779
+ </Link>
780
+ </RailTooltip>
781
+ <RailTooltip label="Chat">
782
+ <button
783
+ type="button"
784
+ className={`workspace-sidebar__rail-icon${activeProjectView === "thread" ? " workspace-sidebar__rail-icon--active" : ""}`}
785
+ onClick={() => {
786
+ const projectThreads = sortedWorkspaces.filter((t) => collapsedProject.thread_ids?.includes(t.id));
787
+ const threadId = collapsedProject.thread_ids?.find((id) => threads.some((t) => t.id === id)) ?? projectThreads[0]?.id;
788
+ if (threadId) onSelectThread(threadId);
789
+ }}
790
+ >
791
+ <MessageSquare size={16} />
792
+ </button>
793
+ </RailTooltip>
794
+
795
+ <div className="workspace-sidebar__rail-separator" />
796
+
797
+ <RailTooltip label="Teams">
798
+ <Link href={`/projects/${collapsedSlug}/teams`} className={`workspace-sidebar__rail-icon${activeProjectView === "teams" ? " workspace-sidebar__rail-icon--active" : ""}`}>
799
+ <Users size={16} />
800
+ </Link>
801
+ </RailTooltip>
802
+ <RailTooltip label="Folders">
803
+ <Link href={`/projects/${collapsedSlug}/folders`} className={`workspace-sidebar__rail-icon${activeProjectView === "folders" ? " workspace-sidebar__rail-icon--active" : ""}`}>
804
+ <FolderGit2 size={16} />
805
+ </Link>
806
+ </RailTooltip>
807
+ <RailTooltip label="Env Variables">
808
+ <Link href={`/projects/${collapsedSlug}/env-vars`} className={`workspace-sidebar__rail-icon${activeProjectView === "env-vars" ? " workspace-sidebar__rail-icon--active" : ""}`}>
809
+ <KeyRound size={16} />
810
+ </Link>
811
+ </RailTooltip>
812
+ </nav>
813
+ )}
814
+
715
815
  <div className="mt-auto p-2">
716
- <a
717
- href="https://discord.gg/G9afUYKKY3"
718
- target="_blank"
719
- rel="noopener noreferrer"
720
- className="flex items-center justify-center w-8 h-8 rounded-lg text-white transition-colors"
721
- style={{ backgroundColor: '#5865F2' }}
722
- onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#4752C4')}
723
- onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = '#5865F2')}
724
- title="Join Discord"
725
- >
726
- <svg width="14" height="14" viewBox="0 0 71 55" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
727
- <path d="M60.1 4.9A58.5 58.5 0 0045.4.2a.2.2 0 00-.2.1 40.8 40.8 0 00-1.8 3.7 54 54 0 00-16.2 0A37.4 37.4 0 0025.4.3a.2.2 0 00-.2-.1A58.4 58.4 0 0010.5 4.9a.2.2 0 00-.1.1C1.5 18.7-.9 32.2.3 45.5v.1a58.8 58.8 0 0017.7 9a.2.2 0 00.3-.1 42 42 0 003.6-5.9.2.2 0 00-.1-.3 38.8 38.8 0 01-5.5-2.6.2.2 0 01 0-.4l1.1-.9a.2.2 0 01.2 0 42 42 0 0035.6 0 .2.2 0 01.2 0l1.1.9a.2.2 0 010 .4 36.4 36.4 0 01-5.5 2.6.2.2 0 00-.1.3 47.2 47.2 0 003.6 5.9.2.2 0 00.3.1 58.6 58.6 0 0017.7-9v-.1c1.4-15.2-2.4-28.4-10-40.1a.2.2 0 00-.1-.1zM23.7 37.3c-3.5 0-6.3-3.2-6.3-7s2.8-7 6.3-7 6.4 3.2 6.3 7-2.8 7-6.3 7zm23.3 0c-3.5 0-6.3-3.2-6.3-7s2.8-7 6.3-7 6.4 3.2 6.3 7-2.8 7-6.3 7z"/>
728
- </svg>
729
- </a>
816
+ <RailTooltip label="Join Discord">
817
+ <a
818
+ href="https://discord.gg/G9afUYKKY3"
819
+ target="_blank"
820
+ rel="noopener noreferrer"
821
+ className="workspace-sidebar__rail-icon"
822
+ style={{ backgroundColor: '#5865F2', color: 'white' }}
823
+ onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#4752C4')}
824
+ onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = '#5865F2')}
825
+ >
826
+ <svg width="14" height="14" viewBox="0 0 71 55" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
827
+ <path d="M60.1 4.9A58.5 58.5 0 0045.4.2a.2.2 0 00-.2.1 40.8 40.8 0 00-1.8 3.7 54 54 0 00-16.2 0A37.4 37.4 0 0025.4.3a.2.2 0 00-.2-.1A58.4 58.4 0 0010.5 4.9a.2.2 0 00-.1.1C1.5 18.7-.9 32.2.3 45.5v.1a58.8 58.8 0 0017.7 9a.2.2 0 00.3-.1 42 42 0 003.6-5.9.2.2 0 00-.1-.3 38.8 38.8 0 01-5.5-2.6.2.2 0 01 0-.4l1.1-.9a.2.2 0 01.2 0 42 42 0 0035.6 0 .2.2 0 01.2 0l1.1.9a.2.2 0 010 .4 36.4 36.4 0 01-5.5 2.6.2.2 0 00-.1.3 47.2 47.2 0 003.6 5.9.2.2 0 00.3.1 58.6 58.6 0 0017.7-9v-.1c1.4-15.2-2.4-28.4-10-40.1a.2.2 0 00-.1-.1zM23.7 37.3c-3.5 0-6.3-3.2-6.3-7s2.8-7 6.3-7 6.4 3.2 6.3 7-2.8 7-6.3 7zm23.3 0c-3.5 0-6.3-3.2-6.3-7s2.8-7 6.3-7 6.4 3.2 6.3 7-2.8 7-6.3 7z"/>
828
+ </svg>
829
+ </a>
830
+ </RailTooltip>
730
831
  </div>
731
832
  </aside>
732
833
  );
@@ -807,7 +908,7 @@ export function WorkspaceSidebar({
807
908
  return (
808
909
  <nav className="workspace-sidebar__section">
809
910
  {/* Home (standalone) */}
810
- <div className="px-2 mb-3">
911
+ <div className="px-2 mt-2 mb-3">
811
912
  <div className="workspace-sidebar__workspace-item">
812
913
  <Link
813
914
  href={`/projects/${selectedProject.slug}`}