@shepai/cli 1.202.1-pr606.60460ac → 1.202.2

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 (372) hide show
  1. package/package.json +1 -1
  2. package/web/.next/BUILD_ID +1 -1
  3. package/web/.next/build-manifest.json +2 -2
  4. package/web/.next/fallback-build-manifest.json +2 -2
  5. package/web/.next/prerender-manifest.json +3 -3
  6. package/web/.next/required-server-files.js +2 -2
  7. package/web/.next/required-server-files.json +2 -2
  8. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +4 -4
  9. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +37 -37
  10. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  11. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  12. package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +4 -4
  13. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +35 -35
  14. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  15. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +4 -4
  17. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +38 -38
  18. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +4 -4
  21. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +47 -47
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +47 -47
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +4 -4
  29. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +36 -36
  30. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +4 -4
  33. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +36 -36
  34. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/chat/page/react-loadable-manifest.json +4 -4
  37. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +35 -35
  38. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/control-center/page/react-loadable-manifest.json +4 -4
  41. package/web/.next/server/app/(dashboard)/control-center/page/server-reference-manifest.json +35 -35
  42. package/web/.next/server/app/(dashboard)/control-center/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/control-center/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +4 -4
  45. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +38 -38
  46. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +4 -4
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +47 -47
  50. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +47 -47
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +4 -4
  57. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +36 -36
  58. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +4 -4
  61. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +36 -36
  62. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/_global-error.html +2 -2
  65. package/web/.next/server/app/_global-error.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  68. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  71. package/web/.next/server/app/_not-found/page/react-loadable-manifest.json +4 -4
  72. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +9 -9
  73. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/agent-questions/page/react-loadable-manifest.json +4 -4
  75. package/web/.next/server/app/agent-questions/page/server-reference-manifest.json +11 -11
  76. package/web/.next/server/app/agent-questions/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/agents/[agentType]/page/react-loadable-manifest.json +4 -4
  78. package/web/.next/server/app/agents/[agentType]/page/server-reference-manifest.json +13 -13
  79. package/web/.next/server/app/agents/[agentType]/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/agents/page/react-loadable-manifest.json +4 -4
  81. package/web/.next/server/app/agents/page/server-reference-manifest.json +10 -10
  82. package/web/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/application/[id]/page/react-loadable-manifest.json +4 -4
  84. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +18 -18
  85. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  86. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/application/[id]/supervisor/page/react-loadable-manifest.json +4 -4
  88. package/web/.next/server/app/application/[id]/supervisor/page/server-reference-manifest.json +10 -10
  89. package/web/.next/server/app/application/[id]/supervisor/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/applications/page/react-loadable-manifest.json +4 -4
  91. package/web/.next/server/app/applications/page/server-reference-manifest.json +20 -20
  92. package/web/.next/server/app/applications/page.js.nft.json +1 -1
  93. package/web/.next/server/app/applications/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/features/page/react-loadable-manifest.json +4 -4
  95. package/web/.next/server/app/features/page/server-reference-manifest.json +31 -31
  96. package/web/.next/server/app/features/page.js.nft.json +1 -1
  97. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/onboarding/page/react-loadable-manifest.json +4 -4
  99. package/web/.next/server/app/onboarding/page/server-reference-manifest.json +9 -9
  100. package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/page/react-loadable-manifest.json +4 -4
  102. package/web/.next/server/app/page/server-reference-manifest.json +9 -9
  103. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/projects/[slug]/items/[itemId]/page/react-loadable-manifest.json +4 -4
  105. package/web/.next/server/app/projects/[slug]/items/[itemId]/page/server-reference-manifest.json +16 -16
  106. package/web/.next/server/app/projects/[slug]/items/[itemId]/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/projects/[slug]/page/react-loadable-manifest.json +4 -4
  108. package/web/.next/server/app/projects/[slug]/page/server-reference-manifest.json +28 -28
  109. package/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/projects/[slug]/pages/page/react-loadable-manifest.json +4 -4
  111. package/web/.next/server/app/projects/[slug]/pages/page/server-reference-manifest.json +12 -12
  112. package/web/.next/server/app/projects/[slug]/pages/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/projects/[slug]/settings/page/react-loadable-manifest.json +4 -4
  114. package/web/.next/server/app/projects/[slug]/settings/page/server-reference-manifest.json +18 -18
  115. package/web/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/projects/page/react-loadable-manifest.json +4 -4
  117. package/web/.next/server/app/projects/page/server-reference-manifest.json +10 -10
  118. package/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/settings/page/react-loadable-manifest.json +4 -4
  120. package/web/.next/server/app/settings/page/server-reference-manifest.json +15 -15
  121. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/skills/page/react-loadable-manifest.json +4 -4
  123. package/web/.next/server/app/skills/page/server-reference-manifest.json +17 -17
  124. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/supervisor/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  126. package/web/.next/server/app/supervisor/feature/[featureId]/page/server-reference-manifest.json +10 -10
  127. package/web/.next/server/app/supervisor/feature/[featureId]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/supervisor/page/react-loadable-manifest.json +4 -4
  129. package/web/.next/server/app/supervisor/page/server-reference-manifest.json +10 -10
  130. package/web/.next/server/app/supervisor/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/supervisor/repo/[repositoryId]/page/react-loadable-manifest.json +4 -4
  132. package/web/.next/server/app/supervisor/repo/[repositoryId]/page/server-reference-manifest.json +10 -10
  133. package/web/.next/server/app/supervisor/repo/[repositoryId]/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/app/tools/page/react-loadable-manifest.json +4 -4
  135. package/web/.next/server/app/tools/page/server-reference-manifest.json +15 -15
  136. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/version/page/react-loadable-manifest.json +4 -4
  138. package/web/.next/server/app/version/page/server-reference-manifest.json +9 -9
  139. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/chunks/[root-of-the-server]__10e976f3._.js +1 -1
  141. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agent-questions_page_actions_4b694f8d.js +1 -1
  142. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agent-questions_page_actions_4b694f8d.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agents_[agentType]_page_actions_103679a6.js +1 -1
  144. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agents_[agentType]_page_actions_103679a6.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_projects_[slug]_pages_page_actions_19d50f6c.js +1 -1
  146. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_projects_[slug]_pages_page_actions_19d50f6c.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js +1 -1
  148. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js +1 -1
  150. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  152. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js +1 -1
  154. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__0af8610a._.js +3 -3
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__0af8610a._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b652a2f._.js +1 -1
  158. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b73253b._.js → [root-of-the-server]__2e388ba3._.js} +2 -2
  159. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b73253b._.js.map → [root-of-the-server]__2e388ba3._.js.map} +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__56cf47e7._.js +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__56cf47e7._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__648730d4._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__68df6415._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__68df6415._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bc6bf96._.js +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bc6bf96._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__9852cb08._.js +2 -2
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__9852cb08._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__a1167cec._.js +1 -1
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__a1167cec._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__a12d0ad7._.js +3 -0
  172. package/web/.next/server/chunks/ssr/{[root-of-the-server]__52ca7f88._.js.map → [root-of-the-server]__a12d0ad7._.js.map} +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba699bec._.js +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba699bec._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0741ee1._.js +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0fa59e6._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0fa59e6._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__ea26ff90._.js +3 -3
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__ff0095e3._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_07036593._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_07036593._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/_0d2a7595._.js +1 -1
  183. package/web/.next/server/chunks/ssr/_0d2a7595._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/_101de7c3._.js +1 -1
  185. package/web/.next/server/chunks/ssr/_101de7c3._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/{_db111d21._.js → _10f54ace._.js} +2 -2
  187. package/web/.next/server/chunks/ssr/{_db111d21._.js.map → _10f54ace._.js.map} +1 -1
  188. package/web/.next/server/chunks/ssr/_24fca3cf._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_24fca3cf._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/{_6ff832ad._.js → _2759af76._.js} +2 -2
  191. package/web/.next/server/chunks/ssr/{_6ff832ad._.js.map → _2759af76._.js.map} +1 -1
  192. package/web/.next/server/chunks/ssr/_2bc48f3d._.js +1 -1
  193. package/web/.next/server/chunks/ssr/_2bc48f3d._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/{_fb539286._.js → _2bef1982._.js} +2 -2
  195. package/web/.next/server/chunks/ssr/{_fb539286._.js.map → _2bef1982._.js.map} +1 -1
  196. package/web/.next/server/chunks/ssr/_32f66845._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_408848e6._.js +1 -1
  198. package/web/.next/server/chunks/ssr/_408848e6._.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/_40e02782._.js +1 -1
  200. package/web/.next/server/chunks/ssr/_40e02782._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_486d45d6._.js +1 -1
  202. package/web/.next/server/chunks/ssr/_486d45d6._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/{_824d5772._.js → _498cba11._.js} +2 -2
  204. package/web/.next/server/chunks/ssr/{_824d5772._.js.map → _498cba11._.js.map} +1 -1
  205. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  206. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/_5cbb0e22._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_5cbb0e22._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/{_5a3edc88._.js → _673be4f1._.js} +2 -2
  210. package/web/.next/server/chunks/ssr/{_5a3edc88._.js.map → _673be4f1._.js.map} +1 -1
  211. package/web/.next/server/chunks/ssr/_7ba67729._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_7ba67729._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/_805ae1aa._.js +1 -1
  214. package/web/.next/server/chunks/ssr/_805ae1aa._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/_87cf18c3._.js +1 -1
  216. package/web/.next/server/chunks/ssr/_87cf18c3._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/_8a700ff4._.js +1 -1
  218. package/web/.next/server/chunks/ssr/_8a700ff4._.js.map +1 -1
  219. package/web/.next/server/chunks/ssr/_95b97274._.js +1 -1
  220. package/web/.next/server/chunks/ssr/_95b97274._.js.map +1 -1
  221. package/web/.next/server/chunks/ssr/{_fbcfaf3a._.js → _9d18d1b1._.js} +2 -2
  222. package/web/.next/server/chunks/ssr/{_fbcfaf3a._.js.map → _9d18d1b1._.js.map} +1 -1
  223. package/web/.next/server/chunks/ssr/{_70ff64a1._.js → _a93687e6._.js} +2 -2
  224. package/web/.next/server/chunks/ssr/{_70ff64a1._.js.map → _a93687e6._.js.map} +1 -1
  225. package/web/.next/server/chunks/ssr/_c2e196ee._.js +1 -1
  226. package/web/.next/server/chunks/ssr/_c2e196ee._.js.map +1 -1
  227. package/web/.next/server/chunks/ssr/_ca3b7bf7._.js +1 -1
  228. package/web/.next/server/chunks/ssr/_ca3b7bf7._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/_d53224a9._.js +1 -1
  230. package/web/.next/server/chunks/ssr/_d53224a9._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/_d573dcc2._.js +1 -1
  232. package/web/.next/server/chunks/ssr/_e2671e14._.js +1 -1
  233. package/web/.next/server/chunks/ssr/_e2671e14._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/_ecd45b17._.js +1 -1
  235. package/web/.next/server/chunks/ssr/_ecd45b17._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/{_f0d45e47._.js → _f46d2018._.js} +2 -2
  237. package/web/.next/server/chunks/ssr/{_f0d45e47._.js.map → _f46d2018._.js.map} +1 -1
  238. package/web/.next/server/chunks/ssr/_f602cc9f._.js +1 -1
  239. package/web/.next/server/chunks/ssr/_f602cc9f._.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/{_20a56008._.js → _f71954a5._.js} +2 -2
  241. package/web/.next/server/chunks/ssr/{_20a56008._.js.map → _f71954a5._.js.map} +1 -1
  242. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  243. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  244. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  245. package/web/.next/server/chunks/ssr/src_presentation_web_0e291f0b._.js +1 -1
  246. package/web/.next/server/chunks/ssr/src_presentation_web_0e291f0b._.js.map +1 -1
  247. package/web/.next/server/chunks/ssr/{src_presentation_web_40673f0c._.js → src_presentation_web_16c83ab4._.js} +2 -2
  248. package/web/.next/server/chunks/ssr/{src_presentation_web_40673f0c._.js.map → src_presentation_web_16c83ab4._.js.map} +1 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_1d8d177f._.js +1 -1
  250. package/web/.next/server/chunks/ssr/src_presentation_web_1d8d177f._.js.map +1 -1
  251. package/web/.next/server/chunks/ssr/src_presentation_web_450b58fc._.js +1 -1
  252. package/web/.next/server/chunks/ssr/src_presentation_web_450b58fc._.js.map +1 -1
  253. package/web/.next/server/chunks/ssr/src_presentation_web_47727150._.js +1 -1
  254. package/web/.next/server/chunks/ssr/src_presentation_web_47727150._.js.map +1 -1
  255. package/web/.next/server/chunks/ssr/src_presentation_web_64fcfc84._.js +1 -1
  256. package/web/.next/server/chunks/ssr/src_presentation_web_64fcfc84._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/src_presentation_web_74b7bdb2._.js +1 -1
  258. package/web/.next/server/chunks/ssr/src_presentation_web_74b7bdb2._.js.map +1 -1
  259. package/web/.next/server/chunks/ssr/src_presentation_web_82aeca34._.js +1 -1
  260. package/web/.next/server/chunks/ssr/src_presentation_web_82aeca34._.js.map +1 -1
  261. package/web/.next/server/chunks/ssr/src_presentation_web_8a564d47._.js +1 -1
  262. package/web/.next/server/chunks/ssr/src_presentation_web_8a564d47._.js.map +1 -1
  263. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js +1 -1
  264. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js.map +1 -1
  265. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_f4f3fad9.js +1 -1
  266. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_f4f3fad9.js.map +1 -1
  267. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_agents_page_actions_d4bd4711.js +1 -1
  268. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_agents_page_actions_d4bd4711.js.map +1 -1
  269. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_onboarding_page_actions_bb695e8d.js +1 -1
  270. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_onboarding_page_actions_bb695e8d.js.map +1 -1
  271. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_ac47e420.js +1 -1
  272. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_ac47e420.js.map +1 -1
  273. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_projects_page_actions_c91a23a8.js +1 -1
  274. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_projects_page_actions_c91a23a8.js.map +1 -1
  275. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_63c2d912.js +1 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_63c2d912.js.map +1 -1
  277. package/web/.next/server/chunks/ssr/src_presentation_web_a53a3da6._.js +1 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web_a53a3da6._.js.map +1 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_246617fe._.js +3 -3
  280. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js +1 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js.map +1 -1
  282. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js +1 -1
  283. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js +1 -1
  284. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js.map +1 -1
  285. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +1 -1
  286. package/web/.next/server/chunks/ssr/src_presentation_web_b1b3c26c._.js +1 -1
  287. package/web/.next/server/chunks/ssr/src_presentation_web_b1b3c26c._.js.map +1 -1
  288. package/web/.next/server/chunks/ssr/src_presentation_web_b98a4353._.js +1 -1
  289. package/web/.next/server/chunks/ssr/src_presentation_web_b98a4353._.js.map +1 -1
  290. package/web/.next/server/chunks/ssr/src_presentation_web_c96ca051._.js +1 -1
  291. package/web/.next/server/chunks/ssr/src_presentation_web_c96ca051._.js.map +1 -1
  292. package/web/.next/server/chunks/ssr/{src_presentation_web_e812a69b._.js → src_presentation_web_cb0d2c28._.js} +2 -2
  293. package/web/.next/server/chunks/ssr/{src_presentation_web_e812a69b._.js.map → src_presentation_web_cb0d2c28._.js.map} +1 -1
  294. package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js +1 -1
  295. package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js.map +1 -1
  296. package/web/.next/server/chunks/ssr/src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js +1 -1
  297. package/web/.next/server/chunks/ssr/src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js.map +1 -1
  298. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  299. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  300. package/web/.next/server/chunks/ssr/src_presentation_web_d3858f16._.js +1 -1
  301. package/web/.next/server/chunks/ssr/src_presentation_web_d3858f16._.js.map +1 -1
  302. package/web/.next/server/chunks/ssr/src_presentation_web_d7f8130c._.js +1 -1
  303. package/web/.next/server/chunks/ssr/src_presentation_web_d7f8130c._.js.map +1 -1
  304. package/web/.next/server/chunks/ssr/src_presentation_web_dddd8ccd._.js +1 -1
  305. package/web/.next/server/chunks/ssr/src_presentation_web_dddd8ccd._.js.map +1 -1
  306. package/web/.next/server/chunks/ssr/src_presentation_web_e13d58b0._.js +1 -1
  307. package/web/.next/server/chunks/ssr/src_presentation_web_e13d58b0._.js.map +1 -1
  308. package/web/.next/server/chunks/ssr/src_presentation_web_ee94a9aa._.js +1 -1
  309. package/web/.next/server/chunks/ssr/src_presentation_web_ee94a9aa._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/src_presentation_web_f0fcfdff._.js +1 -1
  311. package/web/.next/server/chunks/ssr/src_presentation_web_f0fcfdff._.js.map +1 -1
  312. package/web/.next/server/chunks/ssr/src_presentation_web_f17e8516._.js +1 -1
  313. package/web/.next/server/chunks/ssr/src_presentation_web_f17e8516._.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/src_presentation_web_f7180fec._.js +1 -1
  315. package/web/.next/server/chunks/ssr/src_presentation_web_f7180fec._.js.map +1 -1
  316. package/web/.next/server/pages/500.html +2 -2
  317. package/web/.next/server/server-reference-manifest.js +1 -1
  318. package/web/.next/server/server-reference-manifest.json +111 -111
  319. package/web/.next/static/chunks/{5faa828877b1e669.js → 03dda23205877d8b.js} +1 -1
  320. package/web/.next/static/chunks/{4bf4f333302e24a4.js → 054e3a5f5ff4db71.js} +1 -1
  321. package/web/.next/static/chunks/{a868014dbe1b4e42.js → 06e58041911c290b.js} +1 -1
  322. package/web/.next/static/chunks/{b5ff852fee23795d.js → 089ef5b749d79ebd.js} +1 -1
  323. package/web/.next/static/chunks/{1a093b13a9d6952e.js → 0d106010c498c198.js} +2 -2
  324. package/web/.next/static/chunks/193e5a0540757f5e.js +1 -0
  325. package/web/.next/static/chunks/{9abc3e68af98e636.js → 25111a2f2597f500.js} +1 -1
  326. package/web/.next/static/chunks/285e724d07901ef6.js +1 -0
  327. package/web/.next/static/chunks/{3c396f63ebefe875.js → 2b2bfc0465b18a7d.js} +1 -1
  328. package/web/.next/static/chunks/{6af99a08ccacdbce.js → 2b436562e69d2827.js} +1 -1
  329. package/web/.next/static/chunks/{8c96a835b3b0dc44.js → 2e3844d0ac487ac7.js} +1 -1
  330. package/web/.next/static/chunks/325859b8a9482427.js +1 -0
  331. package/web/.next/static/chunks/{2773e7b2587bc9cc.js → 44ab458ceb89d85d.js} +1 -1
  332. package/web/.next/static/chunks/4fdf36904f5421a6.js +1 -0
  333. package/web/.next/static/chunks/59004c65d552581c.js +1 -0
  334. package/web/.next/static/chunks/{0edcdc8a2dd06b7a.js → 5c4837e88a3431b8.js} +1 -1
  335. package/web/.next/static/chunks/{a131f868af7f1f7c.js → 74cdd562eb663f72.js} +1 -1
  336. package/web/.next/static/chunks/{0315591c972888a6.js → 7670d76d4ee743e6.js} +1 -1
  337. package/web/.next/static/chunks/{02d88da9fd656fcd.js → 83fc784ce05a701e.js} +1 -1
  338. package/web/.next/static/chunks/{460cedaa85c821e7.js → 8dd4fdd20b103a66.js} +1 -1
  339. package/web/.next/static/chunks/9336bdc7fc319282.js +1 -0
  340. package/web/.next/static/chunks/9d285565922b2de7.js +1 -0
  341. package/web/.next/static/chunks/{45eeca36eabbed23.js → 9f7f2a11937d87eb.js} +1 -1
  342. package/web/.next/static/chunks/{c3931fdbae836be6.js → a7c7bcfb6f7696a3.js} +1 -1
  343. package/web/.next/static/chunks/{9f7985e2a73929a2.js → a8f57d2a12849f32.js} +1 -1
  344. package/web/.next/static/chunks/{0e1c933065a1100a.js → abe98954ccdf29db.js} +1 -1
  345. package/web/.next/static/chunks/{4378715fa2b5e7de.js → b05808da85e8b34c.js} +1 -1
  346. package/web/.next/static/chunks/{b5dc7979d66caa38.js → b5f83e5e1dad23d5.js} +1 -1
  347. package/web/.next/static/chunks/{6d2074fa3453d333.js → b8293a56f257e5a2.js} +1 -1
  348. package/web/.next/static/chunks/{bc5b87e4068ba11d.js → c61c5e97c76dc733.js} +1 -1
  349. package/web/.next/static/chunks/c6b411bf31744ca7.js +1 -0
  350. package/web/.next/static/chunks/{bdaa907bf3d1d932.js → c732d6cc4c5e4343.js} +1 -1
  351. package/web/.next/static/chunks/{25a200f055ae5cba.js → d214d6a670f48d79.js} +1 -1
  352. package/web/.next/static/chunks/{6901861cb53ab483.js → d7b17a93a26e97c8.js} +1 -1
  353. package/web/.next/static/chunks/{a0325f77bbccc63d.js → d8f14fac959a6bd0.js} +1 -1
  354. package/web/.next/static/chunks/{24ea54516dc249c0.js → d98912f5b6cf4938.js} +1 -1
  355. package/web/.next/static/chunks/{21500b3fe3754296.js → df79667c16344317.js} +1 -1
  356. package/web/.next/static/chunks/{05e8df10619fb980.js → ec8f19328ad1ecd4.js} +1 -1
  357. package/web/.next/static/chunks/{e6e6ba783b2e4d14.js → f0157331838ac962.js} +1 -1
  358. package/web/.next/static/chunks/{c687ed21b9518d73.js → f757d865fae71faf.js} +1 -1
  359. package/web/.next/static/chunks/fb3cbb7f575a7128.js +1 -0
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__52ca7f88._.js +0 -3
  361. package/web/.next/static/chunks/03d7b81c2554d52f.js +0 -1
  362. package/web/.next/static/chunks/15acdaaea57bb459.js +0 -1
  363. package/web/.next/static/chunks/39fe1c1397d5483b.js +0 -1
  364. package/web/.next/static/chunks/495883829026f13f.js +0 -1
  365. package/web/.next/static/chunks/4b3a4f416a6eb1ac.js +0 -1
  366. package/web/.next/static/chunks/4b4160f36cf2a3d6.js +0 -1
  367. package/web/.next/static/chunks/7269537b2188650d.js +0 -1
  368. package/web/.next/static/chunks/b1534b2f3d814fef.js +0 -1
  369. package/web/.next/static/chunks/f6dc1ba364203bb2.js +0 -1
  370. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_buildManifest.js +0 -0
  371. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_clientMiddlewareManifest.json +0 -0
  372. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/ui/dialog.tsx","../../../../../../../src/presentation/web/components/ui/textarea.tsx","../../../../../../../src/presentation/web/components/ui/label.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-label%402.1.7_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types%2Breact%40_511ac9deb435ae46b2843bd1975598a6/node_modules/%40radix-ui/react-label/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/badge.tsx","../../../../../../../src/presentation/web/components/features/projects/projects-page-client.tsx","../../../../../../../src/presentation/web/components/features/projects/create-project-dialog.tsx","../../../../../../../src/presentation/web/app/actions/data%3A51a5cb%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport { X } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, onClick, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fixed inset-0 z-50 bg-black/80 duration-150',\n className\n )}\n onClick={(e) => {\n // Prevent overlay clicks from propagating to document-level handlers\n // (e.g. BaseDrawer outside-click) — only the dialog should dismiss.\n e.stopPropagation();\n onClick?.(e);\n }}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-150 sm:rounded-lg',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute end-4 top-4 cursor-pointer rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col space-y-1.5 text-center sm:text-start', className)}\n {...props}\n />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg leading-none font-semibold tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input field-sizing-content min-h-[80px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","'use client';\n\nimport * as React from 'react';\nimport { Label as LabelPrimitive } from 'radix-ui';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst labelVariants = cva(\n 'text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n);\n\nconst Label = React.forwardRef<\n React.ComponentRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","\"use client\";\n\n// src/label.tsx\nimport * as React from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx } from \"react/jsx-runtime\";\nvar NAME = \"Label\";\nvar Label = React.forwardRef((props, forwardedRef) => {\n return /* @__PURE__ */ jsx(\n Primitive.label,\n {\n ...props,\n ref: forwardedRef,\n onMouseDown: (event) => {\n const target = event.target;\n if (target.closest(\"button, input, select, textarea\")) return;\n props.onMouseDown?.(event);\n if (!event.defaultPrevented && event.detail > 1) event.preventDefault();\n }\n }\n );\n});\nLabel.displayName = NAME;\nvar Root = Label;\nexport {\n Label,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-none',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n","'use client';\n\nimport { useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { FolderKanban, Plus } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Badge } from '@/components/ui/badge';\nimport type { PmProject } from '@shepai/core/domain/generated/output';\nimport { CreateProjectDialog } from './create-project-dialog';\n\nexport interface ProjectsPageClientProps {\n projects: PmProject[];\n className?: string;\n}\n\nexport function ProjectsPageClient({\n projects: initialProjects,\n className,\n}: ProjectsPageClientProps) {\n const [projects, setProjects] = useState<PmProject[]>(initialProjects);\n const [showCreateDialog, setShowCreateDialog] = useState(false);\n const router = useRouter();\n\n const handleProjectCreated = (project: PmProject) => {\n setProjects((prev) => [...prev, project]);\n setShowCreateDialog(false);\n };\n\n return (\n <div data-testid=\"projects-page-client\" className={cn('space-y-4', className)}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"text-muted-foreground h-4 w-4\" />\n <h1 className=\"text-sm font-bold tracking-tight\">Projects</h1>\n <span className=\"text-muted-foreground text-[10px]\">{projects.length} projects</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => setShowCreateDialog(true)}\n data-testid=\"create-project-btn\"\n >\n <Plus className=\"mr-1 h-3 w-3\" />\n New Project\n </Button>\n </div>\n\n {projects.length === 0 ? (\n <div\n data-testid=\"projects-page-empty\"\n className=\"text-muted-foreground flex flex-col items-center justify-center py-12 text-center\"\n >\n <FolderKanban className=\"mb-2 h-6 w-6 opacity-20\" />\n <p className=\"text-xs\">No projects yet. Create your first project to get started.</p>\n </div>\n ) : (\n <div\n data-testid=\"projects-page-grid\"\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\"\n >\n {projects.map((project) => (\n <button\n key={project.id}\n type=\"button\"\n data-testid={`project-card-${project.slug}`}\n className=\"bg-card hover:bg-accent text-card-foreground rounded-lg border p-4 text-left transition-colors\"\n onClick={() => router.push(`/projects/${project.slug}`)}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold\">{project.name}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {project.identifierPrefix}\n </Badge>\n </div>\n {project.description ? (\n <p className=\"text-muted-foreground mt-1 line-clamp-2 text-xs\">\n {project.description}\n </p>\n ) : null}\n <div className=\"text-muted-foreground mt-2 text-[10px]\">\n {project.workItemCounter} items\n </div>\n </button>\n ))}\n </div>\n )}\n\n <CreateProjectDialog\n open={showCreateDialog}\n onOpenChange={setShowCreateDialog}\n onCreated={handleProjectCreated}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Textarea } from '@/components/ui/textarea';\nimport type { PmProject } from '@shepai/core/domain/generated/output';\nimport { createPmProject } from '@/app/actions/create-pm-project';\n\nexport interface CreateProjectDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onCreated: (project: PmProject) => void;\n}\n\nexport function CreateProjectDialog({ open, onOpenChange, onCreated }: CreateProjectDialogProps) {\n const [name, setName] = useState('');\n const [prefix, setPrefix] = useState('');\n const [description, setDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async () => {\n setError(null);\n setSubmitting(true);\n try {\n const result = await createPmProject({\n name,\n identifierPrefix: prefix,\n description: description || undefined,\n });\n if (result.error) {\n setError(result.error);\n } else if (result.project) {\n onCreated(result.project);\n setName('');\n setPrefix('');\n setDescription('');\n }\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent data-testid=\"create-project-dialog\">\n <DialogHeader>\n <DialogTitle>Create Project</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"project-name\">Name</Label>\n <Input\n id=\"project-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My Project\"\n data-testid=\"project-name-input\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"project-prefix\">Identifier Prefix</Label>\n <Input\n id=\"project-prefix\"\n value={prefix}\n onChange={(e) => setPrefix(e.target.value.toUpperCase())}\n placeholder=\"PROJ\"\n maxLength={5}\n data-testid=\"project-prefix-input\"\n />\n <p className=\"text-muted-foreground text-[10px]\">\n 1-5 uppercase letters/numbers, used in work item identifiers (e.g., PROJ-42)\n </p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"project-desc\">Description (optional)</Label>\n <Textarea\n id=\"project-desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What is this project about?\"\n rows={3}\n data-testid=\"project-desc-input\"\n />\n </div>\n {error ? (\n <p className=\"text-destructive text-xs\" data-testid=\"create-project-error\">\n {error}\n </p>\n ) : null}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={submitting}>\n Cancel\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={!name.trim() || !prefix.trim() || submitting}\n data-testid=\"create-project-submit\"\n >\n {submitting ? 'Creating...' : 'Create'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4032b697cdcc222a38f11932c2ab5825d5043a9a52\":\"createPmProject\"},\"src/presentation/web/app/actions/create-pm-project.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"4032b697cdcc222a38f11932c2ab5825d5043a9a52\",callServer,void 0,findSourceMapURL,\"createPmProject\");export{$$RSC_SERVER_ACTION_0 as createPmProject};"],"names":[],"mappings":"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","ignoreList":[3]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/ui/dialog.tsx","../../../../../../../src/presentation/web/components/ui/textarea.tsx","../../../../../../../src/presentation/web/components/ui/label.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-label%402.1.7_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types%2Breact%40_511ac9deb435ae46b2843bd1975598a6/node_modules/%40radix-ui/react-label/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/badge.tsx","../../../../../../../src/presentation/web/components/features/projects/projects-page-client.tsx","../../../../../../../src/presentation/web/components/features/projects/create-project-dialog.tsx","../../../../../../../src/presentation/web/app/actions/data%3A2ee4cd%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport { X } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, onClick, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fixed inset-0 z-50 bg-black/80 duration-150',\n className\n )}\n onClick={(e) => {\n // Prevent overlay clicks from propagating to document-level handlers\n // (e.g. BaseDrawer outside-click) — only the dialog should dismiss.\n e.stopPropagation();\n onClick?.(e);\n }}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-150 sm:rounded-lg',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute end-4 top-4 cursor-pointer rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col space-y-1.5 text-center sm:text-start', className)}\n {...props}\n />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg leading-none font-semibold tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input field-sizing-content min-h-[80px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","'use client';\n\nimport * as React from 'react';\nimport { Label as LabelPrimitive } from 'radix-ui';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst labelVariants = cva(\n 'text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n);\n\nconst Label = React.forwardRef<\n React.ComponentRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","\"use client\";\n\n// src/label.tsx\nimport * as React from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx } from \"react/jsx-runtime\";\nvar NAME = \"Label\";\nvar Label = React.forwardRef((props, forwardedRef) => {\n return /* @__PURE__ */ jsx(\n Primitive.label,\n {\n ...props,\n ref: forwardedRef,\n onMouseDown: (event) => {\n const target = event.target;\n if (target.closest(\"button, input, select, textarea\")) return;\n props.onMouseDown?.(event);\n if (!event.defaultPrevented && event.detail > 1) event.preventDefault();\n }\n }\n );\n});\nLabel.displayName = NAME;\nvar Root = Label;\nexport {\n Label,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-none',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n","'use client';\n\nimport { useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { FolderKanban, Plus } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Badge } from '@/components/ui/badge';\nimport type { PmProject } from '@shepai/core/domain/generated/output';\nimport { CreateProjectDialog } from './create-project-dialog';\n\nexport interface ProjectsPageClientProps {\n projects: PmProject[];\n className?: string;\n}\n\nexport function ProjectsPageClient({\n projects: initialProjects,\n className,\n}: ProjectsPageClientProps) {\n const [projects, setProjects] = useState<PmProject[]>(initialProjects);\n const [showCreateDialog, setShowCreateDialog] = useState(false);\n const router = useRouter();\n\n const handleProjectCreated = (project: PmProject) => {\n setProjects((prev) => [...prev, project]);\n setShowCreateDialog(false);\n };\n\n return (\n <div data-testid=\"projects-page-client\" className={cn('space-y-4', className)}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"text-muted-foreground h-4 w-4\" />\n <h1 className=\"text-sm font-bold tracking-tight\">Projects</h1>\n <span className=\"text-muted-foreground text-[10px]\">{projects.length} projects</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => setShowCreateDialog(true)}\n data-testid=\"create-project-btn\"\n >\n <Plus className=\"mr-1 h-3 w-3\" />\n New Project\n </Button>\n </div>\n\n {projects.length === 0 ? (\n <div\n data-testid=\"projects-page-empty\"\n className=\"text-muted-foreground flex flex-col items-center justify-center py-12 text-center\"\n >\n <FolderKanban className=\"mb-2 h-6 w-6 opacity-20\" />\n <p className=\"text-xs\">No projects yet. Create your first project to get started.</p>\n </div>\n ) : (\n <div\n data-testid=\"projects-page-grid\"\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\"\n >\n {projects.map((project) => (\n <button\n key={project.id}\n type=\"button\"\n data-testid={`project-card-${project.slug}`}\n className=\"bg-card hover:bg-accent text-card-foreground rounded-lg border p-4 text-left transition-colors\"\n onClick={() => router.push(`/projects/${project.slug}`)}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold\">{project.name}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {project.identifierPrefix}\n </Badge>\n </div>\n {project.description ? (\n <p className=\"text-muted-foreground mt-1 line-clamp-2 text-xs\">\n {project.description}\n </p>\n ) : null}\n <div className=\"text-muted-foreground mt-2 text-[10px]\">\n {project.workItemCounter} items\n </div>\n </button>\n ))}\n </div>\n )}\n\n <CreateProjectDialog\n open={showCreateDialog}\n onOpenChange={setShowCreateDialog}\n onCreated={handleProjectCreated}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Textarea } from '@/components/ui/textarea';\nimport type { PmProject } from '@shepai/core/domain/generated/output';\nimport { createPmProject } from '@/app/actions/create-pm-project';\n\nexport interface CreateProjectDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onCreated: (project: PmProject) => void;\n}\n\nexport function CreateProjectDialog({ open, onOpenChange, onCreated }: CreateProjectDialogProps) {\n const [name, setName] = useState('');\n const [prefix, setPrefix] = useState('');\n const [description, setDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async () => {\n setError(null);\n setSubmitting(true);\n try {\n const result = await createPmProject({\n name,\n identifierPrefix: prefix,\n description: description || undefined,\n });\n if (result.error) {\n setError(result.error);\n } else if (result.project) {\n onCreated(result.project);\n setName('');\n setPrefix('');\n setDescription('');\n }\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent data-testid=\"create-project-dialog\">\n <DialogHeader>\n <DialogTitle>Create Project</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"project-name\">Name</Label>\n <Input\n id=\"project-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My Project\"\n data-testid=\"project-name-input\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"project-prefix\">Identifier Prefix</Label>\n <Input\n id=\"project-prefix\"\n value={prefix}\n onChange={(e) => setPrefix(e.target.value.toUpperCase())}\n placeholder=\"PROJ\"\n maxLength={5}\n data-testid=\"project-prefix-input\"\n />\n <p className=\"text-muted-foreground text-[10px]\">\n 1-5 uppercase letters/numbers, used in work item identifiers (e.g., PROJ-42)\n </p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"project-desc\">Description (optional)</Label>\n <Textarea\n id=\"project-desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What is this project about?\"\n rows={3}\n data-testid=\"project-desc-input\"\n />\n </div>\n {error ? (\n <p className=\"text-destructive text-xs\" data-testid=\"create-project-error\">\n {error}\n </p>\n ) : null}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={submitting}>\n Cancel\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={!name.trim() || !prefix.trim() || submitting}\n data-testid=\"create-project-submit\"\n >\n {submitting ? 'Creating...' : 'Create'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b71955c910380917752d7079d6379dd4b530ea9d\":\"createPmProject\"},\"src/presentation/web/app/actions/create-pm-project.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40b71955c910380917752d7079d6379dd4b530ea9d\",callServer,void 0,findSourceMapURL,\"createPmProject\");export{$$RSC_SERVER_ACTION_0 as createPmProject};"],"names":[],"mappings":"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","ignoreList":[3]}
