@mndrk/agx 2.0.33 → 2.0.36

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 (690) hide show
  1. package/cloud-runtime/standalone/.next/BUILD_ID +1 -1
  2. package/cloud-runtime/standalone/.next/app-path-routes-manifest.json +17 -0
  3. package/cloud-runtime/standalone/.next/build-manifest.json +6 -6
  4. package/cloud-runtime/standalone/.next/prerender-manifest.json +27 -3
  5. package/cloud-runtime/standalone/.next/routes-manifest.json +110 -0
  6. package/cloud-runtime/standalone/.next/server/app/_global-error/page/build-manifest.json +4 -4
  7. package/cloud-runtime/standalone/.next/server/app/_global-error.html +2 -2
  8. package/cloud-runtime/standalone/.next/server/app/_global-error.rsc +1 -1
  9. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/cloud-runtime/standalone/.next/server/app/_not-found/page/build-manifest.json +4 -4
  15. package/cloud-runtime/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/cloud-runtime/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/cloud-runtime/standalone/.next/server/app/_not-found.html +2 -2
  18. package/cloud-runtime/standalone/.next/server/app/_not-found.rsc +2 -2
  19. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  20. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  22. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  25. package/cloud-runtime/standalone/.next/server/app/agents/[id]/page/build-manifest.json +4 -4
  26. package/cloud-runtime/standalone/.next/server/app/agents/[id]/page.js.nft.json +1 -1
  27. package/cloud-runtime/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  28. package/cloud-runtime/standalone/.next/server/app/agents/page/build-manifest.json +4 -4
  29. package/cloud-runtime/standalone/.next/server/app/agents/page.js.nft.json +1 -1
  30. package/cloud-runtime/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  31. package/cloud-runtime/standalone/.next/server/app/agents.html +2 -2
  32. package/cloud-runtime/standalone/.next/server/app/agents.rsc +3 -3
  33. package/cloud-runtime/standalone/.next/server/app/agents.segments/_full.segment.rsc +3 -3
  34. package/cloud-runtime/standalone/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  35. package/cloud-runtime/standalone/.next/server/app/agents.segments/_index.segment.rsc +2 -2
  36. package/cloud-runtime/standalone/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
  37. package/cloud-runtime/standalone/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +2 -2
  38. package/cloud-runtime/standalone/.next/server/app/agents.segments/agents.segment.rsc +1 -1
  39. package/cloud-runtime/standalone/.next/server/app/api/agent-specs/route.js +1 -1
  40. package/cloud-runtime/standalone/.next/server/app/api/agent-specs/route.js.nft.json +1 -1
  41. package/cloud-runtime/standalone/.next/server/app/api/agents/[id]/profile/route.js +1 -1
  42. package/cloud-runtime/standalone/.next/server/app/api/agents/[id]/profile/route.js.nft.json +1 -1
  43. package/cloud-runtime/standalone/.next/server/app/api/agents/export/route.js +1 -1
  44. package/cloud-runtime/standalone/.next/server/app/api/agents/export/route.js.nft.json +1 -1
  45. package/cloud-runtime/standalone/.next/server/app/api/automations/create/route.js +2 -2
  46. package/cloud-runtime/standalone/.next/server/app/api/automations/create/route.js.nft.json +1 -1
  47. package/cloud-runtime/standalone/.next/server/app/api/chat/route.js +5 -5
  48. package/cloud-runtime/standalone/.next/server/app/api/chat/route.js.nft.json +1 -1
  49. package/cloud-runtime/standalone/.next/server/app/api/file-search/route.js.nft.json +1 -1
  50. package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route/app-paths-manifest.json +3 -0
  51. package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route/build-manifest.json +11 -0
  52. package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route/server-reference-manifest.json +4 -0
  53. package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route.js +7 -0
  54. package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route.js.map +5 -0
  55. package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route.js.nft.json +1 -0
  56. package/cloud-runtime/standalone/.next/server/app/api/filesystem/pick-folder/route_client-reference-manifest.js +2 -0
  57. package/cloud-runtime/standalone/.next/server/app/api/health/route.js +1 -1
  58. package/cloud-runtime/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
  59. package/cloud-runtime/standalone/.next/server/app/api/learnings/route.js +1 -1
  60. package/cloud-runtime/standalone/.next/server/app/api/learnings/route.js.nft.json +1 -1
  61. package/cloud-runtime/standalone/.next/server/app/api/orchestrator/tasks/[taskId]/start/route.js +1 -1
  62. package/cloud-runtime/standalone/.next/server/app/api/orchestrator/tasks/[taskId]/start/route.js.nft.json +1 -1
  63. package/cloud-runtime/standalone/.next/server/app/api/orchestrator/tasks/[taskId]/status/route.js +1 -1
  64. package/cloud-runtime/standalone/.next/server/app/api/orchestrator/tasks/[taskId]/status/route.js.nft.json +1 -1
  65. package/cloud-runtime/standalone/.next/server/app/api/participants/route.js +3 -3
  66. package/cloud-runtime/standalone/.next/server/app/api/participants/route.js.nft.json +1 -1
  67. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/agents/route.js +1 -1
  68. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/agents/route.js.nft.json +1 -1
  69. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/memory/route.js +1 -1
  70. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/memory/route.js.nft.json +1 -1
  71. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/migrate-v1/route.js +1 -1
  72. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/migrate-v1/route.js.nft.json +1 -1
  73. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/migrate-v2/route.js +1 -1
  74. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/migrate-v2/route.js.nft.json +1 -1
  75. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/route.js +1 -1
  76. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  77. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/skills/route.js +1 -1
  78. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/skills/route.js.nft.json +1 -1
  79. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/threads/route.js +1 -1
  80. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/threads/route.js.nft.json +1 -1
  81. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/variables/route.js +1 -1
  82. package/cloud-runtime/standalone/.next/server/app/api/projects/[id]/variables/route.js.nft.json +1 -1
  83. package/cloud-runtime/standalone/.next/server/app/api/projects/route.js +1 -1
  84. package/cloud-runtime/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  85. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route/app-paths-manifest.json +3 -0
  86. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route/build-manifest.json +11 -0
  87. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route/server-reference-manifest.json +4 -0
  88. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route.js +10 -0
  89. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route.js.map +5 -0
  90. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route.js.nft.json +1 -0
  91. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/cancel/route_client-reference-manifest.js +2 -0
  92. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route/app-paths-manifest.json +3 -0
  93. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route/build-manifest.json +11 -0
  94. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route/server-reference-manifest.json +4 -0
  95. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route.js +10 -0
  96. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route.js.map +5 -0
  97. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route.js.nft.json +1 -0
  98. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/route_client-reference-manifest.js +2 -0
  99. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route/app-paths-manifest.json +3 -0
  100. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route/build-manifest.json +11 -0
  101. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route/server-reference-manifest.json +4 -0
  102. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route.js +10 -0
  103. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route.js.map +5 -0
  104. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route.js.nft.json +1 -0
  105. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/[id]/runs/route_client-reference-manifest.js +2 -0
  106. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route/app-paths-manifest.json +3 -0
  107. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route/build-manifest.json +11 -0
  108. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route/server-reference-manifest.json +4 -0
  109. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route.js +9 -0
  110. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route.js.map +5 -0
  111. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route.js.nft.json +1 -0
  112. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/agents/route_client-reference-manifest.js +2 -0
  113. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route/app-paths-manifest.json +3 -0
  114. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route/build-manifest.json +11 -0
  115. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route/server-reference-manifest.json +4 -0
  116. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route.js +12 -0
  117. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route.js.map +5 -0
  118. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route.js.nft.json +1 -0
  119. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/poll/route_client-reference-manifest.js +2 -0
  120. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route/app-paths-manifest.json +3 -0
  121. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route/build-manifest.json +11 -0
  122. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route/server-reference-manifest.json +4 -0
  123. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route.js +10 -0
  124. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route.js.map +5 -0
  125. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route.js.nft.json +1 -0
  126. package/cloud-runtime/standalone/.next/server/app/api/prompt-jobs/route_client-reference-manifest.js +2 -0
  127. package/cloud-runtime/standalone/.next/server/app/api/queue/complete/route.js +1 -1
  128. package/cloud-runtime/standalone/.next/server/app/api/queue/complete/route.js.nft.json +1 -1
  129. package/cloud-runtime/standalone/.next/server/app/api/queue/route.js +2 -2
  130. package/cloud-runtime/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  131. package/cloud-runtime/standalone/.next/server/app/api/schedules/debug/route.js +3 -3
  132. package/cloud-runtime/standalone/.next/server/app/api/schedules/debug/route.js.nft.json +1 -1
  133. package/cloud-runtime/standalone/.next/server/app/api/schedules/poll/route.js +4 -4
  134. package/cloud-runtime/standalone/.next/server/app/api/schedules/poll/route.js.nft.json +1 -1
  135. package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route/app-paths-manifest.json +3 -0
  136. package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route/build-manifest.json +11 -0
  137. package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route/server-reference-manifest.json +4 -0
  138. package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route.js +8 -0
  139. package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route.js.map +5 -0
  140. package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route.js.nft.json +1 -0
  141. package/cloud-runtime/standalone/.next/server/app/api/skills/assign/route_client-reference-manifest.js +2 -0
  142. package/cloud-runtime/standalone/.next/server/app/api/skills/available/route/app-paths-manifest.json +3 -0
  143. package/cloud-runtime/standalone/.next/server/app/api/skills/available/route/build-manifest.json +11 -0
  144. package/cloud-runtime/standalone/.next/server/app/api/skills/available/route/server-reference-manifest.json +4 -0
  145. package/cloud-runtime/standalone/.next/server/app/api/skills/available/route.js +8 -0
  146. package/cloud-runtime/standalone/.next/server/app/api/skills/available/route.js.map +5 -0
  147. package/cloud-runtime/standalone/.next/server/app/api/skills/available/route.js.nft.json +1 -0
  148. package/cloud-runtime/standalone/.next/server/app/api/skills/available/route_client-reference-manifest.js +2 -0
  149. package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route/app-paths-manifest.json +3 -0
  150. package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route/build-manifest.json +11 -0
  151. package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route/server-reference-manifest.json +4 -0
  152. package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route.js +8 -0
  153. package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route.js.map +5 -0
  154. package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route.js.nft.json +1 -0
  155. package/cloud-runtime/standalone/.next/server/app/api/skills/detail/route_client-reference-manifest.js +2 -0
  156. package/cloud-runtime/standalone/.next/server/app/api/skills/history/route/app-paths-manifest.json +3 -0
  157. package/cloud-runtime/standalone/.next/server/app/api/skills/history/route/build-manifest.json +11 -0
  158. package/cloud-runtime/standalone/.next/server/app/api/skills/history/route/server-reference-manifest.json +4 -0
  159. package/cloud-runtime/standalone/.next/server/app/api/skills/history/route.js +8 -0
  160. package/cloud-runtime/standalone/.next/server/app/api/skills/history/route.js.map +5 -0
  161. package/cloud-runtime/standalone/.next/server/app/api/skills/history/route.js.nft.json +1 -0
  162. package/cloud-runtime/standalone/.next/server/app/api/skills/history/route_client-reference-manifest.js +2 -0
  163. package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route/app-paths-manifest.json +3 -0
  164. package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route/build-manifest.json +11 -0
  165. package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route/server-reference-manifest.json +4 -0
  166. package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route.js +8 -0
  167. package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route.js.map +5 -0
  168. package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route.js.nft.json +1 -0
  169. package/cloud-runtime/standalone/.next/server/app/api/skills/learn/route_client-reference-manifest.js +2 -0
  170. package/cloud-runtime/standalone/.next/server/app/api/skills/route/app-paths-manifest.json +3 -0
  171. package/cloud-runtime/standalone/.next/server/app/api/skills/route/build-manifest.json +11 -0
  172. package/cloud-runtime/standalone/.next/server/app/api/skills/route/server-reference-manifest.json +4 -0
  173. package/cloud-runtime/standalone/.next/server/app/api/skills/route.js +8 -0
  174. package/cloud-runtime/standalone/.next/server/app/api/skills/route.js.map +5 -0
  175. package/cloud-runtime/standalone/.next/server/app/api/skills/route.js.nft.json +1 -0
  176. package/cloud-runtime/standalone/.next/server/app/api/skills/route_client-reference-manifest.js +2 -0
  177. package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route/app-paths-manifest.json +3 -0
  178. package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route/build-manifest.json +11 -0
  179. package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route/server-reference-manifest.json +4 -0
  180. package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route.js +8 -0
  181. package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route.js.map +5 -0
  182. package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route.js.nft.json +1 -0
  183. package/cloud-runtime/standalone/.next/server/app/api/skills/unlearn/route_client-reference-manifest.js +2 -0
  184. package/cloud-runtime/standalone/.next/server/app/api/summarize/route.js +3 -3
  185. package/cloud-runtime/standalone/.next/server/app/api/summarize/route.js.nft.json +1 -1
  186. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js +2 -2
  187. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/comments/[commentId]/route.js.nft.json +1 -1
  188. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/comments/route.js +2 -2
  189. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/comments/route.js.nft.json +1 -1
  190. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/costs/route.js +1 -1
  191. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/costs/route.js.nft.json +1 -1
  192. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/dependencies/route.js +1 -1
  193. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/dependencies/route.js.nft.json +1 -1
  194. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/events/route.js +1 -1
  195. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/events/route.js.nft.json +1 -1
  196. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/history/route.js +1 -1
  197. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/history/route.js.nft.json +1 -1
  198. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/metrics/route.js +1 -1
  199. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/metrics/route.js.nft.json +1 -1
  200. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/replan/route.js +1 -1
  201. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/replan/route.js.nft.json +1 -1
  202. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/restart/route.js +1 -1
  203. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/restart/route.js.nft.json +1 -1
  204. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/resume/route.js +1 -1
  205. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/resume/route.js.nft.json +1 -1
  206. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/rollback/route.js +1 -1
  207. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/rollback/route.js.nft.json +1 -1
  208. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/route.js +1 -1
  209. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/route.js.nft.json +1 -1
  210. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/schedule/route.js +1 -1
  211. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/schedule/route.js.nft.json +1 -1
  212. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/start/route.js +1 -1
  213. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/graph/start/route.js.nft.json +1 -1
  214. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/history/route.js +1 -1
  215. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/history/route.js.nft.json +1 -1
  216. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/logs/route.js +1 -1
  217. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/logs/route.js.nft.json +1 -1
  218. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/complete/route.js +1 -1
  219. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/complete/route.js.nft.json +1 -1
  220. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/fail/route.js +1 -1
  221. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/fail/route.js.nft.json +1 -1
  222. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/resume/route.js +1 -1
  223. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/resume/route.js.nft.json +1 -1
  224. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/start/route.js +1 -1
  225. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/start/route.js.nft.json +1 -1
  226. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/stop/route.js +1 -1
  227. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/stop/route.js.nft.json +1 -1
  228. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js +2 -2
  229. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/nodes/[nodeId]/verify/route.js.nft.json +1 -1
  230. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/route.js +2 -2
  231. package/cloud-runtime/standalone/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  232. package/cloud-runtime/standalone/.next/server/app/api/tasks/assign-orphans/route.js +1 -1
  233. package/cloud-runtime/standalone/.next/server/app/api/tasks/assign-orphans/route.js.nft.json +1 -1
  234. package/cloud-runtime/standalone/.next/server/app/api/tasks/extract/route.js +3 -3
  235. package/cloud-runtime/standalone/.next/server/app/api/tasks/extract/route.js.nft.json +1 -1
  236. package/cloud-runtime/standalone/.next/server/app/api/tasks/route.js +2 -2
  237. package/cloud-runtime/standalone/.next/server/app/api/tasks/route.js.nft.json +1 -1
  238. package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route/app-paths-manifest.json +3 -0
  239. package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route/build-manifest.json +11 -0
  240. package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route/server-reference-manifest.json +4 -0
  241. package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route.js +7 -0
  242. package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route.js.map +5 -0
  243. package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route.js.nft.json +1 -0
  244. package/cloud-runtime/standalone/.next/server/app/api/thread-repos/route_client-reference-manifest.js +2 -0
  245. package/cloud-runtime/standalone/.next/server/app/api/threads/knowledge/route.js +2 -2
  246. package/cloud-runtime/standalone/.next/server/app/api/threads/knowledge/route.js.nft.json +1 -1
  247. package/cloud-runtime/standalone/.next/server/app/api/threads/route.js +2 -2
  248. package/cloud-runtime/standalone/.next/server/app/api/threads/route.js.nft.json +1 -1
  249. package/cloud-runtime/standalone/.next/server/app/api/user-settings/route.js +1 -1
  250. package/cloud-runtime/standalone/.next/server/app/api/user-settings/route.js.nft.json +1 -1
  251. package/cloud-runtime/standalone/.next/server/app/automations/page/build-manifest.json +4 -4
  252. package/cloud-runtime/standalone/.next/server/app/automations/page/react-loadable-manifest.json +8 -1
  253. package/cloud-runtime/standalone/.next/server/app/automations/page.js.nft.json +1 -1
  254. package/cloud-runtime/standalone/.next/server/app/automations/page_client-reference-manifest.js +1 -1
  255. package/cloud-runtime/standalone/.next/server/app/automations.html +2 -2
  256. package/cloud-runtime/standalone/.next/server/app/automations.rsc +4 -4
  257. package/cloud-runtime/standalone/.next/server/app/automations.segments/_full.segment.rsc +4 -4
  258. package/cloud-runtime/standalone/.next/server/app/automations.segments/_head.segment.rsc +1 -1
  259. package/cloud-runtime/standalone/.next/server/app/automations.segments/_index.segment.rsc +2 -2
  260. package/cloud-runtime/standalone/.next/server/app/automations.segments/_tree.segment.rsc +3 -3
  261. package/cloud-runtime/standalone/.next/server/app/automations.segments/automations/__PAGE__.segment.rsc +3 -3
  262. package/cloud-runtime/standalone/.next/server/app/automations.segments/automations.segment.rsc +1 -1
  263. package/cloud-runtime/standalone/.next/server/app/board/page/build-manifest.json +4 -4
  264. package/cloud-runtime/standalone/.next/server/app/board/page.js.nft.json +1 -1
  265. package/cloud-runtime/standalone/.next/server/app/board/page_client-reference-manifest.js +1 -1
  266. package/cloud-runtime/standalone/.next/server/app/board.html +2 -2
  267. package/cloud-runtime/standalone/.next/server/app/board.rsc +2 -2
  268. package/cloud-runtime/standalone/.next/server/app/board.segments/_full.segment.rsc +2 -2
  269. package/cloud-runtime/standalone/.next/server/app/board.segments/_head.segment.rsc +1 -1
  270. package/cloud-runtime/standalone/.next/server/app/board.segments/_index.segment.rsc +2 -2
  271. package/cloud-runtime/standalone/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  272. package/cloud-runtime/standalone/.next/server/app/board.segments/board/__PAGE__.segment.rsc +1 -1
  273. package/cloud-runtime/standalone/.next/server/app/board.segments/board.segment.rsc +1 -1
  274. package/cloud-runtime/standalone/.next/server/app/execution-graph/page/build-manifest.json +4 -4
  275. package/cloud-runtime/standalone/.next/server/app/execution-graph/page.js.nft.json +1 -1
  276. package/cloud-runtime/standalone/.next/server/app/execution-graph/page_client-reference-manifest.js +1 -1
  277. package/cloud-runtime/standalone/.next/server/app/execution-graph.html +2 -2
  278. package/cloud-runtime/standalone/.next/server/app/execution-graph.rsc +3 -3
  279. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_full.segment.rsc +3 -3
  280. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_head.segment.rsc +1 -1
  281. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_index.segment.rsc +2 -2
  282. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_tree.segment.rsc +2 -2
  283. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/execution-graph/__PAGE__.segment.rsc +2 -2
  284. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/execution-graph.segment.rsc +1 -1
  285. package/cloud-runtime/standalone/.next/server/app/index.html +2 -2
  286. package/cloud-runtime/standalone/.next/server/app/index.rsc +5 -5
  287. package/cloud-runtime/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  288. package/cloud-runtime/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  289. package/cloud-runtime/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  290. package/cloud-runtime/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  291. package/cloud-runtime/standalone/.next/server/app/index.segments/_tree.segment.rsc +4 -4
  292. package/cloud-runtime/standalone/.next/server/app/page/build-manifest.json +4 -4
  293. package/cloud-runtime/standalone/.next/server/app/page.js.nft.json +1 -1
  294. package/cloud-runtime/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  295. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/app-paths-manifest.json +3 -0
  296. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/build-manifest.json +18 -0
  297. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/next-font-manifest.json +11 -0
  298. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/react-loadable-manifest.json +8 -0
  299. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page/server-reference-manifest.json +4 -0
  300. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page.js +16 -0
  301. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page.js.map +5 -0
  302. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page.js.nft.json +1 -0
  303. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +2 -0
  304. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page/build-manifest.json +4 -4
  305. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
  306. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
  307. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/knowledge/page/build-manifest.json +4 -4
  308. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/knowledge/page.js.nft.json +1 -1
  309. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/knowledge/page_client-reference-manifest.js +1 -1
  310. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page/build-manifest.json +4 -4
  311. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  312. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  313. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/thread/[threadId]/page/build-manifest.json +4 -4
  314. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/thread/[threadId]/page.js.nft.json +1 -1
  315. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
  316. package/cloud-runtime/standalone/.next/server/app/projects/orphans/page/build-manifest.json +4 -4
  317. package/cloud-runtime/standalone/.next/server/app/projects/orphans/page.js.nft.json +1 -1
  318. package/cloud-runtime/standalone/.next/server/app/projects/orphans/page_client-reference-manifest.js +1 -1
  319. package/cloud-runtime/standalone/.next/server/app/projects/orphans.html +2 -2
  320. package/cloud-runtime/standalone/.next/server/app/projects/orphans.rsc +3 -3
  321. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_full.segment.rsc +3 -3
  322. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_head.segment.rsc +1 -1
  323. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_index.segment.rsc +2 -2
  324. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_tree.segment.rsc +2 -2
  325. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects/orphans/__PAGE__.segment.rsc +2 -2
  326. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects/orphans.segment.rsc +1 -1
  327. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects.segment.rsc +1 -1
  328. package/cloud-runtime/standalone/.next/server/app/projects/page/build-manifest.json +4 -4
  329. package/cloud-runtime/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  330. package/cloud-runtime/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  331. package/cloud-runtime/standalone/.next/server/app/projects.html +2 -2
  332. package/cloud-runtime/standalone/.next/server/app/projects.rsc +3 -3
  333. package/cloud-runtime/standalone/.next/server/app/projects.segments/_full.segment.rsc +3 -3
  334. package/cloud-runtime/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  335. package/cloud-runtime/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  336. package/cloud-runtime/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  337. package/cloud-runtime/standalone/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
  338. package/cloud-runtime/standalone/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  339. package/cloud-runtime/standalone/.next/server/app/settings/page/build-manifest.json +4 -4
  340. package/cloud-runtime/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  341. package/cloud-runtime/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  342. package/cloud-runtime/standalone/.next/server/app/settings.html +2 -2
  343. package/cloud-runtime/standalone/.next/server/app/settings.rsc +3 -3
  344. package/cloud-runtime/standalone/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  345. package/cloud-runtime/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  346. package/cloud-runtime/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  347. package/cloud-runtime/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  348. package/cloud-runtime/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  349. package/cloud-runtime/standalone/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  350. package/cloud-runtime/standalone/.next/server/app/skills/page/app-paths-manifest.json +3 -0
  351. package/cloud-runtime/standalone/.next/server/app/skills/page/build-manifest.json +18 -0
  352. package/cloud-runtime/standalone/.next/server/app/skills/page/next-font-manifest.json +11 -0
  353. package/cloud-runtime/standalone/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
  354. package/cloud-runtime/standalone/.next/server/app/skills/page/server-reference-manifest.json +4 -0
  355. package/cloud-runtime/standalone/.next/server/app/skills/page.js +15 -0
  356. package/cloud-runtime/standalone/.next/server/app/skills/page.js.map +5 -0
  357. package/cloud-runtime/standalone/.next/server/app/skills/page.js.nft.json +1 -0
  358. package/cloud-runtime/standalone/.next/server/app/skills/page_client-reference-manifest.js +2 -0
  359. package/cloud-runtime/standalone/.next/server/app/skills.html +21 -0
  360. package/cloud-runtime/standalone/.next/server/app/skills.meta +15 -0
  361. package/cloud-runtime/standalone/.next/server/app/skills.rsc +23 -0
  362. package/cloud-runtime/standalone/.next/server/app/skills.segments/_full.segment.rsc +23 -0
  363. package/cloud-runtime/standalone/.next/server/app/skills.segments/_head.segment.rsc +5 -0
  364. package/cloud-runtime/standalone/.next/server/app/skills.segments/_index.segment.rsc +9 -0
  365. package/cloud-runtime/standalone/.next/server/app/skills.segments/_tree.segment.rsc +5 -0
  366. package/cloud-runtime/standalone/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +9 -0
  367. package/cloud-runtime/standalone/.next/server/app/skills.segments/skills.segment.rsc +4 -0
  368. package/cloud-runtime/standalone/.next/server/app/status/page/build-manifest.json +4 -4
  369. package/cloud-runtime/standalone/.next/server/app/status/page.js.nft.json +1 -1
  370. package/cloud-runtime/standalone/.next/server/app/status/page_client-reference-manifest.js +1 -1
  371. package/cloud-runtime/standalone/.next/server/app/status.html +2 -2
  372. package/cloud-runtime/standalone/.next/server/app/status.rsc +3 -3
  373. package/cloud-runtime/standalone/.next/server/app/status.segments/_full.segment.rsc +3 -3
  374. package/cloud-runtime/standalone/.next/server/app/status.segments/_head.segment.rsc +1 -1
  375. package/cloud-runtime/standalone/.next/server/app/status.segments/_index.segment.rsc +2 -2
  376. package/cloud-runtime/standalone/.next/server/app/status.segments/_tree.segment.rsc +2 -2
  377. package/cloud-runtime/standalone/.next/server/app/status.segments/status/__PAGE__.segment.rsc +2 -2
  378. package/cloud-runtime/standalone/.next/server/app/status.segments/status.segment.rsc +1 -1
  379. package/cloud-runtime/standalone/.next/server/app/thread/[id]/page/build-manifest.json +4 -4
  380. package/cloud-runtime/standalone/.next/server/app/thread/[id]/page.js.nft.json +1 -1
  381. package/cloud-runtime/standalone/.next/server/app/thread/[id]/page_client-reference-manifest.js +1 -1
  382. package/cloud-runtime/standalone/.next/server/app/welcome/page/build-manifest.json +4 -4
  383. package/cloud-runtime/standalone/.next/server/app/welcome/page.js.nft.json +1 -1
  384. package/cloud-runtime/standalone/.next/server/app/welcome/page_client-reference-manifest.js +1 -1
  385. package/cloud-runtime/standalone/.next/server/app/welcome.html +2 -2
  386. package/cloud-runtime/standalone/.next/server/app/welcome.rsc +3 -3
  387. package/cloud-runtime/standalone/.next/server/app/welcome.segments/_full.segment.rsc +3 -3
  388. package/cloud-runtime/standalone/.next/server/app/welcome.segments/_head.segment.rsc +1 -1
  389. package/cloud-runtime/standalone/.next/server/app/welcome.segments/_index.segment.rsc +2 -2
  390. package/cloud-runtime/standalone/.next/server/app/welcome.segments/_tree.segment.rsc +2 -2
  391. package/cloud-runtime/standalone/.next/server/app/welcome.segments/welcome/__PAGE__.segment.rsc +2 -2
  392. package/cloud-runtime/standalone/.next/server/app/welcome.segments/welcome.segment.rsc +1 -1
  393. package/cloud-runtime/standalone/.next/server/app-paths-manifest.json +17 -0
  394. package/cloud-runtime/standalone/.next/server/chunks/[externals]__cf9f18a6._.js +3 -0
  395. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__875279cb._.js → [root-of-the-server]__005b3c82._.js} +2 -2
  396. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__4837d72a._.js → [root-of-the-server]__056d94e4._.js} +2 -2
  397. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__068b4f08._.js +15 -0
  398. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__b3ed0a00._.js → [root-of-the-server]__0bb52353._.js} +2 -2
  399. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__0f580808._.js +13 -0
  400. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__6c26221d._.js → [root-of-the-server]__1a8e0957._.js} +2 -2
  401. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__6acb940d._.js → [root-of-the-server]__23ad03bf._.js} +2 -2
  402. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__7ffcc20c._.js → [root-of-the-server]__2948f712._.js} +2 -2
  403. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__18423486._.js → [root-of-the-server]__32ef6623._.js} +2 -2
  404. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__1c18c0d1._.js → [root-of-the-server]__34cb1b98._.js} +2 -2
  405. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__4d865017._.js +48 -0
  406. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__5031f8d4._.js +30 -0
  407. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__5a348fba._.js → [root-of-the-server]__596d0e81._.js} +2 -2
  408. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__64712846._.js +3 -0
  409. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__707c32af._.js +15 -0
  410. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__7370bb86._.js +8 -0
  411. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__749af50f._.js +8 -0
  412. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__ffffceac._.js → [root-of-the-server]__75cedecf._.js} +2 -2
  413. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__19520d85._.js → [root-of-the-server]__7ee9b7b6._.js} +2 -2
  414. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__4d8c6e3d._.js → [root-of-the-server]__8ac0286e._.js} +3 -3
  415. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__927cfc20._.js +3 -0
  416. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__96ae701e._.js +3 -0
  417. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__b63cb741._.js → [root-of-the-server]__981d92dd._.js} +3 -3
  418. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__98b352f7._.js +13 -0
  419. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__a44db634._.js +8 -0
  420. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__a55c16a5._.js +158 -0
  421. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__ab2bf82d._.js +13 -0
  422. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__32b13ba9._.js → [root-of-the-server]__b4931ee1._.js} +2 -2
  423. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__e122cae2._.js → [root-of-the-server]__b500f1bf._.js} +2 -2
  424. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__c480c9c2._.js → [root-of-the-server]__b707e701._.js} +2 -2
  425. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__bf5803eb._.js +13 -0
  426. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__ccd4846e._.js +13 -0
  427. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__d4126e05._.js +15 -0
  428. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__d908c9ea._.js +8 -0
  429. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__b9b3fde6._.js → [root-of-the-server]__dcdeee3d._.js} +2 -2
  430. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__e3a4fd97._.js +13 -0
  431. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__e4a87984._.js +15 -0
  432. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__ee6511a0._.js +44 -0
  433. package/cloud-runtime/standalone/.next/server/chunks/_d225c04f._.js +1 -1
  434. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_filesystem_pick-folder_route_actions_162664ff.js +3 -0
  435. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_[id]_cancel_route_actions_fbd5be89.js +3 -0
  436. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_[id]_route_actions_774a2e21.js +3 -0
  437. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_[id]_runs_route_actions_6e59ee83.js +3 -0
  438. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_agents_route_actions_399e1f19.js +3 -0
  439. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_poll_route_actions_23fbbfa1.js +3 -0
  440. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_prompt-jobs_route_actions_acf03860.js +3 -0
  441. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_assign_route_actions_15267be8.js +3 -0
  442. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_available_route_actions_24023111.js +3 -0
  443. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_detail_route_actions_1148baef.js +3 -0
  444. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_history_route_actions_5e5c4757.js +3 -0
  445. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_learn_route_actions_d3a37d25.js +3 -0
  446. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_route_actions_780e175f.js +3 -0
  447. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_skills_unlearn_route_actions_3dfee433.js +3 -0
  448. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_thread-repos_route_actions_e95d24ee.js +3 -0
  449. package/cloud-runtime/standalone/.next/server/chunks/{lib_7cad5c77._.js → lib_a5adca60._.js} +25 -25
  450. package/cloud-runtime/standalone/.next/server/chunks/lib_db_ts_e06c6085._.js +1 -1
  451. package/cloud-runtime/standalone/.next/server/chunks/lib_ea45fe73._.js +1 -1
  452. package/cloud-runtime/standalone/.next/server/chunks/lib_history-store_ts_2e721df2._.js +28 -23
  453. package/cloud-runtime/standalone/.next/server/chunks/lib_history-store_ts_74d1c060._.js +28 -23
  454. package/cloud-runtime/standalone/.next/server/chunks/lib_sqlite-query-adapter_ts_3ea4d849._.js +38 -11
  455. package/cloud-runtime/standalone/.next/server/chunks/lib_sqlite-query-adapter_ts_b0b1a9b2._.js +43 -16
  456. package/cloud-runtime/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_371d0bff.js +19 -19
  457. package/cloud-runtime/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_def8bfbe.js +10 -0
  458. package/cloud-runtime/standalone/.next/server/chunks/src_graph_executor_ts_55c06268._.js +4 -3
  459. package/cloud-runtime/standalone/.next/server/chunks/src_graph_executor_ts_a8bc8d58._.js +4 -3
  460. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__096c39a3._.js +3 -0
  461. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__226f8a19._.js +1 -1
  462. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__47caef59._.js +1 -1
  463. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__67d5f883._.js +3 -0
  464. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__8b4e7816._.js +3 -0
  465. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__8fe8b9dd._.js +3 -0
  466. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__a37fb1c3._.js +3 -0
  467. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__a456581d._.js +3 -0
  468. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__d74022f1._.js +3 -0
  469. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__fcbe03e6._.js → [root-of-the-server]__e0c64529._.js} +2 -2
  470. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__ea035cd9._.js +3 -0
  471. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__ffbc2e98._.js +2 -2
  472. package/cloud-runtime/standalone/.next/server/chunks/ssr/_05c8a494._.js +3 -0
  473. package/cloud-runtime/standalone/.next/server/chunks/ssr/_0c5c111f._.js +3 -0
  474. package/cloud-runtime/standalone/.next/server/chunks/ssr/_0ffd2660._.js +1 -1
  475. package/cloud-runtime/standalone/.next/server/chunks/ssr/_23656a95._.js +3 -0
  476. package/cloud-runtime/standalone/.next/server/chunks/ssr/_23f5fddc._.js +3 -0
  477. package/cloud-runtime/standalone/.next/server/chunks/ssr/_24feb541._.js +4 -0
  478. package/cloud-runtime/standalone/.next/server/chunks/ssr/_27a789b3._.js +3 -0
  479. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_508cd32f._.js → _314f4c49._.js} +2 -2
  480. package/cloud-runtime/standalone/.next/server/chunks/ssr/_36b413cc._.js +3 -0
  481. package/cloud-runtime/standalone/.next/server/chunks/ssr/_43472af3._.js +3 -0
  482. package/cloud-runtime/standalone/.next/server/chunks/ssr/_46e00a9b._.js +95 -0
  483. package/cloud-runtime/standalone/.next/server/chunks/ssr/_478f4991._.js +3 -0
  484. package/cloud-runtime/standalone/.next/server/chunks/ssr/_4bfdfb14._.js +3 -0
  485. package/cloud-runtime/standalone/.next/server/chunks/ssr/_52fe115d._.js +3 -0
  486. package/cloud-runtime/standalone/.next/server/chunks/ssr/_547b6462._.js +4 -0
  487. package/cloud-runtime/standalone/.next/server/chunks/ssr/_547f19ec._.js +3 -0
  488. package/cloud-runtime/standalone/.next/server/chunks/ssr/_85ca101b._.js +2 -2
  489. package/cloud-runtime/standalone/.next/server/chunks/ssr/_93914ecd._.js +1 -1
  490. package/cloud-runtime/standalone/.next/server/chunks/ssr/_9e07dcac._.js +95 -0
  491. package/cloud-runtime/standalone/.next/server/chunks/ssr/_a1b966f7._.js +3 -0
  492. package/cloud-runtime/standalone/.next/server/chunks/ssr/_a68d8f62._.js +3 -0
  493. package/cloud-runtime/standalone/.next/server/chunks/ssr/_a80e12c8._.js +3 -0
  494. package/cloud-runtime/standalone/.next/server/chunks/ssr/_b1e1ef71._.js +95 -0
  495. package/cloud-runtime/standalone/.next/server/chunks/ssr/_e1349560._.js +3 -0
  496. package/cloud-runtime/standalone/.next/server/chunks/ssr/_next-internal_server_app_projects_[slug]_automations_page_actions_9371bc66.js +3 -0
  497. package/cloud-runtime/standalone/.next/server/chunks/ssr/_next-internal_server_app_skills_page_actions_4ac82b1e.js +3 -0
  498. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_agents_[id]_page_tsx_9c49d8c8._.js +1 -1
  499. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_agents_page_tsx_f5f08ed8._.js +1 -1
  500. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_execution-graph_page_tsx_f854185a._.js +2 -2
  501. package/cloud-runtime/standalone/.next/server/chunks/ssr/components_chat-ui_bfeda794._.js +4 -5
  502. package/cloud-runtime/standalone/.next/server/chunks/ssr/components_thread_WorkspaceSidebar_tsx_e660301b._.js +1 -1
  503. package/cloud-runtime/standalone/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_e70f9321._.js → node_modules_lucide-react_dist_esm_b82e03da._.js} +2 -2
  504. package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_next_dist_61a87db9._.js +3 -0
  505. package/cloud-runtime/standalone/.next/server/chunks/ssr/{node_modules_next_920e7746._.js → node_modules_next_f2865b38._.js} +2 -2
  506. package/cloud-runtime/standalone/.next/server/functions-config-manifest.json +14 -0
  507. package/cloud-runtime/standalone/.next/server/middleware-build-manifest.js +4 -4
  508. package/cloud-runtime/standalone/.next/server/middleware-manifest.json +5 -5
  509. package/cloud-runtime/standalone/.next/server/next-font-manifest.js +1 -1
  510. package/cloud-runtime/standalone/.next/server/next-font-manifest.json +8 -0
  511. package/cloud-runtime/standalone/.next/server/pages/404.html +2 -2
  512. package/cloud-runtime/standalone/.next/server/pages/500.html +2 -2
  513. package/cloud-runtime/standalone/.next/server/server-reference-manifest.js +1 -1
  514. package/cloud-runtime/standalone/.next/server/server-reference-manifest.json +1 -1
  515. package/cloud-runtime/standalone/.next/static/chunks/01428247f94115a6.js +1 -0
  516. package/cloud-runtime/standalone/.next/static/chunks/06cf0ed16bf8aa70.js +28 -0
  517. package/cloud-runtime/standalone/.next/static/chunks/19dd745b663fdffa.js +1 -0
  518. package/cloud-runtime/standalone/.next/static/chunks/1a3298f21d1040e9.js +4 -0
  519. package/cloud-runtime/standalone/.next/static/chunks/1c8583feefee0765.js +1 -0
  520. package/cloud-runtime/standalone/.next/static/chunks/1e3dede69b464364.js +1 -0
  521. package/cloud-runtime/standalone/.next/static/chunks/238a28856e739dc9.js +2 -0
  522. package/cloud-runtime/standalone/.next/static/chunks/24772e179852c73e.js +1 -0
  523. package/cloud-runtime/standalone/.next/static/chunks/2d1d138d8ea3234c.css +1 -0
  524. package/cloud-runtime/standalone/.next/static/chunks/2e011469003993e9.js +28 -0
  525. package/cloud-runtime/standalone/.next/static/chunks/31a4164e40ca71e5.js +6 -0
  526. package/cloud-runtime/standalone/.next/static/chunks/3c202e89da05d9b9.js +1 -0
  527. package/cloud-runtime/standalone/.next/static/chunks/3c72becf6dff5597.js +1 -0
  528. package/cloud-runtime/standalone/.next/static/chunks/44dafb5e85578e12.js +16 -0
  529. package/cloud-runtime/standalone/.next/static/chunks/47f22a56011af8d3.js +1 -0
  530. package/cloud-runtime/standalone/.next/static/chunks/48e332ac3e9ed56c.js +1 -0
  531. package/cloud-runtime/standalone/.next/static/chunks/5b567b289ca2273e.css +1 -0
  532. package/cloud-runtime/standalone/.next/static/chunks/5d52c79d9812d06e.js +1 -0
  533. package/cloud-runtime/standalone/.next/static/chunks/617db51b7444f818.js +1 -0
  534. package/cloud-runtime/standalone/.next/static/chunks/673bb6094cea9ded.js +1 -0
  535. package/cloud-runtime/standalone/.next/static/chunks/787436fad75f5bc6.js +5 -0
  536. package/cloud-runtime/standalone/.next/static/chunks/8304e8487aa74059.css +2 -0
  537. package/cloud-runtime/standalone/.next/static/chunks/8a4684388ca0f6de.js +7 -0
  538. package/cloud-runtime/standalone/.next/static/chunks/9f236cc9572783b9.js +93 -0
  539. package/cloud-runtime/standalone/.next/static/chunks/a9aaec85125f69b1.js +1 -0
  540. package/cloud-runtime/standalone/.next/static/chunks/b4c29a62f9255268.js +1 -0
  541. package/cloud-runtime/standalone/.next/static/chunks/bf2bb1662353aff5.js +1 -0
  542. package/cloud-runtime/standalone/.next/static/chunks/c1fb885eed94aa8c.js +1 -0
  543. package/cloud-runtime/standalone/.next/static/chunks/c653186036e56204.js +1 -0
  544. package/cloud-runtime/standalone/.next/static/chunks/cb5581d868e78205.js +1 -0
  545. package/cloud-runtime/standalone/.next/static/chunks/cbdeb17a36b99000.js +1 -0
  546. package/cloud-runtime/standalone/.next/static/chunks/d5cc62984dc4205c.js +1 -0
  547. package/cloud-runtime/standalone/.next/static/chunks/d73f1cc3ebc9993b.js +1 -0
  548. package/cloud-runtime/standalone/.next/static/chunks/{8d15ced2dc70090a.js → da2b00558cf32f37.js} +1 -1
  549. package/cloud-runtime/standalone/.next/static/chunks/{turbopack-97e846241a3a64af.js → turbopack-22475f0dd0c18f92.js} +1 -1
  550. package/cloud-runtime/standalone/app/agents/[id]/page.tsx +4 -1
  551. package/cloud-runtime/standalone/app/agents/page.tsx +22 -2
  552. package/cloud-runtime/standalone/app/api/agent-specs/route.ts +4 -0
  553. package/cloud-runtime/standalone/app/api/agents/export/route.ts +4 -0
  554. package/cloud-runtime/standalone/app/api/chat/route.ts +8 -2
  555. package/cloud-runtime/standalone/app/api/filesystem/pick-folder/route.ts +56 -0
  556. package/cloud-runtime/standalone/app/api/participants/route.ts +50 -1
  557. package/cloud-runtime/standalone/app/api/prompt-jobs/[id]/cancel/route.ts +44 -0
  558. package/cloud-runtime/standalone/app/api/prompt-jobs/[id]/route.ts +94 -0
  559. package/cloud-runtime/standalone/app/api/prompt-jobs/[id]/runs/route.ts +30 -0
  560. package/cloud-runtime/standalone/app/api/prompt-jobs/agents/route.ts +25 -0
  561. package/cloud-runtime/standalone/app/api/prompt-jobs/poll/route.ts +232 -0
  562. package/cloud-runtime/standalone/app/api/prompt-jobs/route.ts +125 -0
  563. package/cloud-runtime/standalone/app/api/skills/assign/route.ts +30 -0
  564. package/cloud-runtime/standalone/app/api/skills/available/route.ts +20 -0
  565. package/cloud-runtime/standalone/app/api/skills/detail/route.ts +23 -0
  566. package/cloud-runtime/standalone/app/api/skills/history/route.ts +18 -0
  567. package/cloud-runtime/standalone/app/api/skills/learn/route.ts +31 -0
  568. package/cloud-runtime/standalone/app/api/skills/route.ts +19 -0
  569. package/cloud-runtime/standalone/app/api/skills/unlearn/route.ts +30 -0
  570. package/cloud-runtime/standalone/app/api/thread-repos/route.ts +30 -0
  571. package/cloud-runtime/standalone/app/automations/page.tsx +15 -3
  572. package/cloud-runtime/standalone/app/execution-graph/page.tsx +2 -2
  573. package/cloud-runtime/standalone/app/globals.css +2 -0
  574. package/cloud-runtime/standalone/app/layout.tsx +1 -1
  575. package/cloud-runtime/standalone/app/projects/[slug]/automations/page.tsx +17 -0
  576. package/cloud-runtime/standalone/app/projects/[slug]/layout.tsx +3 -2
  577. package/cloud-runtime/standalone/app/projects/[slug]/page.tsx +401 -86
  578. package/cloud-runtime/standalone/app/projects/orphans/page.tsx +1 -0
  579. package/cloud-runtime/standalone/app/projects/page.tsx +3 -3
  580. package/cloud-runtime/standalone/app/skills/page.tsx +399 -0
  581. package/cloud-runtime/standalone/components/FloatingPanel.tsx +200 -0
  582. package/cloud-runtime/standalone/components/Layout.tsx +7 -1
  583. package/cloud-runtime/standalone/components/NowRunningPanel.tsx +86 -76
  584. package/cloud-runtime/standalone/components/ProjectModal.tsx +29 -12
  585. package/cloud-runtime/standalone/components/PromptJobBoard.tsx +1434 -0
  586. package/cloud-runtime/standalone/components/chat-ui/ChatContainer.tsx +86 -17
  587. package/cloud-runtime/standalone/components/chat-ui/Composer.tsx +215 -19
  588. package/cloud-runtime/standalone/components/chat-ui/ParticipantBar.tsx +233 -213
  589. package/cloud-runtime/standalone/components/thread/WorkspaceSidebar.tsx +99 -41
  590. package/cloud-runtime/standalone/db/sqlite/001_agx_board_schema.sql +28 -0
  591. package/cloud-runtime/standalone/db/sqlite/002_prompt_scheduler_schema.sql +45 -0
  592. package/cloud-runtime/standalone/db/sqlite/003_prompt_scheduler_v2.sql +13 -0
  593. package/cloud-runtime/standalone/hooks/useAttachments.ts +2 -1
  594. package/cloud-runtime/standalone/hooks/useGroupChat.ts +4 -1
  595. package/cloud-runtime/standalone/hooks/usePromptJobs.ts +111 -0
  596. package/cloud-runtime/standalone/lib/agent-participants.ts +7 -0
  597. package/cloud-runtime/standalone/lib/agent-skill-bindings.ts +118 -0
  598. package/cloud-runtime/standalone/lib/chat/paste-attachments.ts +152 -0
  599. package/cloud-runtime/standalone/lib/db.ts +5 -0
  600. package/cloud-runtime/standalone/lib/history-store.ts +38 -0
  601. package/cloud-runtime/standalone/lib/skills-library.ts +450 -0
  602. package/cloud-runtime/standalone/lib/sqlite-query-adapter.ts +32 -0
  603. package/cloud-runtime/standalone/lib/stream-multiplexer.ts +59 -11
  604. package/cloud-runtime/standalone/lib/types.ts +10 -0
  605. package/cloud-runtime/standalone/migrations/sqlite_schema.sql +28 -0
  606. package/cloud-runtime/standalone/src/graph/llm-review.ts +19 -2
  607. package/cloud-runtime/standalone/src/prompt-scheduler/cron.ts +46 -0
  608. package/cloud-runtime/standalone/src/prompt-scheduler/engine.ts +87 -0
  609. package/cloud-runtime/standalone/src/prompt-scheduler/get-store.ts +36 -0
  610. package/cloud-runtime/standalone/src/prompt-scheduler/runner.ts +144 -0
  611. package/cloud-runtime/standalone/src/prompt-scheduler/store.ts +327 -0
  612. package/cloud-runtime/standalone/src/prompt-scheduler/types.ts +82 -0
  613. package/cloud-runtime/standalone/state/floatingPanels.ts +47 -0
  614. package/cloud-runtime/standalone/styles/composer-pills.css +156 -2
  615. package/cloud-runtime/standalone/styles/workspaceSidebar.css +5 -3
  616. package/cloud-runtime/standalone/test/adapters/sqlite.ts +1 -0
  617. package/cloud-runtime/standalone/update_officeapp.js +36 -0
  618. package/cloud-runtime/standalone/update_store.js +47 -0
  619. package/cloud-runtime/standalone/worker/index.js +293 -45
  620. package/lib/cli/onboarding.js +3 -3
  621. package/lib/storage/db.js +12 -8
  622. package/package.json +5 -2
  623. package/scripts/postinstall.js +0 -68
  624. package/cloud-runtime/standalone/.next/server/chunks/[externals]__1f4b15dd._.js +0 -3
  625. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__4c8624cc._.js +0 -3
  626. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__666f8712._.js +0 -3
  627. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__a189593a._.js +0 -3
  628. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__d6e1ee6e._.js +0 -32
  629. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__f1b7932f._.js +0 -36
  630. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__f701b208._.js +0 -146
  631. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__04d1aa70._.js +0 -3
  632. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__2d80540b._.js +0 -3
  633. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__8973b16a._.js +0 -3
  634. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__a416df95._.js +0 -3
  635. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__c108f06c._.js +0 -3
  636. package/cloud-runtime/standalone/.next/server/chunks/ssr/_0061ebd8._.js +0 -3
  637. package/cloud-runtime/standalone/.next/server/chunks/ssr/_064370bc._.js +0 -3
  638. package/cloud-runtime/standalone/.next/server/chunks/ssr/_41f60c52._.js +0 -3
  639. package/cloud-runtime/standalone/.next/server/chunks/ssr/_54af99c5._.js +0 -3
  640. package/cloud-runtime/standalone/.next/server/chunks/ssr/_6b14826d._.js +0 -3
  641. package/cloud-runtime/standalone/.next/server/chunks/ssr/_84879a01._.js +0 -95
  642. package/cloud-runtime/standalone/.next/server/chunks/ssr/_9eeb2fa0._.js +0 -95
  643. package/cloud-runtime/standalone/.next/server/chunks/ssr/_a0cc0fe7._.js +0 -3
  644. package/cloud-runtime/standalone/.next/server/chunks/ssr/_a1d30b20._.js +0 -95
  645. package/cloud-runtime/standalone/.next/server/chunks/ssr/_c87c359c._.js +0 -95
  646. package/cloud-runtime/standalone/.next/server/chunks/ssr/_ccb409c5._.js +0 -3
  647. package/cloud-runtime/standalone/.next/server/chunks/ssr/_cd5e154b._.js +0 -3
  648. package/cloud-runtime/standalone/.next/server/chunks/ssr/_dd31b6e0._.js +0 -3
  649. package/cloud-runtime/standalone/.next/server/chunks/ssr/_f0ce6183._.js +0 -3
  650. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_automations_page_tsx_3d732184._.js +0 -3
  651. package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_bf855424._.js +0 -3
  652. package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_next_dist_852965c2._.js +0 -3
  653. package/cloud-runtime/standalone/.next/static/chunks/010aff7b601302de.js +0 -16
  654. package/cloud-runtime/standalone/.next/static/chunks/012e3e9699415997.js +0 -1
  655. package/cloud-runtime/standalone/.next/static/chunks/031d99fbe758545a.js +0 -1
  656. package/cloud-runtime/standalone/.next/static/chunks/09f9eeea393db0fd.js +0 -4
  657. package/cloud-runtime/standalone/.next/static/chunks/0c467f54bc78a380.js +0 -1
  658. package/cloud-runtime/standalone/.next/static/chunks/10b0642440302e99.css +0 -2
  659. package/cloud-runtime/standalone/.next/static/chunks/116985039c24f1f8.js +0 -93
  660. package/cloud-runtime/standalone/.next/static/chunks/2ee8d24314eec47c.js +0 -1
  661. package/cloud-runtime/standalone/.next/static/chunks/3e4e8857f875c964.js +0 -1
  662. package/cloud-runtime/standalone/.next/static/chunks/43f6157bc3db9c52.js +0 -6
  663. package/cloud-runtime/standalone/.next/static/chunks/486bf7ff282b91a6.js +0 -5
  664. package/cloud-runtime/standalone/.next/static/chunks/56a01238098d495d.js +0 -93
  665. package/cloud-runtime/standalone/.next/static/chunks/601996727991149e.js +0 -93
  666. package/cloud-runtime/standalone/.next/static/chunks/651c7c97d3bd77e0.js +0 -28
  667. package/cloud-runtime/standalone/.next/static/chunks/7d4c1d97169c8522.js +0 -1
  668. package/cloud-runtime/standalone/.next/static/chunks/851b1d97179bd39b.css +0 -1
  669. package/cloud-runtime/standalone/.next/static/chunks/9048e44ed538b21a.js +0 -2
  670. package/cloud-runtime/standalone/.next/static/chunks/90b581e9631d8cea.js +0 -1
  671. package/cloud-runtime/standalone/.next/static/chunks/99174504a201d23e.js +0 -28
  672. package/cloud-runtime/standalone/.next/static/chunks/a8e8ef440c4daa5a.css +0 -1
  673. package/cloud-runtime/standalone/.next/static/chunks/b22947e6df238fd5.js +0 -1
  674. package/cloud-runtime/standalone/.next/static/chunks/b2dcd19ebe3af3f6.js +0 -93
  675. package/cloud-runtime/standalone/.next/static/chunks/bc06988336ffd261.js +0 -1
  676. package/cloud-runtime/standalone/.next/static/chunks/c93b9643c81c134e.js +0 -8
  677. package/cloud-runtime/standalone/.next/static/chunks/d5d6be8239e57c56.js +0 -1
  678. package/cloud-runtime/standalone/.next/static/chunks/ebaf4e8f04bae7b6.js +0 -1
  679. package/cloud-runtime/standalone/.next/static/chunks/f4909e7ae8229b1c.js +0 -1
  680. package/cloud-runtime/standalone/.next/static/chunks/fd221a50082e5128.js +0 -1
  681. package/cloud-runtime/standalone/agx-board.json +0 -264
  682. package/cloud-runtime/standalone/agx-cli.json +0 -2195
  683. package/cloud-runtime/standalone/fix-primary.js +0 -30
  684. package/cloud-runtime/standalone/fix-theme.js +0 -78
  685. package/cloud-runtime/standalone/test-file +0 -0
  686. package/cloud-runtime/standalone/testfile +0 -0
  687. package/cloud-runtime/standalone/transcri +0 -0
  688. /package/cloud-runtime/standalone/.next/static/{68nLQxEpwR_feFvB8T4tR → 15nzSRnot8KsYYP8yMBe-}/_buildManifest.js +0 -0
  689. /package/cloud-runtime/standalone/.next/static/{68nLQxEpwR_feFvB8T4tR → 15nzSRnot8KsYYP8yMBe-}/_clientMiddlewareManifest.json +0 -0
  690. /package/cloud-runtime/standalone/.next/static/{68nLQxEpwR_feFvB8T4tR → 15nzSRnot8KsYYP8yMBe-}/_ssgManifest.js +0 -0
