@mndrk/agx 2.0.22 → 2.0.24

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 (378) hide show
  1. package/cloud-runtime/standalone/.next/BUILD_ID +1 -1
  2. package/cloud-runtime/standalone/.next/app-path-routes-manifest.json +1 -0
  3. package/cloud-runtime/standalone/.next/build-manifest.json +6 -6
  4. package/cloud-runtime/standalone/.next/prerender-manifest.json +3 -3
  5. package/cloud-runtime/standalone/.next/routes-manifest.json +6 -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/page.js +2 -2
  8. package/cloud-runtime/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  9. package/cloud-runtime/standalone/.next/server/app/_global-error.html +2 -2
  10. package/cloud-runtime/standalone/.next/server/app/_global-error.rsc +1 -1
  11. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/cloud-runtime/standalone/.next/server/app/_not-found/page/build-manifest.json +4 -4
  17. package/cloud-runtime/standalone/.next/server/app/_not-found/page.js +6 -5
  18. package/cloud-runtime/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/cloud-runtime/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/cloud-runtime/standalone/.next/server/app/_not-found.html +14 -2
  21. package/cloud-runtime/standalone/.next/server/app/_not-found.rsc +11 -11
  22. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
  23. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
  24. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  25. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  26. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  27. package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  28. package/cloud-runtime/standalone/.next/server/app/agents/[id]/page/build-manifest.json +4 -4
  29. package/cloud-runtime/standalone/.next/server/app/agents/[id]/page.js +5 -5
  30. package/cloud-runtime/standalone/.next/server/app/agents/[id]/page.js.nft.json +1 -1
  31. package/cloud-runtime/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  32. package/cloud-runtime/standalone/.next/server/app/agents/page/build-manifest.json +4 -4
  33. package/cloud-runtime/standalone/.next/server/app/agents/page.js +5 -5
  34. package/cloud-runtime/standalone/.next/server/app/agents/page.js.nft.json +1 -1
  35. package/cloud-runtime/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  36. package/cloud-runtime/standalone/.next/server/app/agents.html +14 -2
  37. package/cloud-runtime/standalone/.next/server/app/agents.rsc +10 -10
  38. package/cloud-runtime/standalone/.next/server/app/agents.segments/_full.segment.rsc +10 -10
  39. package/cloud-runtime/standalone/.next/server/app/agents.segments/_head.segment.rsc +3 -3
  40. package/cloud-runtime/standalone/.next/server/app/agents.segments/_index.segment.rsc +4 -4
  41. package/cloud-runtime/standalone/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
  42. package/cloud-runtime/standalone/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +4 -4
  43. package/cloud-runtime/standalone/.next/server/app/agents.segments/agents.segment.rsc +3 -3
  44. package/cloud-runtime/standalone/.next/server/app/api/file-search/route.js.nft.json +1 -1
  45. package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route/app-paths-manifest.json +3 -0
  46. package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route/build-manifest.json +11 -0
  47. package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route/server-reference-manifest.json +4 -0
  48. package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route.js +7 -0
  49. package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route.js.map +5 -0
  50. package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route.js.nft.json +1 -0
  51. package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route_client-reference-manifest.js +2 -0
  52. package/cloud-runtime/standalone/.next/server/app/api/providers/route.js +1 -1
  53. package/cloud-runtime/standalone/.next/server/app/api/providers/route.js.nft.json +1 -1
  54. package/cloud-runtime/standalone/.next/server/app/api/status/route.js +1 -1
  55. package/cloud-runtime/standalone/.next/server/app/api/status/route.js.nft.json +1 -1
  56. package/cloud-runtime/standalone/.next/server/app/automations/page/build-manifest.json +4 -4
  57. package/cloud-runtime/standalone/.next/server/app/automations/page.js +5 -5
  58. package/cloud-runtime/standalone/.next/server/app/automations/page.js.nft.json +1 -1
  59. package/cloud-runtime/standalone/.next/server/app/automations/page_client-reference-manifest.js +1 -1
  60. package/cloud-runtime/standalone/.next/server/app/automations.html +14 -2
  61. package/cloud-runtime/standalone/.next/server/app/automations.rsc +11 -11
  62. package/cloud-runtime/standalone/.next/server/app/automations.segments/_full.segment.rsc +11 -11
  63. package/cloud-runtime/standalone/.next/server/app/automations.segments/_head.segment.rsc +3 -3
  64. package/cloud-runtime/standalone/.next/server/app/automations.segments/_index.segment.rsc +4 -4
  65. package/cloud-runtime/standalone/.next/server/app/automations.segments/_tree.segment.rsc +3 -3
  66. package/cloud-runtime/standalone/.next/server/app/automations.segments/automations/__PAGE__.segment.rsc +5 -5
  67. package/cloud-runtime/standalone/.next/server/app/automations.segments/automations.segment.rsc +3 -3
  68. package/cloud-runtime/standalone/.next/server/app/board/page/build-manifest.json +4 -4
  69. package/cloud-runtime/standalone/.next/server/app/board/page.js +6 -6
  70. package/cloud-runtime/standalone/.next/server/app/board/page.js.nft.json +1 -1
  71. package/cloud-runtime/standalone/.next/server/app/board/page_client-reference-manifest.js +1 -1
  72. package/cloud-runtime/standalone/.next/server/app/board.html +14 -2
  73. package/cloud-runtime/standalone/.next/server/app/board.rsc +8 -8
  74. package/cloud-runtime/standalone/.next/server/app/board.segments/_full.segment.rsc +8 -8
  75. package/cloud-runtime/standalone/.next/server/app/board.segments/_head.segment.rsc +3 -3
  76. package/cloud-runtime/standalone/.next/server/app/board.segments/_index.segment.rsc +4 -4
  77. package/cloud-runtime/standalone/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  78. package/cloud-runtime/standalone/.next/server/app/board.segments/board/__PAGE__.segment.rsc +2 -2
  79. package/cloud-runtime/standalone/.next/server/app/board.segments/board.segment.rsc +3 -3
  80. package/cloud-runtime/standalone/.next/server/app/execution-graph/page/build-manifest.json +4 -4
  81. package/cloud-runtime/standalone/.next/server/app/execution-graph/page.js +5 -5
  82. package/cloud-runtime/standalone/.next/server/app/execution-graph/page.js.nft.json +1 -1
  83. package/cloud-runtime/standalone/.next/server/app/execution-graph/page_client-reference-manifest.js +1 -1
  84. package/cloud-runtime/standalone/.next/server/app/execution-graph.html +14 -2
  85. package/cloud-runtime/standalone/.next/server/app/execution-graph.rsc +10 -10
  86. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_full.segment.rsc +10 -10
  87. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_head.segment.rsc +3 -3
  88. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_index.segment.rsc +4 -4
  89. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_tree.segment.rsc +2 -2
  90. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/execution-graph/__PAGE__.segment.rsc +4 -4
  91. package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/execution-graph.segment.rsc +3 -3
  92. package/cloud-runtime/standalone/.next/server/app/index.html +14 -2
  93. package/cloud-runtime/standalone/.next/server/app/index.rsc +10 -10
  94. package/cloud-runtime/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  95. package/cloud-runtime/standalone/.next/server/app/index.segments/_full.segment.rsc +10 -10
  96. package/cloud-runtime/standalone/.next/server/app/index.segments/_head.segment.rsc +3 -3
  97. package/cloud-runtime/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  98. package/cloud-runtime/standalone/.next/server/app/index.segments/_tree.segment.rsc +3 -3
  99. package/cloud-runtime/standalone/.next/server/app/page/build-manifest.json +4 -4
  100. package/cloud-runtime/standalone/.next/server/app/page.js +5 -5
  101. package/cloud-runtime/standalone/.next/server/app/page.js.nft.json +1 -1
  102. package/cloud-runtime/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  103. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page/build-manifest.json +4 -4
  104. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page.js +5 -5
  105. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
  106. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
  107. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page/build-manifest.json +4 -4
  108. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page.js +5 -5
  109. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  110. package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  111. package/cloud-runtime/standalone/.next/server/app/projects/orphans/page/build-manifest.json +4 -4
  112. package/cloud-runtime/standalone/.next/server/app/projects/orphans/page.js +5 -5
  113. package/cloud-runtime/standalone/.next/server/app/projects/orphans/page.js.nft.json +1 -1
  114. package/cloud-runtime/standalone/.next/server/app/projects/orphans/page_client-reference-manifest.js +1 -1
  115. package/cloud-runtime/standalone/.next/server/app/projects/orphans.html +13 -1
  116. package/cloud-runtime/standalone/.next/server/app/projects/orphans.rsc +10 -10
  117. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_full.segment.rsc +10 -10
  118. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_head.segment.rsc +3 -3
  119. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_index.segment.rsc +4 -4
  120. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_tree.segment.rsc +2 -2
  121. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects/orphans/__PAGE__.segment.rsc +4 -4
  122. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects/orphans.segment.rsc +3 -3
  123. package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects.segment.rsc +3 -3
  124. package/cloud-runtime/standalone/.next/server/app/projects/page/build-manifest.json +4 -4
  125. package/cloud-runtime/standalone/.next/server/app/projects/page.js +5 -5
  126. package/cloud-runtime/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  127. package/cloud-runtime/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  128. package/cloud-runtime/standalone/.next/server/app/projects.html +14 -2
  129. package/cloud-runtime/standalone/.next/server/app/projects.rsc +10 -10
  130. package/cloud-runtime/standalone/.next/server/app/projects.segments/_full.segment.rsc +10 -10
  131. package/cloud-runtime/standalone/.next/server/app/projects.segments/_head.segment.rsc +3 -3
  132. package/cloud-runtime/standalone/.next/server/app/projects.segments/_index.segment.rsc +4 -4
  133. package/cloud-runtime/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  134. package/cloud-runtime/standalone/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +4 -4
  135. package/cloud-runtime/standalone/.next/server/app/projects.segments/projects.segment.rsc +3 -3
  136. package/cloud-runtime/standalone/.next/server/app/settings/page/build-manifest.json +4 -4
  137. package/cloud-runtime/standalone/.next/server/app/settings/page.js +5 -5
  138. package/cloud-runtime/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  139. package/cloud-runtime/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  140. package/cloud-runtime/standalone/.next/server/app/settings.html +14 -2
  141. package/cloud-runtime/standalone/.next/server/app/settings.rsc +9 -9
  142. package/cloud-runtime/standalone/.next/server/app/settings.segments/_full.segment.rsc +9 -9
  143. package/cloud-runtime/standalone/.next/server/app/settings.segments/_head.segment.rsc +3 -3
  144. package/cloud-runtime/standalone/.next/server/app/settings.segments/_index.segment.rsc +4 -4
  145. package/cloud-runtime/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  146. package/cloud-runtime/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +3 -3
  147. package/cloud-runtime/standalone/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  148. package/cloud-runtime/standalone/.next/server/app/status/page/build-manifest.json +4 -4
  149. package/cloud-runtime/standalone/.next/server/app/status/page.js +5 -5
  150. package/cloud-runtime/standalone/.next/server/app/status/page.js.nft.json +1 -1
  151. package/cloud-runtime/standalone/.next/server/app/status/page_client-reference-manifest.js +1 -1
  152. package/cloud-runtime/standalone/.next/server/app/status.html +14 -2
  153. package/cloud-runtime/standalone/.next/server/app/status.rsc +10 -10
  154. package/cloud-runtime/standalone/.next/server/app/status.segments/_full.segment.rsc +10 -10
  155. package/cloud-runtime/standalone/.next/server/app/status.segments/_head.segment.rsc +3 -3
  156. package/cloud-runtime/standalone/.next/server/app/status.segments/_index.segment.rsc +4 -4
  157. package/cloud-runtime/standalone/.next/server/app/status.segments/_tree.segment.rsc +2 -2
  158. package/cloud-runtime/standalone/.next/server/app/status.segments/status/__PAGE__.segment.rsc +4 -4
  159. package/cloud-runtime/standalone/.next/server/app/status.segments/status.segment.rsc +3 -3
  160. package/cloud-runtime/standalone/.next/server/app/thread/[id]/page/build-manifest.json +4 -4
  161. package/cloud-runtime/standalone/.next/server/app/thread/[id]/page.js +5 -5
  162. package/cloud-runtime/standalone/.next/server/app/thread/[id]/page.js.nft.json +1 -1
  163. package/cloud-runtime/standalone/.next/server/app/thread/[id]/page_client-reference-manifest.js +1 -1
  164. package/cloud-runtime/standalone/.next/server/app/welcome/page/build-manifest.json +4 -4
  165. package/cloud-runtime/standalone/.next/server/app/welcome/page.js +5 -5
  166. package/cloud-runtime/standalone/.next/server/app/welcome/page.js.nft.json +1 -1
  167. package/cloud-runtime/standalone/.next/server/app/welcome/page_client-reference-manifest.js +1 -1
  168. package/cloud-runtime/standalone/.next/server/app/welcome.html +14 -2
  169. package/cloud-runtime/standalone/.next/server/app/welcome.rsc +10 -10
  170. package/cloud-runtime/standalone/.next/server/app/welcome.segments/_full.segment.rsc +10 -10
  171. package/cloud-runtime/standalone/.next/server/app/welcome.segments/_head.segment.rsc +3 -3
  172. package/cloud-runtime/standalone/.next/server/app/welcome.segments/_index.segment.rsc +4 -4
  173. package/cloud-runtime/standalone/.next/server/app/welcome.segments/_tree.segment.rsc +2 -2
  174. package/cloud-runtime/standalone/.next/server/app/welcome.segments/welcome/__PAGE__.segment.rsc +4 -4
  175. package/cloud-runtime/standalone/.next/server/app/welcome.segments/welcome.segment.rsc +3 -3
  176. package/cloud-runtime/standalone/.next/server/app-paths-manifest.json +1 -0
  177. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__60ba5058._.js +1 -1
  178. package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__621dcb4a._.js +3 -0
  179. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__babd2675._.js → [root-of-the-server]__82d76712._.js} +2 -2
  180. package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__d36da34d._.js → [root-of-the-server]__c2767ca5._.js} +2 -2
  181. package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_filesystem_browse_route_actions_8e268170.js +3 -0
  182. package/cloud-runtime/standalone/.next/server/chunks/lib_history-store_ts_2e721df2._.js +4 -4
  183. package/cloud-runtime/standalone/.next/server/chunks/lib_history-store_ts_74d1c060._.js +6 -6
  184. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__fb05a385._.js → [root-of-the-server]__056cdf7d._.js} +2 -2
  185. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__113d6767._.js +3 -0
  186. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__8d1af2c9._.js → [root-of-the-server]__11e33b9b._.js} +2 -2
  187. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__296a25b5._.js → [root-of-the-server]__19cd257e._.js} +2 -2
  188. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__226f8a19._.js +13 -1
  189. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__51980630._.js → [root-of-the-server]__26d669c2._.js} +2 -2
  190. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__47caef59._.js +1 -1
  191. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0a103abc._.js → [root-of-the-server]__4ebf5947._.js} +2 -2
  192. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__5ffa2883._.js +1 -1
  193. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__6a9d3855._.js +1 -1
  194. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__942ca438._.js +3 -0
  195. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__c45c7360._.js → [root-of-the-server]__a667191a._.js} +2 -2
  196. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1cfbd715._.js → [root-of-the-server]__aa28d46f._.js} +2 -2
  197. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__bd4d5430._.js +3 -0
  198. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__ab36b420._.js → [root-of-the-server]__bde5bc78._.js} +2 -2
  199. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__cde88183._.js +3 -0
  200. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__ce3b51aa._.js +3 -0
  201. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__2503b467._.js → [root-of-the-server]__d36dd8bc._.js} +2 -2
  202. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__b77ae83d._.js → [root-of-the-server]__dac5ab29._.js} +2 -2
  203. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__3405b8e4._.js → [root-of-the-server]__e87ba2b0._.js} +2 -2
  204. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__b9356576._.js → [root-of-the-server]__f62d412e._.js} +2 -2
  205. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__756711b8._.js → [root-of-the-server]__f63d6594._.js} +2 -2
  206. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__46de03a9._.js → [root-of-the-server]__febbd0b8._.js} +2 -2
  207. package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__89c70d6f._.js → [root-of-the-server]__ff22a10e._.js} +2 -2
  208. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_a19a362a._.js → _02c78cac._.js} +3 -3
  209. package/cloud-runtime/standalone/.next/server/chunks/ssr/{node_modules_next_dist_08570d7f._.js → _0b36c9d6._.js} +3 -3
  210. package/cloud-runtime/standalone/.next/server/chunks/ssr/_0ff7c687._.js +3 -3
  211. package/cloud-runtime/standalone/.next/server/chunks/ssr/_0ffd2660._.js +2 -2
  212. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_37435df3._.js → _173da79d._.js} +3 -3
  213. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_4fe611fe._.js → _1c58ab2d._.js} +3 -3
  214. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_a88b4884._.js → _222af282._.js} +3 -3
  215. package/cloud-runtime/standalone/.next/server/chunks/ssr/_27cb3359._.js +95 -0
  216. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_8ebf36f6._.js → _3aa32c11._.js} +3 -3
  217. package/cloud-runtime/standalone/.next/server/chunks/ssr/_43472af3._.js +3 -0
  218. package/cloud-runtime/standalone/.next/server/chunks/ssr/_4b5d7c9b._.js +95 -0
  219. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_c52176ad._.js → _4d4ba84b._.js} +3 -3
  220. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_194cda6c._.js → _50d04b8f._.js} +3 -3
  221. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_a8eaf6bc._.js → _629dc55c._.js} +3 -3
  222. package/cloud-runtime/standalone/.next/server/chunks/ssr/_6a367524._.js +1 -1
  223. package/cloud-runtime/standalone/.next/server/chunks/ssr/_93914ecd._.js +2 -2
  224. package/cloud-runtime/standalone/.next/server/chunks/ssr/_94effa0f._.js +1 -1
  225. package/cloud-runtime/standalone/.next/server/chunks/ssr/_a696e9b3._.js +95 -0
  226. package/cloud-runtime/standalone/.next/server/chunks/ssr/_ae20456d._.js +4 -0
  227. package/cloud-runtime/standalone/.next/server/chunks/ssr/_c838f593._.js +95 -0
  228. package/cloud-runtime/standalone/.next/server/chunks/ssr/_cd5e154b._.js +1 -1
  229. package/cloud-runtime/standalone/.next/server/chunks/ssr/_d021529a._.js +3 -0
  230. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_fc18d7b5._.js → _e04b4053._.js} +3 -3
  231. package/cloud-runtime/standalone/.next/server/chunks/ssr/_e1769638._.js +3 -3
  232. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_b9d3574c._.js → _f1465cc8._.js} +3 -3
  233. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_d4878ef1._.js → _f2a7beb1._.js} +3 -3
  234. package/cloud-runtime/standalone/.next/server/chunks/ssr/_fbced30b._.js +3 -0
  235. package/cloud-runtime/standalone/.next/server/chunks/ssr/{_8d8836a8._.js → _fc1aaf9e._.js} +3 -3
  236. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_agents_[id]_page_tsx_9c49d8c8._.js +1 -1
  237. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_agents_page_tsx_f5f08ed8._.js +1 -1
  238. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_automations_page_tsx_3d732184._.js +1 -1
  239. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_execution-graph_page_tsx_f854185a._.js +2 -2
  240. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_global-error_tsx_9170b7a0._.js +3 -0
  241. package/cloud-runtime/standalone/.next/server/chunks/ssr/app_projects_[slug]_page_tsx_e0fabf6e._.js +2 -2
  242. package/cloud-runtime/standalone/.next/server/chunks/ssr/components_chat-ui_bfeda794._.js +5 -5
  243. package/cloud-runtime/standalone/.next/server/chunks/ssr/components_thread_WorkspaceSidebar_tsx_e660301b._.js +1 -1
  244. package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_next_dist_03ec2107._.js +4 -0
  245. package/cloud-runtime/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_d92e159d.js → node_modules_next_dist_esm_build_templates_app-page_61c49327.js} +3 -3
  246. package/cloud-runtime/standalone/.next/server/middleware-build-manifest.js +4 -4
  247. package/cloud-runtime/standalone/.next/server/middleware-manifest.json +5 -5
  248. package/cloud-runtime/standalone/.next/server/pages/404.html +13 -1
  249. package/cloud-runtime/standalone/.next/server/pages/500.html +2 -2
  250. package/cloud-runtime/standalone/.next/server/server-reference-manifest.js +1 -1
  251. package/cloud-runtime/standalone/.next/server/server-reference-manifest.json +1 -1
  252. package/cloud-runtime/standalone/.next/static/chunks/{785cb91c31bb3303.js → 09f9eeea393db0fd.js} +3 -3
  253. package/cloud-runtime/standalone/.next/static/chunks/1184bf1bfdf97666.js +1 -0
  254. package/cloud-runtime/standalone/.next/static/chunks/2acd153dc5252e88.js +30 -0
  255. package/cloud-runtime/standalone/.next/static/chunks/2deeba875ec50761.js +1 -0
  256. package/cloud-runtime/standalone/.next/static/chunks/45b4d0ee5c92d45b.js +93 -0
  257. package/cloud-runtime/standalone/.next/static/chunks/5ace4b4f4475962a.js +1 -0
  258. package/cloud-runtime/standalone/.next/static/chunks/616d66dbec9e4b8b.js +93 -0
  259. package/cloud-runtime/standalone/.next/static/chunks/64f812259cf8c243.js +18 -0
  260. package/cloud-runtime/standalone/.next/static/chunks/6dbf5940e30fa9c7.js +1 -0
  261. package/cloud-runtime/standalone/.next/static/chunks/7d4c1d97169c8522.js +1 -0
  262. package/cloud-runtime/standalone/.next/static/chunks/7f13efe9329d3f97.js +1 -0
  263. package/cloud-runtime/standalone/.next/static/chunks/80219bbddcf65109.js +1 -0
  264. package/cloud-runtime/standalone/.next/static/chunks/{47ef8bb2118ea917.js → 86ace6febb11ad71.js} +1 -1
  265. package/cloud-runtime/standalone/.next/static/chunks/{90c7dbc004f59a42.js → 88e24940a5d5d386.js} +1 -1
  266. package/cloud-runtime/standalone/.next/static/chunks/9d50c2514f72d926.css +1 -0
  267. package/cloud-runtime/standalone/.next/static/chunks/b079c677d9b39f98.js +5 -0
  268. package/cloud-runtime/standalone/.next/static/chunks/b4e298542d366e31.js +93 -0
  269. package/cloud-runtime/standalone/.next/static/chunks/b88352740262931f.js +6 -0
  270. package/cloud-runtime/standalone/.next/static/chunks/bd6c5b5b4fbd6413.css +2 -0
  271. package/cloud-runtime/standalone/.next/static/chunks/c5609fd2abb65850.js +1 -0
  272. package/cloud-runtime/standalone/.next/static/chunks/{7ca3e4f9ed7425a8.js → d95cd010361834be.js} +1 -1
  273. package/cloud-runtime/standalone/.next/static/chunks/da434b1ad885d636.js +30 -0
  274. package/cloud-runtime/standalone/.next/static/chunks/e44264686aa5ecbf.js +93 -0
  275. package/cloud-runtime/standalone/.next/static/chunks/eab1c7d0246592f8.js +8 -0
  276. package/cloud-runtime/standalone/.next/static/chunks/f7bbf5cfcfed8ba9.js +1 -0
  277. package/cloud-runtime/standalone/.next/static/chunks/{turbopack-92401168917c21f2.js → turbopack-5b5918f610666d2d.js} +1 -1
  278. package/cloud-runtime/standalone/README.md +15 -3
  279. package/cloud-runtime/standalone/app/agents/[id]/page.tsx +147 -147
  280. package/cloud-runtime/standalone/app/agents/page.tsx +115 -310
  281. package/cloud-runtime/standalone/app/api/filesystem/browse/route.ts +39 -0
  282. package/cloud-runtime/standalone/app/api/status/route.ts +1 -1
  283. package/cloud-runtime/standalone/app/api/threads/route.ts +4 -5
  284. package/cloud-runtime/standalone/app/automations/page.tsx +1 -1
  285. package/cloud-runtime/standalone/app/execution-graph/page.tsx +86 -86
  286. package/cloud-runtime/standalone/app/global-error.tsx +54 -0
  287. package/cloud-runtime/standalone/app/globals.css +165 -59
  288. package/cloud-runtime/standalone/app/layout.tsx +17 -0
  289. package/cloud-runtime/standalone/app/projects/[slug]/layout.tsx +1 -1
  290. package/cloud-runtime/standalone/app/projects/[slug]/page.tsx +58 -58
  291. package/cloud-runtime/standalone/app/status/page.tsx +20 -20
  292. package/cloud-runtime/standalone/app/welcome/page.tsx +20 -15
  293. package/cloud-runtime/standalone/components/AutomationsBoard.tsx +1 -1
  294. package/cloud-runtime/standalone/components/ClientOnly.tsx +17 -0
  295. package/cloud-runtime/standalone/components/ConsentToggle/index.tsx +3 -3
  296. package/cloud-runtime/standalone/components/ContextMenu.tsx +123 -0
  297. package/cloud-runtime/standalone/components/DaemonBar.tsx +9 -9
  298. package/cloud-runtime/standalone/components/DirectoryBrowser.tsx +140 -0
  299. package/cloud-runtime/standalone/components/FirstRunModal/index.tsx +10 -10
  300. package/cloud-runtime/standalone/components/KanbanBoard.tsx +9 -9
  301. package/cloud-runtime/standalone/components/OfflineIndicator.tsx +149 -0
  302. package/cloud-runtime/standalone/components/ProjectModal.tsx +32 -8
  303. package/cloud-runtime/standalone/components/TaskCard.tsx +3 -3
  304. package/cloud-runtime/standalone/components/WorkspaceRootsList/index.tsx +57 -35
  305. package/cloud-runtime/standalone/components/chat-ui/AttachmentTray.tsx +7 -7
  306. package/cloud-runtime/standalone/components/chat-ui/ChatContainer.tsx +218 -121
  307. package/cloud-runtime/standalone/components/chat-ui/ChatPreview.tsx +4 -4
  308. package/cloud-runtime/standalone/components/chat-ui/CommandPopover.tsx +4 -4
  309. package/cloud-runtime/standalone/components/chat-ui/Composer.tsx +65 -29
  310. package/cloud-runtime/standalone/components/chat-ui/FileMentionPopover.tsx +4 -4
  311. package/cloud-runtime/standalone/components/chat-ui/FileMentionPopoverItem.tsx +9 -9
  312. package/cloud-runtime/standalone/components/chat-ui/LogPanel.tsx +5 -5
  313. package/cloud-runtime/standalone/components/chat-ui/Markdown.tsx +11 -11
  314. package/cloud-runtime/standalone/components/chat-ui/MentionPopover.tsx +11 -11
  315. package/cloud-runtime/standalone/components/chat-ui/MessageAttachments.tsx +5 -5
  316. package/cloud-runtime/standalone/components/chat-ui/MessageBubble.tsx +6 -6
  317. package/cloud-runtime/standalone/components/chat-ui/MessageList.tsx +60 -135
  318. package/cloud-runtime/standalone/components/chat-ui/ParticipantBar.tsx +507 -263
  319. package/cloud-runtime/standalone/components/chat-ui/ProjectPicker.tsx +17 -17
  320. package/cloud-runtime/standalone/components/chat-ui/ReactionChip.tsx +1 -1
  321. package/cloud-runtime/standalone/components/chat-ui/SearchResults.tsx +14 -14
  322. package/cloud-runtime/standalone/components/chat-ui/StatusIndicator.tsx +7 -7
  323. package/cloud-runtime/standalone/components/chat-ui/TaskDraftCard.tsx +14 -14
  324. package/cloud-runtime/standalone/components/chat-ui/TaskStatusCard.tsx +10 -10
  325. package/cloud-runtime/standalone/components/chat-ui/ThreadMentionPopover.tsx +8 -8
  326. package/cloud-runtime/standalone/components/chat-ui/ThreadView.tsx +36 -33
  327. package/cloud-runtime/standalone/components/chat-ui/TypingIndicator.tsx +7 -7
  328. package/cloud-runtime/standalone/components/errors/StartupGuardWrapper.tsx +96 -0
  329. package/cloud-runtime/standalone/components/thread/WorkspaceSidebar.tsx +173 -193
  330. package/cloud-runtime/standalone/fix-primary.js +30 -0
  331. package/cloud-runtime/standalone/fix-theme.js +78 -0
  332. package/cloud-runtime/standalone/hooks/useKeyboardShortcuts.ts +131 -0
  333. package/cloud-runtime/standalone/lib/history-store.ts +6 -1
  334. package/cloud-runtime/standalone/lib/storage/thread-adapter.ts +3 -3
  335. package/cloud-runtime/standalone/state/windowState.ts +179 -0
  336. package/cloud-runtime/standalone/styles/workspaceSidebar.css +89 -94
  337. package/cloud-runtime/standalone/tsconfig.tsbuildinfo +1 -1
  338. package/package.json +1 -1
  339. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__3fe0b1a1._.js +0 -3
  340. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__5ea3dff5._.js +0 -3
  341. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__931817d6._.js +0 -3
  342. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__e68a6e30._.js +0 -3
  343. package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__fad8b80a._.js +0 -3
  344. package/cloud-runtime/standalone/.next/server/chunks/ssr/_181427d4._.js +0 -95
  345. package/cloud-runtime/standalone/.next/server/chunks/ssr/_2da02644._.js +0 -3
  346. package/cloud-runtime/standalone/.next/server/chunks/ssr/_60f7e403._.js +0 -3
  347. package/cloud-runtime/standalone/.next/server/chunks/ssr/_7dbc349d._.js +0 -95
  348. package/cloud-runtime/standalone/.next/server/chunks/ssr/_a17cabe8._.js +0 -95
  349. package/cloud-runtime/standalone/.next/server/chunks/ssr/_d743f11d._.js +0 -3
  350. package/cloud-runtime/standalone/.next/server/chunks/ssr/_e05b04a5._.js +0 -4
  351. package/cloud-runtime/standalone/.next/server/chunks/ssr/_f2970e5f._.js +0 -4
  352. package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_001a8448._.js +0 -3
  353. package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js +0 -3
  354. package/cloud-runtime/standalone/.next/static/chunks/047593c886feba72.css +0 -2
  355. package/cloud-runtime/standalone/.next/static/chunks/0c589ec8063c3a1f.js +0 -30
  356. package/cloud-runtime/standalone/.next/static/chunks/1826707bd2f73ca6.js +0 -8
  357. package/cloud-runtime/standalone/.next/static/chunks/1f1b912fe2e3d5bd.js +0 -1
  358. package/cloud-runtime/standalone/.next/static/chunks/32f13ace6661115d.js +0 -93
  359. package/cloud-runtime/standalone/.next/static/chunks/3b0a3b913dd15028.js +0 -30
  360. package/cloud-runtime/standalone/.next/static/chunks/4b3358c52d01a3f9.css +0 -1
  361. package/cloud-runtime/standalone/.next/static/chunks/4ee6151684568990.js +0 -93
  362. package/cloud-runtime/standalone/.next/static/chunks/5488a71a8515e8b2.js +0 -1
  363. package/cloud-runtime/standalone/.next/static/chunks/5aad4adabb65cd20.js +0 -1
  364. package/cloud-runtime/standalone/.next/static/chunks/5ce01dbd17ce3bb2.js +0 -1
  365. package/cloud-runtime/standalone/.next/static/chunks/5f5ae2ea4fa2b8f0.js +0 -12
  366. package/cloud-runtime/standalone/.next/static/chunks/6bb1ecbc3b80922c.js +0 -1
  367. package/cloud-runtime/standalone/.next/static/chunks/7657d70cc0c40c81.js +0 -6
  368. package/cloud-runtime/standalone/.next/static/chunks/7f2513325b592f25.js +0 -18
  369. package/cloud-runtime/standalone/.next/static/chunks/8b658ccf17b771b9.js +0 -1
  370. package/cloud-runtime/standalone/.next/static/chunks/b39122b85655e5b0.js +0 -1
  371. package/cloud-runtime/standalone/.next/static/chunks/b649593a57df218f.js +0 -1
  372. package/cloud-runtime/standalone/.next/static/chunks/b8ca4cb386211980.js +0 -5
  373. package/cloud-runtime/standalone/.next/static/chunks/e103488c85a7b445.js +0 -1
  374. package/cloud-runtime/standalone/.next/static/chunks/e355ac901e70f43d.js +0 -1
  375. package/cloud-runtime/standalone/.next/static/chunks/ebebe08434070698.js +0 -93
  376. /package/cloud-runtime/standalone/.next/static/{H3MuYxcqCPfZoSC2uYW8f → Rn0z3Af30mHwrHLLwgKlz}/_buildManifest.js +0 -0
  377. /package/cloud-runtime/standalone/.next/static/{H3MuYxcqCPfZoSC2uYW8f → Rn0z3Af30mHwrHLLwgKlz}/_clientMiddlewareManifest.json +0 -0
  378. /package/cloud-runtime/standalone/.next/static/{H3MuYxcqCPfZoSC2uYW8f → Rn0z3Af30mHwrHLLwgKlz}/_ssgManifest.js +0 -0