@@ -1,3 +1,3 @@
1
- module.exports=[347942,a=>{"use strict";var b=a.i(556365),c=a.i(944592),d=a.i(441305),e=a.i(118948),f=a.i(679620),g=a.i(658339),h=a.i(105180),i=a.i(289111);let j=(0,i.createServerReference)("4068987a9d748712ed92ef5b5d9ad942f5e977d922",i.callServer,void 0,i.findSourceMapURL,"saveAgentPrompt"),k=(0,i.createServerReference)("406b893fe8864179366c306ea1e2abe3981d09edb0",i.callServer,void 0,i.findSourceMapURL,"resetAgentPrompt");function l({entries:a,onSaveOverride:c,onResetOverride:d}){return 0===a.length?(0,b.jsx)("p",{className:"text-muted-foreground rounded-lg border border-dashed p-4 text-sm",children:"No editable prompt slots are registered for this agent yet."}):(0,b.jsx)("div",{className:"flex flex-col gap-4","data-testid":"prompt-editor",children:a.map(a=>(0,b.jsx)(m,{entry:a,...c&&{onSaveOverride:c},...d&&{onResetOverride:d}},`${a.agentType}-${a.promptId}`))})}function m({entry:a,onSaveOverride:d,onResetOverride:i}){let[l,m]=(0,c.useState)(a.effectiveBody),[n,o]=(0,c.useTransition)(),[p,q]=(0,c.useState)(null),[r,s]=(0,c.useState)(null);(0,c.useEffect)(()=>{m(a.effectiveBody)},[a.effectiveBody]);let t=l!==a.effectiveBody,u=a.hasOverride||t;return(0,b.jsxs)("article",{className:"bg-card flex flex-col gap-3 rounded-lg border p-4","data-testid":`prompt-slot-${a.promptId}`,children:[(0,b.jsxs)("header",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:a.name}),(0,b.jsx)("p",{className:"text-muted-foreground text-xs",children:a.description}),(0,b.jsxs)("p",{className:"text-muted-foreground mt-1 font-mono text-[10px]",children:[a.agentType,"/",a.promptId]})]}),u?(0,b.jsx)(g.Badge,{variant:"default",className:"shrink-0","data-testid":`badge-overridden-${a.promptId}`,children:"Overridden"}):(0,b.jsx)(g.Badge,{variant:"secondary",className:"shrink-0",children:"Bundled"})]}),(0,b.jsx)(f.Textarea,{value:l,onChange:a=>m(a.target.value),rows:Math.min(20,Math.max(6,l.split("\n").length)),className:"font-mono text-xs","data-testid":`prompt-textarea-${a.promptId}`,disabled:n,spellCheck:!1}),p?(0,b.jsx)(h.Alert,{variant:"destructive","data-testid":`prompt-error-${a.promptId}`,children:(0,b.jsx)(h.AlertDescription,{children:p})}):null,r?(0,b.jsxs)("p",{className:"text-muted-foreground text-xs","data-testid":`prompt-saved-${a.promptId}`,children:["Saved at ",r.toLocaleTimeString()]}):null,(0,b.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[a.hasOverride?(0,b.jsx)(e.Button,{type:"button",variant:"ghost",size:"sm",disabled:n,onClick:function(){q(null),o(async()=>{let b=await (i??k)({agentType:a.agentType,promptId:a.promptId});b.ok?(m(a.bundledBody),s(new Date)):q(b.error??"Failed to reset")})},"data-testid":`prompt-reset-${a.promptId}`,children:"Reset to bundled"}):null,(0,b.jsx)(e.Button,{type:"button",size:"sm",disabled:!t||n,onClick:function(){q(null),o(async()=>{let b=await (d??j)({agentType:a.agentType,promptId:a.promptId,body:l});b.ok?s(new Date):q(b.error??"Failed to save")})},"data-testid":`prompt-save-${a.promptId}`,children:n?"Saving…":a.hasOverride?"Update override":"Save override"})]})]})}var n=a.i(442030),o=a.i(660047),p=a.i(893741),q=a.i(867837),r=a.i(218615),s=a.i(833161),t=a.i(216605),u=a.i(302807),v=a.i(216839);let w=(0,i.createServerReference)("40ad2417227f10a4eca778e2126f6bd3e29594679d",i.callServer,void 0,i.findSourceMapURL,"resetAgentGraph"),x=(0,i.createServerReference)("40c92ce75be5ab248b54ffdd57154fdcce2a358b8d",i.callServer,void 0,i.findSourceMapURL,"saveAgentGraph"),y={editable:function({id:a,data:c}){let{label:d,description:e,editing:f,onLabelChange:g,onDescriptionChange:h,onDelete:i}=c;return(0,b.jsxs)("div",{className:"bg-card relative min-w-[180px] rounded-md border px-2 py-1.5 shadow-sm",children:[(0,b.jsx)(n.Handle,{type:"target",position:o.Position.Left}),f?(0,b.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,b.jsx)("input",{value:d,onChange:b=>g(a,b.target.value),className:"border-border bg-background w-full rounded border px-1 py-0.5 text-xs font-semibold",placeholder:"label","aria-label":`Label for node ${a}`,"data-testid":`graph-node-label-${a}`}),(0,b.jsx)("input",{value:e??"",onChange:b=>h(a,b.target.value),className:"border-border bg-background w-full rounded border px-1 py-0.5 text-[10px]",placeholder:"description","aria-label":`Description for node ${a}`,"data-testid":`graph-node-description-${a}`}),(0,b.jsx)("button",{type:"button",onClick:()=>i(a),className:"text-destructive absolute -top-2 -right-2 flex size-4 items-center justify-center rounded-full border bg-white shadow-sm","aria-label":`Delete node ${a}`,"data-testid":`graph-node-delete-${a}`,children:(0,b.jsx)(t.Trash2,{className:"size-2.5"})})]}):(0,b.jsxs)("div",{className:"flex flex-col items-start gap-0.5 text-left",children:[(0,b.jsx)("span",{className:"text-xs font-semibold",children:d}),e?(0,b.jsx)("span",{className:"text-muted-foreground text-[10px]",children:e}):null]}),(0,b.jsx)(n.Handle,{type:"source",position:o.Position.Right})]})}};function z(a){return a.graph?(0,b.jsx)(n.ReactFlowProvider,{children:(0,b.jsx)(A,{...a,graph:a.graph})}):(0,b.jsx)("p",{className:"text-muted-foreground rounded-lg border border-dashed p-4 text-sm","data-testid":"agent-graph-empty",children:"No graph descriptor registered for this agent yet."})}function A({graph:a,bundled:d,hasOverride:f,onSaveOverride:i,onResetOverride:j,initialEditing:k}){let[l,m]=(0,c.useState)(!!k),[t,v]=(0,c.useState)(null),[z,A]=(0,c.useState)(null),[C,D]=(0,c.useTransition)(),E=(0,c.useRef)(0),F=(0,c.useMemo)(()=>B(a),[a]),[G,H,I]=(0,n.useNodesState)(F.nodes),[J,K,L]=(0,n.useEdgesState)(F.edges);(0,c.useEffect)(()=>{H(F.nodes),K(F.edges)},[F.nodes,F.edges,H,K]);let M=(0,c.useCallback)((a,b)=>{H(c=>c.map(c=>c.id===a?{...c,data:{...c.data,label:b}}:c))},[H]),N=(0,c.useCallback)((a,b)=>{H(c=>c.map(c=>c.id===a?{...c,data:{...c.data,description:b}}:c))},[H]),O=(0,c.useCallback)(a=>{H(b=>b.filter(b=>b.id!==a)),K(b=>b.filter(b=>b.source!==a&&b.target!==a))},[H,K]),P=(0,c.useMemo)(()=>G.map(a=>({...a,type:"editable",data:{...a.data,editing:l,onLabelChange:M,onDescriptionChange:N,onDelete:O}})),[G,l,M,N,O]);return(0,b.jsxs)("div",{className:"flex flex-col gap-3","data-testid":"agent-graph-view",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("p",{className:"text-sm font-medium",children:a.agentType}),f?(0,b.jsx)(g.Badge,{variant:"default","data-testid":"graph-badge-overridden",children:"Overridden"}):(0,b.jsx)(g.Badge,{variant:"secondary",children:"Bundled"})]}),(0,b.jsx)("div",{className:"flex items-center gap-2",children:l?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(e.Button,{type:"button",variant:"ghost",size:"sm",onClick:function(){E.current+=1;let a=`node-${Date.now()}-${E.current}`;H(b=>{var c;return[...b,{id:a,type:"editable",position:0===(c=b).length?{x:0,y:0}:{x:c.reduce((a,b)=>Math.max(a,b.position.x),0)+240,y:c.reduce((a,b)=>Math.min(a,b.position.y),0)},data:{label:"New step",description:"",editing:!0,onLabelChange:M,onDescriptionChange:N,onDelete:O},sourcePosition:o.Position.Right,targetPosition:o.Position.Left}]})},disabled:C,"data-testid":"graph-add-node",children:[(0,b.jsx)(q.Plus,{className:"size-3"}),"Add node"]}),f?(0,b.jsxs)(e.Button,{type:"button",variant:"ghost",size:"sm",onClick:function(){v(null),D(async()=>{let b=await (j??w)({agentType:a.agentType});if(!b.ok)return void v(b.error??"Failed to reset graph");if(A(new Date),m(!1),d){let a=B(d);H(a.nodes),K(a.edges)}})},disabled:C,"data-testid":"graph-reset",children:[(0,b.jsx)(r.RotateCcw,{className:"size-3"}),"Reset to bundled"]}):null,(0,b.jsxs)(e.Button,{type:"button",variant:"ghost",size:"sm",onClick:function(){H(F.nodes),K(F.edges),v(null),m(!1)},disabled:C,"data-testid":"graph-cancel",children:[(0,b.jsx)(u.X,{className:"size-3"}),"Cancel"]}),(0,b.jsxs)(e.Button,{type:"button",size:"sm",onClick:function(){var b,c;v(null);let d=(b=G,c=J,{nodes:b.map(a=>({id:a.id,label:a.data.label.trim()||a.id,...a.data.description?.trim()?{description:a.data.description.trim()}:{}})),edges:c.map(a=>({from:a.source,to:a.target,..."string"==typeof a.label&&a.label.trim()?{label:a.label.trim()}:{}}))}),e=function(a){if(0===a.nodes.length)return"Graph must have at least one node.";let b=new Set;for(let c of a.nodes){if(!c.label)return`Node ${c.id} must have a label.`;if(b.has(c.id))return`Duplicate node id: ${c.id}`;b.add(c.id)}for(let c of a.edges){if(!b.has(c.from))return`Edge references unknown source: ${c.from}`;if(!b.has(c.to))return`Edge references unknown target: ${c.to}`}return null}(d);e?v(e):D(async()=>{let b=await (i??x)({agentType:a.agentType,...d});b.ok?(A(new Date),m(!1)):v(b.error??"Failed to save graph")})},disabled:C,"data-testid":"graph-save",children:[(0,b.jsx)(s.Save,{className:"size-3"}),C?"Saving…":"Save graph"]})]}):(0,b.jsxs)(e.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>m(!0),"data-testid":"graph-edit",children:[(0,b.jsx)(p.Pencil,{className:"size-3"}),"Edit"]})})]}),t?(0,b.jsx)(h.Alert,{variant:"destructive","data-testid":"graph-error",children:(0,b.jsx)(h.AlertDescription,{children:t})}):null,z&&!l?(0,b.jsxs)("p",{className:"text-muted-foreground text-xs","data-testid":"graph-saved",children:["Saved at ",z.toLocaleTimeString()]}):null,(0,b.jsx)("div",{className:"bg-muted/20 h-[480px] w-full overflow-hidden rounded-lg border",children:(0,b.jsxs)(n.ReactFlow,{nodes:P,edges:J,nodeTypes:y,onNodesChange:I,onEdgesChange:L,onConnect:function(a){K(b=>(0,o.addEdge)({...a,type:"smoothstep"},b))},nodesDraggable:l,nodesConnectable:l,elementsSelectable:l,deleteKeyCode:l?["Backspace","Delete"]:null,fitView:!0,proOptions:{hideAttribution:!0},children:[(0,b.jsx)(n.Background,{gap:20}),(0,b.jsx)(n.Controls,{showInteractive:!1})]})})]})}function B(a){let b=a.nodes.map(a=>({id:a.id,type:"editable",position:{x:0,y:0},data:{label:a.label,description:a.description??"",editing:!1,onLabelChange:()=>void 0,onDescriptionChange:()=>void 0,onDelete:()=>void 0},sourcePosition:o.Position.Right,targetPosition:o.Position.Left})),c=a.edges.map((a,b)=>({id:`e-${b}-${a.from}-${a.to}`,source:a.from,target:a.to,type:"smoothstep",label:a.label,animated:!1})),d=(0,v.layoutWithDagre)(b,c,{direction:"LR",nodeSize:{width:220,height:70},nodesep:30,ranksep:80});return{nodes:d.nodes,edges:d.edges}}var C=a.i(429123),D=a.i(5698);let E=0;function F(){return E+=1,`msg-${E}`}function G({agentType:a,promptId:d,inlinePromptBody:g,fetchOverride:i}){let[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)([]),[n,o]=(0,c.useState)(!1),[p,q]=(0,c.useState)(null),r=(0,c.useRef)(null),s=(0,c.useRef)(null);async function t(b){if(!b.trim()||n)return;q(null);let c=[...l,{id:F(),role:"user",content:b},{id:F(),role:"assistant",content:""}];m(c),k(""),o(!0);let e=new AbortController;r.current=e;try{let b=i??fetch,f=await b("/api/agents/playground",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentType:a,promptId:d,...g&&{promptBody:g},messages:c.slice(0,-1).map(a=>({role:a.role,content:a.content}))}),signal:e.signal});if(!f.ok||!f.body){let a=`Playground request failed (${f.status})`;q(a),o(!1);return}let h=f.body.getReader(),j=new TextDecoder,k="";for(;;){let{value:a,done:b}=await h.read();if(b)break;let c=(k+=j.decode(a,{stream:!0})).split("\n\n");for(let a of(k=c.pop()??"",c)){let b=a.trim();if(!b.startsWith("data:"))continue;let c=b.slice(5).trim();if(c)try{let a=JSON.parse(c);"delta"===a.type?m(b=>(function(a,b){if(0===a.length)return a;let c=a[a.length-1];if(c?.role!=="assistant")return a;let d=[...a];return d[d.length-1]={...c,content:c.content+b},d})(b,a.content)):"error"===a.type&&q(a.content)}catch{}}}}catch(a){a?.name!=="AbortError"&&q(a instanceof Error?a.message:String(a))}finally{o(!1),r.current=null}}return(0,c.useEffect)(()=>{s.current?.scrollTo({top:s.current.scrollHeight})},[l]),(0,b.jsxs)("div",{className:"flex flex-col gap-3 rounded-lg border p-4","data-testid":"agent-playground",children:[(0,b.jsxs)("header",{className:"flex items-center justify-between gap-2",children:[(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("p",{className:"text-sm font-semibold",children:"Playground"}),(0,b.jsxs)("p",{className:"text-muted-foreground text-xs",children:["Streaming against ",a," · ",d,g?" (inline override)":""]})]}),l.length>0?(0,b.jsx)(e.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>m([]),disabled:n,children:"Clear"}):null]}),(0,b.jsx)("div",{ref:s,className:"bg-muted/20 flex h-72 flex-col gap-2 overflow-y-auto rounded border p-3","data-testid":"playground-transcript",children:0===l.length?(0,b.jsx)("p",{className:"text-muted-foreground text-xs",children:"Send a message to test this prompt against the configured executor."}):l.map((a,c)=>(0,b.jsx)("div",{className:"user"===a.role?"bg-primary text-primary-foreground max-w-[85%] self-end rounded-lg px-3 py-2 text-sm":"bg-card max-w-[85%] self-start rounded-lg border px-3 py-2 text-sm whitespace-pre-wrap","data-testid":`playground-msg-${c}-${a.role}`,children:a.content||(n&&c===l.length-1?"…":"")},a.id))}),p?(0,b.jsx)(h.Alert,{variant:"destructive","data-testid":"playground-error",children:(0,b.jsx)(h.AlertDescription,{children:p})}):null,(0,b.jsxs)("form",{className:"flex items-end gap-2",onSubmit:a=>{a.preventDefault(),t(j)},children:[(0,b.jsx)(f.Textarea,{value:j,onChange:a=>k(a.target.value),rows:2,placeholder:"Try a prompt…",className:"font-mono text-xs","data-testid":"playground-input",disabled:n,onKeyDown:a=>{"Enter"===a.key&&(a.metaKey||a.ctrlKey)&&(a.preventDefault(),t(j))}}),n?(0,b.jsxs)(e.Button,{type:"button",variant:"secondary",onClick:function(){r.current?.abort(),r.current=null,o(!1)},"data-testid":"playground-stop",children:[(0,b.jsx)(D.Square,{className:"size-3"}),"Stop"]}):(0,b.jsxs)(e.Button,{type:"submit",disabled:!j.trim(),"data-testid":"playground-send",children:[(0,b.jsx)(C.Send,{className:"size-3"}),"Send"]})]})]})}function H({agentType:a,prompts:e,graph:f,bundledGraph:g,hasGraphOverride:h}){let[i,j]=(0,c.useState)(e[0]?.promptId??"evaluator.system"),k=e.find(a=>a.promptId===i);return(0,b.jsxs)(d.Tabs,{defaultValue:"prompts","data-testid":"agent-editor-tabs",children:[(0,b.jsxs)(d.TabsList,{children:[(0,b.jsx)(d.TabsTrigger,{value:"prompts",children:"Prompts"}),(0,b.jsx)(d.TabsTrigger,{value:"graph",children:"Graph"}),(0,b.jsx)(d.TabsTrigger,{value:"playground",children:"Playground"})]}),(0,b.jsx)(d.TabsContent,{value:"prompts",className:"mt-4",children:(0,b.jsx)(l,{entries:e})}),(0,b.jsx)(d.TabsContent,{value:"graph",className:"mt-4",children:(0,b.jsx)(z,{graph:f,bundled:g??null,hasOverride:h??!1})}),(0,b.jsxs)(d.TabsContent,{value:"playground",className:"mt-4 flex flex-col gap-3",children:[e.length>1?(0,b.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,b.jsx)("label",{htmlFor:"playground-prompt-select",className:"text-muted-foreground",children:"Use prompt:"}),(0,b.jsx)("select",{id:"playground-prompt-select",value:i,onChange:a=>j(a.target.value),className:"border-border bg-background rounded border px-2 py-1 text-xs","data-testid":"playground-prompt-select",children:e.map(a=>(0,b.jsx)("option",{value:a.promptId,children:a.name},a.promptId))})]}):null,(0,b.jsx)(G,{agentType:a,promptId:i,...k?.hasOverride&&{inlinePromptBody:k.effectiveBody}})]})]})}a.s(["AgentEditorTabs",()=>H],347942)}];
1
+ module.exports=[347942,a=>{"use strict";var b=a.i(556365),c=a.i(944592),d=a.i(441305),e=a.i(118948),f=a.i(679620),g=a.i(658339),h=a.i(105180),i=a.i(289111);let j=(0,i.createServerReference)("4058419163c682b19445b7046c44220504fb8fcdee",i.callServer,void 0,i.findSourceMapURL,"saveAgentPrompt"),k=(0,i.createServerReference)("40b8d0cf270d6704436f7ca615ab2a7bbf86ae2cf7",i.callServer,void 0,i.findSourceMapURL,"resetAgentPrompt");function l({entries:a,onSaveOverride:c,onResetOverride:d}){return 0===a.length?(0,b.jsx)("p",{className:"text-muted-foreground rounded-lg border border-dashed p-4 text-sm",children:"No editable prompt slots are registered for this agent yet."}):(0,b.jsx)("div",{className:"flex flex-col gap-4","data-testid":"prompt-editor",children:a.map(a=>(0,b.jsx)(m,{entry:a,...c&&{onSaveOverride:c},...d&&{onResetOverride:d}},`${a.agentType}-${a.promptId}`))})}function m({entry:a,onSaveOverride:d,onResetOverride:i}){let[l,m]=(0,c.useState)(a.effectiveBody),[n,o]=(0,c.useTransition)(),[p,q]=(0,c.useState)(null),[r,s]=(0,c.useState)(null);(0,c.useEffect)(()=>{m(a.effectiveBody)},[a.effectiveBody]);let t=l!==a.effectiveBody,u=a.hasOverride||t;return(0,b.jsxs)("article",{className:"bg-card flex flex-col gap-3 rounded-lg border p-4","data-testid":`prompt-slot-${a.promptId}`,children:[(0,b.jsxs)("header",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:a.name}),(0,b.jsx)("p",{className:"text-muted-foreground text-xs",children:a.description}),(0,b.jsxs)("p",{className:"text-muted-foreground mt-1 font-mono text-[10px]",children:[a.agentType,"/",a.promptId]})]}),u?(0,b.jsx)(g.Badge,{variant:"default",className:"shrink-0","data-testid":`badge-overridden-${a.promptId}`,children:"Overridden"}):(0,b.jsx)(g.Badge,{variant:"secondary",className:"shrink-0",children:"Bundled"})]}),(0,b.jsx)(f.Textarea,{value:l,onChange:a=>m(a.target.value),rows:Math.min(20,Math.max(6,l.split("\n").length)),className:"font-mono text-xs","data-testid":`prompt-textarea-${a.promptId}`,disabled:n,spellCheck:!1}),p?(0,b.jsx)(h.Alert,{variant:"destructive","data-testid":`prompt-error-${a.promptId}`,children:(0,b.jsx)(h.AlertDescription,{children:p})}):null,r?(0,b.jsxs)("p",{className:"text-muted-foreground text-xs","data-testid":`prompt-saved-${a.promptId}`,children:["Saved at ",r.toLocaleTimeString()]}):null,(0,b.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[a.hasOverride?(0,b.jsx)(e.Button,{type:"button",variant:"ghost",size:"sm",disabled:n,onClick:function(){q(null),o(async()=>{let b=await (i??k)({agentType:a.agentType,promptId:a.promptId});b.ok?(m(a.bundledBody),s(new Date)):q(b.error??"Failed to reset")})},"data-testid":`prompt-reset-${a.promptId}`,children:"Reset to bundled"}):null,(0,b.jsx)(e.Button,{type:"button",size:"sm",disabled:!t||n,onClick:function(){q(null),o(async()=>{let b=await (d??j)({agentType:a.agentType,promptId:a.promptId,body:l});b.ok?s(new Date):q(b.error??"Failed to save")})},"data-testid":`prompt-save-${a.promptId}`,children:n?"Saving…":a.hasOverride?"Update override":"Save override"})]})]})}var n=a.i(442030),o=a.i(660047),p=a.i(893741),q=a.i(867837),r=a.i(218615),s=a.i(833161),t=a.i(216605),u=a.i(302807),v=a.i(216839);let w=(0,i.createServerReference)("4063625f5f10db64950da320dd6272b580f69873a9",i.callServer,void 0,i.findSourceMapURL,"resetAgentGraph"),x=(0,i.createServerReference)("4001c755450bb815b3e68e16e7f4dbca09edd97ac7",i.callServer,void 0,i.findSourceMapURL,"saveAgentGraph"),y={editable:function({id:a,data:c}){let{label:d,description:e,editing:f,onLabelChange:g,onDescriptionChange:h,onDelete:i}=c;return(0,b.jsxs)("div",{className:"bg-card relative min-w-[180px] rounded-md border px-2 py-1.5 shadow-sm",children:[(0,b.jsx)(n.Handle,{type:"target",position:o.Position.Left}),f?(0,b.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,b.jsx)("input",{value:d,onChange:b=>g(a,b.target.value),className:"border-border bg-background w-full rounded border px-1 py-0.5 text-xs font-semibold",placeholder:"label","aria-label":`Label for node ${a}`,"data-testid":`graph-node-label-${a}`}),(0,b.jsx)("input",{value:e??"",onChange:b=>h(a,b.target.value),className:"border-border bg-background w-full rounded border px-1 py-0.5 text-[10px]",placeholder:"description","aria-label":`Description for node ${a}`,"data-testid":`graph-node-description-${a}`}),(0,b.jsx)("button",{type:"button",onClick:()=>i(a),className:"text-destructive absolute -top-2 -right-2 flex size-4 items-center justify-center rounded-full border bg-white shadow-sm","aria-label":`Delete node ${a}`,"data-testid":`graph-node-delete-${a}`,children:(0,b.jsx)(t.Trash2,{className:"size-2.5"})})]}):(0,b.jsxs)("div",{className:"flex flex-col items-start gap-0.5 text-left",children:[(0,b.jsx)("span",{className:"text-xs font-semibold",children:d}),e?(0,b.jsx)("span",{className:"text-muted-foreground text-[10px]",children:e}):null]}),(0,b.jsx)(n.Handle,{type:"source",position:o.Position.Right})]})}};function z(a){return a.graph?(0,b.jsx)(n.ReactFlowProvider,{children:(0,b.jsx)(A,{...a,graph:a.graph})}):(0,b.jsx)("p",{className:"text-muted-foreground rounded-lg border border-dashed p-4 text-sm","data-testid":"agent-graph-empty",children:"No graph descriptor registered for this agent yet."})}function A({graph:a,bundled:d,hasOverride:f,onSaveOverride:i,onResetOverride:j,initialEditing:k}){let[l,m]=(0,c.useState)(!!k),[t,v]=(0,c.useState)(null),[z,A]=(0,c.useState)(null),[C,D]=(0,c.useTransition)(),E=(0,c.useRef)(0),F=(0,c.useMemo)(()=>B(a),[a]),[G,H,I]=(0,n.useNodesState)(F.nodes),[J,K,L]=(0,n.useEdgesState)(F.edges);(0,c.useEffect)(()=>{H(F.nodes),K(F.edges)},[F.nodes,F.edges,H,K]);let M=(0,c.useCallback)((a,b)=>{H(c=>c.map(c=>c.id===a?{...c,data:{...c.data,label:b}}:c))},[H]),N=(0,c.useCallback)((a,b)=>{H(c=>c.map(c=>c.id===a?{...c,data:{...c.data,description:b}}:c))},[H]),O=(0,c.useCallback)(a=>{H(b=>b.filter(b=>b.id!==a)),K(b=>b.filter(b=>b.source!==a&&b.target!==a))},[H,K]),P=(0,c.useMemo)(()=>G.map(a=>({...a,type:"editable",data:{...a.data,editing:l,onLabelChange:M,onDescriptionChange:N,onDelete:O}})),[G,l,M,N,O]);return(0,b.jsxs)("div",{className:"flex flex-col gap-3","data-testid":"agent-graph-view",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("p",{className:"text-sm font-medium",children:a.agentType}),f?(0,b.jsx)(g.Badge,{variant:"default","data-testid":"graph-badge-overridden",children:"Overridden"}):(0,b.jsx)(g.Badge,{variant:"secondary",children:"Bundled"})]}),(0,b.jsx)("div",{className:"flex items-center gap-2",children:l?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(e.Button,{type:"button",variant:"ghost",size:"sm",onClick:function(){E.current+=1;let a=`node-${Date.now()}-${E.current}`;H(b=>{var c;return[...b,{id:a,type:"editable",position:0===(c=b).length?{x:0,y:0}:{x:c.reduce((a,b)=>Math.max(a,b.position.x),0)+240,y:c.reduce((a,b)=>Math.min(a,b.position.y),0)},data:{label:"New step",description:"",editing:!0,onLabelChange:M,onDescriptionChange:N,onDelete:O},sourcePosition:o.Position.Right,targetPosition:o.Position.Left}]})},disabled:C,"data-testid":"graph-add-node",children:[(0,b.jsx)(q.Plus,{className:"size-3"}),"Add node"]}),f?(0,b.jsxs)(e.Button,{type:"button",variant:"ghost",size:"sm",onClick:function(){v(null),D(async()=>{let b=await (j??w)({agentType:a.agentType});if(!b.ok)return void v(b.error??"Failed to reset graph");if(A(new Date),m(!1),d){let a=B(d);H(a.nodes),K(a.edges)}})},disabled:C,"data-testid":"graph-reset",children:[(0,b.jsx)(r.RotateCcw,{className:"size-3"}),"Reset to bundled"]}):null,(0,b.jsxs)(e.Button,{type:"button",variant:"ghost",size:"sm",onClick:function(){H(F.nodes),K(F.edges),v(null),m(!1)},disabled:C,"data-testid":"graph-cancel",children:[(0,b.jsx)(u.X,{className:"size-3"}),"Cancel"]}),(0,b.jsxs)(e.Button,{type:"button",size:"sm",onClick:function(){var b,c;v(null);let d=(b=G,c=J,{nodes:b.map(a=>({id:a.id,label:a.data.label.trim()||a.id,...a.data.description?.trim()?{description:a.data.description.trim()}:{}})),edges:c.map(a=>({from:a.source,to:a.target,..."string"==typeof a.label&&a.label.trim()?{label:a.label.trim()}:{}}))}),e=function(a){if(0===a.nodes.length)return"Graph must have at least one node.";let b=new Set;for(let c of a.nodes){if(!c.label)return`Node ${c.id} must have a label.`;if(b.has(c.id))return`Duplicate node id: ${c.id}`;b.add(c.id)}for(let c of a.edges){if(!b.has(c.from))return`Edge references unknown source: ${c.from}`;if(!b.has(c.to))return`Edge references unknown target: ${c.to}`}return null}(d);e?v(e):D(async()=>{let b=await (i??x)({agentType:a.agentType,...d});b.ok?(A(new Date),m(!1)):v(b.error??"Failed to save graph")})},disabled:C,"data-testid":"graph-save",children:[(0,b.jsx)(s.Save,{className:"size-3"}),C?"Saving…":"Save graph"]})]}):(0,b.jsxs)(e.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>m(!0),"data-testid":"graph-edit",children:[(0,b.jsx)(p.Pencil,{className:"size-3"}),"Edit"]})})]}),t?(0,b.jsx)(h.Alert,{variant:"destructive","data-testid":"graph-error",children:(0,b.jsx)(h.AlertDescription,{children:t})}):null,z&&!l?(0,b.jsxs)("p",{className:"text-muted-foreground text-xs","data-testid":"graph-saved",children:["Saved at ",z.toLocaleTimeString()]}):null,(0,b.jsx)("div",{className:"bg-muted/20 h-[480px] w-full overflow-hidden rounded-lg border",children:(0,b.jsxs)(n.ReactFlow,{nodes:P,edges:J,nodeTypes:y,onNodesChange:I,onEdgesChange:L,onConnect:function(a){K(b=>(0,o.addEdge)({...a,type:"smoothstep"},b))},nodesDraggable:l,nodesConnectable:l,elementsSelectable:l,deleteKeyCode:l?["Backspace","Delete"]:null,fitView:!0,proOptions:{hideAttribution:!0},children:[(0,b.jsx)(n.Background,{gap:20}),(0,b.jsx)(n.Controls,{showInteractive:!1})]})})]})}function B(a){let b=a.nodes.map(a=>({id:a.id,type:"editable",position:{x:0,y:0},data:{label:a.label,description:a.description??"",editing:!1,onLabelChange:()=>void 0,onDescriptionChange:()=>void 0,onDelete:()=>void 0},sourcePosition:o.Position.Right,targetPosition:o.Position.Left})),c=a.edges.map((a,b)=>({id:`e-${b}-${a.from}-${a.to}`,source:a.from,target:a.to,type:"smoothstep",label:a.label,animated:!1})),d=(0,v.layoutWithDagre)(b,c,{direction:"LR",nodeSize:{width:220,height:70},nodesep:30,ranksep:80});return{nodes:d.nodes,edges:d.edges}}var C=a.i(429123),D=a.i(5698);let E=0;function F(){return E+=1,`msg-${E}`}function G({agentType:a,promptId:d,inlinePromptBody:g,fetchOverride:i}){let[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)([]),[n,o]=(0,c.useState)(!1),[p,q]=(0,c.useState)(null),r=(0,c.useRef)(null),s=(0,c.useRef)(null);async function t(b){if(!b.trim()||n)return;q(null);let c=[...l,{id:F(),role:"user",content:b},{id:F(),role:"assistant",content:""}];m(c),k(""),o(!0);let e=new AbortController;r.current=e;try{let b=i??fetch,f=await b("/api/agents/playground",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentType:a,promptId:d,...g&&{promptBody:g},messages:c.slice(0,-1).map(a=>({role:a.role,content:a.content}))}),signal:e.signal});if(!f.ok||!f.body){let a=`Playground request failed (${f.status})`;q(a),o(!1);return}let h=f.body.getReader(),j=new TextDecoder,k="";for(;;){let{value:a,done:b}=await h.read();if(b)break;let c=(k+=j.decode(a,{stream:!0})).split("\n\n");for(let a of(k=c.pop()??"",c)){let b=a.trim();if(!b.startsWith("data:"))continue;let c=b.slice(5).trim();if(c)try{let a=JSON.parse(c);"delta"===a.type?m(b=>(function(a,b){if(0===a.length)return a;let c=a[a.length-1];if(c?.role!=="assistant")return a;let d=[...a];return d[d.length-1]={...c,content:c.content+b},d})(b,a.content)):"error"===a.type&&q(a.content)}catch{}}}}catch(a){a?.name!=="AbortError"&&q(a instanceof Error?a.message:String(a))}finally{o(!1),r.current=null}}return(0,c.useEffect)(()=>{s.current?.scrollTo({top:s.current.scrollHeight})},[l]),(0,b.jsxs)("div",{className:"flex flex-col gap-3 rounded-lg border p-4","data-testid":"agent-playground",children:[(0,b.jsxs)("header",{className:"flex items-center justify-between gap-2",children:[(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("p",{className:"text-sm font-semibold",children:"Playground"}),(0,b.jsxs)("p",{className:"text-muted-foreground text-xs",children:["Streaming against ",a," · ",d,g?" (inline override)":""]})]}),l.length>0?(0,b.jsx)(e.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>m([]),disabled:n,children:"Clear"}):null]}),(0,b.jsx)("div",{ref:s,className:"bg-muted/20 flex h-72 flex-col gap-2 overflow-y-auto rounded border p-3","data-testid":"playground-transcript",children:0===l.length?(0,b.jsx)("p",{className:"text-muted-foreground text-xs",children:"Send a message to test this prompt against the configured executor."}):l.map((a,c)=>(0,b.jsx)("div",{className:"user"===a.role?"bg-primary text-primary-foreground max-w-[85%] self-end rounded-lg px-3 py-2 text-sm":"bg-card max-w-[85%] self-start rounded-lg border px-3 py-2 text-sm whitespace-pre-wrap","data-testid":`playground-msg-${c}-${a.role}`,children:a.content||(n&&c===l.length-1?"…":"")},a.id))}),p?(0,b.jsx)(h.Alert,{variant:"destructive","data-testid":"playground-error",children:(0,b.jsx)(h.AlertDescription,{children:p})}):null,(0,b.jsxs)("form",{className:"flex items-end gap-2",onSubmit:a=>{a.preventDefault(),t(j)},children:[(0,b.jsx)(f.Textarea,{value:j,onChange:a=>k(a.target.value),rows:2,placeholder:"Try a prompt…",className:"font-mono text-xs","data-testid":"playground-input",disabled:n,onKeyDown:a=>{"Enter"===a.key&&(a.metaKey||a.ctrlKey)&&(a.preventDefault(),t(j))}}),n?(0,b.jsxs)(e.Button,{type:"button",variant:"secondary",onClick:function(){r.current?.abort(),r.current=null,o(!1)},"data-testid":"playground-stop",children:[(0,b.jsx)(D.Square,{className:"size-3"}),"Stop"]}):(0,b.jsxs)(e.Button,{type:"submit",disabled:!j.trim(),"data-testid":"playground-send",children:[(0,b.jsx)(C.Send,{className:"size-3"}),"Send"]})]})]})}function H({agentType:a,prompts:e,graph:f,bundledGraph:g,hasGraphOverride:h}){let[i,j]=(0,c.useState)(e[0]?.promptId??"evaluator.system"),k=e.find(a=>a.promptId===i);return(0,b.jsxs)(d.Tabs,{defaultValue:"prompts","data-testid":"agent-editor-tabs",children:[(0,b.jsxs)(d.TabsList,{children:[(0,b.jsx)(d.TabsTrigger,{value:"prompts",children:"Prompts"}),(0,b.jsx)(d.TabsTrigger,{value:"graph",children:"Graph"}),(0,b.jsx)(d.TabsTrigger,{value:"playground",children:"Playground"})]}),(0,b.jsx)(d.TabsContent,{value:"prompts",className:"mt-4",children:(0,b.jsx)(l,{entries:e})}),(0,b.jsx)(d.TabsContent,{value:"graph",className:"mt-4",children:(0,b.jsx)(z,{graph:f,bundled:g??null,hasOverride:h??!1})}),(0,b.jsxs)(d.TabsContent,{value:"playground",className:"mt-4 flex flex-col gap-3",children:[e.length>1?(0,b.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,b.jsx)("label",{htmlFor:"playground-prompt-select",className:"text-muted-foreground",children:"Use prompt:"}),(0,b.jsx)("select",{id:"playground-prompt-select",value:i,onChange:a=>j(a.target.value),className:"border-border bg-background rounded border px-2 py-1 text-xs","data-testid":"playground-prompt-select",children:e.map(a=>(0,b.jsx)("option",{value:a.promptId,children:a.name},a.promptId))})]}):null,(0,b.jsx)(G,{agentType:a,promptId:i,...k?.hasOverride&&{inlinePromptBody:k.effectiveBody}})]})]})}a.s(["AgentEditorTabs",()=>H],347942)}];
2
2
 
