@mndrk/agx 2.2.0 → 2.3.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 (433) hide show
  1. package/README.md +70 -105
  2. package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
  3. package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +3 -3
  4. package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
  5. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +1 -1
  6. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
  7. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.html +2 -2
  14. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.rsc +2 -2
  15. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  22. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page.js.nft.json +1 -1
  23. package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  24. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.html +2 -2
  25. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.rsc +3 -3
  26. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_full.segment.rsc +3 -3
  27. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  28. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_index.segment.rsc +2 -2
  29. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
  30. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +2 -2
  31. package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents.segment.rsc +1 -1
  32. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
  33. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
  34. package/cloud-runtime/standalone/apps/local/.next/server/app/api/agents/export/route.js.nft.json +1 -1
  35. package/cloud-runtime/standalone/apps/local/.next/server/app/api/chat/route.js.nft.json +1 -1
  36. package/cloud-runtime/standalone/apps/local/.next/server/app/api/file-search/route.js.nft.json +1 -1
  37. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/[id]/route.js.nft.json +1 -1
  38. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/context/route.js.nft.json +1 -1
  39. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/issues/route.js.nft.json +1 -1
  40. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/options/route.js.nft.json +1 -1
  41. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/runs/scripted/route.js.nft.json +1 -1
  42. package/cloud-runtime/standalone/apps/local/.next/server/app/api/linear/status/route.js.nft.json +1 -1
  43. package/cloud-runtime/standalone/apps/local/.next/server/app/api/participants/route.js.nft.json +1 -1
  44. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/linear-issues/route.js.nft.json +1 -1
  45. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/scheduled-tasks/route.js.nft.json +1 -1
  46. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/objectives/[objectiveId]/worker/route.js.nft.json +1 -1
  47. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/search/route.js.nft.json +1 -1
  48. package/cloud-runtime/standalone/apps/local/.next/server/app/api/projects/[id]/teams/route.js.nft.json +1 -1
  49. package/cloud-runtime/standalone/apps/local/.next/server/app/api/prompt-jobs/poll/route.js.nft.json +1 -1
  50. package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/check/[id]/route.js.nft.json +1 -1
  51. package/cloud-runtime/standalone/apps/local/.next/server/app/api/providers/route.js.nft.json +1 -1
  52. package/cloud-runtime/standalone/apps/local/.next/server/app/api/queue/route.js.nft.json +1 -1
  53. package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
  54. package/cloud-runtime/standalone/apps/local/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
  55. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/assign/route.js.nft.json +1 -1
  56. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/available/route.js.nft.json +1 -1
  57. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/detail/route.js.nft.json +1 -1
  58. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/history/route.js.nft.json +1 -1
  59. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/learn/route.js.nft.json +1 -1
  60. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/route.js.nft.json +1 -1
  61. package/cloud-runtime/standalone/apps/local/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -1
  62. package/cloud-runtime/standalone/apps/local/.next/server/app/api/status/route.js.nft.json +1 -1
  63. package/cloud-runtime/standalone/apps/local/.next/server/app/api/summarize/route.js.nft.json +1 -1
  64. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
  65. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
  66. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js.nft.json +1 -1
  67. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  68. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/extract/route.js.nft.json +1 -1
  69. package/cloud-runtime/standalone/apps/local/.next/server/app/api/tasks/route.js.nft.json +1 -1
  70. package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
  71. package/cloud-runtime/standalone/apps/local/.next/server/app/api/threads/route.js.nft.json +1 -1
  72. package/cloud-runtime/standalone/apps/local/.next/server/app/automations/page/react-loadable-manifest.json +2 -2
  73. package/cloud-runtime/standalone/apps/local/.next/server/app/automations/page_client-reference-manifest.js +1 -1
  74. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.html +2 -2
  75. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.rsc +4 -4
  76. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_full.segment.rsc +4 -4
  77. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_head.segment.rsc +1 -1
  78. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_index.segment.rsc +2 -2
  79. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/_tree.segment.rsc +2 -2
  80. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/automations/__PAGE__.segment.rsc +2 -2
  81. package/cloud-runtime/standalone/apps/local/.next/server/app/automations.segments/automations.segment.rsc +1 -1
  82. package/cloud-runtime/standalone/apps/local/.next/server/app/board/page_client-reference-manifest.js +1 -1
  83. package/cloud-runtime/standalone/apps/local/.next/server/app/board.html +2 -2
  84. package/cloud-runtime/standalone/apps/local/.next/server/app/board.rsc +2 -2
  85. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_full.segment.rsc +2 -2
  86. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_head.segment.rsc +1 -1
  87. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_index.segment.rsc +2 -2
  88. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  89. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/board/__PAGE__.segment.rsc +1 -1
  90. package/cloud-runtime/standalone/apps/local/.next/server/app/board.segments/board.segment.rsc +1 -1
  91. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page.js.nft.json +1 -1
  92. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph/page_client-reference-manifest.js +1 -1
  93. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.html +2 -2
  94. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.rsc +3 -3
  95. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_full.segment.rsc +3 -3
  96. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_head.segment.rsc +1 -1
  97. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_index.segment.rsc +2 -2
  98. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/_tree.segment.rsc +2 -2
  99. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/execution-graph/__PAGE__.segment.rsc +2 -2
  100. package/cloud-runtime/standalone/apps/local/.next/server/app/execution-graph.segments/execution-graph.segment.rsc +1 -1
  101. package/cloud-runtime/standalone/apps/local/.next/server/app/folders/page_client-reference-manifest.js +1 -1
  102. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.html +2 -2
  103. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.rsc +3 -3
  104. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_full.segment.rsc +3 -3
  105. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_head.segment.rsc +1 -1
  106. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_index.segment.rsc +2 -2
  107. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/_tree.segment.rsc +2 -2
  108. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/folders/__PAGE__.segment.rsc +2 -2
  109. package/cloud-runtime/standalone/apps/local/.next/server/app/folders.segments/folders.segment.rsc +1 -1
  110. package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
  111. package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +3 -3
  112. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  113. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +3 -3
  114. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_head.segment.rsc +1 -1
  115. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_index.segment.rsc +2 -2
  116. package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  117. package/cloud-runtime/standalone/apps/local/.next/server/app/page.js.nft.json +1 -1
  118. package/cloud-runtime/standalone/apps/local/.next/server/app/page_client-reference-manifest.js +1 -1
  119. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page/react-loadable-manifest.json +1 -1
  120. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page.js.nft.json +1 -1
  121. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
  122. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page.js.nft.json +1 -1
  123. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
  124. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page.js.nft.json +1 -1
  125. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
  126. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
  127. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
  128. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/knowledge/page.js.nft.json +1 -1
  129. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/knowledge/page_client-reference-manifest.js +1 -1
  130. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page/react-loadable-manifest.json +1 -1
  131. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page.js.nft.json +1 -1
  132. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/linear/page_client-reference-manifest.js +1 -1
  133. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page.js.nft.json +1 -1
  134. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page_client-reference-manifest.js +1 -1
  135. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page.js.nft.json +1 -1
  136. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page_client-reference-manifest.js +1 -1
  137. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  138. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  139. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/settings/page.js.nft.json +1 -1
  140. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
  141. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.js.nft.json +1 -1
  142. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
  143. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page.js.nft.json +1 -1
  144. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page_client-reference-manifest.js +1 -1
  145. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page.js.nft.json +1 -1
  146. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page_client-reference-manifest.js +1 -1
  147. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page.js.nft.json +1 -1
  148. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page_client-reference-manifest.js +1 -1
  149. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page.js.nft.json +1 -1
  150. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page_client-reference-manifest.js +1 -1
  151. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page.js.nft.json +1 -1
  152. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page_client-reference-manifest.js +1 -1
  153. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page.js.nft.json +1 -1
  154. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page_client-reference-manifest.js +1 -1
  155. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
  156. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
  157. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans/page_client-reference-manifest.js +1 -1
  158. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.html +2 -2
  159. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.rsc +2 -2
  160. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_full.segment.rsc +2 -2
  161. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_head.segment.rsc +1 -1
  162. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_index.segment.rsc +2 -2
  163. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/_tree.segment.rsc +2 -2
  164. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects/orphans/__PAGE__.segment.rsc +1 -1
  165. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects/orphans.segment.rsc +1 -1
  166. package/cloud-runtime/standalone/apps/local/.next/server/app/projects/orphans.segments/projects.segment.rsc +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/settings/page_client-reference-manifest.js +1 -1
  178. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.html +2 -2
  179. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.rsc +2 -2
  180. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  181. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  182. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  183. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  184. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  185. package/cloud-runtime/standalone/apps/local/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  186. package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page.js.nft.json +1 -1
  187. package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  188. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.html +2 -2
  189. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.rsc +4 -3
  190. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +4 -3
  191. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  192. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_index.segment.rsc +2 -2
  193. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_tree.segment.rsc +3 -2
  194. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +3 -2
  195. package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  196. package/cloud-runtime/standalone/apps/local/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  197. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.html +2 -2
  198. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.rsc +2 -2
  199. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_full.segment.rsc +2 -2
  200. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_head.segment.rsc +1 -1
  201. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_index.segment.rsc +2 -2
  202. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/_tree.segment.rsc +2 -2
  203. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +1 -1
  204. package/cloud-runtime/standalone/apps/local/.next/server/app/skills.segments/skills.segment.rsc +1 -1
  205. package/cloud-runtime/standalone/apps/local/.next/server/app/status/page_client-reference-manifest.js +1 -1
  206. package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
  207. package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +3 -3
  208. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +3 -3
  209. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
  210. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +2 -2
  211. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +2 -2
  212. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +2 -2
  213. package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
  214. package/cloud-runtime/standalone/apps/local/.next/server/app/thread/[id]/page_client-reference-manifest.js +1 -1
  215. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0-zk9w8._.js +7 -2
  216. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0.01bfe._.js +13 -8
  217. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__00c~p6z._.js +7 -2
  218. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__019dflu._.js +7 -2
  219. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__02t.3rm._.js +4 -4
  220. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__06zr0ph._.js +6 -1
  221. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__07d._0s._.js +15 -10
  222. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__08xj~a3._.js +1 -1
  223. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0a0cq38._.js +34 -3
  224. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0asvfdo._.js +35 -4
  225. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0bt7ejs._.js +7 -2
  226. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0f.~98d._.js +7 -2
  227. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0g-~-.q._.js +6 -1
  228. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0g7p6pw._.js +1 -1
  229. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0gj~dap._.js +40 -9
  230. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0hkcw03._.js +8 -3
  231. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0hyu3en._.js +7 -2
  232. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0i5aw03._.js +7 -2
  233. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0ke4z91._.js +7 -2
  234. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0l53ok5._.js +41 -10
  235. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0ll-~cx._.js +7 -2
  236. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0mh6p.0._.js +7 -2
  237. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0nc-lbr._.js +1 -1
  238. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0p9rl6.._.js +8 -3
  239. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0q~pnp0._.js +6 -6
  240. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0ue0bu5._.js +6 -1
  241. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0unwwyx._.js +12 -7
  242. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0vtkl3q._.js +4 -4
  243. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0x6w64i._.js +1 -1
  244. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0z82z0-._.js +6 -1
  245. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0zrv3p3._.js +16 -11
  246. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__0~iknwz._.js +12 -7
  247. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__10d.dhd._.js +46 -15
  248. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__10sw5ia._.js +4 -4
  249. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__11yx.ud._.js +33 -2
  250. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__13-nlgu._.js +5 -5
  251. package/cloud-runtime/standalone/apps/local/.next/server/chunks/[root-of-the-server]__13960a8._.js +14 -9
  252. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_06qet8g._.js +14 -9
  253. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0_0m2ly._.js +4 -4
  254. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0a15wtk._.js +4 -4
  255. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0fr1qq6._.js +1 -1
  256. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0g.q2r6._.js +6 -1
  257. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_0i7fs.i._.js +4 -4
  258. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_01pvj2g._.js +1 -1
  259. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_agent-participants_ts_0cq15u5._.js +1 -1
  260. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_db_ts_0twf-w5._.js +1 -1
  261. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_orchestrator_chat-processor_ts_0c2l_oh._.js +43 -12
  262. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_sqlite-query-adapter_ts_0l95hik._.js +15 -15
  263. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_lib_sqlite-query-adapter_ts_0s5xprd._.js +1 -1
  264. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_graph_082u-ls._.js +19 -14
  265. package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_src_graph_schedule-runner_ts_07-ozf_._.js +2 -2
  266. package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0_l0fpi.js +1 -1
  267. package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0gips_c.js +1 -1
  268. package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0rszt9p.js +10 -6
  269. package/cloud-runtime/standalone/apps/local/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0u_5kfo.js +1 -1
  270. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_06fnblz._.js +3 -0
  271. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0140-84._.js +3 -0
  272. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_03fckp4._.js +3 -0
  273. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/{_0tcjapj._.js → _0ip6k6n._.js} +2 -2
  274. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0jensz1._.js +3 -0
  275. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0t0p8q5._.js +3 -0
  276. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0yeuuy1._.js +1 -23
  277. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_03z24q2._.js +1 -1
  278. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0_ac-.f._.js +3 -3
  279. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0a-8i4p._.js +1 -1
  280. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0k4~c1x._.js +1 -1
  281. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0ld1uug._.js +1 -1
  282. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0ms1d6i._.js +4 -0
  283. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0p_v0ri._.js +1 -1
  284. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0x.xj52._.js +3 -0
  285. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0~g2ijr._.js +1 -1
  286. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_11k_-8~._.js +3 -3
  287. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_agents_[id]_page_tsx_06n47n~._.js +1 -1
  288. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_agents_page_tsx_078reb_._.js +1 -1
  289. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_linear_page_tsx_0a~n5y8._.js +25 -3
  290. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_page_tsx_0kcaeqi._.js +1 -1
  291. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_teams_[teamId]_agents_[agentId]_page_tsx_0wm~_~t._.js +1 -1
  292. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_teams_[teamId]_page_tsx_0iyozfl._.js +1 -1
  293. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_teams_new_page_tsx_0yqd0a5._.js +1 -1
  294. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_projects_[slug]_terminal_page_tsx_01n9qk.._.js +1 -20
  295. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_app_setup_page_tsx_0ql2qmr._.js +1 -1
  296. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_PromptJobBoard_tsx_06zob36._.js +2 -2
  297. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_0k4tfip._.js +1 -1
  298. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_terminal_TerminalPane_tsx_0l17vs_._.js +22 -0
  299. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_thread_WorkspaceSidebar_tsx_0unv2xp._.js +1 -1
  300. package/cloud-runtime/standalone/apps/local/.next/server/middleware-build-manifest.js +3 -3
  301. package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
  302. package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
  303. package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +1 -1
  304. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
  305. package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
  306. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1011~1x9nj4ny.js → 0-k2m1ncx7hwx.js} +1 -1
  307. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0dnw31436wd~..js → 0-pkmgle2s8u8.js} +1 -1
  308. package/cloud-runtime/standalone/apps/local/.next/static/chunks/064jfmraty.9h.js +1 -0
  309. package/cloud-runtime/standalone/apps/local/.next/static/chunks/06kru5m9q~r.j.js +1 -0
  310. package/cloud-runtime/standalone/apps/local/.next/static/chunks/06kyg1q0bcz6p.js +5 -0
  311. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0_cjth28_11b2.js → 08bdyjcnamzep.js} +1 -1
  312. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0-olq~7zw3wjy.js → 08xq~uyr6.eqw.js} +1 -1
  313. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0gj98094p~zn4.js → 0cku81z~3oe6..js} +1 -1
  314. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0e7jhy0-52_4k.js +1 -0
  315. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0wh6p5~ft5rma.js → 0htc.sqrk_0.c.js} +1 -1
  316. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ju4xmxwqddw6.js +1 -0
  317. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0mm978wb-ueg-.js +6 -0
  318. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0musu8f.4wvxz.js +1 -0
  319. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0bchtyu6m.2yv.js → 0muti0yiyhu0t.js} +1 -1
  320. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0rhps884e-bzu.js +1 -0
  321. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0rr3fvwc5ind~.js +5 -0
  322. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0sbkkjowkksa6.js +1 -0
  323. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0sjz0.o9_33qy.js +1 -0
  324. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0srzmg8ivve1g.css +1 -0
  325. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0fonouj2i9qnb.js → 0swo3_e8.4s7j.js} +2 -2
  326. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0sysrf3~l~r35.js +1 -0
  327. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0t69h-kc701fn.js +1 -0
  328. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0v67lnh..wj4z.js +1 -0
  329. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{013gtut17~fne.js → 0wb45ol1xrqe~.js} +1 -23
  330. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{00po4v2x~0x_z.js → 0wiw2v8gm-k_-.js} +1 -1
  331. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0jq0t4zip38wt.js → 0wopevh0s7.8c.js} +1 -1
  332. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0xm2~gxlt1npd.js +1 -0
  333. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1503vb7lb6.g1.js → 0ya124ushze_f.js} +4 -4
  334. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{00e1ihnb6ap3t.js → 0zt2o58c5gytn.js} +2 -2
  335. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0~idsggr8vqf5.js +59 -0
  336. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0xu_doej_wc-3.js → 0~mcfx41q4znh.js} +3 -3
  337. package/cloud-runtime/standalone/apps/local/.next/static/chunks/116j4mjz~y42t.js +1 -0
  338. package/cloud-runtime/standalone/apps/local/.next/static/chunks/{0-vo_x2cxmjm3.js → 12b62py0mq1gm.js} +4 -4
  339. package/cloud-runtime/standalone/apps/local/.next/static/chunks/12y5i0lh6s73o.js +1 -0
  340. package/cloud-runtime/standalone/apps/local/.next/static/chunks/148.mt80civoz.js +20 -0
  341. package/cloud-runtime/standalone/apps/local/.next/static/chunks/14m5d270euu_s.js +1 -0
  342. package/cloud-runtime/standalone/apps/local/.next/static/chunks/16h9208kl5~xa.js +16 -0
  343. package/cloud-runtime/standalone/apps/local/app/agents/[id]/page.tsx +6 -3
  344. package/cloud-runtime/standalone/apps/local/app/agents/page.tsx +3 -3
  345. package/cloud-runtime/standalone/apps/local/app/api/chat/route.ts +7 -1
  346. package/cloud-runtime/standalone/apps/local/app/api/participants/route.ts +9 -9
  347. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/search/route.ts +6 -6
  348. package/cloud-runtime/standalone/apps/local/app/api/projects/[id]/teams/route.ts +3 -3
  349. package/cloud-runtime/standalone/apps/local/app/api/prompt-jobs/agents/route.ts +1 -1
  350. package/cloud-runtime/standalone/apps/local/app/api/schedules/poll/route.ts +11 -2
  351. package/cloud-runtime/standalone/apps/local/app/page.tsx +72 -14
  352. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/page.tsx +34 -1
  353. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page.tsx +6 -3
  354. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/[teamId]/page.tsx +6 -3
  355. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/new/page.tsx +8 -17
  356. package/cloud-runtime/standalone/apps/local/app/projects/[slug]/teams/replace/page.tsx +1 -1
  357. package/cloud-runtime/standalone/apps/local/app/projects/page.tsx +7 -0
  358. package/cloud-runtime/standalone/apps/local/app/setup/page.tsx +1 -38
  359. package/cloud-runtime/standalone/apps/local/components/AutomationsBoard.tsx +8 -4
  360. package/cloud-runtime/standalone/apps/local/components/EmptyStateCard.tsx +37 -0
  361. package/cloud-runtime/standalone/apps/local/components/LinearBoard.tsx +103 -770
  362. package/cloud-runtime/standalone/apps/local/components/PromptJobBoard.tsx +5 -37
  363. package/cloud-runtime/standalone/apps/local/components/TeamPickerModal.tsx +3 -3
  364. package/cloud-runtime/standalone/apps/local/components/chat-ui/Composer.tsx +28 -32
  365. package/cloud-runtime/standalone/apps/local/components/chat-ui/ParticipantBar.tsx +24 -39
  366. package/cloud-runtime/standalone/apps/local/components/linear/LinearBoardFilters.tsx +343 -0
  367. package/cloud-runtime/standalone/apps/local/components/linear/TicketRow.tsx +158 -0
  368. package/cloud-runtime/standalone/apps/local/components/projects/ObjectiveHealthTrend.tsx +45 -61
  369. package/cloud-runtime/standalone/apps/local/components/projects/RecentlyCompletedCard.tsx +0 -16
  370. package/cloud-runtime/standalone/apps/local/components/projects/ReplaceAgentsModal.tsx +2 -2
  371. package/cloud-runtime/standalone/apps/local/components/setup/McpSetupStep.tsx +155 -120
  372. package/cloud-runtime/standalone/apps/local/components/setup/ProviderStep.tsx +85 -88
  373. package/cloud-runtime/standalone/apps/local/components/setup/SetupLayout.tsx +6 -4
  374. package/cloud-runtime/standalone/apps/local/components/terminal/ProjectTerminal.tsx +18 -193
  375. package/cloud-runtime/standalone/apps/local/components/terminal/TerminalPane.tsx +40 -4
  376. package/cloud-runtime/standalone/apps/local/components/thread/WorkspaceSidebar.tsx +4 -4
  377. package/cloud-runtime/standalone/apps/local/components/ui/ResizeHandle.tsx +52 -0
  378. package/cloud-runtime/standalone/apps/local/hooks/useAutomations.ts +8 -3
  379. package/cloud-runtime/standalone/apps/local/hooks/useLinearActiveAgents.ts +38 -0
  380. package/cloud-runtime/standalone/apps/local/hooks/useLinearParticipants.ts +118 -0
  381. package/cloud-runtime/standalone/apps/local/hooks/usePromptJobs.ts +5 -3
  382. package/cloud-runtime/standalone/apps/local/hooks/useSetupFlow.ts +6 -81
  383. package/cloud-runtime/standalone/apps/local/lib/agent-participants.ts +1 -1
  384. package/cloud-runtime/standalone/apps/local/lib/agent-process-registry.ts +34 -0
  385. package/cloud-runtime/standalone/apps/local/lib/db.ts +5 -5
  386. package/cloud-runtime/standalone/apps/local/lib/linear-board-utils.ts +9 -0
  387. package/cloud-runtime/standalone/apps/local/lib/linear-run-status.ts +88 -0
  388. package/cloud-runtime/standalone/apps/local/lib/linear-run-store.ts +4 -4
  389. package/cloud-runtime/standalone/apps/local/lib/sqlite-query-adapter.ts +5 -1
  390. package/cloud-runtime/standalone/apps/local/lib/team-catalog.ts +60 -60
  391. package/cloud-runtime/standalone/apps/local/lib/types.ts +1 -1
  392. package/cloud-runtime/standalone/apps/local/migrations/sqlite_schema.sql +1 -1
  393. package/cloud-runtime/standalone/apps/local/skills-lock.json +5 -0
  394. package/cloud-runtime/standalone/apps/local/src/graph/schedule-runner.ts +26 -1
  395. package/cloud-runtime/standalone/apps/local/src/graph/store.ts +13 -0
  396. package/cloud-runtime/standalone/apps/local/state/linearBoardPins.ts +45 -0
  397. package/cloud-runtime/standalone/apps/local/worker/index.js +56 -4
  398. package/lib/cli/onboarding.js +8 -5
  399. package/package.json +1 -1
  400. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/0rhn_lucide-react_dist_esm_067eb..._.js +0 -3
  401. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_00trrg8._.js +0 -3
  402. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0ejzn1e._.js +0 -3
  403. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0sjchy6._.js +0 -3
  404. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0w4gpvr._.js +0 -3
  405. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/_0x6hh0t._.js +0 -4
  406. package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_0t6p.qm._.js +0 -3
  407. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0-wlbe.ripd2w.css +0 -1
  408. package/cloud-runtime/standalone/apps/local/.next/static/chunks/014z_yruiincl.js +0 -1
  409. package/cloud-runtime/standalone/apps/local/.next/static/chunks/041-dhls9zkl1.js +0 -1
  410. package/cloud-runtime/standalone/apps/local/.next/static/chunks/069yt_7prdxsp.js +0 -1
  411. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0e6rxcxy.l5c8.js +0 -1
  412. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ime4btrg-g4l.js +0 -1
  413. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0j-nhn61e~nnj.js +0 -1
  414. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0jglardpw~5uc.js +0 -37
  415. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0l3v45kd.9is_.js +0 -1
  416. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0ng6wy4ak35jg.js +0 -1
  417. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0n~jhoq~op4e5.js +0 -16
  418. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0p-rdas54yo~w.js +0 -1
  419. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0pdrpsy-zdxp0.js +0 -5
  420. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0p~l5ap6qqx2o.js +0 -1
  421. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0tm20~ec~occu.js +0 -1
  422. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0w94x-v00osq0.js +0 -1
  423. package/cloud-runtime/standalone/apps/local/.next/static/chunks/0xwny92a.ad_i.js +0 -1
  424. package/cloud-runtime/standalone/apps/local/.next/static/chunks/11l2tww5f0hsk.js +0 -20
  425. package/cloud-runtime/standalone/apps/local/.next/static/chunks/12qohmk-~yrtg.js +0 -1
  426. package/cloud-runtime/standalone/apps/local/.next/static/chunks/14v~9vx3tdv85.js +0 -1
  427. package/cloud-runtime/standalone/apps/local/.next/static/chunks/16fyhcmwlw3th.js +0 -6
  428. package/cloud-runtime/standalone/apps/local/.next/static/chunks/18e8w~~mvoh5o.js +0 -1
  429. package/cloud-runtime/standalone/apps/local/components/setup/ProjectStep.tsx +0 -189
  430. package/cloud-runtime/standalone/apps/local/components/setup/TeamsStep.tsx +0 -500
  431. /package/cloud-runtime/standalone/apps/local/.next/static/{qPuactsz6OYimwT6dSdHn → ROMPfjQqFXqGHmbybq1eC}/_buildManifest.js +0 -0
  432. /package/cloud-runtime/standalone/apps/local/.next/static/{qPuactsz6OYimwT6dSdHn → ROMPfjQqFXqGHmbybq1eC}/_clientMiddlewareManifest.js +0 -0
  433. /package/cloud-runtime/standalone/apps/local/.next/static/{qPuactsz6OYimwT6dSdHn → ROMPfjQqFXqGHmbybq1eC}/_ssgManifest.js +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import dynamic from "next/dynamic";