@@ -0,0 +1,1434 @@
1
+ "use client";
2
+
3
+ import React, { useState, useEffect, useCallback } from "react";
4
+ import dynamic from "next/dynamic";
5
+ import {
6
+ Play,
7
+ Pause,
8
+ Trash2,
9
+ Plus,
10
+ X,
11
+ Clock,
12
+ Terminal,
13
+ RefreshCw,
14
+ ChevronDown,
15
+ Settings2,
16
+ Zap,
17
+ Calendar,
18
+ CalendarDays,
19
+ Repeat,
20
+ Pencil,
21
+ ArrowLeft,
22
+ Copy,
23
+ ExternalLink,
24
+ } from "lucide-react";
25
+ import { usePromptJobs } from "@/hooks/usePromptJobs";
26
+ import type { PromptJob, PromptRun } from "@/src/prompt-scheduler/types";
27
+
28
+ const RichTextEditor = dynamic(() => import("@/components/RichTextEditor"), {
29
+ ssr: false,
30
+ });
31
+
32
+ // ── Helpers ──────────────────────────────────────────────────────────────────
33
+
34
+ function formatNextRun(epochMs: number | null, state: string): string {
35
+ if (state === "paused") return "Paused";
36
+ if (state === "stopped") return "Stopped";
37
+ if (epochMs === null) return "Pending...";
38
+ const diff = epochMs - Date.now();
39
+ if (diff < 0) return "overdue";
40
+ if (diff < 60_000) return `in ${Math.round(diff / 1000)}s`;
41
+ if (diff < 3_600_000) return `in ${Math.round(diff / 60_000)}m`;
42
+ if (diff < 86_400_000) return `in ${Math.round(diff / 3_600_000)}h`;
43
+ return `in ${Math.round(diff / 86_400_000)}d`;
44
+ }
45
+
46
+ function formatDate(iso: string | null): string {
47
+ if (!iso) return "—";
48
+ const d = new Date(iso);
49
+ return (
50
+ d.toLocaleDateString("en-US", { month: "short", day: "numeric" }) +
51
+ ", " +
52
+ d.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit" })
53
+ );
54
+ }
55
+
56
+ function StateBadge({ state }: { state: PromptJob["state"] }) {
57
+ const styles: Record<string, string> = {
58
+ active: "text-green-400 bg-green-400/10 border-green-400/20",
59
+ paused: "text-amber-400 bg-amber-400/10 border-amber-400/20",
60
+ stopped:
61
+ "text-[var(--muted-foreground)] bg-[var(--muted)] border-[var(--card-border)]",
62
+ };
63
+ return (
64
+ <span
65
+ className={`text-[10px] font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md border ${styles[state] ?? styles.stopped}`}
66
+ >
67
+ {state}
68
+ </span>
69
+ );
70
+ }
71
+
72
+ const statusDotColor: Record<string, string> = {
73
+ active: "bg-emerald-400",
74
+ paused: "bg-amber-400",
75
+ stopped: "bg-zinc-500",
76
+ };
77
+
78
+ const runStatusDot: Record<string, string> = {
79
+ success: "bg-emerald-400",
80
+ failed: "bg-red-400",
81
+ cancelled: "bg-zinc-500",
82
+ running: "bg-sky-400",
83
+ queued: "bg-amber-400",
84
+ };
85
+
86
+ // ── Create/Edit Modal ────────────────────────────────────────────────────────
87
+
88
+ interface AgentOption {
89
+ id: string;
90
+ name: string;
91
+ provider: string;
92
+ model: string | null;
93
+ color: string;
94
+ title: string | null;
95
+ }
96
+
97
+ interface CreateJobData {
98
+ name: string;
99
+ prompt: string;
100
+ agentId: string;
101
+ provider: string;
102
+ model: string;
103
+ cliArgs: string;
104
+ catchUpPolicy: string;
105
+ cadence: string;
106
+ triggerType: string;
107
+ condition: string;
108
+ checkEveryMs: number;
109
+ }
110
+
111
+ const DAYS_OF_WEEK = [
112
+ { label: "Sun", short: "S", value: 0 },
113
+ { label: "Mon", short: "M", value: 1 },
114
+ { label: "Tue", short: "T", value: 2 },
115
+ { label: "Wed", short: "W", value: 3 },
116
+ { label: "Thu", short: "T", value: 4 },
117
+ { label: "Fri", short: "F", value: 5 },
118
+ { label: "Sat", short: "S", value: 6 },
119
+ ];
120
+
121
+ function getOrdinal(n: number) {
122
+ const s = ["th", "st", "nd", "rd"];
123
+ const v = n % 100;
124
+ return s[(v - 20) % 10] || s[v] || s[0];
125
+ }
126
+
127
+ function buildCron(
128
+ freq: string,
129
+ hour: string,
130
+ minute: string,
131
+ days: number[],
132
+ monthDay: number,
133
+ ): string {
134
+ switch (freq) {
135
+ case "hourly":
136
+ return `${minute} * * * *`;
137
+ case "daily":
138
+ return `${minute} ${hour} * * *`;
139
+ case "weekly":
140
+ return `${minute} ${hour} * * ${days.sort().join(",")}`;
141
+ case "monthly":
142
+ return `${minute} ${hour} ${monthDay} * *`;
143
+ default:
144
+ return `${minute} ${hour} * * *`;
145
+ }
146
+ }
147
+
148
+ function buildHumanReadable(
149
+ freq: string,
150
+ hour: string,
151
+ minute: string,
152
+ days: number[],
153
+ monthDay: number,
154
+ ): string {
155
+ const hh = parseInt(hour);
156
+ const suffix = hh >= 12 ? "PM" : "AM";
157
+ const displayHour = hh % 12 || 12;
158
+ const time = `${displayHour}:${minute} ${suffix}`;
159
+
160
+ switch (freq) {
161
+ case "hourly":
162
+ return `Every hour at :${minute}`;
163
+ case "daily":
164
+ return `Every day at ${time}`;
165
+ case "weekly": {
166
+ const labels = days
167
+ .sort()
168
+ .map((d) => DAYS_OF_WEEK.find((day) => day.value === d)!.label);
169
+ return `${time} on ${labels.join(", ")}`;
170
+ }
171
+ case "monthly":
172
+ return `${monthDay}${getOrdinal(monthDay)} of every month at ${time}`;
173
+ default:
174
+ return `Every day at ${time}`;
175
+ }
176
+ }
177
+
178
+ function ScheduleBuilder({
179
+ value,
180
+ onChange,
181
+ }: {
182
+ value: string;
183
+ onChange: (cron: string, label: string) => void;
184
+ }) {
185
+ const [freq, setFreq] = useState("daily");
186
+ const [hour, setHour] = useState("09");
187
+ const [minute, setMinute] = useState("00");
188
+ const [selectedDays, setSelectedDays] = useState([1, 2, 3, 4, 5]);
189
+ const [monthDay, setMonthDay] = useState(1);
190
+
191
+ useEffect(() => {
192
+ const cron = buildCron(freq, hour, minute, selectedDays, monthDay);
193
+ const label = buildHumanReadable(
194
+ freq,
195
+ hour,
196
+ minute,
197
+ selectedDays,
198
+ monthDay,
199
+ );
200
+ onChange(cron, label);
201
+ }, [freq, hour, minute, selectedDays, monthDay]);
202
+
203
+ const toggleDay = (d: number) =>
204
+ setSelectedDays((prev) =>
205
+ prev.includes(d) ? prev.filter((x) => x !== d) : [...prev, d],
206
+ );
207
+
208
+ const freqPill = (
209
+ id: string,
210
+ label: string,
211
+ Icon: React.ComponentType<{ size?: number }>,
212
+ ) => (
213
+ <button
214
+ key={id}
215
+ type="button"
216
+ onClick={() => setFreq(id)}
217
+ className={`flex flex-col items-center justify-center p-2.5 rounded-xl border transition-all text-[11px] font-medium ${
218
+ freq === id
219
+ ? "border-[var(--foreground)] bg-[var(--foreground)]/5 text-[var(--foreground)]"
220
+ : "border-[var(--card-border)] bg-[var(--muted)] text-[var(--muted-foreground)] hover:border-[var(--muted-foreground)]"
221
+ }`}
222
+ >
223
+ <Icon size={16} />
224
+ <span className="mt-1">{label}</span>
225
+ </button>
226
+ );
227
+
228
+ const selectClass =
229
+ "bg-[var(--muted)] border border-[var(--card-border)] rounded-lg px-2 py-1.5 text-sm font-medium text-[var(--foreground)] focus:outline-none focus:border-[var(--foreground)] transition-colors";
230
+
231
+ return (
232
+ <div className="space-y-4">
233
+ {/* Frequency pills */}
234
+ <div className="grid grid-cols-4 gap-2">
235
+ {freqPill("hourly", "Hourly", Repeat)}
236
+ {freqPill("daily", "Daily", Clock)}
237
+ {freqPill("weekly", "Weekly", CalendarDays)}
238
+ {freqPill("monthly", "Monthly", Calendar)}
239
+ </div>
240
+
241
+ {/* Time picker (not for hourly) */}
242
+ {freq !== "hourly" ? (
243
+ <div>
244
+ <div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1.5">
245
+ Time
246
+ </div>
247
+ <div className="flex items-center gap-1.5">
248
+ <select
249
+ value={hour}
250
+ onChange={(e) => setHour(e.target.value)}
251
+ className={selectClass}
252
+ >
253
+ {Array.from({ length: 24 }).map((_, i) => {
254
+ const val = i.toString().padStart(2, "0");
255
+ return (
256
+ <option key={val} value={val}>
257
+ {val}
258
+ </option>
259
+ );
260
+ })}
261
+ </select>
262
+ <span className="text-sm font-bold text-[var(--muted-foreground)]">
263
+ :
264
+ </span>
265
+ <select
266
+ value={minute}
267
+ onChange={(e) => setMinute(e.target.value)}
268
+ className={selectClass}
269
+ >
270
+ {[
271
+ "00",
272
+ "05",
273
+ "10",
274
+ "15",
275
+ "20",
276
+ "25",
277
+ "30",
278
+ "35",
279
+ "40",
280
+ "45",
281
+ "50",
282
+ "55",
283
+ ].map((val) => (
284
+ <option key={val} value={val}>
285
+ {val}
286
+ </option>
287
+ ))}
288
+ </select>
289
+ <span className="ml-1.5 text-[10px] text-[var(--muted-foreground)]">
290
+ {parseInt(hour) >= 12 ? "PM" : "AM"}
291
+ </span>
292
+ </div>
293
+ </div>
294
+ ) : (
295
+ <div>
296
+ <div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1.5">
297
+ At minute
298
+ </div>
299
+ <select
300
+ value={minute}
301
+ onChange={(e) => setMinute(e.target.value)}
302
+ className={selectClass}
303
+ >
304
+ {[
305
+ "00",
306
+ "05",
307
+ "10",
308
+ "15",
309
+ "20",
310
+ "25",
311
+ "30",
312
+ "35",
313
+ "40",
314
+ "45",
315
+ "50",
316
+ "55",
317
+ ].map((val) => (
318
+ <option key={val} value={val}>
319
+ :{val}
320
+ </option>
321
+ ))}
322
+ </select>
323
+ </div>
324
+ )}
325
+
326
+ {/* Weekly: day selector */}
327
+ {freq === "weekly" && (
328
+ <div>
329
+ <div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1.5">
330
+ Repeat on
331
+ </div>
332
+ <div className="flex gap-1.5">
333
+ {DAYS_OF_WEEK.map((day) => (
334
+ <button
335
+ key={day.value}
336
+ type="button"
337
+ onClick={() => toggleDay(day.value)}
338
+ className={`size-8 rounded-full flex items-center justify-center text-[10px] font-bold transition-all ${
339
+ selectedDays.includes(day.value)
340
+ ? "bg-[var(--foreground)] text-[var(--background)]"
341
+ : "bg-[var(--muted)] text-[var(--muted-foreground)] hover:bg-[var(--card-border)]"
342
+ }`}
343
+ >
344
+ {day.label[0]}
345
+ </button>
346
+ ))}
347
+ </div>
348
+ </div>
349
+ )}
350
+
351
+ {/* Monthly: date grid */}
352
+ {freq === "monthly" && (
353
+ <div>
354
+ <div className="text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-1.5">
355
+ On day
356
+ </div>
357
+ <div className="grid grid-cols-7 gap-1">
358
+ {Array.from({ length: 31 }).map((_, i) => {
359
+ const d = i + 1;
360
+ return (
361
+ <button
362
+ key={d}
363
+ type="button"
364
+ onClick={() => setMonthDay(d)}
365
+ className={`size-7 rounded-lg flex items-center justify-center text-[10px] font-medium transition-all ${
366
+ monthDay === d
367
+ ? "bg-[var(--foreground)] text-[var(--background)]"
368
+ : "bg-[var(--muted)] text-[var(--muted-foreground)] hover:bg-[var(--card-border)]"
369
+ }`}
370
+ >
371
+ {d}
372
+ </button>
373
+ );
374
+ })}
375
+ </div>
376
+ </div>
377
+ )}
378
+
379
+ {/* Summary */}
380
+ <div className="px-3 py-2 rounded-lg bg-[var(--muted)] border border-[var(--card-border)]">
381
+ <div className="text-[10px] text-[var(--muted-foreground)] mb-0.5">
382
+ Schedule
383
+ </div>
384
+ <div className="text-xs font-medium text-[var(--foreground)]">
385
+ {buildHumanReadable(freq, hour, minute, selectedDays, monthDay)}
386
+ </div>
387
+ <div className="text-[10px] font-mono text-[var(--muted-foreground)] mt-0.5">
388
+ {buildCron(freq, hour, minute, selectedDays, monthDay)}
389
+ </div>
390
+ </div>
391
+ </div>
392
+ );
393
+ }
394
+
395
+ const CHECK_PRESETS = [
396
+ { label: "1 min", ms: 60000 },
397
+ { label: "5 min", ms: 300000 },
398
+ { label: "15 min", ms: 900000 },
399
+ { label: "30 min", ms: 1800000 },
400
+ { label: "1 hour", ms: 3600000 },
401
+ ] as const;
402
+
403
+ function Label({ children }: { children: React.ReactNode }) {
404
+ return (
405
+ <label className="block text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-widest mb-2">
406
+ {children}
407
+ </label>
408
+ );
409
+ }
410
+
411
+ function agentAvatar(id: string, color: string, size = 24) {
412
+ const bg = color ? color.replace("#", "") : "e2e8f0";
413
+ return `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${encodeURIComponent(id)}&size=${size}&backgroundColor=${bg}`;
414
+ }
415
+
416
+ function AgentDropdown({
417
+ agents,
418
+ value,
419
+ onChange,
420
+ }: {
421
+ agents: AgentOption[];
422
+ value: string;
423
+ onChange: (id: string) => void;
424
+ }) {
425
+ const [open, setOpen] = useState(false);
426
+ const selected = agents.find((a) => a.id === value);
427
+
428
+ return (
429
+ <div className="relative">
430
+ <Label>Agent</Label>
431
+ <button
432
+ type="button"
433
+ onClick={() => setOpen(!open)}
434
+ className="w-full flex items-center gap-2.5 px-3 py-2.5 rounded-lg border border-[var(--card-border)] bg-[var(--muted)] text-left transition-colors hover:border-[var(--muted-foreground)]"
435
+ >
436
+ {selected ? (
437
+ <>
438
+ <img
439
+ src={agentAvatar(selected.id, selected.color)}
440
+ alt=""
441
+ className="size-6 rounded-full shrink-0"
442
+ />
443
+ <div className="min-w-0 flex-1">
444
+ <div className="text-xs font-medium text-[var(--foreground)] truncate">
445
+ {selected.name}
446
+ </div>
447
+ <div className="text-[10px] text-[var(--muted-foreground)]">
448
+ {selected.provider}
449
+ {selected.model ? ` / ${selected.model}` : ""}
450
+ </div>
451
+ </div>
452
+ </>
453
+ ) : (
454
+ <span className="text-xs text-[var(--muted-foreground)]">
455
+ Select an agent...
456
+ </span>
457
+ )}
458
+ <ChevronDown
459
+ size={14}
460
+ className={`ml-auto text-[var(--muted-foreground)] transition-transform ${open ? "rotate-180" : ""}`}
461
+ />
462
+ </button>
463
+
464
+ {open && (
465
+ <div className="absolute z-20 mt-1 w-full rounded-lg border border-[var(--card-border)] bg-[var(--card-bg)] shadow-lg max-h-[280px] overflow-y-auto">
466
+ {agents.map((a) => (
467
+ <button
468
+ key={a.id}
469
+ type="button"
470
+ onClick={() => {
471
+ onChange(a.id);
472
+ setOpen(false);
473
+ }}
474
+ className={`w-full flex items-center gap-2.5 px-3 py-2.5 text-left transition-colors hover:bg-[var(--muted)] ${value === a.id ? "bg-[var(--muted)]" : ""}`}
475
+ >
476
+ <img
477
+ src={agentAvatar(a.id, a.color)}
478
+ alt=""
479
+ className="size-6 rounded-full shrink-0"
480
+ />
481
+ <div className="min-w-0 flex-1">
482
+ <div className="text-xs font-medium text-[var(--foreground)] truncate">
483
+ {a.name}
484
+ </div>
485
+ <div className="text-[10px] text-[var(--muted-foreground)]">
486
+ {a.provider}
487
+ {a.model ? ` / ${a.model}` : ""}
488
+ </div>
489
+ </div>
490
+ {value === a.id && (
491
+ <span className="text-xs text-[var(--foreground)]">
492
+ &#10003;
493
+ </span>
494
+ )}
495
+ </button>
496
+ ))}
497
+ </div>
498
+ )}
499
+ </div>
500
+ );
501
+ }
502
+
503
+ function CreateJobModal({
504
+ onClose,
505
+ onSubmit,
506
+ editingJob,
507
+ }: {
508
+ onClose: () => void;
509
+ onSubmit: (data: CreateJobData) => Promise<void>;
510
+ editingJob?: PromptJob | null;
511
+ }) {
512
+ const [agents, setAgents] = useState<AgentOption[]>([]);
513
+ const [name, setName] = useState(editingJob?.name ?? "");
514
+ const [prompt, setPrompt] = useState(editingJob?.prompt ?? "");
515
+ const [agentId, setAgentId] = useState(editingJob?.agentId ?? "");
516
+ const [provider, setProvider] = useState(editingJob?.provider ?? "claude");
517
+ const [model, setModel] = useState(editingJob?.model ?? "");
518
+
519
+ useEffect(() => {
520
+ fetch("/api/prompt-jobs/agents")
521
+ .then((r) => r.json())
522
+ .then((d) => setAgents(d.agents ?? []))
523
+ .catch(() => {});
524
+ }, []);
525
+ const [cliArgs, setCliArgs] = useState(editingJob?.cliArgs ?? "");
526
+ const [cadence, setCadence] = useState(editingJob?.cadence ?? "");
527
+ const [cadenceLabel, setCadenceLabel] = useState(editingJob?.cadence ?? "");
528
+ const [triggerType, setTriggerType] = useState<"scheduled" | "condition">(
529
+ (editingJob?.triggerType as any) ?? "scheduled",
530
+ );
531
+ const [condition, setCondition] = useState(editingJob?.condition ?? "");
532
+ const [checkEveryMs, setCheckEveryMs] = useState(
533
+ editingJob?.checkEveryMs ?? 300000,
534
+ );
535
+ const [catchUpPolicy, setCatchUpPolicy] = useState<'fire_once' | 'replay_all' | 'skip'>(editingJob?.catchUpPolicy ?? 'fire_once');
536
+ const [showAdvanced, setShowAdvanced] = useState(!!editingJob?.cliArgs || (editingJob?.catchUpPolicy != null && editingJob.catchUpPolicy !== 'fire_once'));
537
+ const [submitting, setSubmitting] = useState(false);
538
+
539
+ const handleSubmit = async (e: React.FormEvent) => {
540
+ e.preventDefault();
541
+ if (!name.trim() || !prompt.trim()) return;
542
+ if (triggerType === "scheduled" && !cadence.trim()) return;
543
+ if (triggerType === "condition" && !condition.trim()) return;
544
+ setSubmitting(true);
545
+ await onSubmit({
546
+ name: name.trim(),
547
+ prompt: prompt.trim(),
548
+ agentId,
549
+ provider,
550
+ model: model.trim(),
551
+ cliArgs: cliArgs.trim(),
552
+ catchUpPolicy,
553
+ cadence: triggerType === "scheduled" ? cadence.trim() : "",
554
+ triggerType,
555
+ condition: condition.trim(),
556
+ checkEveryMs,
557
+ });
558
+ setSubmitting(false);
559
+ onClose();
560
+ };
561
+
562
+ const inputClass =
563
+ "w-full bg-[var(--muted)] border border-[var(--card-border)] rounded-lg px-3 py-2 text-sm text-[var(--foreground)] placeholder:text-[var(--muted-foreground)] focus:outline-none focus:border-[var(--foreground)] transition-colors";
564
+ const pillClass = (active: boolean) =>
565
+ `px-3 py-1.5 rounded-lg text-xs font-medium border transition-all cursor-pointer ${
566
+ active
567
+ ? "bg-[var(--foreground)] text-[var(--background)] border-[var(--foreground)]"
568
+ : "bg-[var(--muted)] text-[var(--muted-foreground)] border-[var(--card-border)] hover:border-[var(--muted-foreground)] hover:text-[var(--foreground)]"
569
+ }`;
570
+
571
+ return (
572
+ <div className="h-full flex flex-col text-[var(--foreground)]">
573
+ <div className="h-14 shrink-0 border-b border-[var(--card-border)] flex items-center justify-between px-6">
574
+ <div className="flex items-center gap-3">
575
+ <button
576
+ onClick={onClose}
577
+ className="p-1.5 rounded-md text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] transition-colors"
578
+ >
579
+ <X size={18} />
580
+ </button>
581
+ <h2 className="text-sm font-semibold">
582
+ {editingJob ? "Edit Prompt Job" : "New Prompt Job"}
583
+ </h2>
584
+ </div>
585
+ <button
586
+ onClick={handleSubmit as any}
587
+ disabled={submitting || !name.trim() || !prompt.trim()}
588
+ className="px-5 py-2 rounded-lg text-sm font-medium bg-[var(--foreground)] text-[var(--background)] hover:opacity-90 disabled:opacity-40 transition-opacity"
589
+ >
590
+ {submitting
591
+ ? "Saving..."
592
+ : editingJob
593
+ ? "Save Changes"
594
+ : "Create Job"}
595
+ </button>
596
+ </div>
597
+
598
+ <div className="flex flex-1 min-h-0 overflow-hidden">
599
+ <div className="flex-1 border-r border-[var(--card-border)] flex flex-col min-w-0">
600
+ <div className="px-8 pt-8 pb-4">
601
+ <input
602
+ type="text"
603
+ value={name}
604
+ onChange={(e) => setName(e.target.value)}
605
+ placeholder="Untitled job"
606
+ className="w-full text-2xl font-bold bg-transparent border-none outline-none placeholder:text-[var(--muted-foreground)]/40 text-[var(--foreground)]"
607
+ autoFocus
608
+ />
609
+ </div>
610
+ <div className="flex-1 px-8 pb-8 overflow-y-auto">
611
+ <Label>Instructions</Label>
612
+ <div className="bg-[var(--card-bg)] border border-[var(--card-border)] rounded-xl overflow-hidden min-h-[300px]">
613
+ <RichTextEditor
614
+ content={prompt}
615
+ onChange={(md) => setPrompt(md)}
616
+ placeholder="Describe what this prompt should do..."
617
+ />
618
+ </div>
619
+ </div>
620
+ </div>
621
+
622
+ <div className="w-[380px] shrink-0 overflow-y-auto p-6 space-y-6">
623
+ {/* Agent picker dropdown */}
624
+ <AgentDropdown
625
+ agents={agents}
626
+ value={agentId}
627
+ onChange={(id) => {
628
+ setAgentId(id);
629
+ const a = agents.find((a) => a.id === id);
630
+ if (a) {
631
+ setProvider(a.provider);
632
+ setModel(a.model ?? "");
633
+ } else {
634
+ setProvider("claude");
635
+ setModel("");
636
+ }
637
+ }}
638
+ />
639
+
640
+ <div>
641
+ <Label>Trigger</Label>
642
+ <div className="flex rounded-lg border border-[var(--card-border)] overflow-hidden">
643
+ <button
644
+ type="button"
645
+ onClick={() => setTriggerType("scheduled")}
646
+ className={`flex-1 py-2.5 text-xs font-medium flex items-center justify-center gap-1.5 transition-colors ${triggerType === "scheduled" ? "bg-[var(--foreground)] text-[var(--background)]" : "bg-[var(--muted)] text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}`}
647
+ >
648
+ <Calendar size={13} /> Schedule
649
+ </button>
650
+ <button
651
+ type="button"
652
+ onClick={() => setTriggerType("condition")}
653
+ className={`flex-1 py-2.5 text-xs font-medium flex items-center justify-center gap-1.5 transition-colors ${triggerType === "condition" ? "bg-[var(--foreground)] text-[var(--background)]" : "bg-[var(--muted)] text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}`}
654
+ >
655
+ <Zap size={13} /> Condition
656
+ </button>
657
+ </div>
658
+ </div>
659
+
660
+ {triggerType === "scheduled" ? (
661
+ <ScheduleBuilder
662
+ value={cadence}
663
+ onChange={(cron, label) => {
664
+ setCadence(cron);
665
+ setCadenceLabel(label);
666
+ }}
667
+ />
668
+ ) : (
669
+ <>
670
+ <div>
671
+ <Label>Condition</Label>
672
+ <textarea
673
+ value={condition}
674
+ onChange={(e) => setCondition(e.target.value)}
675
+ placeholder="there are unread emails in my inbox"
676
+ rows={3}
677
+ className={`${inputClass} resize-none`}
678
+ />
679
+ <p className="text-[10px] text-[var(--muted-foreground)] mt-1.5">
680
+ The LLM evaluates this as a gate. If true, the prompt runs.
681
+ </p>
682
+ </div>
683
+ <div>
684
+ <Label>Check frequency</Label>
685
+ <div className="flex flex-wrap gap-1.5">
686
+ {CHECK_PRESETS.map((preset) => (
687
+ <button
688
+ key={preset.ms}
689
+ type="button"
690
+ onClick={() => setCheckEveryMs(preset.ms)}
691
+ className={pillClass(checkEveryMs === preset.ms)}
692
+ >
693
+ {preset.label}
694
+ </button>
695
+ ))}
696
+ </div>
697
+ </div>
698
+ </>
699
+ )}
700
+
701
+ <div>
702
+ <button
703
+ type="button"
704
+ onClick={() => setShowAdvanced(!showAdvanced)}
705
+ className="flex items-center gap-1.5 text-[11px] text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors"
706
+ >
707
+ <Settings2 size={12} /> {showAdvanced ? "Hide" : "Show"} advanced
708
+ <ChevronDown
709
+ size={12}
710
+ className={`transition-transform ${showAdvanced ? "rotate-180" : ""}`}
711
+ />
712
+ </button>
713
+ {showAdvanced && (
714
+ <div className="mt-3 space-y-3 pt-3 border-t border-[var(--card-border)]">
715
+ <div>
716
+ <Label>CLI Arguments</Label>
717
+ <input
718
+ type="text"
719
+ value={cliArgs}
720
+ onChange={(e) => setCliArgs(e.target.value)}
721
+ placeholder="--dangerously-skip-permissions"
722
+ className={inputClass}
723
+ />
724
+ <p className="text-[10px] text-[var(--muted-foreground)] mt-1">
725
+ Extra flags passed to the CLI command.
726
+ </p>
727
+ </div>
728
+ <div>
729
+ <Label>When missed</Label>
730
+ <div className="space-y-1.5">
731
+ {([
732
+ { id: 'fire_once', label: 'Run once on recovery', desc: 'Execute a single run regardless of how many were missed' },
733
+ { id: 'replay_all', label: 'Run all missed', desc: 'Queue one run per missed occurrence (use with caution)' },
734
+ { id: 'skip', label: 'Skip and wait for next', desc: 'Discard missed runs, wait for the next scheduled time' },
735
+ ] as const).map((opt) => (
736
+ <button key={opt.id} type="button" onClick={() => setCatchUpPolicy(opt.id)}
737
+ className={`w-full text-left px-3 py-2 rounded-lg border transition-all ${
738
+ catchUpPolicy === opt.id
739
+ ? 'border-[var(--foreground)] bg-[var(--foreground)]/5'
740
+ : 'border-[var(--card-border)] bg-[var(--muted)] hover:border-[var(--muted-foreground)]'
741
+ }`}>
742
+ <div className="text-xs font-medium text-[var(--foreground)]">{opt.label}</div>
743
+ <div className="text-[10px] text-[var(--muted-foreground)]">{opt.desc}</div>
744
+ </button>
745
+ ))}
746
+ </div>
747
+ </div>
748
+ </div>
749
+ )}
750
+ </div>
751
+ </div>
752
+ </div>
753
+ </div>
754
+ );
755
+ }
756
+
757
+ // ── Detail View (3-panel) ────────────────────────────────────────────────────
758
+
759
+ function JobDetailView({
760
+ job,
761
+ agentMap,
762
+ onBack,
763
+ onEdit,
764
+ onToggle,
765
+ onDelete,
766
+ onRunNow,
767
+ onCancelRun,
768
+ onUpdateAgent,
769
+ fetchRuns,
770
+ }: {
771
+ job: PromptJob;
772
+ agentMap: Record<string, AgentOption>;
773
+ onBack: () => void;
774
+ onEdit: () => void;
775
+ onToggle: () => void;
776
+ onDelete: () => void;
777
+ onRunNow: () => void;
778
+ onCancelRun: () => void;
779
+ onUpdateAgent: (agentId: string) => void;
780
+ fetchRuns: (jobId: string) => Promise<PromptRun[]>;
781
+ }) {
782
+ const [runs, setRuns] = useState<PromptRun[]>([]);
783
+ const [selectedRunId, setSelectedRunId] = useState<string | null>(null);
784
+ const agents = Object.values(agentMap);
785
+ const agentName =
786
+ job.agentId && agentMap[job.agentId] ? agentMap[job.agentId].name : null;
787
+
788
+ const loadRuns = useCallback(async () => {
789
+ const data = await fetchRuns(job.id);
790
+ setRuns(data);
791
+ if (data.length > 0 && !selectedRunId) setSelectedRunId(data[0].id);
792
+ }, [job.id, fetchRuns, selectedRunId]);
793
+
794
+ useEffect(() => {
795
+ loadRuns();
796
+ }, [loadRuns]);
797
+ // Auto-refresh runs
798
+ useEffect(() => {
799
+ const iv = setInterval(loadRuns, 5000);
800
+ return () => clearInterval(iv);
801
+ }, [loadRuns]);
802
+
803
+ const selectedRun = runs.find((r) => r.id === selectedRunId) ?? null;
804
+ const isRunning = job.lastOutcome === "running";
805
+
806
+ return (
807
+ <div className="h-full flex flex-col text-[var(--foreground)]">
808
+ {/* Top bar */}
809
+ <div className="shrink-0 flex items-center gap-3 border-b border-[var(--card-border)] px-4 py-3.5 pt-4">
810
+ <button
811
+ onClick={onBack}
812
+ className="inline-flex items-center gap-1.5 rounded-md border border-[var(--card-border)] px-2.5 py-1 text-[11px] text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]"
813
+ >
814
+ <ArrowLeft size={12} /> Back
815
+ </button>
816
+ <h2 className="text-[13px] font-semibold truncate">{job.name}</h2>
817
+ <span
818
+ className={`inline-block size-2 shrink-0 rounded-full ${statusDotColor[job.state] ?? "bg-zinc-500"}`}
819
+ />
820
+ </div>
821
+
822
+ {/* 3-panel content */}
823
+ <div className="flex min-h-0 flex-1">
824
+ {/* LEFT: Job details */}
825
+ <div className="flex w-[260px] shrink-0 flex-col border-r border-[var(--card-border)] overflow-y-auto">
826
+ <div className="p-4 space-y-4">
827
+ {/* Actions */}
828
+ <div className="flex items-center gap-2">
829
+ <button
830
+ onClick={onRunNow}
831
+ disabled={isRunning}
832
+ className="inline-flex items-center gap-1.5 rounded-md border border-[var(--card-border)] px-2.5 py-1 text-[10px] font-bold uppercase tracking-[0.05em] text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)] hover:border-[var(--foreground)] disabled:opacity-50"
833
+ >
834
+ <Play size={11} /> Run now
835
+ </button>
836
+ <button
837
+ onClick={onToggle}
838
+ type="button"
839
+ role="switch"
840
+ aria-checked={job.state === "active"}
841
+ title={job.state === "active" ? "Pause" : "Resume"}
842
+ className={`relative inline-flex h-[16px] w-[28px] shrink-0 cursor-pointer rounded-full border transition-colors ${
843
+ job.state === "active"
844
+ ? "border-emerald-400/30 bg-emerald-500/40"
845
+ : "border-[var(--card-border)] bg-[var(--muted)]"
846
+ }`}
847
+ >
848
+ <span
849
+ className={`pointer-events-none absolute top-[2px] size-[10px] rounded-full bg-white/90 shadow-sm transition-transform ${
850
+ job.state === "active"
851
+ ? "translate-x-[14px]"
852
+ : "translate-x-[2px]"
853
+ }`}
854
+ />
855
+ </button>
856
+ {isRunning && (
857
+ <button
858
+ onClick={onCancelRun}
859
+ className="inline-flex items-center gap-1.5 rounded-md border border-[var(--card-border)] px-2.5 py-1 text-[10px] font-bold uppercase tracking-[0.05em] text-[var(--muted-foreground)] hover:text-red-400 hover:border-red-400/30 transition-colors"
860
+ >
861
+ Cancel
862
+ </button>
863
+ )}
864
+ <div className="ml-auto flex items-center gap-1">
865
+ <button
866
+ onClick={onEdit}
867
+ title="Edit"
868
+ className="p-1.5 rounded-md border border-[var(--card-border)] text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:border-[var(--foreground)] transition-colors"
869
+ >
870
+ <Pencil size={12} />
871
+ </button>
872
+ <button
873
+ onClick={onDelete}
874
+ title="Delete"
875
+ className="p-1.5 rounded-md border border-[var(--card-border)] text-[var(--muted-foreground)] hover:text-red-400 hover:border-red-400/30 transition-colors"
876
+ >
877
+ <Trash2 size={12} />
878
+ </button>
879
+ </div>
880
+ </div>
881
+
882
+ <div>
883
+ <div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)] mb-1.5">
884
+ Status
885
+ </div>
886
+ <div
887
+ className={`text-[12px] font-semibold ${job.state === "active" ? "text-emerald-400" : job.state === "paused" ? "text-amber-400" : "text-[var(--muted-foreground)]"}`}
888
+ >
889
+ {job.state.charAt(0).toUpperCase() + job.state.slice(1)}
890
+ </div>
891
+ </div>
892
+ <AgentDropdown
893
+ agents={agents}
894
+ value={job.agentId}
895
+ onChange={onUpdateAgent}
896
+ />
897
+ <div>
898
+ <div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)] mb-1.5">
899
+ Trigger
900
+ </div>
901
+ <div className="text-[12px] text-[var(--foreground)]">
902
+ {job.triggerType === "condition"
903
+ ? `Condition (every ${Math.round(job.checkEveryMs / 60000)}m)`
904
+ : job.cadence || job.cronExpr}
905
+ </div>
906
+ </div>
907
+ {job.condition && (
908
+ <div>
909
+ <div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)] mb-1.5">
910
+ Condition
911
+ </div>
912
+ <div className="text-[12px] text-[var(--foreground)]">
913
+ {job.condition}
914
+ </div>
915
+ </div>
916
+ )}
917
+ <div>
918
+ <div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)] mb-1.5">
919
+ Instructions
920
+ </div>
921
+ <div className="text-[11px] leading-[1.5] text-[var(--muted-foreground)] whitespace-pre-wrap break-words">
922
+ {job.prompt.length > 200
923
+ ? job.prompt.slice(0, 200) + "..."
924
+ : job.prompt}
925
+ </div>
926
+ </div>
927
+
928
+ <div className="space-y-1.5">
929
+ {[
930
+ ...(job.overlapPolicy !== "skip"
931
+ ? [{ l: "Overlap", v: job.overlapPolicy }]
932
+ : []),
933
+ ...(job.cliArgs ? [{ l: "CLI args", v: job.cliArgs }] : []),
934
+ { l: "Next run", v: formatNextRun(job.nextRunAt, job.state) },
935
+ {
936
+ l: "Last run",
937
+ v: job.lastRunAt
938
+ ? formatDate(new Date(job.lastRunAt).toISOString()) +
939
+ ` (${job.lastOutcome ?? "—"})`
940
+ : "Never",
941
+ },
942
+ ].map((item) => (
943
+ <div
944
+ key={item.l}
945
+ className="flex items-center justify-between rounded-md border border-[var(--card-border)] bg-[var(--muted)]/50 px-2.5 py-1.5 text-[11px]"
946
+ >
947
+ <span className="text-[var(--muted-foreground)]">
948
+ {item.l}
949
+ </span>
950
+ <span className="font-medium text-[var(--foreground)]">
951
+ {item.v}
952
+ </span>
953
+ </div>
954
+ ))}
955
+ </div>
956
+ </div>
957
+ </div>
958
+
959
+ {/* MIDDLE: Run history */}
960
+ <div className="flex w-[240px] shrink-0 flex-col border-r border-[var(--card-border)] overflow-hidden">
961
+ <div className="border-b border-[var(--card-border)] px-3 py-2">
962
+ <div className="text-[10px] font-bold uppercase tracking-[0.12em] text-[var(--muted-foreground)]">
963
+ Run History{" "}
964
+ <span className="text-[var(--muted-foreground)]/50">
965
+ {runs.length}
966
+ </span>
967
+ </div>
968
+ </div>
969
+ <div className="min-h-0 flex-1 overflow-y-auto">
970
+ {runs.length === 0 ? (
971
+ <div className="p-4 text-center text-[11px] text-[var(--muted-foreground)]">
972
+ No runs yet
973
+ </div>
974
+ ) : (
975
+ <div className="flex flex-col">
976
+ {runs.map((run) => {
977
+ const isSelected = selectedRunId === run.id;
978
+ return (
979
+ <button
980
+ key={run.id}
981
+ type="button"
982
+ onClick={() => setSelectedRunId(run.id)}
983
+ className={`flex items-start gap-2.5 px-3 py-2.5 text-left transition-colors border-l-2 ${
984
+ isSelected
985
+ ? "bg-[var(--foreground)]/5 border-l-[var(--foreground)]"
986
+ : "border-l-transparent hover:bg-[var(--muted)]/30"
987
+ }`}
988
+ >
989
+ <span
990
+ className={`mt-1 inline-block size-2 shrink-0 rounded-full ${runStatusDot[run.status] ?? "bg-zinc-500"}`}
991
+ />
992
+ <div className="min-w-0 flex-1">
993
+ <div className="text-[11px] font-medium text-[var(--foreground)] truncate">
994
+ {run.status === "running"
995
+ ? "Running..."
996
+ : run.status.charAt(0).toUpperCase() +
997
+ run.status.slice(1)}
998
+ {run.durationMs != null &&
999
+ ` · ${(run.durationMs / 1000).toFixed(1)}s`}
1000
+ </div>
1001
+ <div className="mt-0.5 flex items-center gap-2 text-[10px] text-[var(--muted-foreground)]">
1002
+ <span>
1003
+ {formatDate(run.startedAt ?? run.createdAt)}
1004
+ </span>
1005
+ </div>
1006
+ </div>
1007
+ </button>
1008
+ );
1009
+ })}
1010
+ </div>
1011
+ )}
1012
+ </div>
1013
+ </div>
1014
+
1015
+ {/* RIGHT: Selected run output */}
1016
+ <div className="flex min-w-0 flex-1 flex-col overflow-hidden">
1017
+ {selectedRun ? (
1018
+ <>
1019
+ <div className="flex items-center justify-between border-b border-[var(--card-border)] px-4 py-2">
1020
+ <div className="min-w-0">
1021
+ <div className="text-[12px] font-semibold text-[var(--foreground)] truncate">
1022
+ Run {selectedRun.id.slice(0, 8)}
1023
+ </div>
1024
+ <div className="text-[10px] text-[var(--muted-foreground)]">
1025
+ {selectedRun.status}{" "}
1026
+ {selectedRun.durationMs != null &&
1027
+ `· ${(selectedRun.durationMs / 1000).toFixed(1)}s`}
1028
+ </div>
1029
+ </div>
1030
+ </div>
1031
+ <div className="min-h-0 flex-1 overflow-y-auto px-4 py-3">
1032
+ {selectedRun.output ? (
1033
+ <div className="space-y-3">
1034
+ <div className="flex gap-2.5">
1035
+ <div className="shrink-0 mt-0.5">
1036
+ {job.agentId && agentMap[job.agentId] ? (
1037
+ <img
1038
+ src={agentAvatar(
1039
+ job.agentId,
1040
+ agentMap[job.agentId].color,
1041
+ 28,
1042
+ )}
1043
+ alt=""
1044
+ className="size-7 rounded-full"
1045
+ />
1046
+ ) : (
1047
+ <div className="flex size-7 items-center justify-center rounded-full bg-[var(--muted)] text-[10px] text-[var(--muted-foreground)]">
1048
+ <Terminal size={12} />
1049
+ </div>
1050
+ )}
1051
+ </div>
1052
+ <div className="min-w-0 flex-1">
1053
+ <div className="mb-1">
1054
+ <span className="text-[11px] font-semibold text-[var(--foreground)]">
1055
+ {agentName ?? job.provider}
1056
+ </span>
1057
+ </div>
1058
+ <div className="rounded-lg px-3 py-2 text-[12px] leading-[1.55] bg-[var(--muted)] text-[var(--foreground)]">
1059
+ <div className="whitespace-pre-wrap break-words">
1060
+ {selectedRun.output}
1061
+ </div>
1062
+ </div>
1063
+ </div>
1064
+ </div>
1065
+ {selectedRun.error && (
1066
+ <div className="flex gap-2.5">
1067
+ <div className="shrink-0 mt-0.5">
1068
+ <div className="flex size-7 items-center justify-center rounded-full bg-red-500/10 text-[10px] text-red-400">
1069
+ !
1070
+ </div>
1071
+ </div>
1072
+ <div className="min-w-0 flex-1">
1073
+ <div className="rounded-lg px-3 py-2 text-[12px] leading-[1.55] bg-red-500/10 text-red-400">
1074
+ <div className="whitespace-pre-wrap break-words">
1075
+ {selectedRun.error}
1076
+ </div>
1077
+ </div>
1078
+ </div>
1079
+ </div>
1080
+ )}
1081
+ </div>
1082
+ ) : (
1083
+ <div className="text-center py-12 text-[var(--muted-foreground)] text-sm">
1084
+ {selectedRun.status === "queued"
1085
+ ? "Waiting to start..."
1086
+ : selectedRun.status === "running"
1087
+ ? "Running..."
1088
+ : "No output captured"}
1089
+ </div>
1090
+ )}
1091
+ </div>
1092
+ </>
1093
+ ) : (
1094
+ <div className="flex-1 flex items-center justify-center text-[var(--muted-foreground)] text-sm">
1095
+ {runs.length === 0
1096
+ ? 'No runs yet. Click "Run now" to trigger one.'
1097
+ : "Select a run to view its output"}
1098
+ </div>
1099
+ )}
1100
+ </div>
1101
+ </div>
1102
+ </div>
1103
+ );
1104
+ }
1105
+
1106
+ // ── Main Board ───────────────────────────────────────────────────────────────
1107
+
1108
+ export default function PromptJobBoard({ projectId }: { projectId?: string } = {}) {
1109
+ const {
1110
+ jobs, loading, refresh,
1111
+ createJob,
1112
+ updateJob,
1113
+ deleteJob,
1114
+ toggleJob,
1115
+ runNow,
1116
+ cancelRun,
1117
+ fetchRuns,
1118
+ } = usePromptJobs(projectId);
1119
+
1120
+ const [filter, setFilter] = useState("all");
1121
+ const [selectedId, setSelectedId] = useState<string | null>(null);
1122
+ const [showCreate, setShowCreate] = useState(false);
1123
+ const [editingJob, setEditingJob] = useState<PromptJob | null>(null);
1124
+ const [busy, setBusy] = useState<Record<string, boolean>>({});
1125
+ const [toast, setToast] = useState<string | null>(null);
1126
+ const [agentMap, setAgentMap] = useState<Record<string, AgentOption>>({});
1127
+
1128
+ useEffect(() => {
1129
+ fetch("/api/prompt-jobs/agents")
1130
+ .then((r) => r.json())
1131
+ .then((d) => {
1132
+ const map: Record<string, AgentOption> = {};
1133
+ for (const a of d.agents ?? []) map[a.id] = a;
1134
+ setAgentMap(map);
1135
+ })
1136
+ .catch(() => {});
1137
+ }, []);
1138
+
1139
+ const showToast = (message: string) => {
1140
+ setToast(message);
1141
+ setTimeout(() => setToast(null), 2500);
1142
+ };
1143
+
1144
+ const filteredJobs = jobs.filter(
1145
+ (j) => filter === "all" || j.state === filter,
1146
+ );
1147
+ const selected = jobs.find((j) => j.id === selectedId) ?? null;
1148
+
1149
+ const counts: Record<string, number> = {
1150
+ all: jobs.length,
1151
+ active: jobs.filter((j) => j.state === "active").length,
1152
+ paused: jobs.filter((j) => j.state === "paused").length,
1153
+ stopped: jobs.filter((j) => j.state === "stopped").length,
1154
+ };
1155
+
1156
+ const handleToggle = async (job: PromptJob) => {
1157
+ const ok = await toggleJob(job);
1158
+ if (ok)
1159
+ showToast(`${job.name} ${job.state === "active" ? "paused" : "resumed"}`);
1160
+ };
1161
+
1162
+ const handleRunNow = async (id: string, e?: React.MouseEvent) => {
1163
+ e?.stopPropagation();
1164
+ if (busy[id]) return;
1165
+ setBusy((prev) => ({ ...prev, [id]: true }));
1166
+ const ok = await runNow(id);
1167
+ setBusy((prev) => {
1168
+ const next = { ...prev };
1169
+ delete next[id];
1170
+ return next;
1171
+ });
1172
+ if (ok) showToast("Run triggered");
1173
+ };
1174
+
1175
+ const handleDelete = async (id: string) => {
1176
+ const ok = await deleteJob(id);
1177
+ if (ok) {
1178
+ if (selectedId === id) setSelectedId(null);
1179
+ showToast("Job deleted");
1180
+ }
1181
+ };
1182
+
1183
+ const handleCancelRun = async (id: string) => {
1184
+ const ok = await cancelRun(id);
1185
+ if (ok) showToast("Run cancelled");
1186
+ };
1187
+
1188
+ const handleCreateOrUpdate = async (data: CreateJobData) => {
1189
+ if (editingJob) {
1190
+ const ok = await updateJob(editingJob.id, data as any);
1191
+ if (ok) showToast(`Job "${data.name}" updated`);
1192
+ } else {
1193
+ const ok = await createJob({ ...data, projectId: projectId ?? '' });
1194
+ if (ok) showToast(`Job "${data.name}" created`);
1195
+ }
1196
+ };
1197
+
1198
+ // Toast overlay (shared across all views)
1199
+ const toastEl = toast && (
1200
+ <div className="fixed bottom-8 left-1/2 -translate-x-1/2 z-50 animate-in fade-in slide-in-from-bottom-2 duration-200">
1201
+ <div className="bg-[var(--card-bg)] border border-[var(--card-border)] px-4 py-2.5 rounded-xl shadow-lg flex items-center gap-2.5 text-sm font-medium">
1202
+ {toast}
1203
+ </div>
1204
+ </div>
1205
+ );
1206
+
1207
+ // ── Create/Edit view ──
1208
+ if (showCreate) {
1209
+ return (
1210
+ <>
1211
+ {toastEl}
1212
+ <CreateJobModal
1213
+ onClose={() => {
1214
+ setShowCreate(false);
1215
+ setEditingJob(null);
1216
+ }}
1217
+ onSubmit={handleCreateOrUpdate}
1218
+ editingJob={editingJob}
1219
+ />
1220
+ </>
1221
+ );
1222
+ }
1223
+
1224
+ // ── Detail view (3-panel) ──
1225
+ if (selected) {
1226
+ return (
1227
+ <>
1228
+ {toastEl}
1229
+ <JobDetailView
1230
+ job={selected}
1231
+ agentMap={agentMap}
1232
+ onBack={() => setSelectedId(null)}
1233
+ onEdit={() => {
1234
+ setEditingJob(selected);
1235
+ setShowCreate(true);
1236
+ }}
1237
+ onToggle={() => handleToggle(selected)}
1238
+ onDelete={() => handleDelete(selected.id)}
1239
+ onRunNow={() => handleRunNow(selected.id)}
1240
+ onCancelRun={() => handleCancelRun(selected.id)}
1241
+ onUpdateAgent={async (agentId) => {
1242
+ const agent = agentMap[agentId];
1243
+ await updateJob(selected.id, {
1244
+ agentId,
1245
+ provider: agent?.provider ?? "claude",
1246
+ model: agent?.model ?? "",
1247
+ } as any);
1248
+ }}
1249
+ fetchRuns={fetchRuns}
1250
+ />
1251
+ </>
1252
+ );
1253
+ }
1254
+
1255
+ // ── List view ──
1256
+ return (
1257
+ <div className="h-full flex flex-col text-[var(--foreground)]">
1258
+ {toastEl}
1259
+
1260
+ <div className="px-6 md:px-10 pt-6 pb-0">
1261
+ <div className="flex flex-col sm:flex-row justify-between items-start sm:items-end gap-4 mb-6">
1262
+ <div>
1263
+ <h1 className="text-2xl font-bold tracking-tight mb-1">
1264
+ Prompt Scheduler
1265
+ </h1>
1266
+ <p className="text-sm text-[var(--muted-foreground)]">
1267
+ {counts.active} active job{counts.active !== 1 ? "s" : ""}{" "}
1268
+ &middot; {jobs.length} total
1269
+ </p>
1270
+ </div>
1271
+ <div className="flex items-center gap-2">
1272
+ <button
1273
+ onClick={() => refresh()}
1274
+ className="p-2 rounded-lg border border-[var(--card-border)] text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:border-[var(--foreground)] transition-colors"
1275
+ >
1276
+ <RefreshCw size={16} />
1277
+ </button>
1278
+ <button
1279
+ onClick={() => {
1280
+ setEditingJob(null);
1281
+ setShowCreate(true);
1282
+ }}
1283
+ className="bg-[var(--foreground)] text-[var(--background)] px-4 py-2 rounded-lg text-sm font-medium flex items-center gap-2 hover:opacity-90 transition-opacity"
1284
+ >
1285
+ <Plus size={16} /> New Job
1286
+ </button>
1287
+ </div>
1288
+ </div>
1289
+
1290
+ <div className="flex gap-4 border-b border-[var(--card-border)] pb-3">
1291
+ {(["all", "active", "paused", "stopped"] as const).map((f) => (
1292
+ <button
1293
+ key={f}
1294
+ onClick={() => setFilter(f)}
1295
+ className={`text-xs font-medium pb-1 transition-colors border-b-2 capitalize ${
1296
+ filter === f
1297
+ ? "border-[var(--foreground)] text-[var(--foreground)]"
1298
+ : "border-transparent text-[var(--muted-foreground)] hover:text-[var(--foreground)]"
1299
+ }`}
1300
+ >
1301
+ {f}
1302
+ <span className="ml-1.5 text-[10px] text-[var(--muted-foreground)] font-mono">
1303
+ {counts[f]}
1304
+ </span>
1305
+ </button>
1306
+ ))}
1307
+ </div>
1308
+ </div>
1309
+
1310
+ <div className="flex-1 min-h-0 px-6 md:px-10 py-6 overflow-y-auto">
1311
+ {loading && jobs.length === 0 ? (
1312
+ <div className="text-center py-12 text-[var(--muted-foreground)] text-sm">
1313
+ Loading jobs...
1314
+ </div>
1315
+ ) : (
1316
+ <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-3">
1317
+ {filteredJobs.map((job) => {
1318
+ const isBusy = busy[job.id];
1319
+ return (
1320
+ <div
1321
+ key={job.id}
1322
+ onClick={() => setSelectedId(job.id)}
1323
+ className="p-5 rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] hover:border-[var(--muted-foreground)] transition-all cursor-pointer"
1324
+ >
1325
+ <div className="flex justify-between items-start gap-3 mb-3">
1326
+ <div className="min-w-0">
1327
+ <h3 className="text-sm font-semibold truncate mb-1">
1328
+ {job.name}
1329
+ </h3>
1330
+ <StateBadge state={job.state} />
1331
+ </div>
1332
+ <div
1333
+ className="flex items-center gap-1.5 shrink-0"
1334
+ onClick={(e) => e.stopPropagation()}
1335
+ >
1336
+ <button
1337
+ onClick={(e) => { e.stopPropagation(); handleToggle(job); }}
1338
+ type="button"
1339
+ role="switch"
1340
+ aria-checked={job.state === 'active'}
1341
+ title={job.state === 'active' ? 'Pause' : 'Resume'}
1342
+ className={`relative inline-flex h-[14px] w-[24px] shrink-0 cursor-pointer rounded-full border transition-colors ${
1343
+ job.state === 'active' ? 'border-emerald-400/30 bg-emerald-500/40' : 'border-[var(--card-border)] bg-[var(--muted)]'
1344
+ }`}
1345
+ >
1346
+ <span className={`pointer-events-none absolute top-[1.5px] size-[9px] rounded-full bg-white/90 shadow-sm transition-transform ${
1347
+ job.state === 'active' ? 'translate-x-[11px]' : 'translate-x-[1.5px]'
1348
+ }`} />
1349
+ </button>
1350
+ <button
1351
+ onClick={(e) => handleRunNow(job.id, e)}
1352
+ disabled={isBusy}
1353
+ title="Run now"
1354
+ className={`p-1.5 rounded-md border text-[var(--muted-foreground)] transition-colors ${isBusy ? "border-[var(--card-border)] opacity-50 cursor-wait" : "border-[var(--card-border)] hover:text-[var(--foreground)] hover:border-[var(--muted-foreground)]"}`}
1355
+ >
1356
+ <Play
1357
+ size={12}
1358
+ className={isBusy ? "animate-pulse" : "fill-current"}
1359
+ />
1360
+ </button>
1361
+ <button
1362
+ onClick={(e) => {
1363
+ e.stopPropagation();
1364
+ handleDelete(job.id);
1365
+ }}
1366
+ title="Delete"
1367
+ className="p-1.5 rounded-md border border-[var(--card-border)] text-[var(--muted-foreground)] hover:text-red-500 hover:border-red-500/30 transition-colors"
1368
+ >
1369
+ <Trash2 size={12} />
1370
+ </button>
1371
+ </div>
1372
+ </div>
1373
+
1374
+ <p className="text-[12px] text-[var(--muted-foreground)] leading-relaxed line-clamp-2 mb-3">
1375
+ {job.prompt}
1376
+ </p>
1377
+
1378
+ <div className="pt-3 border-t border-[var(--card-border)]/50 flex items-center gap-4 text-[11px] text-[var(--muted-foreground)]">
1379
+ <span className="flex items-center gap-1">
1380
+ {job.agentId && agentMap[job.agentId] ? (
1381
+ <>
1382
+ <img
1383
+ src={agentAvatar(
1384
+ job.agentId,
1385
+ agentMap[job.agentId].color,
1386
+ 16,
1387
+ )}
1388
+ alt=""
1389
+ className="size-4 rounded-full"
1390
+ />
1391
+ {agentMap[job.agentId].name}
1392
+ </>
1393
+ ) : (
1394
+ <>
1395
+ <Terminal size={11} />
1396
+ {job.provider}
1397
+ </>
1398
+ )}
1399
+ </span>
1400
+ {job.triggerType === "condition" && (
1401
+ <span className="text-[10px] px-1.5 py-0.5 rounded bg-purple-500/10 text-purple-400 border border-purple-400/20">
1402
+ condition
1403
+ </span>
1404
+ )}
1405
+ <span className="flex items-center gap-1">
1406
+ <Clock size={11} />
1407
+ {formatNextRun(job.nextRunAt, job.state)}
1408
+ </span>
1409
+ <span
1410
+ className="ml-auto font-mono truncate max-w-[120px]"
1411
+ title={job.cadence || job.cronExpr}
1412
+ >
1413
+ {job.triggerType === "condition"
1414
+ ? `every ${Math.round(job.checkEveryMs / 60000)}m`
1415
+ : job.cadence || job.cronExpr}
1416
+ </span>
1417
+ </div>
1418
+ </div>
1419
+ );
1420
+ })}
1421
+
1422
+ {filteredJobs.length === 0 && (
1423
+ <div className="md:col-span-2 xl:col-span-3 text-center py-12 text-[var(--muted-foreground)] text-sm border border-dashed border-[var(--card-border)] rounded-xl">
1424
+ {jobs.length === 0
1425
+ ? "No prompt jobs yet. Create one to get started."
1426
+ : "No jobs match the selected filter."}
1427
+ </div>
1428
+ )}
1429
+ </div>
1430
+ )}
1431
+ </div>
1432
+ </div>
1433
+ );
1434
+ }