3
3
  //# sourceMappingURL=src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/agent-editor/agent-editor-tabs.tsx","../../../../../../../src/presentation/web/components/agent-editor/prompt-editor.tsx","../../../../../../../src/presentation/web/app/actions/data%3Aa9c859%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A513f1e%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/agent-editor/agent-graph-view.tsx","../../../../../../../src/presentation/web/app/actions/data%3Af97393%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3Af50812%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/agent-editor/agent-playground.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';\nimport { PromptEditor, type PromptEditorEntry } from './prompt-editor';\nimport { AgentGraphView, type AgentGraphDescriptor } from './agent-graph-view';\nimport { AgentPlayground } from './agent-playground';\n\nexport interface AgentEditorTabsProps {\n agentType: string;\n prompts: PromptEditorEntry[];\n graph: AgentGraphDescriptor | null;\n bundledGraph?: AgentGraphDescriptor | null;\n hasGraphOverride?: boolean;\n}\n\nexport function AgentEditorTabs({\n agentType,\n prompts,\n graph,\n bundledGraph,\n hasGraphOverride,\n}: AgentEditorTabsProps) {\n const [selectedPromptId, setSelectedPromptId] = useState<string>(\n prompts[0]?.promptId ?? 'evaluator.system'\n );\n const selectedPrompt = prompts.find((p) => p.promptId === selectedPromptId);\n\n return (\n <Tabs defaultValue=\"prompts\" data-testid=\"agent-editor-tabs\">\n <TabsList>\n <TabsTrigger value=\"prompts\">Prompts</TabsTrigger>\n <TabsTrigger value=\"graph\">Graph</TabsTrigger>\n <TabsTrigger value=\"playground\">Playground</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"prompts\" className=\"mt-4\">\n <PromptEditor entries={prompts} />\n </TabsContent>\n\n <TabsContent value=\"graph\" className=\"mt-4\">\n <AgentGraphView\n graph={graph}\n bundled={bundledGraph ?? null}\n hasOverride={hasGraphOverride ?? false}\n />\n </TabsContent>\n\n <TabsContent value=\"playground\" className=\"mt-4 flex flex-col gap-3\">\n {prompts.length > 1 ? (\n <div className=\"flex items-center gap-2 text-xs\">\n <label htmlFor=\"playground-prompt-select\" className=\"text-muted-foreground\">\n Use prompt:\n </label>\n <select\n id=\"playground-prompt-select\"\n value={selectedPromptId}\n onChange={(e) => setSelectedPromptId(e.target.value)}\n className=\"border-border bg-background rounded border px-2 py-1 text-xs\"\n data-testid=\"playground-prompt-select\"\n >\n {prompts.map((p) => (\n <option key={p.promptId} value={p.promptId}>\n {p.name}\n </option>\n ))}\n </select>\n </div>\n ) : null}\n <AgentPlayground\n agentType={agentType}\n promptId={selectedPromptId}\n {...(selectedPrompt?.hasOverride && { inlinePromptBody: selectedPrompt.effectiveBody })}\n />\n </TabsContent>\n </Tabs>\n );\n}\n","'use client';\n\nimport { useEffect, useState, useTransition } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Badge } from '@/components/ui/badge';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { saveAgentPrompt, resetAgentPrompt } from '@/app/actions/agent-prompts';\n\nexport interface PromptEditorEntry {\n agentType: string;\n promptId: string;\n name: string;\n description: string;\n bundledBody: string;\n effectiveBody: string;\n hasOverride: boolean;\n}\n\nexport interface PromptEditorProps {\n entries: PromptEditorEntry[];\n /** Optional override of the save handler — used by Storybook + tests. */\n onSaveOverride?: (input: { agentType: string; promptId: string; body: string }) => Promise<{\n ok: boolean;\n error?: string;\n }>;\n onResetOverride?: (input: { agentType: string; promptId: string }) => Promise<{\n ok: boolean;\n error?: string;\n }>;\n}\n\nexport function PromptEditor({ entries, onSaveOverride, onResetOverride }: PromptEditorProps) {\n if (entries.length === 0) {\n return (\n <p className=\"text-muted-foreground rounded-lg border border-dashed p-4 text-sm\">\n No editable prompt slots are registered for this agent yet.\n </p>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\" data-testid=\"prompt-editor\">\n {entries.map((entry) => (\n <PromptSlotCard\n key={`${entry.agentType}-${entry.promptId}`}\n entry={entry}\n {...(onSaveOverride && { onSaveOverride })}\n {...(onResetOverride && { onResetOverride })}\n />\n ))}\n </div>\n );\n}\n\nfunction PromptSlotCard({\n entry,\n onSaveOverride,\n onResetOverride,\n}: {\n entry: PromptEditorEntry;\n onSaveOverride?: PromptEditorProps['onSaveOverride'];\n onResetOverride?: PromptEditorProps['onResetOverride'];\n}) {\n const [body, setBody] = useState(entry.effectiveBody);\n const [isPending, startTransition] = useTransition();\n const [error, setError] = useState<string | null>(null);\n const [savedAt, setSavedAt] = useState<Date | null>(null);\n\n // Re-sync when server data refreshes (revalidatePath after save).\n useEffect(() => {\n setBody(entry.effectiveBody);\n }, [entry.effectiveBody]);\n\n const dirty = body !== entry.effectiveBody;\n const overridden = entry.hasOverride || dirty;\n\n function handleSave() {\n setError(null);\n startTransition(async () => {\n const fn = onSaveOverride ?? saveAgentPrompt;\n const result = await fn({ agentType: entry.agentType, promptId: entry.promptId, body });\n if (!result.ok) setError(result.error ?? 'Failed to save');\n else setSavedAt(new Date());\n });\n }\n\n function handleReset() {\n setError(null);\n startTransition(async () => {\n const fn = onResetOverride ?? resetAgentPrompt;\n const result = await fn({ agentType: entry.agentType, promptId: entry.promptId });\n if (!result.ok) setError(result.error ?? 'Failed to reset');\n else {\n setBody(entry.bundledBody);\n setSavedAt(new Date());\n }\n });\n }\n\n return (\n <article\n className=\"bg-card flex flex-col gap-3 rounded-lg border p-4\"\n data-testid={`prompt-slot-${entry.promptId}`}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <h3 className=\"text-sm font-semibold\">{entry.name}</h3>\n <p className=\"text-muted-foreground text-xs\">{entry.description}</p>\n <p className=\"text-muted-foreground mt-1 font-mono text-[10px]\">\n {entry.agentType}/{entry.promptId}\n </p>\n </div>\n {overridden ? (\n <Badge\n variant=\"default\"\n className=\"shrink-0\"\n data-testid={`badge-overridden-${entry.promptId}`}\n >\n Overridden\n </Badge>\n ) : (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n Bundled\n </Badge>\n )}\n </header>\n\n <Textarea\n value={body}\n onChange={(e) => setBody(e.target.value)}\n rows={Math.min(20, Math.max(6, body.split('\\n').length))}\n className=\"font-mono text-xs\"\n data-testid={`prompt-textarea-${entry.promptId}`}\n disabled={isPending}\n spellCheck={false}\n />\n\n {error ? (\n <Alert variant=\"destructive\" data-testid={`prompt-error-${entry.promptId}`}>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n {savedAt ? (\n <p className=\"text-muted-foreground text-xs\" data-testid={`prompt-saved-${entry.promptId}`}>\n Saved at {savedAt.toLocaleTimeString()}\n </p>\n ) : null}\n\n <div className=\"flex items-center justify-end gap-2\">\n {entry.hasOverride ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={isPending}\n onClick={handleReset}\n data-testid={`prompt-reset-${entry.promptId}`}\n >\n Reset to bundled\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={!dirty || isPending}\n onClick={handleSave}\n data-testid={`prompt-save-${entry.promptId}`}\n >\n {isPending ? 'Saving…' : entry.hasOverride ? 'Update override' : 'Save override'}\n </Button>\n </div>\n </article>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4068987a9d748712ed92ef5b5d9ad942f5e977d922\":\"saveAgentPrompt\"},\"src/presentation/web/app/actions/agent-prompts.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"4068987a9d748712ed92ef5b5d9ad942f5e977d922\",callServer,void 0,findSourceMapURL,\"saveAgentPrompt\");export{$$RSC_SERVER_ACTION_0 as saveAgentPrompt};","/* __next_internal_action_entry_do_not_use__ [{\"406b893fe8864179366c306ea1e2abe3981d09edb0\":\"resetAgentPrompt\"},\"src/presentation/web/app/actions/agent-prompts.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"406b893fe8864179366c306ea1e2abe3981d09edb0\",callServer,void 0,findSourceMapURL,\"resetAgentPrompt\");export{$$RSC_SERVER_ACTION_1 as resetAgentPrompt};","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useTransition } from 'react';\nimport {\n ReactFlow,\n ReactFlowProvider,\n Background,\n Controls,\n Position,\n addEdge,\n useEdgesState,\n useNodesState,\n type Connection,\n type Edge,\n type Node,\n type NodeProps,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport { Pencil, Plus, RotateCcw, Save, Trash2, X } from 'lucide-react';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { layoutWithDagre } from '@/lib/layout-with-dagre';\nimport { resetAgentGraph, saveAgentGraph } from '@/app/actions/agent-graph';\n\nexport interface AgentGraphDescriptor {\n agentType: string;\n nodes: { id: string; label: string; description?: string }[];\n edges: { from: string; to: string; label?: string }[];\n}\n\nexport interface AgentGraphViewProps {\n graph: AgentGraphDescriptor | null;\n /** Bundled descriptor — used by \"Reset to bundled\" to restore the default. */\n bundled?: AgentGraphDescriptor | null;\n /** True when an override exists; controls badge + reset visibility. */\n hasOverride?: boolean;\n /** Optional override of the save handler — used by tests/Storybook. */\n onSaveOverride?: (input: {\n agentType: string;\n nodes: AgentGraphDescriptor['nodes'];\n edges: AgentGraphDescriptor['edges'];\n }) => Promise<{ ok: boolean; error?: string }>;\n /** Optional override of the reset handler — used by tests/Storybook. */\n onResetOverride?: (input: { agentType: string }) => Promise<{ ok: boolean; error?: string }>;\n /** Force the editor to start in edit mode (Storybook). */\n initialEditing?: boolean;\n}\n\ninterface NodeData extends Record<string, unknown> {\n label: string;\n description?: string;\n editing: boolean;\n onLabelChange: (id: string, value: string) => void;\n onDescriptionChange: (id: string, value: string) => void;\n onDelete: (id: string) => void;\n}\n\nconst NODE_TYPES = { editable: EditableNode };\n\nexport function AgentGraphView(props: AgentGraphViewProps) {\n if (!props.graph) {\n return (\n <p\n className=\"text-muted-foreground rounded-lg border border-dashed p-4 text-sm\"\n data-testid=\"agent-graph-empty\"\n >\n No graph descriptor registered for this agent yet.\n </p>\n );\n }\n return (\n <ReactFlowProvider>\n <AgentGraphInner {...props} graph={props.graph} />\n </ReactFlowProvider>\n );\n}\n\nfunction AgentGraphInner({\n graph,\n bundled,\n hasOverride,\n onSaveOverride,\n onResetOverride,\n initialEditing,\n}: AgentGraphViewProps & { graph: AgentGraphDescriptor }) {\n const [editing, setEditing] = useState(Boolean(initialEditing));\n const [error, setError] = useState<string | null>(null);\n const [savedAt, setSavedAt] = useState<Date | null>(null);\n const [isPending, startTransition] = useTransition();\n const idCounterRef = useRef(0);\n\n const initial = useMemo(() => buildFlow(graph), [graph]);\n const [nodes, setNodes, onNodesChange] = useNodesState<Node<NodeData>>(initial.nodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(initial.edges);\n\n // Re-sync when server data refreshes (revalidatePath after save).\n useEffect(() => {\n setNodes(initial.nodes);\n setEdges(initial.edges);\n }, [initial.nodes, initial.edges, setNodes, setEdges]);\n\n const handleLabelChange = useCallback(\n (id: string, value: string) => {\n setNodes((curr) =>\n curr.map((n) => (n.id === id ? { ...n, data: { ...n.data, label: value } } : n))\n );\n },\n [setNodes]\n );\n\n const handleDescriptionChange = useCallback(\n (id: string, value: string) => {\n setNodes((curr) =>\n curr.map((n) => (n.id === id ? { ...n, data: { ...n.data, description: value } } : n))\n );\n },\n [setNodes]\n );\n\n const handleDelete = useCallback(\n (id: string) => {\n setNodes((curr) => curr.filter((n) => n.id !== id));\n setEdges((curr) => curr.filter((e) => e.source !== id && e.target !== id));\n },\n [setNodes, setEdges]\n );\n\n // Inject latest callbacks + editing flag into node.data (without re-laying-out).\n const renderedNodes = useMemo<Node<NodeData>[]>(\n () =>\n nodes.map((n) => ({\n ...n,\n type: 'editable',\n data: {\n ...n.data,\n editing,\n onLabelChange: handleLabelChange,\n onDescriptionChange: handleDescriptionChange,\n onDelete: handleDelete,\n },\n })),\n [nodes, editing, handleLabelChange, handleDescriptionChange, handleDelete]\n );\n\n function handleConnect(params: Connection) {\n setEdges((curr) => addEdge({ ...params, type: 'smoothstep' }, curr));\n }\n\n function handleAddNode() {\n idCounterRef.current += 1;\n const id = `node-${Date.now()}-${idCounterRef.current}`;\n setNodes((curr) => [\n ...curr,\n {\n id,\n type: 'editable',\n position: nextPosition(curr),\n data: {\n label: 'New step',\n description: '',\n editing: true,\n onLabelChange: handleLabelChange,\n onDescriptionChange: handleDescriptionChange,\n onDelete: handleDelete,\n },\n sourcePosition: Position.Right,\n targetPosition: Position.Left,\n },\n ]);\n }\n\n function handleSave() {\n setError(null);\n const payload = serialize(nodes, edges);\n const validation = validate(payload);\n if (validation) {\n setError(validation);\n return;\n }\n startTransition(async () => {\n const fn = onSaveOverride ?? saveAgentGraph;\n const result = await fn({ agentType: graph.agentType, ...payload });\n if (!result.ok) {\n setError(result.error ?? 'Failed to save graph');\n return;\n }\n setSavedAt(new Date());\n setEditing(false);\n });\n }\n\n function handleCancel() {\n setNodes(initial.nodes);\n setEdges(initial.edges);\n setError(null);\n setEditing(false);\n }\n\n function handleReset() {\n setError(null);\n startTransition(async () => {\n const fn = onResetOverride ?? resetAgentGraph;\n const result = await fn({ agentType: graph.agentType });\n if (!result.ok) {\n setError(result.error ?? 'Failed to reset graph');\n return;\n }\n setSavedAt(new Date());\n setEditing(false);\n // Re-sync from bundled when caller supplied it; otherwise the\n // revalidatePath in the server action will swap initial via props.\n if (bundled) {\n const fresh = buildFlow(bundled);\n setNodes(fresh.nodes);\n setEdges(fresh.edges);\n }\n });\n }\n\n return (\n <div className=\"flex flex-col gap-3\" data-testid=\"agent-graph-view\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium\">{graph.agentType}</p>\n {hasOverride ? (\n <Badge variant=\"default\" data-testid=\"graph-badge-overridden\">\n Overridden\n </Badge>\n ) : (\n <Badge variant=\"secondary\">Bundled</Badge>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {editing ? (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleAddNode}\n disabled={isPending}\n data-testid=\"graph-add-node\"\n >\n <Plus className=\"size-3\" />\n Add node\n </Button>\n {hasOverride ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleReset}\n disabled={isPending}\n data-testid=\"graph-reset\"\n >\n <RotateCcw className=\"size-3\" />\n Reset to bundled\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCancel}\n disabled={isPending}\n data-testid=\"graph-cancel\"\n >\n <X className=\"size-3\" />\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleSave}\n disabled={isPending}\n data-testid=\"graph-save\"\n >\n <Save className=\"size-3\" />\n {isPending ? 'Saving…' : 'Save graph'}\n </Button>\n </>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setEditing(true)}\n data-testid=\"graph-edit\"\n >\n <Pencil className=\"size-3\" />\n Edit\n </Button>\n )}\n </div>\n </div>\n\n {error ? (\n <Alert variant=\"destructive\" data-testid=\"graph-error\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n {savedAt && !editing ? (\n <p className=\"text-muted-foreground text-xs\" data-testid=\"graph-saved\">\n Saved at {savedAt.toLocaleTimeString()}\n </p>\n ) : null}\n\n <div className=\"bg-muted/20 h-[480px] w-full overflow-hidden rounded-lg border\">\n <ReactFlow\n nodes={renderedNodes}\n edges={edges}\n nodeTypes={NODE_TYPES}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={handleConnect}\n nodesDraggable={editing}\n nodesConnectable={editing}\n elementsSelectable={editing}\n deleteKeyCode={editing ? ['Backspace', 'Delete'] : null}\n fitView\n proOptions={{ hideAttribution: true }}\n >\n <Background gap={20} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </div>\n </div>\n );\n}\n\n// ── React Flow node ────────────────────────────────────────────────────────────\n\nimport { Handle } from '@xyflow/react';\n\nfunction EditableNode({ id, data }: NodeProps<Node<NodeData>>) {\n const { label, description, editing, onLabelChange, onDescriptionChange, onDelete } = data;\n return (\n <div className=\"bg-card relative min-w-[180px] rounded-md border px-2 py-1.5 shadow-sm\">\n <Handle type=\"target\" position={Position.Left} />\n {editing ? (\n <div className=\"flex flex-col gap-1\">\n <input\n value={label}\n onChange={(e) => onLabelChange(id, e.target.value)}\n className=\"border-border bg-background w-full rounded border px-1 py-0.5 text-xs font-semibold\"\n placeholder=\"label\"\n aria-label={`Label for node ${id}`}\n data-testid={`graph-node-label-${id}`}\n />\n <input\n value={description ?? ''}\n onChange={(e) => onDescriptionChange(id, e.target.value)}\n className=\"border-border bg-background w-full rounded border px-1 py-0.5 text-[10px]\"\n placeholder=\"description\"\n aria-label={`Description for node ${id}`}\n data-testid={`graph-node-description-${id}`}\n />\n <button\n type=\"button\"\n onClick={() => onDelete(id)}\n className=\"text-destructive absolute -top-2 -right-2 flex size-4 items-center justify-center rounded-full border bg-white shadow-sm\"\n aria-label={`Delete node ${id}`}\n data-testid={`graph-node-delete-${id}`}\n >\n <Trash2 className=\"size-2.5\" />\n </button>\n </div>\n ) : (\n <div className=\"flex flex-col items-start gap-0.5 text-left\">\n <span className=\"text-xs font-semibold\">{label}</span>\n {description ? (\n <span className=\"text-muted-foreground text-[10px]\">{description}</span>\n ) : null}\n </div>\n )}\n <Handle type=\"source\" position={Position.Right} />\n </div>\n );\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────────\n\nfunction buildFlow(graph: AgentGraphDescriptor): { nodes: Node<NodeData>[]; edges: Edge[] } {\n const nodes: Node<NodeData>[] = graph.nodes.map((n) => ({\n id: n.id,\n type: 'editable',\n position: { x: 0, y: 0 },\n data: {\n label: n.label,\n description: n.description ?? '',\n editing: false,\n onLabelChange: () => undefined,\n onDescriptionChange: () => undefined,\n onDelete: () => undefined,\n },\n sourcePosition: Position.Right,\n targetPosition: Position.Left,\n }));\n\n const edges: Edge[] = graph.edges.map((e, idx) => ({\n id: `e-${idx}-${e.from}-${e.to}`,\n source: e.from,\n target: e.to,\n type: 'smoothstep',\n label: e.label,\n animated: false,\n }));\n\n const laidOut = layoutWithDagre(nodes, edges, {\n direction: 'LR',\n nodeSize: { width: 220, height: 70 },\n nodesep: 30,\n ranksep: 80,\n });\n return { nodes: laidOut.nodes as Node<NodeData>[], edges: laidOut.edges };\n}\n\nfunction nextPosition(existing: Node<NodeData>[]): { x: number; y: number } {\n if (existing.length === 0) return { x: 0, y: 0 };\n const maxX = existing.reduce((m, n) => Math.max(m, n.position.x), 0);\n const minY = existing.reduce((m, n) => Math.min(m, n.position.y), 0);\n return { x: maxX + 240, y: minY };\n}\n\nfunction serialize(\n nodes: Node<NodeData>[],\n edges: Edge[]\n): { nodes: AgentGraphDescriptor['nodes']; edges: AgentGraphDescriptor['edges'] } {\n return {\n nodes: nodes.map((n) => ({\n id: n.id,\n label: n.data.label.trim() || n.id,\n ...(n.data.description?.trim() ? { description: n.data.description.trim() } : {}),\n })),\n edges: edges.map((e) => ({\n from: e.source,\n to: e.target,\n ...(typeof e.label === 'string' && e.label.trim() ? { label: e.label.trim() } : {}),\n })),\n };\n}\n\nfunction validate(payload: {\n nodes: AgentGraphDescriptor['nodes'];\n edges: AgentGraphDescriptor['edges'];\n}): string | null {\n if (payload.nodes.length === 0) return 'Graph must have at least one node.';\n const ids = new Set<string>();\n for (const n of payload.nodes) {\n if (!n.label) return `Node ${n.id} must have a label.`;\n if (ids.has(n.id)) return `Duplicate node id: ${n.id}`;\n ids.add(n.id);\n }\n for (const e of payload.edges) {\n if (!ids.has(e.from)) return `Edge references unknown source: ${e.from}`;\n if (!ids.has(e.to)) return `Edge references unknown target: ${e.to}`;\n }\n return null;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40ad2417227f10a4eca778e2126f6bd3e29594679d\":\"resetAgentGraph\"},\"src/presentation/web/app/actions/agent-graph.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"40ad2417227f10a4eca778e2126f6bd3e29594679d\",callServer,void 0,findSourceMapURL,\"resetAgentGraph\");export{$$RSC_SERVER_ACTION_1 as resetAgentGraph};","/* __next_internal_action_entry_do_not_use__ [{\"40c92ce75be5ab248b54ffdd57154fdcce2a358b8d\":\"saveAgentGraph\"},\"src/presentation/web/app/actions/agent-graph.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40c92ce75be5ab248b54ffdd57154fdcce2a358b8d\",callServer,void 0,findSourceMapURL,\"saveAgentGraph\");export{$$RSC_SERVER_ACTION_0 as saveAgentGraph};","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Send, Square } from 'lucide-react';\n\nexport interface PlaygroundChatMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n}\n\nlet nextMessageId = 0;\nfunction newMessageId(): string {\n nextMessageId += 1;\n return `msg-${nextMessageId}`;\n}\n\nexport interface AgentPlaygroundProps {\n agentType: string;\n /** Currently selected prompt slot — used for the system prompt + UI context. */\n promptId: string;\n /** Inline prompt body the user is currently editing (overrides the saved one). */\n inlinePromptBody?: string;\n /** Optional override of the streaming endpoint — used by tests/Storybook. */\n fetchOverride?: typeof fetch;\n}\n\ninterface StreamEvent {\n type: 'system' | 'delta' | 'done' | 'error';\n content: string;\n}\n\nexport function AgentPlayground({\n agentType,\n promptId,\n inlinePromptBody,\n fetchOverride,\n}: AgentPlaygroundProps) {\n const [input, setInput] = useState('');\n const [messages, setMessages] = useState<PlaygroundChatMessage[]>([]);\n const [streaming, setStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const transcriptRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n transcriptRef.current?.scrollTo({ top: transcriptRef.current.scrollHeight });\n }, [messages]);\n\n async function send(prompt: string) {\n if (!prompt.trim() || streaming) return;\n setError(null);\n\n const nextMessages: PlaygroundChatMessage[] = [\n ...messages,\n { id: newMessageId(), role: 'user', content: prompt },\n { id: newMessageId(), role: 'assistant', content: '' },\n ];\n setMessages(nextMessages);\n setInput('');\n setStreaming(true);\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const fetcher = fetchOverride ?? fetch;\n const res = await fetcher('/api/agents/playground', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n agentType,\n promptId,\n ...(inlinePromptBody && { promptBody: inlinePromptBody }),\n messages: nextMessages.slice(0, -1).map((m) => ({ role: m.role, content: m.content })),\n }),\n signal: controller.signal,\n });\n\n if (!res.ok || !res.body) {\n const message = `Playground request failed (${res.status})`;\n setError(message);\n setStreaming(false);\n return;\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const events = buffer.split('\\n\\n');\n buffer = events.pop() ?? '';\n for (const block of events) {\n const line = block.trim();\n if (!line.startsWith('data:')) continue;\n const payload = line.slice(5).trim();\n if (!payload) continue;\n try {\n const event = JSON.parse(payload) as StreamEvent;\n if (event.type === 'delta') {\n setMessages((prev) => appendDelta(prev, event.content));\n } else if (event.type === 'error') {\n setError(event.content);\n }\n } catch {\n // ignore malformed line\n }\n }\n }\n } catch (err) {\n if ((err as { name?: string })?.name !== 'AbortError') {\n setError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n setStreaming(false);\n abortRef.current = null;\n }\n }\n\n function stop() {\n abortRef.current?.abort();\n abortRef.current = null;\n setStreaming(false);\n }\n\n return (\n <div className=\"flex flex-col gap-3 rounded-lg border p-4\" data-testid=\"agent-playground\">\n <header className=\"flex items-center justify-between gap-2\">\n <div className=\"flex flex-col\">\n <p className=\"text-sm font-semibold\">Playground</p>\n <p className=\"text-muted-foreground text-xs\">\n Streaming against {agentType} · {promptId}\n {inlinePromptBody ? ' (inline override)' : ''}\n </p>\n </div>\n {messages.length > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setMessages([])}\n disabled={streaming}\n >\n Clear\n </Button>\n ) : null}\n </header>\n\n <div\n ref={transcriptRef}\n className=\"bg-muted/20 flex h-72 flex-col gap-2 overflow-y-auto rounded border p-3\"\n data-testid=\"playground-transcript\"\n >\n {messages.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">\n Send a message to test this prompt against the configured executor.\n </p>\n ) : (\n messages.map((m, i) => (\n <div\n key={m.id}\n className={\n m.role === 'user'\n ? 'bg-primary text-primary-foreground max-w-[85%] self-end rounded-lg px-3 py-2 text-sm'\n : 'bg-card max-w-[85%] self-start rounded-lg border px-3 py-2 text-sm whitespace-pre-wrap'\n }\n data-testid={`playground-msg-${i}-${m.role}`}\n >\n {m.content || (streaming && i === messages.length - 1 ? '…' : '')}\n </div>\n ))\n )}\n </div>\n\n {error ? (\n <Alert variant=\"destructive\" data-testid=\"playground-error\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <form\n className=\"flex items-end gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n void send(input);\n }}\n >\n <Textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n rows={2}\n placeholder=\"Try a prompt…\"\n className=\"font-mono text-xs\"\n data-testid=\"playground-input\"\n disabled={streaming}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n void send(input);\n }\n }}\n />\n {streaming ? (\n <Button type=\"button\" variant=\"secondary\" onClick={stop} data-testid=\"playground-stop\">\n <Square className=\"size-3\" />\n Stop\n </Button>\n ) : (\n <Button type=\"submit\" disabled={!input.trim()} data-testid=\"playground-send\">\n <Send className=\"size-3\" />\n Send\n </Button>\n )}\n </form>\n </div>\n );\n}\n\nfunction appendDelta(prev: PlaygroundChatMessage[], delta: string): PlaygroundChatMessage[] {\n if (prev.length === 0) return prev;\n const last = prev[prev.length - 1];\n if (last?.role !== 'assistant') return prev;\n const next = [...prev];\n next[next.length - 1] = { ...last, content: last.content + delta };\n return next;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/agent-editor/agent-editor-tabs.tsx","../../../../../../../src/presentation/web/components/agent-editor/prompt-editor.tsx","../../../../../../../src/presentation/web/app/actions/data%3A73d5cf%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A873d21%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/agent-editor/agent-graph-view.tsx","../../../../../../../src/presentation/web/app/actions/data%3A0e2e3b%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A3f8bde%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/agent-editor/agent-playground.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';\nimport { PromptEditor, type PromptEditorEntry } from './prompt-editor';\nimport { AgentGraphView, type AgentGraphDescriptor } from './agent-graph-view';\nimport { AgentPlayground } from './agent-playground';\n\nexport interface AgentEditorTabsProps {\n agentType: string;\n prompts: PromptEditorEntry[];\n graph: AgentGraphDescriptor | null;\n bundledGraph?: AgentGraphDescriptor | null;\n hasGraphOverride?: boolean;\n}\n\nexport function AgentEditorTabs({\n agentType,\n prompts,\n graph,\n bundledGraph,\n hasGraphOverride,\n}: AgentEditorTabsProps) {\n const [selectedPromptId, setSelectedPromptId] = useState<string>(\n prompts[0]?.promptId ?? 'evaluator.system'\n );\n const selectedPrompt = prompts.find((p) => p.promptId === selectedPromptId);\n\n return (\n <Tabs defaultValue=\"prompts\" data-testid=\"agent-editor-tabs\">\n <TabsList>\n <TabsTrigger value=\"prompts\">Prompts</TabsTrigger>\n <TabsTrigger value=\"graph\">Graph</TabsTrigger>\n <TabsTrigger value=\"playground\">Playground</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"prompts\" className=\"mt-4\">\n <PromptEditor entries={prompts} />\n </TabsContent>\n\n <TabsContent value=\"graph\" className=\"mt-4\">\n <AgentGraphView\n graph={graph}\n bundled={bundledGraph ?? null}\n hasOverride={hasGraphOverride ?? false}\n />\n </TabsContent>\n\n <TabsContent value=\"playground\" className=\"mt-4 flex flex-col gap-3\">\n {prompts.length > 1 ? (\n <div className=\"flex items-center gap-2 text-xs\">\n <label htmlFor=\"playground-prompt-select\" className=\"text-muted-foreground\">\n Use prompt:\n </label>\n <select\n id=\"playground-prompt-select\"\n value={selectedPromptId}\n onChange={(e) => setSelectedPromptId(e.target.value)}\n className=\"border-border bg-background rounded border px-2 py-1 text-xs\"\n data-testid=\"playground-prompt-select\"\n >\n {prompts.map((p) => (\n <option key={p.promptId} value={p.promptId}>\n {p.name}\n </option>\n ))}\n </select>\n </div>\n ) : null}\n <AgentPlayground\n agentType={agentType}\n promptId={selectedPromptId}\n {...(selectedPrompt?.hasOverride && { inlinePromptBody: selectedPrompt.effectiveBody })}\n />\n </TabsContent>\n </Tabs>\n );\n}\n","'use client';\n\nimport { useEffect, useState, useTransition } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Badge } from '@/components/ui/badge';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { saveAgentPrompt, resetAgentPrompt } from '@/app/actions/agent-prompts';\n\nexport interface PromptEditorEntry {\n agentType: string;\n promptId: string;\n name: string;\n description: string;\n bundledBody: string;\n effectiveBody: string;\n hasOverride: boolean;\n}\n\nexport interface PromptEditorProps {\n entries: PromptEditorEntry[];\n /** Optional override of the save handler — used by Storybook + tests. */\n onSaveOverride?: (input: { agentType: string; promptId: string; body: string }) => Promise<{\n ok: boolean;\n error?: string;\n }>;\n onResetOverride?: (input: { agentType: string; promptId: string }) => Promise<{\n ok: boolean;\n error?: string;\n }>;\n}\n\nexport function PromptEditor({ entries, onSaveOverride, onResetOverride }: PromptEditorProps) {\n if (entries.length === 0) {\n return (\n <p className=\"text-muted-foreground rounded-lg border border-dashed p-4 text-sm\">\n No editable prompt slots are registered for this agent yet.\n </p>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\" data-testid=\"prompt-editor\">\n {entries.map((entry) => (\n <PromptSlotCard\n key={`${entry.agentType}-${entry.promptId}`}\n entry={entry}\n {...(onSaveOverride && { onSaveOverride })}\n {...(onResetOverride && { onResetOverride })}\n />\n ))}\n </div>\n );\n}\n\nfunction PromptSlotCard({\n entry,\n onSaveOverride,\n onResetOverride,\n}: {\n entry: PromptEditorEntry;\n onSaveOverride?: PromptEditorProps['onSaveOverride'];\n onResetOverride?: PromptEditorProps['onResetOverride'];\n}) {\n const [body, setBody] = useState(entry.effectiveBody);\n const [isPending, startTransition] = useTransition();\n const [error, setError] = useState<string | null>(null);\n const [savedAt, setSavedAt] = useState<Date | null>(null);\n\n // Re-sync when server data refreshes (revalidatePath after save).\n useEffect(() => {\n setBody(entry.effectiveBody);\n }, [entry.effectiveBody]);\n\n const dirty = body !== entry.effectiveBody;\n const overridden = entry.hasOverride || dirty;\n\n function handleSave() {\n setError(null);\n startTransition(async () => {\n const fn = onSaveOverride ?? saveAgentPrompt;\n const result = await fn({ agentType: entry.agentType, promptId: entry.promptId, body });\n if (!result.ok) setError(result.error ?? 'Failed to save');\n else setSavedAt(new Date());\n });\n }\n\n function handleReset() {\n setError(null);\n startTransition(async () => {\n const fn = onResetOverride ?? resetAgentPrompt;\n const result = await fn({ agentType: entry.agentType, promptId: entry.promptId });\n if (!result.ok) setError(result.error ?? 'Failed to reset');\n else {\n setBody(entry.bundledBody);\n setSavedAt(new Date());\n }\n });\n }\n\n return (\n <article\n className=\"bg-card flex flex-col gap-3 rounded-lg border p-4\"\n data-testid={`prompt-slot-${entry.promptId}`}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <h3 className=\"text-sm font-semibold\">{entry.name}</h3>\n <p className=\"text-muted-foreground text-xs\">{entry.description}</p>\n <p className=\"text-muted-foreground mt-1 font-mono text-[10px]\">\n {entry.agentType}/{entry.promptId}\n </p>\n </div>\n {overridden ? (\n <Badge\n variant=\"default\"\n className=\"shrink-0\"\n data-testid={`badge-overridden-${entry.promptId}`}\n >\n Overridden\n </Badge>\n ) : (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n Bundled\n </Badge>\n )}\n </header>\n\n <Textarea\n value={body}\n onChange={(e) => setBody(e.target.value)}\n rows={Math.min(20, Math.max(6, body.split('\\n').length))}\n className=\"font-mono text-xs\"\n data-testid={`prompt-textarea-${entry.promptId}`}\n disabled={isPending}\n spellCheck={false}\n />\n\n {error ? (\n <Alert variant=\"destructive\" data-testid={`prompt-error-${entry.promptId}`}>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n {savedAt ? (\n <p className=\"text-muted-foreground text-xs\" data-testid={`prompt-saved-${entry.promptId}`}>\n Saved at {savedAt.toLocaleTimeString()}\n </p>\n ) : null}\n\n <div className=\"flex items-center justify-end gap-2\">\n {entry.hasOverride ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={isPending}\n onClick={handleReset}\n data-testid={`prompt-reset-${entry.promptId}`}\n >\n Reset to bundled\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={!dirty || isPending}\n onClick={handleSave}\n data-testid={`prompt-save-${entry.promptId}`}\n >\n {isPending ? 'Saving…' : entry.hasOverride ? 'Update override' : 'Save override'}\n </Button>\n </div>\n </article>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4058419163c682b19445b7046c44220504fb8fcdee\":\"saveAgentPrompt\"},\"src/presentation/web/app/actions/agent-prompts.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"4058419163c682b19445b7046c44220504fb8fcdee\",callServer,void 0,findSourceMapURL,\"saveAgentPrompt\");export{$$RSC_SERVER_ACTION_0 as saveAgentPrompt};","/* __next_internal_action_entry_do_not_use__ [{\"40b8d0cf270d6704436f7ca615ab2a7bbf86ae2cf7\":\"resetAgentPrompt\"},\"src/presentation/web/app/actions/agent-prompts.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"40b8d0cf270d6704436f7ca615ab2a7bbf86ae2cf7\",callServer,void 0,findSourceMapURL,\"resetAgentPrompt\");export{$$RSC_SERVER_ACTION_1 as resetAgentPrompt};","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useTransition } from 'react';\nimport {\n ReactFlow,\n ReactFlowProvider,\n Background,\n Controls,\n Position,\n addEdge,\n useEdgesState,\n useNodesState,\n type Connection,\n type Edge,\n type Node,\n type NodeProps,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport { Pencil, Plus, RotateCcw, Save, Trash2, X } from 'lucide-react';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { layoutWithDagre } from '@/lib/layout-with-dagre';\nimport { resetAgentGraph, saveAgentGraph } from '@/app/actions/agent-graph';\n\nexport interface AgentGraphDescriptor {\n agentType: string;\n nodes: { id: string; label: string; description?: string }[];\n edges: { from: string; to: string; label?: string }[];\n}\n\nexport interface AgentGraphViewProps {\n graph: AgentGraphDescriptor | null;\n /** Bundled descriptor — used by \"Reset to bundled\" to restore the default. */\n bundled?: AgentGraphDescriptor | null;\n /** True when an override exists; controls badge + reset visibility. */\n hasOverride?: boolean;\n /** Optional override of the save handler — used by tests/Storybook. */\n onSaveOverride?: (input: {\n agentType: string;\n nodes: AgentGraphDescriptor['nodes'];\n edges: AgentGraphDescriptor['edges'];\n }) => Promise<{ ok: boolean; error?: string }>;\n /** Optional override of the reset handler — used by tests/Storybook. */\n onResetOverride?: (input: { agentType: string }) => Promise<{ ok: boolean; error?: string }>;\n /** Force the editor to start in edit mode (Storybook). */\n initialEditing?: boolean;\n}\n\ninterface NodeData extends Record<string, unknown> {\n label: string;\n description?: string;\n editing: boolean;\n onLabelChange: (id: string, value: string) => void;\n onDescriptionChange: (id: string, value: string) => void;\n onDelete: (id: string) => void;\n}\n\nconst NODE_TYPES = { editable: EditableNode };\n\nexport function AgentGraphView(props: AgentGraphViewProps) {\n if (!props.graph) {\n return (\n <p\n className=\"text-muted-foreground rounded-lg border border-dashed p-4 text-sm\"\n data-testid=\"agent-graph-empty\"\n >\n No graph descriptor registered for this agent yet.\n </p>\n );\n }\n return (\n <ReactFlowProvider>\n <AgentGraphInner {...props} graph={props.graph} />\n </ReactFlowProvider>\n );\n}\n\nfunction AgentGraphInner({\n graph,\n bundled,\n hasOverride,\n onSaveOverride,\n onResetOverride,\n initialEditing,\n}: AgentGraphViewProps & { graph: AgentGraphDescriptor }) {\n const [editing, setEditing] = useState(Boolean(initialEditing));\n const [error, setError] = useState<string | null>(null);\n const [savedAt, setSavedAt] = useState<Date | null>(null);\n const [isPending, startTransition] = useTransition();\n const idCounterRef = useRef(0);\n\n const initial = useMemo(() => buildFlow(graph), [graph]);\n const [nodes, setNodes, onNodesChange] = useNodesState<Node<NodeData>>(initial.nodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(initial.edges);\n\n // Re-sync when server data refreshes (revalidatePath after save).\n useEffect(() => {\n setNodes(initial.nodes);\n setEdges(initial.edges);\n }, [initial.nodes, initial.edges, setNodes, setEdges]);\n\n const handleLabelChange = useCallback(\n (id: string, value: string) => {\n setNodes((curr) =>\n curr.map((n) => (n.id === id ? { ...n, data: { ...n.data, label: value } } : n))\n );\n },\n [setNodes]\n );\n\n const handleDescriptionChange = useCallback(\n (id: string, value: string) => {\n setNodes((curr) =>\n curr.map((n) => (n.id === id ? { ...n, data: { ...n.data, description: value } } : n))\n );\n },\n [setNodes]\n );\n\n const handleDelete = useCallback(\n (id: string) => {\n setNodes((curr) => curr.filter((n) => n.id !== id));\n setEdges((curr) => curr.filter((e) => e.source !== id && e.target !== id));\n },\n [setNodes, setEdges]\n );\n\n // Inject latest callbacks + editing flag into node.data (without re-laying-out).\n const renderedNodes = useMemo<Node<NodeData>[]>(\n () =>\n nodes.map((n) => ({\n ...n,\n type: 'editable',\n data: {\n ...n.data,\n editing,\n onLabelChange: handleLabelChange,\n onDescriptionChange: handleDescriptionChange,\n onDelete: handleDelete,\n },\n })),\n [nodes, editing, handleLabelChange, handleDescriptionChange, handleDelete]\n );\n\n function handleConnect(params: Connection) {\n setEdges((curr) => addEdge({ ...params, type: 'smoothstep' }, curr));\n }\n\n function handleAddNode() {\n idCounterRef.current += 1;\n const id = `node-${Date.now()}-${idCounterRef.current}`;\n setNodes((curr) => [\n ...curr,\n {\n id,\n type: 'editable',\n position: nextPosition(curr),\n data: {\n label: 'New step',\n description: '',\n editing: true,\n onLabelChange: handleLabelChange,\n onDescriptionChange: handleDescriptionChange,\n onDelete: handleDelete,\n },\n sourcePosition: Position.Right,\n targetPosition: Position.Left,\n },\n ]);\n }\n\n function handleSave() {\n setError(null);\n const payload = serialize(nodes, edges);\n const validation = validate(payload);\n if (validation) {\n setError(validation);\n return;\n }\n startTransition(async () => {\n const fn = onSaveOverride ?? saveAgentGraph;\n const result = await fn({ agentType: graph.agentType, ...payload });\n if (!result.ok) {\n setError(result.error ?? 'Failed to save graph');\n return;\n }\n setSavedAt(new Date());\n setEditing(false);\n });\n }\n\n function handleCancel() {\n setNodes(initial.nodes);\n setEdges(initial.edges);\n setError(null);\n setEditing(false);\n }\n\n function handleReset() {\n setError(null);\n startTransition(async () => {\n const fn = onResetOverride ?? resetAgentGraph;\n const result = await fn({ agentType: graph.agentType });\n if (!result.ok) {\n setError(result.error ?? 'Failed to reset graph');\n return;\n }\n setSavedAt(new Date());\n setEditing(false);\n // Re-sync from bundled when caller supplied it; otherwise the\n // revalidatePath in the server action will swap initial via props.\n if (bundled) {\n const fresh = buildFlow(bundled);\n setNodes(fresh.nodes);\n setEdges(fresh.edges);\n }\n });\n }\n\n return (\n <div className=\"flex flex-col gap-3\" data-testid=\"agent-graph-view\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium\">{graph.agentType}</p>\n {hasOverride ? (\n <Badge variant=\"default\" data-testid=\"graph-badge-overridden\">\n Overridden\n </Badge>\n ) : (\n <Badge variant=\"secondary\">Bundled</Badge>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {editing ? (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleAddNode}\n disabled={isPending}\n data-testid=\"graph-add-node\"\n >\n <Plus className=\"size-3\" />\n Add node\n </Button>\n {hasOverride ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleReset}\n disabled={isPending}\n data-testid=\"graph-reset\"\n >\n <RotateCcw className=\"size-3\" />\n Reset to bundled\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCancel}\n disabled={isPending}\n data-testid=\"graph-cancel\"\n >\n <X className=\"size-3\" />\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleSave}\n disabled={isPending}\n data-testid=\"graph-save\"\n >\n <Save className=\"size-3\" />\n {isPending ? 'Saving…' : 'Save graph'}\n </Button>\n </>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setEditing(true)}\n data-testid=\"graph-edit\"\n >\n <Pencil className=\"size-3\" />\n Edit\n </Button>\n )}\n </div>\n </div>\n\n {error ? (\n <Alert variant=\"destructive\" data-testid=\"graph-error\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n {savedAt && !editing ? (\n <p className=\"text-muted-foreground text-xs\" data-testid=\"graph-saved\">\n Saved at {savedAt.toLocaleTimeString()}\n </p>\n ) : null}\n\n <div className=\"bg-muted/20 h-[480px] w-full overflow-hidden rounded-lg border\">\n <ReactFlow\n nodes={renderedNodes}\n edges={edges}\n nodeTypes={NODE_TYPES}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={handleConnect}\n nodesDraggable={editing}\n nodesConnectable={editing}\n elementsSelectable={editing}\n deleteKeyCode={editing ? ['Backspace', 'Delete'] : null}\n fitView\n proOptions={{ hideAttribution: true }}\n >\n <Background gap={20} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </div>\n </div>\n );\n}\n\n// ── React Flow node ────────────────────────────────────────────────────────────\n\nimport { Handle } from '@xyflow/react';\n\nfunction EditableNode({ id, data }: NodeProps<Node<NodeData>>) {\n const { label, description, editing, onLabelChange, onDescriptionChange, onDelete } = data;\n return (\n <div className=\"bg-card relative min-w-[180px] rounded-md border px-2 py-1.5 shadow-sm\">\n <Handle type=\"target\" position={Position.Left} />\n {editing ? (\n <div className=\"flex flex-col gap-1\">\n <input\n value={label}\n onChange={(e) => onLabelChange(id, e.target.value)}\n className=\"border-border bg-background w-full rounded border px-1 py-0.5 text-xs font-semibold\"\n placeholder=\"label\"\n aria-label={`Label for node ${id}`}\n data-testid={`graph-node-label-${id}`}\n />\n <input\n value={description ?? ''}\n onChange={(e) => onDescriptionChange(id, e.target.value)}\n className=\"border-border bg-background w-full rounded border px-1 py-0.5 text-[10px]\"\n placeholder=\"description\"\n aria-label={`Description for node ${id}`}\n data-testid={`graph-node-description-${id}`}\n />\n <button\n type=\"button\"\n onClick={() => onDelete(id)}\n className=\"text-destructive absolute -top-2 -right-2 flex size-4 items-center justify-center rounded-full border bg-white shadow-sm\"\n aria-label={`Delete node ${id}`}\n data-testid={`graph-node-delete-${id}`}\n >\n <Trash2 className=\"size-2.5\" />\n </button>\n </div>\n ) : (\n <div className=\"flex flex-col items-start gap-0.5 text-left\">\n <span className=\"text-xs font-semibold\">{label}</span>\n {description ? (\n <span className=\"text-muted-foreground text-[10px]\">{description}</span>\n ) : null}\n </div>\n )}\n <Handle type=\"source\" position={Position.Right} />\n </div>\n );\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────────\n\nfunction buildFlow(graph: AgentGraphDescriptor): { nodes: Node<NodeData>[]; edges: Edge[] } {\n const nodes: Node<NodeData>[] = graph.nodes.map((n) => ({\n id: n.id,\n type: 'editable',\n position: { x: 0, y: 0 },\n data: {\n label: n.label,\n description: n.description ?? '',\n editing: false,\n onLabelChange: () => undefined,\n onDescriptionChange: () => undefined,\n onDelete: () => undefined,\n },\n sourcePosition: Position.Right,\n targetPosition: Position.Left,\n }));\n\n const edges: Edge[] = graph.edges.map((e, idx) => ({\n id: `e-${idx}-${e.from}-${e.to}`,\n source: e.from,\n target: e.to,\n type: 'smoothstep',\n label: e.label,\n animated: false,\n }));\n\n const laidOut = layoutWithDagre(nodes, edges, {\n direction: 'LR',\n nodeSize: { width: 220, height: 70 },\n nodesep: 30,\n ranksep: 80,\n });\n return { nodes: laidOut.nodes as Node<NodeData>[], edges: laidOut.edges };\n}\n\nfunction nextPosition(existing: Node<NodeData>[]): { x: number; y: number } {\n if (existing.length === 0) return { x: 0, y: 0 };\n const maxX = existing.reduce((m, n) => Math.max(m, n.position.x), 0);\n const minY = existing.reduce((m, n) => Math.min(m, n.position.y), 0);\n return { x: maxX + 240, y: minY };\n}\n\nfunction serialize(\n nodes: Node<NodeData>[],\n edges: Edge[]\n): { nodes: AgentGraphDescriptor['nodes']; edges: AgentGraphDescriptor['edges'] } {\n return {\n nodes: nodes.map((n) => ({\n id: n.id,\n label: n.data.label.trim() || n.id,\n ...(n.data.description?.trim() ? { description: n.data.description.trim() } : {}),\n })),\n edges: edges.map((e) => ({\n from: e.source,\n to: e.target,\n ...(typeof e.label === 'string' && e.label.trim() ? { label: e.label.trim() } : {}),\n })),\n };\n}\n\nfunction validate(payload: {\n nodes: AgentGraphDescriptor['nodes'];\n edges: AgentGraphDescriptor['edges'];\n}): string | null {\n if (payload.nodes.length === 0) return 'Graph must have at least one node.';\n const ids = new Set<string>();\n for (const n of payload.nodes) {\n if (!n.label) return `Node ${n.id} must have a label.`;\n if (ids.has(n.id)) return `Duplicate node id: ${n.id}`;\n ids.add(n.id);\n }\n for (const e of payload.edges) {\n if (!ids.has(e.from)) return `Edge references unknown source: ${e.from}`;\n if (!ids.has(e.to)) return `Edge references unknown target: ${e.to}`;\n }\n return null;\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4063625f5f10db64950da320dd6272b580f69873a9\":\"resetAgentGraph\"},\"src/presentation/web/app/actions/agent-graph.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"4063625f5f10db64950da320dd6272b580f69873a9\",callServer,void 0,findSourceMapURL,\"resetAgentGraph\");export{$$RSC_SERVER_ACTION_1 as resetAgentGraph};","/* __next_internal_action_entry_do_not_use__ [{\"4001c755450bb815b3e68e16e7f4dbca09edd97ac7\":\"saveAgentGraph\"},\"src/presentation/web/app/actions/agent-graph.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"4001c755450bb815b3e68e16e7f4dbca09edd97ac7\",callServer,void 0,findSourceMapURL,\"saveAgentGraph\");export{$$RSC_SERVER_ACTION_0 as saveAgentGraph};","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Send, Square } from 'lucide-react';\n\nexport interface PlaygroundChatMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n}\n\nlet nextMessageId = 0;\nfunction newMessageId(): string {\n nextMessageId += 1;\n return `msg-${nextMessageId}`;\n}\n\nexport interface AgentPlaygroundProps {\n agentType: string;\n /** Currently selected prompt slot — used for the system prompt + UI context. */\n promptId: string;\n /** Inline prompt body the user is currently editing (overrides the saved one). */\n inlinePromptBody?: string;\n /** Optional override of the streaming endpoint — used by tests/Storybook. */\n fetchOverride?: typeof fetch;\n}\n\ninterface StreamEvent {\n type: 'system' | 'delta' | 'done' | 'error';\n content: string;\n}\n\nexport function AgentPlayground({\n agentType,\n promptId,\n inlinePromptBody,\n fetchOverride,\n}: AgentPlaygroundProps) {\n const [input, setInput] = useState('');\n const [messages, setMessages] = useState<PlaygroundChatMessage[]>([]);\n const [streaming, setStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const transcriptRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n transcriptRef.current?.scrollTo({ top: transcriptRef.current.scrollHeight });\n }, [messages]);\n\n async function send(prompt: string) {\n if (!prompt.trim() || streaming) return;\n setError(null);\n\n const nextMessages: PlaygroundChatMessage[] = [\n ...messages,\n { id: newMessageId(), role: 'user', content: prompt },\n { id: newMessageId(), role: 'assistant', content: '' },\n ];\n setMessages(nextMessages);\n setInput('');\n setStreaming(true);\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const fetcher = fetchOverride ?? fetch;\n const res = await fetcher('/api/agents/playground', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n agentType,\n promptId,\n ...(inlinePromptBody && { promptBody: inlinePromptBody }),\n messages: nextMessages.slice(0, -1).map((m) => ({ role: m.role, content: m.content })),\n }),\n signal: controller.signal,\n });\n\n if (!res.ok || !res.body) {\n const message = `Playground request failed (${res.status})`;\n setError(message);\n setStreaming(false);\n return;\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const events = buffer.split('\\n\\n');\n buffer = events.pop() ?? '';\n for (const block of events) {\n const line = block.trim();\n if (!line.startsWith('data:')) continue;\n const payload = line.slice(5).trim();\n if (!payload) continue;\n try {\n const event = JSON.parse(payload) as StreamEvent;\n if (event.type === 'delta') {\n setMessages((prev) => appendDelta(prev, event.content));\n } else if (event.type === 'error') {\n setError(event.content);\n }\n } catch {\n // ignore malformed line\n }\n }\n }\n } catch (err) {\n if ((err as { name?: string })?.name !== 'AbortError') {\n setError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n setStreaming(false);\n abortRef.current = null;\n }\n }\n\n function stop() {\n abortRef.current?.abort();\n abortRef.current = null;\n setStreaming(false);\n }\n\n return (\n <div className=\"flex flex-col gap-3 rounded-lg border p-4\" data-testid=\"agent-playground\">\n <header className=\"flex items-center justify-between gap-2\">\n <div className=\"flex flex-col\">\n <p className=\"text-sm font-semibold\">Playground</p>\n <p className=\"text-muted-foreground text-xs\">\n Streaming against {agentType} · {promptId}\n {inlinePromptBody ? ' (inline override)' : ''}\n </p>\n </div>\n {messages.length > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setMessages([])}\n disabled={streaming}\n >\n Clear\n </Button>\n ) : null}\n </header>\n\n <div\n ref={transcriptRef}\n className=\"bg-muted/20 flex h-72 flex-col gap-2 overflow-y-auto rounded border p-3\"\n data-testid=\"playground-transcript\"\n >\n {messages.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">\n Send a message to test this prompt against the configured executor.\n </p>\n ) : (\n messages.map((m, i) => (\n <div\n key={m.id}\n className={\n m.role === 'user'\n ? 'bg-primary text-primary-foreground max-w-[85%] self-end rounded-lg px-3 py-2 text-sm'\n : 'bg-card max-w-[85%] self-start rounded-lg border px-3 py-2 text-sm whitespace-pre-wrap'\n }\n data-testid={`playground-msg-${i}-${m.role}`}\n >\n {m.content || (streaming && i === messages.length - 1 ? '…' : '')}\n </div>\n ))\n )}\n </div>\n\n {error ? (\n <Alert variant=\"destructive\" data-testid=\"playground-error\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <form\n className=\"flex items-end gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n void send(input);\n }}\n >\n <Textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n rows={2}\n placeholder=\"Try a prompt…\"\n className=\"font-mono text-xs\"\n data-testid=\"playground-input\"\n disabled={streaming}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n void send(input);\n }\n }}\n />\n {streaming ? (\n <Button type=\"button\" variant=\"secondary\" onClick={stop} data-testid=\"playground-stop\">\n <Square className=\"size-3\" />\n Stop\n </Button>\n ) : (\n <Button type=\"submit\" disabled={!input.trim()} data-testid=\"playground-send\">\n <Send className=\"size-3\" />\n Send\n </Button>\n )}\n </form>\n </div>\n );\n}\n\nfunction appendDelta(prev: PlaygroundChatMessage[], delta: string): PlaygroundChatMessage[] {\n if (prev.length === 0) return prev;\n const last = prev[prev.length - 1];\n if (last?.role !== 'assistant') return prev;\n const next = [...prev];\n next[next.length - 1] = { ...last, content: last.content + delta };\n return next;\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[100228,a=>{"use strict";var b=a.i(556365);a.i(478454);var c=a.i(124255),d=a.i(302824),e=a.i(658339),f=a.i(513126),g=a.i(403195);function h({skill:a,onClose:h}){return(0,b.jsx)(c.BaseDrawer,{open:null!==a,onClose:h,size:"sm",modal:!0,"data-testid":"skill-detail-drawer",header:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.DrawerTitle,{children:a.displayName}),(0,b.jsx)(d.DrawerDescription,{children:a.name})]}):void 0,children:a?(0,b.jsxs)("div",{className:"px-4 pb-4",children:[(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:a.description}),(0,b.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(e.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),(0,b.jsx)(e.Badge,{variant:"outline",children:a.category}),a.context?(0,b.jsx)(e.Badge,{variant:"outline",children:a.context}):null]}),a.allowedTools?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Allowed Tools"}),(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-sm",children:a.allowedTools})]})]}):null,a.resources.length>0?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Resources"}),(0,b.jsx)("ul",{className:"mt-2 space-y-1.5",children:a.resources.map(a=>(0,b.jsxs)("li",{className:"text-muted-foreground flex items-center gap-2 text-sm",children:[(0,b.jsx)(g.FolderOpen,{className:"size-3.5 shrink-0"}),(0,b.jsxs)("span",{children:[a.name,"/ — ",a.fileCount," ",1===a.fileCount?"file":"files"]})]},a.name))})]})]}):null,a.body?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsx)("pre",{className:"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap",children:a.body})]}):null]}):null})}a.s(["SkillDetailDrawer",()=>h])},274468,a=>{"use strict";var b=a.i(556365),c=a.i(944592),d=a.i(531378),e=a.i(167424),f=a.i(390920),g=a.i(118948);a.i(955135);var h=a.i(975550);a.i(738702);var i=a.i(516223),j=a.i(184117),k=a.i(658339),l=a.i(403195);function m({skill:a,onSelect:c}){return(0,b.jsxs)(j.Card,{className:"hover:border-primary/50 cursor-pointer transition-colors",role:"button",tabIndex:0,onClick:()=>c(a),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),c(a))},"data-testid":`skill-card-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"pb-3",children:[(0,b.jsx)(j.CardTitle,{className:"text-base",children:a.displayName}),(0,b.jsx)("p",{className:"text-muted-foreground font-mono text-xs",children:a.name})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-3",children:[(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-sm",children:a.description}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),a.context?(0,b.jsx)(k.Badge,{variant:"outline",children:a.context}):null,a.allowedTools?(0,b.jsx)(k.Badge,{variant:"outline",children:"Tools"}):null,a.resources.length>0?(0,b.jsxs)("span",{className:"text-muted-foreground inline-flex items-center gap-1 text-xs",children:[(0,b.jsx)(l.FolderOpen,{className:"size-3"}),a.resources.length," ",1===a.resources.length?"resource":"resources"]}):null]})]})]})}let n=["Workflow","Code Generation","Analysis","Reference"];function o({skills:a,onSkillSelect:c}){let d=function(a){let b=new Map;for(let c of a){let a=b.get(c.category)??[];a.push(c),b.set(c.category,a)}return b}(a);return(0,b.jsx)("div",{className:"space-y-8",children:n.map(a=>{let e=d.get(a);return e&&0!==e.length?(0,b.jsxs)("section",{children:[(0,b.jsxs)("h2",{className:"mb-4 text-lg font-semibold",children:[a," ",(0,b.jsxs)("span",{className:"text-muted-foreground text-sm font-normal",children:["(",e.length,")"]})]}),(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",children:e.map(a=>(0,b.jsx)(m,{skill:a,onSelect:c},a.name))})]},a):null})})}let p=[{label:"All",value:null},{label:"Workflow",value:"Workflow"},{label:"Code Generation",value:"Code Generation"},{label:"Analysis",value:"Analysis"},{label:"Reference",value:"Reference"}];function q({activeCategory:a,onCategoryChange:c,counts:d}){return(0,b.jsx)("div",{className:"flex flex-wrap gap-2",role:"group","aria-label":"Filter by category",children:p.map(({label:e,value:f})=>(0,b.jsxs)(g.Button,{variant:a===f?"default":"outline",size:"sm",onClick:()=>c(f),children:[e,d&&f?(0,b.jsxs)("span",{className:"ms-1 text-xs opacity-70",children:["(",d[f],")"]}):null]},e))})}var r=a.i(100228),s=a.i(513126),t=a.i(91109),u=a.i(867837),v=a.i(302807),w=a.i(952313),x=a.i(289111);let y=(0,x.createServerReference)("404cbbf5cbe0cfdf07d93183de60894f8629e44bbf",x.callServer,void 0,x.findSourceMapURL,"removeInjectedSkill");var z=a.i(645670),A=a.i(758860),B=a.i(441305);let C=(0,x.createServerReference)("40f4b35b187e528b58a0ceffc79c02c821fbf3d40b",x.callServer,void 0,x.findSourceMapURL,"addInjectedSkill");function D({open:a,onOpenChange:d,onAdded:e,discoveredSkills:h,existingSkillNames:i}){let[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),r=h.filter(a=>!i.includes(a.name)),s=async a=>{k(!0);let b=await C({name:a.name,type:"local",source:`.claude/skills/${a.name}`});(k(!1),b.success)?(w.toast.success(`Added "${a.name}" to feature skills`),e()):w.toast.error(b.error??"Failed to add skill")},t=async()=>{if(!l.trim()||!n.trim())return void w.toast.error("Name and source are required");k(!0);let a=await C({name:l.trim(),type:"remote",source:n.trim(),...p.trim()&&{remoteSkillName:p.trim()}});(k(!1),a.success)?(w.toast.success(`Added "${l.trim()}" to feature skills`),m(""),o(""),q(""),e()):w.toast.error(a.error??"Failed to add skill")};return(0,b.jsx)(z.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(z.DialogContent,{className:"sm:max-w-md","data-testid":"add-skill-dialog",children:[(0,b.jsx)(z.DialogHeader,{children:(0,b.jsx)(z.DialogTitle,{children:"Add Skill to Features"})}),(0,b.jsxs)(B.Tabs,{defaultValue:"local",children:[(0,b.jsxs)(B.TabsList,{className:"w-full",children:[(0,b.jsx)(B.TabsTrigger,{value:"local",className:"flex-1",children:"Local"}),(0,b.jsx)(B.TabsTrigger,{value:"remote",className:"flex-1",children:"Remote"})]}),(0,b.jsx)(B.TabsContent,{value:"local",className:"mt-4",children:0===r.length?(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"All discovered skills are already configured."}):(0,b.jsx)("div",{className:"flex max-h-60 flex-col gap-2 overflow-y-auto",children:r.map(a=>(0,b.jsxs)("button",{type:"button",className:"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors",onClick:()=>s(a),disabled:j,"data-testid":`add-local-skill-${a.name}`,children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:a.displayName}),(0,b.jsx)("span",{className:"text-muted-foreground line-clamp-1 text-xs",children:a.description})]},a.name))})}),(0,b.jsx)(B.TabsContent,{value:"remote",className:"mt-4",children:(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-name",children:"Name"}),(0,b.jsx)(f.Input,{id:"remote-name",placeholder:"e.g. remotion-best-practices",value:l,onChange:a=>m(a.target.value),"data-testid":"remote-skill-name"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-source",children:"Source (npm package or URL)"}),(0,b.jsx)(f.Input,{id:"remote-source",placeholder:"e.g. @anthropic/remotion-skills",value:n,onChange:a=>o(a.target.value),"data-testid":"remote-skill-source"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-skill-name",children:"Skill Name (optional)"}),(0,b.jsx)(f.Input,{id:"remote-skill-name",placeholder:"e.g. remotion-best-practices",value:p,onChange:a=>q(a.target.value),"data-testid":"remote-skill-skill-name"})]}),(0,b.jsx)(z.DialogFooter,{children:(0,b.jsx)(g.Button,{onClick:t,disabled:j||!l.trim()||!n.trim(),"data-testid":"add-remote-skill-submit",children:"Add Remote Skill"})})]})})]})]})})}function E({config:a,discoveredSkills:d}){let e=(0,t.useRouter)(),[f,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)(null),k=(0,c.useMemo)(()=>{let a=new Map;for(let b of d)a.set(b.name,b.description);return a},[d]),l=async a=>{j(a);let b=await y(a);(j(null),b.success)?(w.toast.success(`Removed "${a}" from feature skills`),e.refresh()):w.toast.error(b.error??"Failed to remove skill")};return(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-base font-semibold",children:"Feature Skills"}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"Curated skills included in new feature worktrees to guide the agent"})]}),a.skills.length>0?(0,b.jsx)("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:a.skills.map(a=>(0,b.jsx)(F,{skill:a,description:k.get(a.name),onRemove:()=>l(a.name),isRemoving:i===a.name},a.name))}):(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"No skills configured. Add skills to guide the agent when working on new features."}),(0,b.jsx)("div",{children:(0,b.jsxs)(g.Button,{variant:"outline",size:"sm",onClick:()=>h(!0),"data-testid":"add-injected-skill-button",children:[(0,b.jsx)(u.Plus,{className:"mr-1.5 size-4"}),"Add Skill"]})}),(0,b.jsx)(D,{open:f,onOpenChange:h,onAdded:()=>{h(!1),e.refresh()},discoveredSkills:d,existingSkillNames:a.skills.map(a=>a.name)})]})}function F({skill:a,description:c,onRemove:d,isRemoving:e}){return(0,b.jsxs)(j.Card,{"data-testid":`injected-skill-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"flex flex-row items-start justify-between gap-2 pb-2",children:[(0,b.jsx)("div",{className:"min-w-0",children:(0,b.jsx)(j.CardTitle,{className:"truncate text-sm",children:a.name})}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-sm",className:"shrink-0",onClick:d,disabled:e,"aria-label":`Remove ${a.name}`,"data-testid":`remove-injected-skill-${a.name}`,children:(0,b.jsx)(v.X,{className:"size-4"})})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-2 pt-0",children:[c?(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-xs",children:c}):null,(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"local"===a.type?"secondary":"outline",className:"text-xs",children:"local"===a.type?"Local":"Remote"}),(0,b.jsx)("span",{className:"text-muted-foreground max-w-37.5 truncate text-xs",children:a.source})]})]})]})}function G({skills:a,injectionConfig:j}){let[k,l]=(0,c.useState)(""),[m,n]=(0,c.useState)(null),[p,t]=(0,c.useState)(null),u=(0,c.useMemo)(()=>(function(a){let b={Workflow:0,"Code Generation":0,Analysis:0,Reference:0};for(let c of a)b[c.category]++;return b})(a),[a]),v=(0,c.useMemo)(()=>{let b=k.toLowerCase();return a.filter(a=>{if(m&&a.category!==m)return!1;if(b){let c=a.name.toLowerCase().includes(b),d=a.description.toLowerCase().includes(b);if(!c&&!d)return!1}return!0})},[a,k,m]);return 0===a.length?(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(e.Puzzle,{className:"size-10"}),title:"No skills found",description:"No Claude Code skills are installed. Add skills to .claude/skills/ to get started."})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(d.Search,{className:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),(0,b.jsx)(f.Input,{placeholder:"Search skills...",value:k,onChange:a=>l(a.target.value),className:"ps-9"})]}),(0,b.jsx)(q,{activeCategory:m,onCategoryChange:n,counts:u}),v.length>0?(0,b.jsx)(o,{skills:v,onSkillSelect:t}):(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(d.Search,{className:"size-10"}),title:"No matching skills",description:"No skills match your current search and filter criteria.",action:(0,b.jsx)(g.Button,{variant:"outline",onClick:()=>{l(""),n(null)},children:"Clear filters"})}),(0,b.jsx)(r.SkillDetailDrawer,{skill:p,onClose:()=>t(null)})]})}a.s(["SkillsPageClient",()=>G],274468)}];