5
- import { ArrowDown, ArrowUp, Check, ChevronDown, Clock, ExternalLink, FileText, Link2, Play, Plus, RefreshCw, Search, Settings, User, X } from "lucide-react";
5
+ import { ArrowDown, ArrowUp, Clock, FileText, Play, Plus, RefreshCw, Search, Settings, User, X } from "lucide-react";
6
6
  import { useUrlSelection } from "@/hooks/useUrlSelection";
7
7
  import { useLinearIssues, type LinearIssue } from "@/hooks/useLinearIssues";
8
8
  import { useLinearConnection } from "@/hooks/useLinearConnection";
@@ -18,6 +18,10 @@ import {
18
18
  loadLinearBoardFilters,
19
19
  persistLinearBoardFilters,
20
20
  } from "@/state/linearBoardFilters";
21
+ import {
22
+ loadPinnedIssueIds,
23
+ persistPinnedIssueIds,
24
+ } from "@/state/linearBoardPins";
21
25
  import {
22
26
  loadLinearTicketPanelWidth,
23
27
  persistLinearTicketPanelWidth,
@@ -32,6 +36,24 @@ import { buildLinearExecutionPrompt } from "@/lib/linear-execution-prompt";
32
36
  import type { Participant } from "@/lib/types";
33
37
  import LinearSetup from "@/components/LinearSetup";
34
38
  import LinearSettingsModal from "@/components/linear/LinearSettingsModal";
39
+ import {
40
+ getRunDisplayState,
41
+ getRunTitle,
42
+ STATUS_BADGE_STYLES,
43
+ STATUS_DOT_COLORS,
44
+ STATUS_TEXT_COLORS,
45
+ } from "@/lib/linear-run-status";
46
+ import { ResizeHandle } from "@/components/ui/ResizeHandle";
47
+ import {
48
+ FilterSelect,
49
+ IssueStatusSelect,
50
+ MultiFilterPopdown,
51
+ type FilterOption,
52
+ } from "@/components/linear/LinearBoardFilters";
53
+ import { TicketRow } from "@/components/linear/TicketRow";
54
+ import { useLinearParticipants } from "@/hooks/useLinearParticipants";
55
+ import { useLinearActiveAgents } from "@/hooks/useLinearActiveAgents";
56
+ import { agentAvatarUrl } from "@/lib/linear-board-utils";
35
57
 
36
58
  const Composer = dynamic(
37
59
  () => import("@/components/chat-ui/Composer").then((module) => module.Composer),
@@ -42,60 +64,6 @@ function createThreadId() {
42
64
  return globalThis.crypto?.randomUUID?.() ?? `thread-${Date.now()}-${Math.random().toString(36).slice(2)}`;
43
65
  }
44
66
 
45
- function ResizeHandle({
46
- onResize,
47
- }: {
48
- onResize: (delta: number) => void;
49
- }) {
50
- const dragging = useRef(false);
51
- const lastX = useRef(0);
52
-
53
- useEffect(() => {
54
- if (!dragging.current) return;
55
-
56
- const onMouseMove = (e: MouseEvent) => {
57
- const delta = e.clientX - lastX.current;
58
- lastX.current = e.clientX;
59
- onResize(delta);
60
- };
61
-
62
- const onMouseUp = () => {
63
- dragging.current = false;
64
- document.body.style.cursor = "";
65
- document.body.style.userSelect = "";
66
- window.removeEventListener("mousemove", onMouseMove);
67
- window.removeEventListener("mouseup", onMouseUp);
68
- };
69
-
70
- window.addEventListener("mousemove", onMouseMove);
71
- window.addEventListener("mouseup", onMouseUp);
72
- return () => {
73
- window.removeEventListener("mousemove", onMouseMove);
74
- window.removeEventListener("mouseup", onMouseUp);
75
- };
76
- });
77
-
78
- return (
79
- <div
80
- className="group relative z-10 w-0 shrink-0 cursor-col-resize"
81
- onMouseDown={(e) => {
82
- e.preventDefault();
83
- dragging.current = true;
84
- lastX.current = e.clientX;
85
- document.body.style.cursor = "col-resize";
86
- document.body.style.userSelect = "none";
87
- }}
88
- >
89
- <div className="absolute inset-y-0 -left-0.5 w-1 transition-colors group-hover:bg-[var(--primary)]/40" />
90
- </div>
91
- );
92
- }
93
-
94
- function agentAvatarUrl(id: string, color?: string, size = 20): string {
95
- const bg = color ? color.replace("#", "") : "e2e8f0";
96
- return `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${encodeURIComponent(id)}&size=${size}&backgroundColor=${bg}`;
97
- }
98
-
99
67
  function formatRunTime(iso: string): string {
100
68
  return new Date(iso).toLocaleTimeString([], {
101
69
  hour: "numeric",
@@ -103,439 +71,8 @@ function formatRunTime(iso: string): string {
103
71
  });
104
72
  }
105
73
 
106
- function openLinearIssueTab(issueUrl: string): void {
107
- const opened = window.open(issueUrl, "_blank", "noopener,noreferrer");
108
- opened?.focus();
109
- }
110
-
111
- type RunDisplayTone = LinearRun["status"] | "ready";
112
-
113
- function formatRunStatus(status: LinearRun["status"]): string {
114
- switch (status) {
115
- case "queued":
116
- return "queued";
117
- case "running":
118
- return "running";
119
- case "success":
120
- return "success";
121
- case "failed":
122
- return "failed";
123
- case "cancelled":
124
- return "cancelled";
125
- default:
126
- return status;
127
- }
128
- }
129
-
130
- function getRunDisplayState(run: LinearRun): {
131
- label: string;
132
- tone: RunDisplayTone;
133
- } {
134
- if (run.mode === "chat") {
135
- switch (run.status) {
136
- case "queued":
137
- return { label: "starting", tone: "queued" };
138
- case "running":
139
- return { label: "thinking", tone: "running" };
140
- case "success":
141
- return { label: "ready", tone: "ready" };
142
- case "failed":
143
- return { label: "error", tone: "failed" };
144
- case "cancelled":
145
- return { label: "stopped", tone: "cancelled" };
146
- default:
147
- return { label: formatRunStatus(run.status), tone: run.status };
148
- }
149
- }
150
-
151
- return { label: formatRunStatus(run.status), tone: run.status };
152
- }
153
-
154
- function getRunTitle(run: LinearRun): string {
155
- const title = run.sessionTitle?.trim();
156
- if (title) {
157
- return title;
158
- }
159
- return run.mode === "scripted" ? "Scripted session" : "Chat session";
160
- }
161
-
162
- const STATUS_LABELS: Record<string, string> = {
163
- "In Progress": "In Prog",
164
- "In Review": "Review",
165
- Backlog: "Backlog",
166
- Todo: "Todo",
167
- Done: "Done",
168
- Cancelled: "Cancl.",
169
- };
170
-
171
- const STATUS_BADGE_STYLES: Record<RunDisplayTone, string> = {
172
- queued: "bg-amber-500/10 border-amber-500/20 text-amber-400",
173
- running: "bg-yellow-500/10 border-yellow-500/20 text-yellow-400",
174
- ready: "bg-sky-500/10 border-sky-500/20 text-sky-400",
175
- success: "bg-emerald-500/10 border-emerald-500/20 text-emerald-400",
176
- failed: "bg-red-500/10 border-red-500/20 text-red-400",
177
- cancelled: "bg-zinc-500/10 border-zinc-500/20 text-zinc-400",
178
- };
179
-
180
- const STATUS_DOT_COLORS: Record<RunDisplayTone, string> = {
181
- queued: "bg-amber-400",
182
- running: "bg-yellow-400",
183
- ready: "bg-sky-400",
184
- success: "bg-emerald-400",
185
- failed: "bg-red-400",
186
- cancelled: "bg-zinc-400",
187
- };
188
-
189
- const STATUS_TEXT_COLORS: Record<RunDisplayTone, string> = {
190
- queued: "text-amber-500",
191
- running: "text-yellow-500",
192
- ready: "text-sky-500",
193
- success: "text-green-500",
194
- failed: "text-red-500",
195
- cancelled: "text-[var(--muted-foreground)]",
196
- };
197
-
198
74
  const NEW_SESSION_PANEL_ID = "new";
199
75
 
200
- interface FilterOption {
201
- value: string;
202
- label: string;
203
- }
204
-
205
- interface FilterSelectProps {
206
- label: string;
207
- value: string;
208
- options: FilterOption[];
209
- activeClasses: string;
210
- onChange: (value: string) => void;
211
- disabled?: boolean;
212
- }
213
-
214
- interface FilterPopdownProps extends FilterSelectProps {
215
- emptyLabel?: string;
216
- }
217
-
218
- interface MultiFilterPopdownProps {
219
- label: string;
220
- values: string[];
221
- options: FilterOption[];
222
- activeClasses: string;
223
- onChange: (value: string[]) => void;
224
- emptyLabel?: string;
225
- }
226
-
227
- function FilterSelect({
228
- label,
229
- value,
230
- options,
231
- activeClasses,
232
- onChange,
233
- disabled = false,
234
- }: FilterSelectProps) {
235
- const isActive = value.trim().length > 0;
236
-
237
- return (
238
- <div className="relative">
239
- <select
240
- aria-label={label}
241
- className={`max-w-[160px] appearance-none rounded-full border bg-transparent px-2.5 py-0.5 pr-6 text-[11px] font-medium outline-none transition-colors disabled:cursor-not-allowed disabled:opacity-60 ${
242
- isActive
243
- ? activeClasses
244
- : "border-[var(--card-border)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)]"
245
- }`}
246
- value={value}
247
- disabled={disabled}
248
- onChange={(event) => onChange(event.target.value)}
249
- >
250
- {options.map((option) => (
251
- <option key={`${label}-${option.value || "all"}`} value={option.value}>
252
- {option.label}
253
- </option>
254
- ))}
255
- </select>
256
- <ChevronDown
257
- size={12}
258
- className="pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-current"
259
- />
260
- </div>
261
- );
262
- }
263
-
264
- function IssueStatusSelect({
265
- status,
266
- options,
267
- onChange,
268
- disabled = false,
269
- updating = false,
270
- }: {
271
- status: string;
272
- options: FilterOption[];
273
- onChange: (value: string) => void;
274
- disabled?: boolean;
275
- updating?: boolean;
276
- }) {
277
- return (
278
- <div className="relative">
279
- <select
280
- aria-label="Ticket status"
281
- className="max-w-[160px] appearance-none rounded-md border border-[var(--card-border)] bg-[var(--card-bg)] px-2.5 py-1 pr-8 text-xs font-medium text-[var(--foreground)] outline-none transition-colors hover:border-[var(--muted-foreground)] disabled:cursor-not-allowed disabled:opacity-60"
282
- value={status}
283
- disabled={disabled || updating}
284
- onChange={(event) => onChange(event.target.value)}
285
- >
286
- {options.map((option) => (
287
- <option key={`ticket-status-${option.value}`} value={option.value}>
288
- {option.label}
289
- </option>
290
- ))}
291
- </select>
292
- {updating ? (
293
- <RefreshCw
294
- size={12}
295
- className="pointer-events-none absolute right-6 top-1/2 -translate-y-1/2 animate-spin text-[var(--muted-foreground)]"
296
- />
297
- ) : null}
298
- <ChevronDown
299
- size={12}
300
- className="pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)]"
301
- />
302
- </div>
303
- );
304
- }
305
-
306
- function FilterPopdown({
307
- label,
308
- value,
309
- options,
310
- activeClasses,
311
- onChange,
312
- emptyLabel,
313
- }: FilterPopdownProps) {
314
- const [open, setOpen] = useState(false);
315
- const wrapperRef = useRef<HTMLDivElement | null>(null);
316
- const selectedOption = options.find((option) => option.value === value) ?? null;
317
- const isActive = value.trim().length > 0;
318
- const buttonLabel = selectedOption?.label ?? emptyLabel ?? label;
319
-
320
- useEffect(() => {
321
- if (!open) {
322
- return;
323
- }
324
-
325
- const handlePointerDown = (event: PointerEvent) => {
326
- if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {
327
- setOpen(false);
328
- }
329
- };
330
-
331
- document.addEventListener("pointerdown", handlePointerDown);
332
- return () => document.removeEventListener("pointerdown", handlePointerDown);
333
- }, [open]);
334
-
335
- useEffect(() => {
336
- setOpen(false);
337
- }, [value]);
338
-
339
- return (
340
- <div className="relative" ref={wrapperRef}>
341
- <button
342
- type="button"
343
- aria-label={label}
344
- aria-haspopup="listbox"
345
- aria-expanded={open}
346
- className={`flex max-w-[180px] items-center gap-1 rounded-full border px-2.5 py-0.5 text-[11px] font-medium transition-colors ${
347
- isActive
348
- ? activeClasses
349
- : "border-[var(--card-border)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)]"
350
- }`}
351
- onClick={() => setOpen((current) => !current)}
352
- >
353
- <span className="max-w-[132px] truncate">{buttonLabel}</span>
354
- <ChevronDown size={12} className={`shrink-0 transition-transform ${open ? "rotate-180" : ""}`} />
355
- </button>
356
- {open ? (
357
- <div
358
- role="listbox"
359
- aria-label={`${label} options`}
360
- className="absolute left-0 top-full z-50 mt-1 min-w-[220px] overflow-hidden rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] p-1 shadow-lg backdrop-blur-sm"
361
- >
362
- {options.map((option) => {
363
- const isSelected = option.value === value;
364
- return (
365
- <button
366
- key={`${label}-${option.value || "all"}`}
367
- type="button"
368
- role="option"
369
- aria-selected={isSelected}
370
- className={`flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs transition-colors ${
371
- isSelected
372
- ? "bg-[var(--background)] font-medium text-[var(--foreground)]"
373
- : "text-[var(--muted-foreground)] hover:bg-[var(--background)] hover:text-[var(--foreground)]"
374
- }`}
375
- onClick={() => onChange(option.value)}
376
- >
377
- <span
378
- className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${
379
- isSelected
380
- ? "border-blue-500 bg-blue-500 text-white"
381
- : "border-[var(--card-border)]"
382
- }`}
383
- >
384
- {isSelected ? <Check size={10} /> : null}
385
- </span>
386
- <span className="min-w-0 flex-1 truncate">{option.label}</span>
387
- </button>
388
- );
389
- })}
390
- </div>
391
- ) : null}
392
- </div>
393
- );
394
- }
395
-
396
- function MultiFilterPopdown({
397
- label,
398
- values,
399
- options,
400
- activeClasses,
401
- onChange,
402
- emptyLabel,
403
- }: MultiFilterPopdownProps) {
404
- const [open, setOpen] = useState(false);
405
- const wrapperRef = useRef<HTMLDivElement | null>(null);
406
- const selectedOptions = options.filter(
407
- (option) => option.value && values.includes(option.value)
408
- );
409
- const isActive = selectedOptions.length > 0;
410
- const buttonLabel = (() => {
411
- if (selectedOptions.length === 0) {
412
- return emptyLabel ?? label;
413
- }
414
- if (selectedOptions.length === options.length) {
415
- return emptyLabel ?? label;
416
- }
417
- if (selectedOptions.length === 1) {
418
- return selectedOptions[0]?.label ?? (emptyLabel ?? label);
419
- }
420
- const lowerLabel = label.toLowerCase();
421
- return `${selectedOptions.length} ${lowerLabel}${lowerLabel.endsWith("s") ? "es" : "s"}`;
422
- })();
423
-
424
- useEffect(() => {
425
- if (!open) {
426
- return;
427
- }
428
-
429
- const handlePointerDown = (event: PointerEvent) => {
430
- if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {
431
- setOpen(false);
432
- }
433
- };
434
-
435
- document.addEventListener("pointerdown", handlePointerDown);
436
- return () => document.removeEventListener("pointerdown", handlePointerDown);
437
- }, [open]);
438
-
439
- const toggleValue = useCallback(
440
- (nextValue: string) => {
441
- if (!nextValue) {
442
- onChange([]);
443
- return;
444
- }
445
-
446
- const nextValues = values.includes(nextValue)
447
- ? values.filter((value) => value !== nextValue)
448
- : [...values, nextValue];
449
- onChange(nextValues);
450
- },
451
- [onChange, values]
452
- );
453
-
454
- return (
455
- <div className="relative" ref={wrapperRef}>
456
- <button
457
- type="button"
458
- aria-label={label}
459
- aria-haspopup="listbox"
460
- aria-expanded={open}
461
- className={`flex max-w-[180px] items-center gap-1 rounded-full border px-2.5 py-0.5 text-[11px] font-medium transition-colors ${
462
- isActive
463
- ? activeClasses
464
- : "border-[var(--card-border)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)]"
465
- }`}
466
- onClick={() => setOpen((current) => !current)}
467
- >
468
- <span className="max-w-[132px] truncate">{buttonLabel}</span>
469
- <ChevronDown size={12} className={`shrink-0 transition-transform ${open ? "rotate-180" : ""}`} />
470
- </button>
471
- {open ? (
472
- <div
473
- role="listbox"
474
- aria-label={`${label} options`}
475
- aria-multiselectable="true"
476
- className="absolute left-0 top-full z-50 mt-1 min-w-[240px] overflow-hidden rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] p-1 shadow-lg backdrop-blur-sm"
477
- >
478
- <button
479
- type="button"
480
- role="option"
481
- aria-selected={!isActive}
482
- className={`flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs transition-colors ${
483
- !isActive
484
- ? "bg-[var(--background)] font-medium text-[var(--foreground)]"
485
- : "text-[var(--muted-foreground)] hover:bg-[var(--background)] hover:text-[var(--foreground)]"
486
- }`}
487
- onClick={() => onChange([])}
488
- >
489
- <span
490
- className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${
491
- !isActive
492
- ? "border-blue-500 bg-blue-500 text-white"
493
- : "border-[var(--card-border)]"
494
- }`}
495
- >
496
- {!isActive ? <Check size={10} /> : null}
497
- </span>
498
- <span className="min-w-0 flex-1 truncate">{emptyLabel ?? label}</span>
499
- </button>
500
- {selectedOptions.length > 0 ? (
501
- <div className="px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-[0.12em] text-[var(--muted-foreground)]">
502
- Selected
503
- </div>
504
- ) : null}
505
- {options.filter((option) => option.value).map((option) => {
506
- const isSelected = values.includes(option.value);
507
- return (
508
- <button
509
- key={`${label}-${option.value}`}
510
- type="button"
511
- role="option"
512
- aria-selected={isSelected}
513
- className={`flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs transition-colors ${
514
- isSelected
515
- ? "bg-[var(--background)] font-medium text-[var(--foreground)]"
516
- : "text-[var(--muted-foreground)] hover:bg-[var(--background)] hover:text-[var(--foreground)]"
517
- }`}
518
- onClick={() => toggleValue(option.value)}
519
- >
520
- <span
521
- className={`flex h-4 w-4 shrink-0 items-center justify-center rounded border ${
522
- isSelected
523
- ? "border-blue-500 bg-blue-500 text-white"
524
- : "border-[var(--card-border)]"
525
- }`}
526
- >
527
- {isSelected ? <Check size={10} /> : null}
528
- </span>
529
- <span className="min-w-0 flex-1 truncate">{option.label}</span>
530
- </button>
531
- );
532
- })}
533
- </div>
534
- ) : null}
535
- </div>
536
- );
537
- }
538
-
539
76
  interface CycleOption {
540
77
  id: string;
541
78
  number: number;
@@ -1075,134 +612,6 @@ function ThreadMessageList({
1075
612
  );
1076
613
  }
1077
614
 
1078
- function TicketRow({
1079
- issue,
1080
- selected,
1081
- onSelect,
1082
- activeAgents,
1083
- participants,
1084
- }: {
1085
- issue: LinearIssue;
1086
- selected: boolean;
1087
- onSelect: () => void;
1088
- activeAgents?: Array<{ agentId: string; agentName: string }>;
1089
- participants?: Participant[];
1090
- }) {
1091
- const [copied, setCopied] = useState(false);
1092
- const copyResetTimeoutRef = useRef<number | null>(null);
1093
-
1094
- useEffect(() => {
1095
- return () => {
1096
- if (copyResetTimeoutRef.current) {
1097
- window.clearTimeout(copyResetTimeoutRef.current);
1098
- }
1099
- };
1100
- }, []);
1101
-
1102
- const handleCopyUrl = useCallback(async (event: React.MouseEvent<HTMLButtonElement>) => {
1103
- event.stopPropagation();
1104
- if (!issue.url) {
1105
- return;
1106
- }
1107
-
1108
- try {
1109
- await navigator.clipboard.writeText(issue.url);
1110
- setCopied(true);
1111
- if (copyResetTimeoutRef.current) {
1112
- window.clearTimeout(copyResetTimeoutRef.current);
1113
- }
1114
- copyResetTimeoutRef.current = window.setTimeout(() => {
1115
- setCopied(false);
1116
- }, 1500) as unknown as number;
1117
- } catch (error) {
1118
- console.error("Failed to copy Linear issue URL:", error);
1119
- setCopied(false);
1120
- }
1121
- }, [issue.url]);
1122
-
1123
- const handleOpenIssue = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {
1124
- event.stopPropagation();
1125
- if (!issue.url) {
1126
- return;
1127
- }
1128
- openLinearIssueTab(issue.url);
1129
- }, [issue.url]);
1130
-
1131
- const shortStatus = STATUS_LABELS[issue.status] ?? issue.status.slice(0, 6);
1132
- return (
1133
- <div
1134
- className={`group relative flex cursor-pointer items-center gap-3 px-4 py-2.5 text-sm transition-colors ${
1135
- selected
1136
- ? "bg-[var(--card-bg)]"
1137
- : "hover:bg-[var(--card-bg)]/50"
1138
- }`}
1139
- onClick={onSelect}
1140
- role="button"
1141
- tabIndex={0}
1142
- onKeyDown={(event) => {
1143
- if (event.key === "Enter" || event.key === " ") {
1144
- event.preventDefault();
1145
- onSelect();
1146
- }
1147
- }}
1148
- >
1149
- {selected && (
1150
- <div className="absolute left-0 top-0 bottom-0 w-[3px] rounded-r-full bg-blue-500" />
1151
- )}
1152
- <span className="w-24 shrink-0 whitespace-nowrap font-mono text-xs text-[var(--muted-foreground)]">
1153
- {issue.identifier}
1154
- </span>
1155
- <span className={`min-w-0 flex-1 truncate text-xs ${selected ? "font-medium text-[var(--foreground)]" : "text-[var(--muted-foreground)]"}`}>
1156
- {issue.title}
1157
- </span>
1158
- <span className="shrink-0 text-xs text-[var(--muted-foreground)]">
1159
- {shortStatus}
1160
- </span>
1161
- {activeAgents && activeAgents.length > 0 && (
1162
- <span className="inline-flex items-center -space-x-1 shrink-0">
1163
- {activeAgents.slice(0, 3).map((agent) => {
1164
- const participant = participants?.find((p) => p.id === agent.agentId);
1165
- return (
1166
- <span key={agent.agentId} className="relative inline-block" title={participant?.name ?? agent.agentName}>
1167
- <img src={agentAvatarUrl(agent.agentId, participant?.color, 16)} alt={participant?.name ?? agent.agentName} className="h-3 w-3 rounded-full ring-[1.5px] ring-[var(--app-shell-pane)]" />
1168
- <span className="absolute -bottom-px -right-px h-1.5 w-1.5 rounded-full bg-green-500 ring-[1px] ring-[var(--app-shell-pane)]" />
1169
- </span>
1170
- );
1171
- })}
1172
- </span>
1173
- )}
1174
- <div className="flex shrink-0 items-center gap-1">
1175
- <button
1176
- type="button"
1177
- className={`flex h-6 w-6 shrink-0 items-center justify-center rounded text-[var(--muted-foreground)] transition-all hover:bg-zinc-700 hover:text-[var(--foreground)] ${
1178
- selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"
1179
- } ${issue.url ? "" : "cursor-not-allowed opacity-40 hover:bg-transparent hover:text-[var(--muted-foreground)]"}`}
1180
- onClick={(event) => {
1181
- void handleCopyUrl(event);
1182
- }}
1183
- title={copied ? "Copied ticket URL" : "Copy ticket URL"}
1184
- aria-label={copied ? "Copied ticket URL" : "Copy ticket URL"}
1185
- disabled={!issue.url}
1186
- >
1187
- {copied ? <Check size={10} className="text-emerald-400" /> : <Link2 size={10} />}
1188
- </button>
1189
- <button
1190
- type="button"
1191
- className={`flex h-6 w-6 shrink-0 items-center justify-center rounded text-[var(--muted-foreground)] transition-all hover:bg-zinc-700 hover:text-[var(--foreground)] ${
1192
- selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"
1193
- } ${issue.url ? "" : "cursor-not-allowed opacity-40 hover:bg-transparent hover:text-[var(--muted-foreground)]"}`}
1194
- onClick={handleOpenIssue}
1195
- title={issue.url ? "Open this Linear ticket in a new tab" : "This ticket does not have a Linear URL"}
1196
- aria-label={issue.url ? "Open this Linear ticket in a new tab" : "This ticket does not have a Linear URL"}
1197
- disabled={!issue.url}
1198
- >
1199
- <ExternalLink size={10} />
1200
- </button>
1201
- </div>
1202
- </div>
1203
- );
1204
- }
1205
-
1206
615
  interface LinearBoardProps {
1207
616
  projectId?: string;
1208
617
  projectSlug?: string;
@@ -1242,10 +651,11 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
1242
651
  const [sortBy, setSortBy] = useState<"activity" | "identifier" | "status" | "created">("activity");
1243
652
  const [sortDir, setSortDir] = useState<"asc" | "desc">("desc");
1244
653
  const [hasActivity, setHasActivity] = useState(false);
654
+ const [pinnedIssueIds, setPinnedIssueIds] = useState<Set<string>>(() => loadPinnedIssueIds(projectSlug));
1245
655
  const [selectedIssueFallback, setSelectedIssueFallback] = useState<LinearIssue | null>(null);
1246
656
  const [updatingIssueId, setUpdatingIssueId] = useState<string | null>(null);
1247
- const [participants, setParticipants] = useState<Participant[]>([]);
1248
- const [issueActiveAgents, setIssueActiveAgents] = useState<Map<string, Array<{ agentId: string; agentName: string }>>>(new Map());
657
+ const { participants } = useLinearParticipants(projectId);
658
+ const { issueActiveAgents } = useLinearActiveAgents(projectId);
1249
659
  const [pickerIssue, setPickerIssue] = useState<LinearIssue | null>(null);
1250
660
  const [pickerAnchor, setPickerAnchor] = useState<{ top: number; left: number } | null>(null);
1251
661
  const [touchPanelTab, setTouchPanelTab] = useState<"runs" | "ticket">("runs");
@@ -1265,6 +675,19 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
1265
675
  searchDebounceRef.current = setTimeout(() => setDebouncedSearch(value), 300);
1266
676
  }, []);
1267
677
 
678
+ const togglePin = useCallback((issueId: string) => {
679
+ setPinnedIssueIds((prev) => {
680
+ const next = new Set(prev);
681
+ if (next.has(issueId)) {
682
+ next.delete(issueId);
683
+ } else {
684
+ next.add(issueId);
685
+ }
686
+ persistPinnedIssueIds(projectSlug, next);
687
+ return next;
688
+ });
689
+ }, [projectSlug]);
690
+
1268
691
  useEffect(() => {
1269
692
  return () => {
1270
693
  if (searchDebounceRef.current) {
@@ -1285,6 +708,7 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
1285
708
  setSortBy(storedFilters.sortBy);
1286
709
  setSortDir(storedFilters.sortDir);
1287
710
  setHasActivity(storedFilters.hasActivity);
711
+ setPinnedIssueIds(loadPinnedIssueIds(projectSlug));
1288
712
  }, [projectSlug]);
1289
713
 
1290
714
  useEffect(() => {
@@ -1411,7 +835,7 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
1411
835
  loadMore,
1412
836
  refresh: refreshIssues,
1413
837
  updateIssue,
1414
- } = useLinearIssues(filters, connected, { projectSlug });
838
+ } = useLinearIssues(filters, connected && filterOptionsLoaded, { projectSlug });
1415
839
  const selectedIssueFromList = useMemo(
1416
840
  () => (selectedIssueId ? issues.find((issue) => issue.id === selectedIssueId) ?? null : null),
1417
841
  [issues, selectedIssueId],
@@ -1419,6 +843,21 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
1419
843
  const selectedIssue =
1420
844
  selectedIssueFromList ??
1421
845
  (selectedIssueFallback?.id === selectedIssueId ? selectedIssueFallback : null);
846
+
847
+ const sortedIssues = useMemo(() => {
848
+ if (pinnedIssueIds.size === 0) return issues;
849
+ const pinned: LinearIssue[] = [];
850
+ const unpinned: LinearIssue[] = [];
851
+ for (const issue of issues) {
852
+ if (pinnedIssueIds.has(issue.id)) {
853
+ pinned.push(issue);
854
+ } else {
855
+ unpinned.push(issue);
856
+ }
857
+ }
858
+ return [...pinned, ...unpinned];
859
+ }, [issues, pinnedIssueIds]);
860
+
1422
861
  const {
1423
862
  runs,
1424
863
  loading: runsLoading,
@@ -1604,128 +1043,6 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
1604
1043
  setTouchPanelTab("runs");
1605
1044
  }, [isTouchLayout, runs.length, selectedIssue, selectedRun, selectedRunId]);
1606
1045
 
1607
- useEffect(() => {
1608
- let cancelled = false;
1609
-
1610
- async function loadParticipants() {
1611
- try {
1612
- const participantsResponse = await fetch("/api/participants");
1613
- const allParticipants = participantsResponse.ok
1614
- ? ((await participantsResponse.json()) as Participant[])
1615
- : [];
1616
-
1617
- if (!projectId) {
1618
- if (!cancelled) setParticipants(allParticipants);
1619
- return;
1620
- }
1621
-
1622
- // Check if the linear worker has a team configured
1623
- const workerParams = new URLSearchParams();
1624
- workerParams.set("projectId", projectId);
1625
- const workerResponse = await fetch(`/api/linear/worker?${workerParams}`).catch(() => null);
1626
- const workerData = workerResponse?.ok ? await workerResponse.json().catch(() => null) : null;
1627
- const workerTeamId: string | undefined = workerData?.job?.teamId || undefined;
1628
-
1629
- if (workerTeamId) {
1630
- // Use the team's agents as participants
1631
- const teamAgentsResponse = await fetch(
1632
- `/api/projects/${encodeURIComponent(projectId)}/teams/${encodeURIComponent(workerTeamId)}/agents`
1633
- );
1634
- if (teamAgentsResponse.ok) {
1635
- const teamData = await teamAgentsResponse.json();
1636
- const teamAgentIds: string[] = Array.isArray(teamData.agents)
1637
- ? teamData.agents
1638
- .sort((a: { routing_order?: number }, b: { routing_order?: number }) =>
1639
- (a.routing_order ?? 0) - (b.routing_order ?? 0)
1640
- )
1641
- .map((agent: { agent_id?: string }) => agent.agent_id)
1642
- .filter((value: unknown): value is string => typeof value === "string" && value.trim().length > 0)
1643
- : [];
1644
- if (teamAgentIds.length > 0) {
1645
- const teamOrderIndex = new Map(teamAgentIds.map((id, index) => [id, index]));
1646
- const teamParticipants = allParticipants
1647
- .filter((participant) => teamOrderIndex.has(participant.id))
1648
- .sort(
1649
- (left, right) =>
1650
- (teamOrderIndex.get(left.id) ?? Number.MAX_SAFE_INTEGER) -
1651
- (teamOrderIndex.get(right.id) ?? Number.MAX_SAFE_INTEGER)
1652
- );
1653
- if (!cancelled && teamParticipants.length > 0) {
1654
- setParticipants(teamParticipants);
1655
- return;
1656
- }
1657
- }
1658
- }
1659
- }
1660
-
1661
- // Fallback: use project agents
1662
- const projectAgentsResponse = await fetch(
1663
- `/api/projects/${encodeURIComponent(projectId)}/agents`
1664
- );
1665
- if (!projectAgentsResponse.ok) {
1666
- if (!cancelled) setParticipants(allParticipants);
1667
- return;
1668
- }
1669
-
1670
- const projectData = await projectAgentsResponse.json();
1671
- const orderedAgentIds: string[] = Array.isArray(projectData.agents)
1672
- ? projectData.agents
1673
- .map((agent: { agent_id?: string }) => agent.agent_id)
1674
- .filter((value: unknown): value is string => typeof value === "string" && value.trim().length > 0)
1675
- : [];
1676
- const orderIndex = new Map(orderedAgentIds.map((id, index) => [id, index]));
1677
- const scopedParticipants = allParticipants
1678
- .filter((participant) => orderIndex.has(participant.id))
1679
- .sort(
1680
- (left, right) =>
1681
- (orderIndex.get(left.id) ?? Number.MAX_SAFE_INTEGER) -
1682
- (orderIndex.get(right.id) ?? Number.MAX_SAFE_INTEGER)
1683
- );
1684
-
1685
- if (!cancelled) {
1686
- setParticipants(scopedParticipants);
1687
- }
1688
- } catch {
1689
- if (!cancelled) {
1690
- setParticipants([]);
1691
- }
1692
- }
1693
- }
1694
-
1695
- void loadParticipants();
1696
-
1697
- return () => {
1698
- cancelled = true;
1699
- };
1700
- }, [projectId]);
1701
-
1702
- useEffect(() => {
1703
- let cancelled = false;
1704
-
1705
- async function fetchActiveAgents() {
1706
- try {
1707
- const params = new URLSearchParams();
1708
- if (projectId) params.set("projectId", projectId);
1709
- const res = await fetch(`/api/linear/issues/active-agents?${params}`);
1710
- if (!res.ok || cancelled) return;
1711
- const data = await res.json();
1712
- const map = new Map<string, Array<{ agentId: string; agentName: string }>>();
1713
- for (const entry of data.agents ?? []) {
1714
- const list = map.get(entry.issueId) ?? [];
1715
- list.push({ agentId: entry.agentId, agentName: entry.agentName });
1716
- map.set(entry.issueId, list);
1717
- }
1718
- if (!cancelled) setIssueActiveAgents(map);
1719
- } catch {
1720
- // ignore
1721
- }
1722
- }
1723
-
1724
- void fetchActiveAgents();
1725
- const interval = setInterval(() => void fetchActiveAgents(), 5000);
1726
- return () => { cancelled = true; clearInterval(interval); };
1727
- }, [projectId]);
1728
-
1729
1046
  useEffect(() => {
1730
1047
  if (!showRunScripts) {
1731
1048
  return;
@@ -1986,21 +1303,29 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
1986
1303
  </div>
1987
1304
  ) : (
1988
1305
  <>
1989
- {issues.map((issue) => (
1990
- <TicketRow
1991
- key={issue.id}
1992
- issue={issue}
1993
- selected={selectedIssue?.id === issue.id}
1994
- activeAgents={issueActiveAgents.get(issue.id)}
1995
- participants={participants}
1996
- onSelect={() => {
1997
- setTouchPanelTab("runs");
1998
- pushSelection({
1999
- issue: issue.id,
2000
- run: null,
2001
- });
2002
- }}
2003
- />
1306
+ {sortedIssues.map((issue, idx) => (
1307
+ <React.Fragment key={issue.id}>
1308
+ {pinnedIssueIds.size > 0 &&
1309
+ !pinnedIssueIds.has(issue.id) &&
1310
+ (idx === 0 || pinnedIssueIds.has(sortedIssues[idx - 1].id)) && (
1311
+ <div className="mx-4 border-t border-amber-500/20" />
1312
+ )}
1313
+ <TicketRow
1314
+ issue={issue}
1315
+ selected={selectedIssue?.id === issue.id}
1316
+ pinned={pinnedIssueIds.has(issue.id)}
1317
+ activeAgents={issueActiveAgents.get(issue.id)}
1318
+ participants={participants}
1319
+ onSelect={() => {
1320
+ setTouchPanelTab("runs");
1321
+ pushSelection({
1322
+ issue: issue.id,
1323
+ run: null,
1324
+ });
1325
+ }}
1326
+ onTogglePin={() => togglePin(issue.id)}
1327
+ />
1328
+ </React.Fragment>
2004
1329
  ))}
2005
1330
  {hasMore ? (
2006
1331
  <div
@@ -2304,20 +1629,28 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
2304
1629
  </div>
2305
1630
  ) : (
2306
1631
  <>
2307
- {issues.map((issue) => (
2308
- <TicketRow
2309
- key={issue.id}
2310
- issue={issue}
2311
- selected={selectedIssue?.id === issue.id}
2312
- activeAgents={issueActiveAgents.get(issue.id)}
2313
- participants={participants}
2314
- onSelect={() =>
2315
- pushSelection({
2316
- issue: issue.id,
2317
- run: null,
2318
- })
2319
- }
2320
- />
1632
+ {sortedIssues.map((issue, idx) => (
1633
+ <React.Fragment key={issue.id}>
1634
+ {pinnedIssueIds.size > 0 &&
1635
+ !pinnedIssueIds.has(issue.id) &&
1636
+ (idx === 0 || pinnedIssueIds.has(sortedIssues[idx - 1].id)) && (
1637
+ <div className="mx-4 border-t border-amber-500/20" />
1638
+ )}
1639
+ <TicketRow
1640
+ issue={issue}
1641
+ selected={selectedIssue?.id === issue.id}
1642
+ pinned={pinnedIssueIds.has(issue.id)}
1643
+ activeAgents={issueActiveAgents.get(issue.id)}
1644
+ participants={participants}
1645
+ onSelect={() =>
1646
+ pushSelection({
1647
+ issue: issue.id,
1648
+ run: null,
1649
+ })
1650
+ }
1651
+ onTogglePin={() => togglePin(issue.id)}
1652
+ />
1653
+ </React.Fragment>
2321
1654
  ))}
2322
1655
  {hasMore ? (
2323
1656
  <div
@@ -2549,8 +1882,8 @@ export default function LinearBoard({ projectId, projectSlug, initialShowSetting
2549
1882
  />
2550
1883
  <span className="flex flex-col">
2551
1884
  <span className="font-medium text-[var(--foreground)]">{agent.name}</span>
2552
- {agent.title ? (
2553
- <span className="text-[10px] text-[var(--muted-foreground)]">{agent.title}</span>
1885
+ {agent.role ? (
1886
+ <span className="text-[10px] text-[var(--muted-foreground)]">{agent.role}</span>
2554
1887
  ) : null}
2555
1888
  </span>
2556
1889
  </button>