@@ -12,6 +12,8 @@ import {
12
12
  FolderOpen,
13
13
  ChevronDown,
14
14
  GripVertical,
15
+ Copy,
16
+ Check,
15
17
  } from 'lucide-react';
16
18
  import RichTextEditor from "@/components/RichTextEditor";
17
19
  import {
@@ -86,11 +88,11 @@ function SortableAgentItem({
86
88
  return (
87
89
  <div ref={setNodeRef} style={style} className="relative group">
88
90
  <div
89
- className={`w-full flex items-center justify-between gap-1 px-1.5 py-1.5 rounded-md transition-colors ${isActive ? "text-slate-700 hover:bg-slate-100" : "text-slate-400 hover:bg-slate-50"}`}
91
+ className={`w-full flex items-center justify-between gap-1 px-1.5 py-1.5 rounded-md transition-colors ${isActive ? "text-[var(--foreground)] hover:bg-[var(--muted)]" : "text-[var(--muted-foreground)] hover:bg-[var(--app-shell-subtle)]"}`}
90
92
  >
91
93
  <button
92
94
  type="button"
93
- className="flex-shrink-0 cursor-grab active:cursor-grabbing p-1 text-slate-300 hover:text-slate-500 transition-colors"
95
+ className="flex-shrink-0 cursor-grab active:cursor-grabbing p-1 text-[var(--muted-foreground)] hover:text-[var(--muted-foreground)] transition-colors"
94
96
  {...attributes}
95
97
  {...listeners}
96
98
  >
@@ -121,9 +123,9 @@ function SortableAgentItem({
121
123
  }}
122
124
  aria-label={`${isActive ? "Disable" : "Enable"} ${p.name}`}
123
125
  aria-pressed={isActive}
124
- className={`relative w-5 h-3 rounded-full transition-colors flex-shrink-0 ${isActive ? "bg-violet-300" : "bg-slate-200"}`}
126
+ className={`relative w-5 h-3 rounded-full transition-colors flex-shrink-0 ${isActive ? "bg-violet-300" : "bg-[var(--muted)]"}`}
125
127
  >
126
- <span className={`absolute top-[2px] left-[2px] w-2 h-2 bg-white rounded-full shadow-sm transition-transform ${isActive ? "translate-x-2" : "translate-x-0"}`} />
128
+ <span className={`absolute top-[2px] left-[2px] w-2 h-2 bg-[var(--card-bg)] rounded-full shadow-sm transition-transform ${isActive ? "translate-x-2" : "translate-x-0"}`} />
127
129
  </button>
128
130
  </div>
129
131
  </div>
@@ -160,6 +162,102 @@ export interface ProjectMembership {
160
162
  available: { id: string; name: string }[];
161
163
  }
162
164
 
165
+ type AgentFormViewMode = "form" | "json";
166
+
167
+ const AGENT_FORM_PROVIDERS: ChatProvider[] = ["claude", "ollama", "gemini", "codex", "zai"];
168
+
169
+ function serializeSkills(skills: AgentFormData["skills"]) {
170
+ return (skills ?? []).map((skill) => (
171
+ skill.condition?.trim()
172
+ ? `${skill.file} | ${skill.condition}`
173
+ : skill.file
174
+ )).join("\n");
175
+ }
176
+
177
+ function parseSkillsText(skillsText: string) {
178
+ return skillsText
179
+ .split("\n")
180
+ .map((line) => line.trim())
181
+ .filter(Boolean)
182
+ .map((line) => {
183
+ const [file, ...conditionParts] = line.split("|");
184
+ return {
185
+ file: file.trim(),
186
+ condition: conditionParts.join("|").trim(),
187
+ };
188
+ })
189
+ .filter((skill) => skill.file.length > 0);
190
+ }
191
+
192
+ function buildAgentFormJson(data: AgentFormData, projectIds?: string[]) {
193
+ return JSON.stringify(
194
+ {
195
+ name: data.name,
196
+ provider: data.provider,
197
+ model: data.model,
198
+ identity: data.identity,
199
+ color: data.color ?? "#6B7280",
200
+ skills: data.skills ?? [],
201
+ ...(projectIds ? { projectIds } : {}),
202
+ },
203
+ null,
204
+ 2
205
+ );
206
+ }
207
+
208
+ function parseAgentFormJson(raw: string, currentProvider: ChatProvider) {
209
+ let parsed: unknown;
210
+ try {
211
+ parsed = JSON.parse(raw);
212
+ } catch {
213
+ throw new Error("JSON is invalid.");
214
+ }
215
+
216
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
217
+ throw new Error("JSON must be an object.");
218
+ }
219
+
220
+ const obj = parsed as Record<string, unknown>;
221
+ const providerValue = typeof obj.provider === "string" ? obj.provider : currentProvider;
222
+ const provider = AGENT_FORM_PROVIDERS.includes(providerValue as ChatProvider)
223
+ ? providerValue as ChatProvider
224
+ : currentProvider;
225
+
226
+ const skillsInput = Array.isArray(obj.skills) ? obj.skills : [];
227
+ const skills = skillsInput.flatMap((entry) => {
228
+ if (typeof entry === "string") {
229
+ const [file, ...conditionParts] = entry.split("|");
230
+ const trimmedFile = file.trim();
231
+ return trimmedFile
232
+ ? [{ file: trimmedFile, condition: conditionParts.join("|").trim() }]
233
+ : [];
234
+ }
235
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) return [];
236
+ const file = typeof entry.file === "string" ? entry.file.trim() : "";
237
+ if (!file) return [];
238
+ return [{
239
+ file,
240
+ condition: typeof entry.condition === "string" ? entry.condition.trim() : "",
241
+ }];
242
+ });
243
+
244
+ const projectIds = Array.isArray(obj.projectIds)
245
+ ? obj.projectIds.filter((projectId): projectId is string => typeof projectId === "string" && projectId.trim().length > 0)
246
+ : undefined;
247
+
248
+ return {
249
+ data: {
250
+ name: typeof obj.name === "string" ? obj.name : "",
251
+ provider,
252
+ model: typeof obj.model === "string" ? obj.model : "",
253
+ identity: typeof obj.identity === "string" ? obj.identity : "",
254
+ color: typeof obj.color === "string" && obj.color.trim() ? obj.color : "#6B7280",
255
+ skills,
256
+ } satisfies AgentFormData,
257
+ projectIds,
258
+ };
259
+ }
260
+
163
261
  interface AgentInspectabilitySummary {
164
262
  learnedMemories: Array<{
165
263
  id: string;
@@ -212,20 +310,36 @@ export function AgentForm({
212
310
  const [model, setModel] = useState(initial.model);
213
311
  const [identity, setIdentity] = useState(initial.identity);
214
312
  const [color, setColor] = useState(initial.color ?? "#6B7280");
215
- const [skillsText, setSkillsText] = useState(
216
- (initial.skills ?? []).map((skill) => (
217
- skill.condition?.trim()
218
- ? `${skill.file} | ${skill.condition}`
219
- : skill.file
220
- )).join("\n")
221
- );
313
+ const [skillsText, setSkillsText] = useState(serializeSkills(initial.skills));
222
314
  const [selectedProjectIds, setSelectedProjectIds] = useState<Set<string>>(new Set(initialProjectIds ?? []));
223
315
  const [inspectability, setInspectability] = useState<AgentInspectabilitySummary | null>(null);
224
316
  const [projectKnowledgeSummaries, setProjectKnowledgeSummaries] = useState<ProjectKnowledgeSummary[]>([]);
317
+ const [viewMode, setViewMode] = useState<AgentFormViewMode>("form");
318
+ const [jsonText, setJsonText] = useState(() => buildAgentFormJson(initial, projects ? (initialProjectIds ?? []) : undefined));
319
+ const [jsonError, setJsonError] = useState<string | null>(null);
320
+ const [jsonCopied, setJsonCopied] = useState(false);
225
321
  const ref = useRef<HTMLDivElement>(null);
226
322
 
227
323
  useClickOutside(ref, onCancel);
228
324
 
325
+ useEffect(() => {
326
+ if (viewMode !== "form") return;
327
+ setJsonText(buildAgentFormJson({
328
+ name,
329
+ provider,
330
+ model,
331
+ identity,
332
+ color,
333
+ skills: parseSkillsText(skillsText),
334
+ }, projects ? Array.from(selectedProjectIds) : undefined));
335
+ }, [viewMode, name, provider, model, identity, color, skillsText, selectedProjectIds, projects]);
336
+
337
+ useEffect(() => {
338
+ if (!jsonCopied) return;
339
+ const timeoutId = window.setTimeout(() => setJsonCopied(false), 1200);
340
+ return () => window.clearTimeout(timeoutId);
341
+ }, [jsonCopied]);
342
+
229
343
  useEffect(() => {
230
344
  let cancelled = false;
231
345
 
@@ -321,43 +435,109 @@ export function AgentForm({
321
435
  };
322
436
  }, [projectMemberships, projects]);
323
437
 
438
+ const applyParsedJson = (raw: string) => {
439
+ const parsed = parseAgentFormJson(raw, provider);
440
+ const validProjectIds = projects
441
+ ? (parsed.projectIds ?? []).filter((projectId) => projects.some((project) => project.id === projectId))
442
+ : undefined;
443
+ setName(parsed.data.name);
444
+ setProvider(parsed.data.provider);
445
+ setModel(parsed.data.model);
446
+ setIdentity(parsed.data.identity);
447
+ setColor(parsed.data.color ?? "#6B7280");
448
+ setSkillsText(serializeSkills(parsed.data.skills));
449
+ if (projects) {
450
+ setSelectedProjectIds(new Set(validProjectIds ?? []));
451
+ }
452
+ setJsonText(buildAgentFormJson(parsed.data, projects ? (validProjectIds ?? []) : undefined));
453
+ setJsonError(null);
454
+ return {
455
+ ...parsed,
456
+ projectIds: validProjectIds,
457
+ };
458
+ };
459
+
460
+ const switchToFormView = () => {
461
+ if (viewMode === "form") return;
462
+ try {
463
+ applyParsedJson(jsonText);
464
+ setViewMode("form");
465
+ } catch (error) {
466
+ setJsonError(error instanceof Error ? error.message : "Unable to parse JSON.");
467
+ }
468
+ };
469
+
470
+ const switchToJsonView = () => {
471
+ setJsonText(buildAgentFormJson({
472
+ name,
473
+ provider,
474
+ model,
475
+ identity,
476
+ color,
477
+ skills: parseSkillsText(skillsText),
478
+ }, projects ? Array.from(selectedProjectIds) : undefined));
479
+ setJsonError(null);
480
+ setViewMode("json");
481
+ };
482
+
483
+ const handleCopyJson = async () => {
484
+ try {
485
+ await navigator.clipboard.writeText(jsonText);
486
+ setJsonCopied(true);
487
+ } catch {
488
+ setJsonCopied(false);
489
+ }
490
+ };
491
+
324
492
  const handleSubmit = () => {
325
- if (!name.trim() || !model.trim()) return;
326
- const skills = skillsText
327
- .split("\n")
328
- .map((line) => line.trim())
329
- .filter(Boolean)
330
- .map((line) => {
331
- const [file, ...conditionParts] = line.split("|");
332
- return {
333
- file: file.trim(),
334
- condition: conditionParts.join("|").trim(),
335
- };
336
- })
337
- .filter((skill) => skill.file.length > 0);
493
+ let nextName = name.trim();
494
+ let nextProvider = provider;
495
+ let nextModel = model.trim();
496
+ let nextIdentity = identity.trim();
497
+ let nextColor = color;
498
+ let nextSkills = parseSkillsText(skillsText);
499
+ let nextProjectIds = projects ? Array.from(selectedProjectIds) : undefined;
500
+
501
+ if (viewMode === "json") {
502
+ try {
503
+ const parsed = applyParsedJson(jsonText);
504
+ nextName = parsed.data.name.trim();
505
+ nextProvider = parsed.data.provider;
506
+ nextModel = parsed.data.model.trim();
507
+ nextIdentity = parsed.data.identity.trim();
508
+ nextColor = parsed.data.color ?? "#6B7280";
509
+ nextSkills = parsed.data.skills ?? [];
510
+ nextProjectIds = projects ? (parsed.projectIds ?? []) : undefined;
511
+ } catch (error) {
512
+ setJsonError(error instanceof Error ? error.message : "Unable to parse JSON.");
513
+ return;
514
+ }
515
+ }
516
+
517
+ if (!nextName || !nextModel) return;
338
518
 
339
519
  onSubmit(
340
520
  {
341
- name: name.trim(),
342
- provider,
343
- model: model.trim(),
344
- identity: identity.trim(),
345
- color,
346
- skills,
521
+ name: nextName,
522
+ provider: nextProvider,
523
+ model: nextModel,
524
+ identity: nextIdentity,
525
+ color: nextColor,
526
+ skills: nextSkills,
347
527
  },
348
- projects ? Array.from(selectedProjectIds) : undefined
528
+ nextProjectIds
349
529
  );
350
530
  };
351
531
 
352
532
  return (
353
533
  <div
354
534
  ref={ref}
355
- className="fixed inset-0 z-[100] flex items-center justify-center p-4 bg-slate-500/20 backdrop-blur-sm"
535
+ className="fixed inset-0 z-[100] flex items-center justify-center p-4 bg-black/30 backdrop-blur-sm"
356
536
  onKeyDown={(e) => {
357
537
  if (e.key === "Escape") onCancel();
358
538
  }}
359
539
  >
360
- <div className="bg-white rounded-[32px] shadow-2xl overflow-hidden w-full max-w-2xl max-h-[90vh] flex flex-col animate-in fade-in zoom-in duration-300">
540
+ <div className="bg-[var(--card-bg)] rounded-[32px] shadow-2xl overflow-hidden w-full max-w-2xl max-h-[90vh] flex flex-col animate-in fade-in zoom-in duration-300">
361
541
  <div className="px-8 pt-8 pb-4 shrink-0 flex items-center justify-between">
362
542
  <div className="flex items-center gap-4">
363
543
  {agentId && (
@@ -365,291 +545,355 @@ export function AgentForm({
365
545
  <img
366
546
  src={agentAvatarUrl(agentId, 64, color)}
367
547
  alt={name}
368
- className="w-14 h-14 rounded-full bg-slate-100"
548
+ className="w-14 h-14 rounded-full bg-[var(--muted)]"
369
549
  />
370
550
  <div className="flex items-center gap-1.5">
371
- <label className="text-[10px] text-slate-400">Color</label>
551
+ <label className="text-[10px] text-[var(--muted-foreground)]">Color</label>
372
552
  <input
373
553
  type="color"
374
554
  value={color}
375
555
  onChange={(e) => setColor(e.target.value)}
376
- className="w-5 h-5 rounded border border-slate-200 cursor-pointer p-0"
556
+ className="w-5 h-5 rounded border border-[var(--border)] cursor-pointer p-0"
377
557
  />
378
558
  </div>
379
559
  </div>
380
560
  )}
381
561
  <div>
382
- <h2 className="text-[10px] font-bold tracking-widest text-slate-400 uppercase">{title}</h2>
562
+ <h2 className="text-[10px] font-bold tracking-widest text-[var(--muted-foreground)] uppercase">{title}</h2>
383
563
  <h1 className="text-2xl font-semibold mt-1">{name || "Configure Agent"}</h1>
384
564
  </div>
385
565
  </div>
386
566
  <button
387
567
  onClick={onCancel}
388
- className="p-2 text-slate-400 hover:text-slate-600 hover:bg-slate-100 rounded-full transition-all"
568
+ className="p-2 text-[var(--muted-foreground)] hover:text-[var(--muted-foreground)] hover:bg-[var(--muted)] rounded-full transition-all"
389
569
  >
390
570
  <X size={20} />
391
571
  </button>
392
572
  </div>
393
573
 
394
574
  <div className="px-8 pb-8 space-y-6 overflow-y-auto">
395
- <div className="space-y-2">
396
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
397
- <User size={16} /> Name
398
- </label>
399
- <input
400
- type="text"
401
- value={name}
402
- onChange={(e) => setName(e.target.value)}
403
- className="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all"
404
- placeholder="Enter agent name..."
405
- autoFocus
406
- />
575
+ <div className="flex items-center justify-between gap-3">
576
+ <div className="inline-flex rounded-xl bg-[var(--muted)] p-1">
577
+ <button
578
+ type="button"
579
+ onClick={switchToFormView}
580
+ className={viewMode === "form"
581
+ ? "px-3 py-1.5 text-xs font-semibold rounded-lg bg-[var(--card-bg)] text-[var(--foreground)] shadow-sm"
582
+ : "px-3 py-1.5 text-xs font-semibold rounded-lg text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}
583
+ >
584
+ Form
585
+ </button>
586
+ <button
587
+ type="button"
588
+ onClick={switchToJsonView}
589
+ className={viewMode === "json"
590
+ ? "px-3 py-1.5 text-xs font-semibold rounded-lg bg-[var(--card-bg)] text-[var(--foreground)] shadow-sm"
591
+ : "px-3 py-1.5 text-xs font-semibold rounded-lg text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}
592
+ >
593
+ JSON
594
+ </button>
595
+ </div>
596
+ {viewMode === "json" && (
597
+ <button
598
+ type="button"
599
+ onClick={handleCopyJson}
600
+ className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-semibold text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] rounded-lg transition-colors"
601
+ >
602
+ {jsonCopied ? <Check size={14} className="text-emerald-500" /> : <Copy size={14} />}
603
+ {jsonCopied ? "Copied" : "Copy"}
604
+ </button>
605
+ )}
407
606
  </div>
408
607
 
409
- <div className="grid grid-cols-2 gap-4">
410
- <div className="space-y-2">
411
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
412
- <Box size={16} /> Provider
413
- </label>
414
- <div className="relative">
415
- <select
416
- value={provider}
417
- onChange={(e) => setProvider(e.target.value as ChatProvider)}
418
- className="w-full appearance-none px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all pr-10 cursor-pointer"
419
- >
420
- <option value="claude">Claude</option>
421
- <option value="ollama">Ollama</option>
422
- <option value="gemini">Gemini</option>
423
- <option value="codex">Codex</option>
424
- <option value="zai">Z.AI</option>
425
- </select>
426
- <ChevronDown className="absolute right-3 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none" size={16} />
608
+ {viewMode === "form" ? (
609
+ <>
610
+ <div className="space-y-2">
611
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
612
+ <User size={16} /> Name
613
+ </label>
614
+ <input
615
+ type="text"
616
+ value={name}
617
+ onChange={(e) => setName(e.target.value)}
618
+ className="w-full px-4 py-3 bg-[var(--app-shell-subtle)] border border-[var(--border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all"
619
+ placeholder="Enter agent name..."
620
+ autoFocus
621
+ />
427
622
  </div>
428
- </div>
429
- <div className="space-y-2">
430
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
431
- <Cpu size={16} /> Model
432
- </label>
433
- <input
434
- type="text"
435
- value={model}
436
- onChange={(e) => setModel(e.target.value)}
437
- className="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all font-mono text-sm"
438
- placeholder="e.g. claude-sonnet-4-6"
439
- />
440
- </div>
441
- </div>
442
623
 
443
- <div className="space-y-2">
444
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
445
- <BookOpen size={16} /> Identity
446
- </label>
447
- <div className="border border-slate-200 rounded-xl overflow-hidden bg-slate-50 focus-within:ring-2 focus-within:ring-indigo-500/20 focus-within:border-indigo-500 transition-all">
448
- <RichTextEditor
449
- content={identity}
450
- onChange={(md) => setIdentity(md)}
451
- placeholder="Describe the agent's identity and role..."
452
- />
453
- </div>
454
- <p className="text-xs text-slate-400">Identity defines who the agent is. Keep portable knowledge separate below; project and repo knowledge belong on their scoped surfaces.</p>
455
- </div>
624
+ <div className="grid grid-cols-2 gap-4">
625
+ <div className="space-y-2">
626
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
627
+ <Box size={16} /> Provider
628
+ </label>
629
+ <div className="relative">
630
+ <select
631
+ value={provider}
632
+ onChange={(e) => setProvider(e.target.value as ChatProvider)}
633
+ className="w-full appearance-none px-4 py-3 bg-[var(--app-shell-subtle)] border border-[var(--border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all pr-10 cursor-pointer"
634
+ >
635
+ <option value="claude">Claude</option>
636
+ <option value="ollama">Ollama</option>
637
+ <option value="gemini">Gemini</option>
638
+ <option value="codex">Codex</option>
639
+ <option value="zai">Z.AI</option>
640
+ </select>
641
+ <ChevronDown className="absolute right-3 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)] pointer-events-none" size={16} />
642
+ </div>
643
+ </div>
644
+ <div className="space-y-2">
645
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
646
+ <Cpu size={16} /> Model
647
+ </label>
648
+ <input
649
+ type="text"
650
+ value={model}
651
+ onChange={(e) => setModel(e.target.value)}
652
+ className="w-full px-4 py-3 bg-[var(--app-shell-subtle)] border border-[var(--border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all font-mono text-sm"
653
+ placeholder="e.g. claude-sonnet-4-6"
654
+ />
655
+ </div>
656
+ </div>
456
657
 
457
- <div className="space-y-2">
458
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
459
- <Sparkles size={16} /> Portable Knowledge
460
- </label>
461
- <textarea
462
- value={skillsText}
463
- onChange={(e) => setSkillsText(e.target.value)}
464
- rows={5}
465
- className="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all font-mono text-xs"
466
- placeholder={"one/path/to/skill.md\npath/to/skill.md | when coding in TypeScript"}
467
- />
468
- <p className="text-xs text-slate-400">Portable agent knowledge only. One reference per line. Use <code>|</code> to add an optional condition.</p>
469
- </div>
658
+ <div className="space-y-2">
659
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
660
+ <BookOpen size={16} /> Identity
661
+ </label>
662
+ <div className="border border-[var(--border)] rounded-xl overflow-hidden bg-[var(--app-shell-subtle)] focus-within:ring-2 focus-within:ring-indigo-500/20 focus-within:border-indigo-500 transition-all">
663
+ <RichTextEditor
664
+ content={identity}
665
+ onChange={(md) => setIdentity(md)}
666
+ placeholder="Describe the agent's identity and role..."
667
+ />
668
+ </div>
669
+ <p className="text-xs text-[var(--muted-foreground)]">Identity defines who the agent is. Keep portable knowledge separate below; project and repo knowledge belong on their scoped surfaces.</p>
670
+ </div>
470
671
 
471
- {agentId && (
472
- <div className="space-y-3">
473
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
474
- <Sparkles size={16} /> System-Generated Agent Knowledge
475
- </label>
476
- {inspectability?.learnedMemories?.length ? (
477
- <div className="space-y-2 max-h-48 overflow-y-auto">
478
- {inspectability.learnedMemories.map((item) => (
479
- <div key={item.id} className="rounded-xl border border-slate-200 bg-slate-50 px-3 py-2">
480
- <div className="flex items-center justify-between gap-2">
481
- <span className="text-[10px] font-bold uppercase tracking-wide text-slate-400">{item.type}</span>
482
- <span className="text-[10px] text-slate-400">{new Date(item.createdAt).toLocaleString()}</span>
483
- </div>
484
- <p className="mt-1 text-xs text-slate-700 leading-relaxed">{item.content}</p>
672
+ <div className="space-y-2">
673
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
674
+ <Sparkles size={16} /> Portable Knowledge
675
+ </label>
676
+ <textarea
677
+ value={skillsText}
678
+ onChange={(e) => setSkillsText(e.target.value)}
679
+ rows={5}
680
+ className="w-full px-4 py-3 bg-[var(--app-shell-subtle)] border border-[var(--border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all font-mono text-xs"
681
+ placeholder={"one/path/to/skill.md\npath/to/skill.md | when coding in TypeScript"}
682
+ />
683
+ <p className="text-xs text-[var(--muted-foreground)]">Portable agent knowledge only. One reference per line. Use <code>|</code> to add an optional condition.</p>
684
+ </div>
685
+
686
+ {agentId && (
687
+ <div className="space-y-3">
688
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
689
+ <Sparkles size={16} /> System-Generated Agent Knowledge
690
+ </label>
691
+ {inspectability?.learnedMemories?.length ? (
692
+ <div className="space-y-2 max-h-48 overflow-y-auto">
693
+ {inspectability.learnedMemories.map((item) => (
694
+ <div key={item.id} className="rounded-xl border border-[var(--border)] bg-[var(--app-shell-subtle)] px-3 py-2">
695
+ <div className="flex items-center justify-between gap-2">
696
+ <span className="text-[10px] font-bold uppercase tracking-wide text-[var(--muted-foreground)]">{item.type}</span>
697
+ <span className="text-[10px] text-[var(--muted-foreground)]">{new Date(item.createdAt).toLocaleString()}</span>
698
+ </div>
699
+ <p className="mt-1 text-xs text-[var(--foreground)] leading-relaxed">{item.content}</p>
700
+ </div>
701
+ ))}
485
702
  </div>
486
- ))}
703
+ ) : (
704
+ <p className="text-xs text-[var(--muted-foreground)]">No system-generated agent knowledge yet.</p>
705
+ )}
487
706
  </div>
488
- ) : (
489
- <p className="text-xs text-slate-400">No system-generated agent knowledge yet.</p>
490
707
  )}
491
- </div>
492
- )}
493
708
 
494
- {projects && projects.length > 0 && (
495
- <div className="space-y-3">
496
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
497
- <FolderOpen size={16} /> Assign To Projects
498
- </label>
499
- <div className="space-y-1 max-h-[160px] overflow-y-auto">
500
- {projects.map((project) => {
501
- const checked = selectedProjectIds.has(project.id);
502
- return (
503
- <button
504
- key={project.id}
505
- type="button"
506
- className={
507
- checked
508
- ? "w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors bg-indigo-50 text-indigo-700"
509
- : "w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-slate-600 hover:bg-slate-50"
510
- }
511
- onClick={() => setSelectedProjectIds((prev) => {
512
- const next = new Set(prev);
513
- if (next.has(project.id)) next.delete(project.id); else next.add(project.id);
514
- return next;
515
- })}
516
- >
517
- <div className={
518
- checked
519
- ? "w-4 h-4 rounded border flex-shrink-0 flex items-center justify-center bg-indigo-600 border-indigo-600"
520
- : "w-4 h-4 rounded border flex-shrink-0 flex items-center justify-center border-slate-300"
521
- }>
522
- {checked && <svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 5l2 2 4-4" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/></svg>}
523
- </div>
524
- <span className="text-xs font-medium text-left">{project.label ?? project.name}</span>
525
- </button>
526
- );
527
- })}
528
- </div>
529
- </div>
530
- )}
531
-
532
- {projectMemberships && (
533
- <div className="space-y-3">
534
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
535
- <FolderOpen size={16} /> Project Memberships
536
- </label>
537
- {projectMemberships.current.length > 0 ? (
538
- <div className="flex flex-col gap-1">
539
- {projectMemberships.current.map((project) => (
540
- <div key={project.id} className="flex items-center gap-2 text-xs bg-slate-50 rounded-lg px-3 py-2">
541
- <FolderOpen size={12} className="text-slate-400 shrink-0" />
542
- <span className="truncate flex-1">{project.name}</span>
543
- {onRemoveFromProject && !project.is_default && (
709
+ {projects && projects.length > 0 && (
710
+ <div className="space-y-3">
711
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
712
+ <FolderOpen size={16} /> Assign To Projects
713
+ </label>
714
+ <div className="space-y-1 max-h-[160px] overflow-y-auto">
715
+ {projects.map((project) => {
716
+ const checked = selectedProjectIds.has(project.id);
717
+ return (
544
718
  <button
719
+ key={project.id}
545
720
  type="button"
546
- className="text-slate-400 hover:text-red-500 transition-colors"
547
- onClick={() => onRemoveFromProject(project.id)}
548
- title="Remove from project"
721
+ className={
722
+ checked
723
+ ? "w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors bg-indigo-50 text-indigo-700"
724
+ : "w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-[var(--muted-foreground)] hover:bg-[var(--app-shell-subtle)]"
725
+ }
726
+ onClick={() => setSelectedProjectIds((prev) => {
727
+ const next = new Set(prev);
728
+ if (next.has(project.id)) next.delete(project.id); else next.add(project.id);
729
+ return next;
730
+ })}
549
731
  >
550
- <X size={12} />
732
+ <div className={
733
+ checked
734
+ ? "w-4 h-4 rounded border flex-shrink-0 flex items-center justify-center bg-indigo-600 border-indigo-600"
735
+ : "w-4 h-4 rounded border flex-shrink-0 flex items-center justify-center border-[var(--border)]"
736
+ }>
737
+ {checked && <svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 5l2 2 4-4" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/></svg>}
738
+ </div>
739
+ <span className="text-xs font-medium text-left">{project.label ?? project.name}</span>
551
740
  </button>
552
- )}
553
- </div>
554
- ))}
741
+ );
742
+ })}
743
+ </div>
555
744
  </div>
556
- ) : (
557
- <p className="text-xs text-slate-400 italic">Not assigned to any projects</p>
558
745
  )}
559
- {projectMemberships.available.length > 0 && onAddToProject && (
560
- <div className="flex flex-wrap gap-1">
561
- {projectMemberships.available.map((project) => (
562
- <button
563
- key={project.id}
564
- type="button"
565
- className="inline-flex items-center gap-1 text-[10px] px-2 py-1 rounded-lg border border-dashed border-slate-300 text-slate-500 hover:border-slate-400 hover:text-slate-700 transition-colors"
566
- onClick={() => onAddToProject(project.id)}
567
- >
568
- <Plus size={10} />
569
- {project.name}
570
- </button>
571
- ))}
746
+
747
+ {projectMemberships && (
748
+ <div className="space-y-3">
749
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
750
+ <FolderOpen size={16} /> Project Memberships
751
+ </label>
752
+ {projectMemberships.current.length > 0 ? (
753
+ <div className="flex flex-col gap-1">
754
+ {projectMemberships.current.map((project) => (
755
+ <div key={project.id} className="flex items-center gap-2 text-xs bg-[var(--app-shell-subtle)] rounded-lg px-3 py-2">
756
+ <FolderOpen size={12} className="text-[var(--muted-foreground)] shrink-0" />
757
+ <span className="truncate flex-1">{project.name}</span>
758
+ {onRemoveFromProject && !project.is_default && (
759
+ <button
760
+ type="button"
761
+ className="text-[var(--muted-foreground)] hover:text-red-500 transition-colors"
762
+ onClick={() => onRemoveFromProject(project.id)}
763
+ title="Remove from project"
764
+ >
765
+ <X size={12} />
766
+ </button>
767
+ )}
768
+ </div>
769
+ ))}
770
+ </div>
771
+ ) : (
772
+ <p className="text-xs text-[var(--muted-foreground)] italic">Not assigned to any projects</p>
773
+ )}
774
+ {projectMemberships.available.length > 0 && onAddToProject && (
775
+ <div className="flex flex-wrap gap-1">
776
+ {projectMemberships.available.map((project) => (
777
+ <button
778
+ key={project.id}
779
+ type="button"
780
+ className="inline-flex items-center gap-1 text-[10px] px-2 py-1 rounded-lg border border-dashed border-[var(--border)] text-[var(--muted-foreground)] hover:border-[var(--border)] hover:text-[var(--foreground)] transition-colors"
781
+ onClick={() => onAddToProject(project.id)}
782
+ >
783
+ <Plus size={10} />
784
+ {project.name}
785
+ </button>
786
+ ))}
787
+ </div>
788
+ )}
572
789
  </div>
573
790
  )}
574
- </div>
575
- )}
576
791
 
577
- {agentId && projectKnowledgeSummaries.length > 0 && (
578
- <div className="space-y-3">
579
- <label className="flex items-center gap-2 text-sm font-medium text-slate-500">
580
- <FolderOpen size={16} /> Scoped Knowledge Summary
581
- </label>
582
- <div className="space-y-2">
583
- {projectKnowledgeSummaries.map((project) => (
584
- <div key={project.id} className="rounded-xl border border-slate-200 bg-slate-50 px-3 py-3">
585
- <div className="text-xs font-semibold text-slate-800">{project.name}</div>
586
- <div className="mt-2 grid grid-cols-2 sm:grid-cols-5 gap-2 text-[10px] text-slate-500">
587
- <div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
588
- <div className="font-bold text-slate-700">{project.projectKnowledgeReferences}</div>
589
- <div>Project refs</div>
590
- </div>
591
- <div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
592
- <div className="font-bold text-slate-700">{project.projectKnowledgeNotes}</div>
593
- <div>Project notes</div>
594
- </div>
595
- <div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
596
- <div className="font-bold text-slate-700">{project.systemProjectKnowledge}</div>
597
- <div>Project generated</div>
598
- </div>
599
- <div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
600
- <div className="font-bold text-slate-700">{project.repoKnowledgeNotes}</div>
601
- <div>Repo notes</div>
602
- </div>
603
- <div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
604
- <div className="font-bold text-slate-700">{project.systemRepoKnowledge}</div>
605
- <div>Repo generated</div>
606
- </div>
607
- </div>
608
- {(project.projectGeneratedItems.length > 0 || project.repoGeneratedItems.length > 0) && (
609
- <div className="mt-3 space-y-2">
610
- {project.projectGeneratedItems.length > 0 && (
611
- <div className="rounded-lg border border-slate-200 bg-white px-3 py-2">
612
- <div className="text-[10px] font-black uppercase tracking-wide text-slate-400">Project generated</div>
613
- <div className="mt-2 space-y-1">
614
- {project.projectGeneratedItems.map((item) => (
615
- <div key={item.id} className="text-xs text-slate-700 leading-relaxed">
616
- {item.content}
617
- </div>
618
- ))}
619
- </div>
792
+ {agentId && projectKnowledgeSummaries.length > 0 && (
793
+ <div className="space-y-3">
794
+ <label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
795
+ <FolderOpen size={16} /> Scoped Knowledge Summary
796
+ </label>
797
+ <div className="space-y-2">
798
+ {projectKnowledgeSummaries.map((project) => (
799
+ <div key={project.id} className="rounded-xl border border-[var(--border)] bg-[var(--app-shell-subtle)] px-3 py-3">
800
+ <div className="text-xs font-semibold text-[var(--foreground)]">{project.name}</div>
801
+ <div className="mt-2 grid grid-cols-2 sm:grid-cols-5 gap-2 text-[10px] text-[var(--muted-foreground)]">
802
+ <div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
803
+ <div className="font-bold text-[var(--foreground)]">{project.projectKnowledgeReferences}</div>
804
+ <div>Project refs</div>
620
805
  </div>
621
- )}
622
- {project.repoGeneratedItems.length > 0 && (
623
- <div className="rounded-lg border border-slate-200 bg-white px-3 py-2">
624
- <div className="text-[10px] font-black uppercase tracking-wide text-slate-400">Repo generated</div>
625
- <div className="mt-2 space-y-1">
626
- {project.repoGeneratedItems.map((item) => (
627
- <div key={item.id} className="text-xs text-slate-700 leading-relaxed">
628
- {item.repoName ? `${item.repoName}: ` : ""}{item.content}
806
+ <div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
807
+ <div className="font-bold text-[var(--foreground)]">{project.projectKnowledgeNotes}</div>
808
+ <div>Project notes</div>
809
+ </div>
810
+ <div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
811
+ <div className="font-bold text-[var(--foreground)]">{project.systemProjectKnowledge}</div>
812
+ <div>Project generated</div>
813
+ </div>
814
+ <div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
815
+ <div className="font-bold text-[var(--foreground)]">{project.repoKnowledgeNotes}</div>
816
+ <div>Repo notes</div>
817
+ </div>
818
+ <div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
819
+ <div className="font-bold text-[var(--foreground)]">{project.systemRepoKnowledge}</div>
820
+ <div>Repo generated</div>
821
+ </div>
822
+ </div>
823
+ {(project.projectGeneratedItems.length > 0 || project.repoGeneratedItems.length > 0) && (
824
+ <div className="mt-3 space-y-2">
825
+ {project.projectGeneratedItems.length > 0 && (
826
+ <div className="rounded-lg border border-[var(--border)] bg-[var(--card-bg)] px-3 py-2">
827
+ <div className="text-[10px] font-black uppercase tracking-wide text-[var(--muted-foreground)]">Project generated</div>
828
+ <div className="mt-2 space-y-1">
829
+ {project.projectGeneratedItems.map((item) => (
830
+ <div key={item.id} className="text-xs text-[var(--foreground)] leading-relaxed">
831
+ {item.content}
832
+ </div>
833
+ ))}
629
834
  </div>
630
- ))}
631
- </div>
835
+ </div>
836
+ )}
837
+ {project.repoGeneratedItems.length > 0 && (
838
+ <div className="rounded-lg border border-[var(--border)] bg-[var(--card-bg)] px-3 py-2">
839
+ <div className="text-[10px] font-black uppercase tracking-wide text-[var(--muted-foreground)]">Repo generated</div>
840
+ <div className="mt-2 space-y-1">
841
+ {project.repoGeneratedItems.map((item) => (
842
+ <div key={item.id} className="text-xs text-[var(--foreground)] leading-relaxed">
843
+ {item.repoName ? `${item.repoName}: ` : ""}{item.content}
844
+ </div>
845
+ ))}
846
+ </div>
847
+ </div>
848
+ )}
632
849
  </div>
633
850
  )}
634
851
  </div>
635
- )}
852
+ ))}
636
853
  </div>
637
- ))}
854
+ <p className="text-xs text-[var(--muted-foreground)]">Project and repo knowledge are edited on their scoped project surfaces.</p>
855
+ </div>
856
+ )}
857
+ </>
858
+ ) : (
859
+ <div className="space-y-3">
860
+ <div className="flex items-center justify-between gap-3">
861
+ <p className="text-xs text-[var(--muted-foreground)]">Paste agent JSON here. Switching back to Form or saving will apply valid JSON to the form state.</p>
862
+ <button
863
+ type="button"
864
+ onClick={switchToFormView}
865
+ className="px-3 py-1.5 text-xs font-semibold text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] rounded-lg transition-colors"
866
+ >
867
+ Apply to Form
868
+ </button>
638
869
  </div>
639
- <p className="text-xs text-slate-400">Project and repo knowledge are edited on their scoped project surfaces.</p>
870
+ <textarea
871
+ value={jsonText}
872
+ onChange={(e) => {
873
+ setJsonText(e.target.value);
874
+ if (jsonError) setJsonError(null);
875
+ }}
876
+ rows={22}
877
+ className="w-full px-4 py-3 bg-[var(--app-shell-bg)] text-[var(--foreground)] border border-[var(--app-shell-border)] rounded-2xl focus:outline-none focus:ring-2 focus:ring-[var(--ring)] focus:border-[var(--primary)] transition-all font-mono text-xs"
878
+ spellCheck={false}
879
+ autoFocus
880
+ />
881
+ {jsonError && (
882
+ <p className="text-xs text-red-500">{jsonError}</p>
883
+ )}
640
884
  </div>
641
885
  )}
642
886
 
643
- <div className="flex items-center justify-end gap-3 pt-4 border-t border-slate-100">
887
+ <div className="flex items-center justify-end gap-3 pt-4 border-t border-[var(--border)]">
644
888
  <button
645
889
  onClick={onCancel}
646
- className="px-6 py-2.5 text-sm font-semibold text-slate-500 hover:text-slate-800 hover:bg-slate-50 rounded-xl transition-all"
890
+ className="px-6 py-2.5 text-sm font-semibold text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--app-shell-subtle)] rounded-xl transition-all"
647
891
  >
648
892
  Cancel
649
893
  </button>
650
894
  <button
651
895
  onClick={handleSubmit}
652
- disabled={!name.trim() || !model.trim()}
896
+ disabled={viewMode === "form" ? (!name.trim() || !model.trim()) : false}
653
897
  className="px-8 py-2.5 bg-indigo-600 text-white text-sm font-semibold rounded-xl shadow-[0_4px_12px_rgba(79,70,229,0.3)] hover:bg-indigo-700 active:scale-95 disabled:opacity-50 transition-all font-bold"
654
898
  >
655
899
  {submitLabel}
@@ -723,7 +967,7 @@ export function ParticipantBar({
723
967
  return (
724
968
  <React.Fragment key={p.id}>
725
969
  {showDivider && (
726
- <div className="mx-2 my-1 border-t border-dashed border-slate-200" />
970
+ <div className="mx-2 my-1 border-t border-dashed border-[var(--border)]" />
727
971
  )}
728
972
  <SortableAgentItem
729
973
  p={p}
@@ -757,7 +1001,7 @@ export function ParticipantBar({
757
1001
  onClick={() => {
758
1002
  setOpenPanel(openPanel === "add" ? null : "add");
759
1003
  }}
760
- className="w-full flex items-center justify-center gap-1 px-3 py-2 rounded-md text-sm font-medium text-slate-500 hover:text-slate-800 hover:bg-slate-100 transition-colors"
1004
+ className="w-full flex items-center justify-center gap-1 px-3 py-2 rounded-md text-sm font-medium text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] transition-colors"
761
1005
  >
762
1006
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="M12 5v14" /></svg>
763
1007
  Add agent
@@ -821,7 +1065,7 @@ export function ParticipantBar({
821
1065
  <div className="relative">
822
1066
  <button
823
1067
  onClick={() => setOpenPanel(openPanel === "add" ? null : "add")}
824
- className="text-xs border border-slate-200 text-slate-500 hover:text-slate-800 hover:border-slate-300 hover:bg-slate-50 transition-all font-medium flex items-center gap-1 px-2.5 py-1 rounded-full"
1068
+ className="text-xs border border-[var(--border)] text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:border-[var(--border)] hover:bg-[var(--app-shell-subtle)] transition-all font-medium flex items-center gap-1 px-2.5 py-1 rounded-full"
825
1069
  >
826
1070
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="M12 5v14" /></svg>
827
1071
  Add agent