1
+ module.exports=[100228,a=>{"use strict";var b=a.i(556365);a.i(478454);var c=a.i(124255),d=a.i(302824),e=a.i(658339),f=a.i(513126),g=a.i(403195);function h({skill:a,onClose:h}){return(0,b.jsx)(c.BaseDrawer,{open:null!==a,onClose:h,size:"sm",modal:!0,"data-testid":"skill-detail-drawer",header:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.DrawerTitle,{children:a.displayName}),(0,b.jsx)(d.DrawerDescription,{children:a.name})]}):void 0,children:a?(0,b.jsxs)("div",{className:"px-4 pb-4",children:[(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:a.description}),(0,b.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(e.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),(0,b.jsx)(e.Badge,{variant:"outline",children:a.category}),a.context?(0,b.jsx)(e.Badge,{variant:"outline",children:a.context}):null]}),a.allowedTools?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Allowed Tools"}),(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-sm",children:a.allowedTools})]})]}):null,a.resources.length>0?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Resources"}),(0,b.jsx)("ul",{className:"mt-2 space-y-1.5",children:a.resources.map(a=>(0,b.jsxs)("li",{className:"text-muted-foreground flex items-center gap-2 text-sm",children:[(0,b.jsx)(g.FolderOpen,{className:"size-3.5 shrink-0"}),(0,b.jsxs)("span",{children:[a.name,"/ — ",a.fileCount," ",1===a.fileCount?"file":"files"]})]},a.name))})]})]}):null,a.body?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsx)("pre",{className:"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap",children:a.body})]}):null]}):null})}a.s(["SkillDetailDrawer",()=>h])},274468,a=>{"use strict";var b=a.i(556365),c=a.i(944592),d=a.i(531378),e=a.i(167424),f=a.i(390920),g=a.i(118948);a.i(955135);var h=a.i(975550);a.i(738702);var i=a.i(516223),j=a.i(184117),k=a.i(658339),l=a.i(403195);function m({skill:a,onSelect:c}){return(0,b.jsxs)(j.Card,{className:"hover:border-primary/50 cursor-pointer transition-colors",role:"button",tabIndex:0,onClick:()=>c(a),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),c(a))},"data-testid":`skill-card-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"pb-3",children:[(0,b.jsx)(j.CardTitle,{className:"text-base",children:a.displayName}),(0,b.jsx)("p",{className:"text-muted-foreground font-mono text-xs",children:a.name})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-3",children:[(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-sm",children:a.description}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),a.context?(0,b.jsx)(k.Badge,{variant:"outline",children:a.context}):null,a.allowedTools?(0,b.jsx)(k.Badge,{variant:"outline",children:"Tools"}):null,a.resources.length>0?(0,b.jsxs)("span",{className:"text-muted-foreground inline-flex items-center gap-1 text-xs",children:[(0,b.jsx)(l.FolderOpen,{className:"size-3"}),a.resources.length," ",1===a.resources.length?"resource":"resources"]}):null]})]})]})}let n=["Workflow","Code Generation","Analysis","Reference"];function o({skills:a,onSkillSelect:c}){let d=function(a){let b=new Map;for(let c of a){let a=b.get(c.category)??[];a.push(c),b.set(c.category,a)}return b}(a);return(0,b.jsx)("div",{className:"space-y-8",children:n.map(a=>{let e=d.get(a);return e&&0!==e.length?(0,b.jsxs)("section",{children:[(0,b.jsxs)("h2",{className:"mb-4 text-lg font-semibold",children:[a," ",(0,b.jsxs)("span",{className:"text-muted-foreground text-sm font-normal",children:["(",e.length,")"]})]}),(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",children:e.map(a=>(0,b.jsx)(m,{skill:a,onSelect:c},a.name))})]},a):null})})}let p=[{label:"All",value:null},{label:"Workflow",value:"Workflow"},{label:"Code Generation",value:"Code Generation"},{label:"Analysis",value:"Analysis"},{label:"Reference",value:"Reference"}];function q({activeCategory:a,onCategoryChange:c,counts:d}){return(0,b.jsx)("div",{className:"flex flex-wrap gap-2",role:"group","aria-label":"Filter by category",children:p.map(({label:e,value:f})=>(0,b.jsxs)(g.Button,{variant:a===f?"default":"outline",size:"sm",onClick:()=>c(f),children:[e,d&&f?(0,b.jsxs)("span",{className:"ms-1 text-xs opacity-70",children:["(",d[f],")"]}):null]},e))})}var r=a.i(100228),s=a.i(513126),t=a.i(91109),u=a.i(867837),v=a.i(302807),w=a.i(952313),x=a.i(289111);let y=(0,x.createServerReference)("40bbc7a178882065cb023af5e8c819713966705830",x.callServer,void 0,x.findSourceMapURL,"removeInjectedSkill");var z=a.i(645670),A=a.i(758860),B=a.i(441305);let C=(0,x.createServerReference)("40e2f63b6c84afbed3693cc4359e99d9f35adc1047",x.callServer,void 0,x.findSourceMapURL,"addInjectedSkill");function D({open:a,onOpenChange:d,onAdded:e,discoveredSkills:h,existingSkillNames:i}){let[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),r=h.filter(a=>!i.includes(a.name)),s=async a=>{k(!0);let b=await C({name:a.name,type:"local",source:`.claude/skills/${a.name}`});(k(!1),b.success)?(w.toast.success(`Added "${a.name}" to feature skills`),e()):w.toast.error(b.error??"Failed to add skill")},t=async()=>{if(!l.trim()||!n.trim())return void w.toast.error("Name and source are required");k(!0);let a=await C({name:l.trim(),type:"remote",source:n.trim(),...p.trim()&&{remoteSkillName:p.trim()}});(k(!1),a.success)?(w.toast.success(`Added "${l.trim()}" to feature skills`),m(""),o(""),q(""),e()):w.toast.error(a.error??"Failed to add skill")};return(0,b.jsx)(z.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(z.DialogContent,{className:"sm:max-w-md","data-testid":"add-skill-dialog",children:[(0,b.jsx)(z.DialogHeader,{children:(0,b.jsx)(z.DialogTitle,{children:"Add Skill to Features"})}),(0,b.jsxs)(B.Tabs,{defaultValue:"local",children:[(0,b.jsxs)(B.TabsList,{className:"w-full",children:[(0,b.jsx)(B.TabsTrigger,{value:"local",className:"flex-1",children:"Local"}),(0,b.jsx)(B.TabsTrigger,{value:"remote",className:"flex-1",children:"Remote"})]}),(0,b.jsx)(B.TabsContent,{value:"local",className:"mt-4",children:0===r.length?(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"All discovered skills are already configured."}):(0,b.jsx)("div",{className:"flex max-h-60 flex-col gap-2 overflow-y-auto",children:r.map(a=>(0,b.jsxs)("button",{type:"button",className:"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors",onClick:()=>s(a),disabled:j,"data-testid":`add-local-skill-${a.name}`,children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:a.displayName}),(0,b.jsx)("span",{className:"text-muted-foreground line-clamp-1 text-xs",children:a.description})]},a.name))})}),(0,b.jsx)(B.TabsContent,{value:"remote",className:"mt-4",children:(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-name",children:"Name"}),(0,b.jsx)(f.Input,{id:"remote-name",placeholder:"e.g. remotion-best-practices",value:l,onChange:a=>m(a.target.value),"data-testid":"remote-skill-name"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-source",children:"Source (npm package or URL)"}),(0,b.jsx)(f.Input,{id:"remote-source",placeholder:"e.g. @anthropic/remotion-skills",value:n,onChange:a=>o(a.target.value),"data-testid":"remote-skill-source"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-skill-name",children:"Skill Name (optional)"}),(0,b.jsx)(f.Input,{id:"remote-skill-name",placeholder:"e.g. remotion-best-practices",value:p,onChange:a=>q(a.target.value),"data-testid":"remote-skill-skill-name"})]}),(0,b.jsx)(z.DialogFooter,{children:(0,b.jsx)(g.Button,{onClick:t,disabled:j||!l.trim()||!n.trim(),"data-testid":"add-remote-skill-submit",children:"Add Remote Skill"})})]})})]})]})})}function E({config:a,discoveredSkills:d}){let e=(0,t.useRouter)(),[f,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)(null),k=(0,c.useMemo)(()=>{let a=new Map;for(let b of d)a.set(b.name,b.description);return a},[d]),l=async a=>{j(a);let b=await y(a);(j(null),b.success)?(w.toast.success(`Removed "${a}" from feature skills`),e.refresh()):w.toast.error(b.error??"Failed to remove skill")};return(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-base font-semibold",children:"Feature Skills"}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"Curated skills included in new feature worktrees to guide the agent"})]}),a.skills.length>0?(0,b.jsx)("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:a.skills.map(a=>(0,b.jsx)(F,{skill:a,description:k.get(a.name),onRemove:()=>l(a.name),isRemoving:i===a.name},a.name))}):(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"No skills configured. Add skills to guide the agent when working on new features."}),(0,b.jsx)("div",{children:(0,b.jsxs)(g.Button,{variant:"outline",size:"sm",onClick:()=>h(!0),"data-testid":"add-injected-skill-button",children:[(0,b.jsx)(u.Plus,{className:"mr-1.5 size-4"}),"Add Skill"]})}),(0,b.jsx)(D,{open:f,onOpenChange:h,onAdded:()=>{h(!1),e.refresh()},discoveredSkills:d,existingSkillNames:a.skills.map(a=>a.name)})]})}function F({skill:a,description:c,onRemove:d,isRemoving:e}){return(0,b.jsxs)(j.Card,{"data-testid":`injected-skill-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"flex flex-row items-start justify-between gap-2 pb-2",children:[(0,b.jsx)("div",{className:"min-w-0",children:(0,b.jsx)(j.CardTitle,{className:"truncate text-sm",children:a.name})}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-sm",className:"shrink-0",onClick:d,disabled:e,"aria-label":`Remove ${a.name}`,"data-testid":`remove-injected-skill-${a.name}`,children:(0,b.jsx)(v.X,{className:"size-4"})})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-2 pt-0",children:[c?(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-xs",children:c}):null,(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"local"===a.type?"secondary":"outline",className:"text-xs",children:"local"===a.type?"Local":"Remote"}),(0,b.jsx)("span",{className:"text-muted-foreground max-w-37.5 truncate text-xs",children:a.source})]})]})]})}function G({skills:a,injectionConfig:j}){let[k,l]=(0,c.useState)(""),[m,n]=(0,c.useState)(null),[p,t]=(0,c.useState)(null),u=(0,c.useMemo)(()=>(function(a){let b={Workflow:0,"Code Generation":0,Analysis:0,Reference:0};for(let c of a)b[c.category]++;return b})(a),[a]),v=(0,c.useMemo)(()=>{let b=k.toLowerCase();return a.filter(a=>{if(m&&a.category!==m)return!1;if(b){let c=a.name.toLowerCase().includes(b),d=a.description.toLowerCase().includes(b);if(!c&&!d)return!1}return!0})},[a,k,m]);return 0===a.length?(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(e.Puzzle,{className:"size-10"}),title:"No skills found",description:"No Claude Code skills are installed. Add skills to .claude/skills/ to get started."})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(d.Search,{className:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),(0,b.jsx)(f.Input,{placeholder:"Search skills...",value:k,onChange:a=>l(a.target.value),className:"ps-9"})]}),(0,b.jsx)(q,{activeCategory:m,onCategoryChange:n,counts:u}),v.length>0?(0,b.jsx)(o,{skills:v,onSkillSelect:t}):(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(d.Search,{className:"size-10"}),title:"No matching skills",description:"No skills match your current search and filter criteria.",action:(0,b.jsx)(g.Button,{variant:"outline",onClick:()=>{l(""),n(null)},children:"Clear filters"})}),(0,b.jsx)(r.SkillDetailDrawer,{skill:p,onClose:()=>t(null)})]})}a.s(["SkillsPageClient",()=>G],274468)}];
2
2
 
3
3
  //# sourceMappingURL=src_presentation_web_components_features_skills_8a174cac._.js.map