@shepai/cli 1.163.0 → 1.164.0-pr514.db33061

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 (311) hide show
  1. package/README.md +12 -0
  2. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts +3 -1
  3. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts +19 -0
  5. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +7 -1
  7. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.d.ts +2 -0
  9. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.js +1 -1
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-add-session-usage-tracking.d.ts +18 -0
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-add-session-usage-tracking.d.ts.map +1 -0
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-add-session-usage-tracking.js +32 -0
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts +12 -0
  15. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.js +31 -0
  17. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts +38 -7
  18. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +152 -45
  20. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +17 -1
  21. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +131 -47
  23. package/dist/src/presentation/web/app/actions/get-git-log.d.ts +44 -0
  24. package/dist/src/presentation/web/app/actions/get-git-log.d.ts.map +1 -0
  25. package/dist/src/presentation/web/app/actions/get-git-log.js +125 -0
  26. package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -1
  27. package/dist/src/presentation/web/app/actions/open-folder.js +5 -2
  28. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/messages/route.d.ts.map +1 -1
  29. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/messages/route.js +3 -1
  30. package/dist/src/presentation/web/components/assistant-ui/thread.js +8 -1
  31. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
  32. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  33. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +46 -15
  34. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  35. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +77 -5
  36. package/dist/src/presentation/web/components/common/control-center-drawer/use-drawer-sync.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/common/control-center-drawer/use-drawer-sync.js +11 -0
  38. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +10 -9
  40. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +5 -1
  41. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  42. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +24 -13
  43. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +56 -81
  45. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.js +11 -6
  47. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/features/chat/ChatTab.js +13 -7
  50. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts +16 -0
  51. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts.map +1 -1
  52. package/dist/src/presentation/web/components/features/chat/useChatRuntime.js +98 -7
  53. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts.map +1 -1
  54. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +1 -1
  55. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +7 -2
  57. package/dist/src/presentation/web/hooks/use-animations-enabled.d.ts +6 -0
  58. package/dist/src/presentation/web/hooks/use-animations-enabled.d.ts.map +1 -0
  59. package/dist/src/presentation/web/hooks/use-animations-enabled.js +30 -0
  60. package/dist/tsconfig.build.tsbuildinfo +1 -1
  61. package/package.json +2 -2
  62. package/web/.next/BUILD_ID +1 -1
  63. package/web/.next/build-manifest.json +2 -2
  64. package/web/.next/fallback-build-manifest.json +2 -2
  65. package/web/.next/prerender-manifest.json +3 -3
  66. package/web/.next/required-server-files.js +3 -3
  67. package/web/.next/required-server-files.json +3 -3
  68. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  69. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  72. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  75. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  78. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +69 -54
  84. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  86. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +69 -54
  88. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  90. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  92. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  95. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  96. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  98. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  104. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  105. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +69 -54
  107. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
  108. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  109. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +69 -54
  111. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  112. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  113. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  115. package/web/.next/server/app/_global-error.html +2 -2
  116. package/web/.next/server/app/_global-error.rsc +1 -1
  117. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  118. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  119. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  120. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  121. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  122. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  123. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  124. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  126. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  127. package/web/.next/server/app/api/graph-data/route.js +1 -1
  128. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  129. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  130. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  131. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  132. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  134. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  135. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  137. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  138. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  139. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  140. package/web/.next/server/app/version/page.js.nft.json +1 -1
  141. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  142. package/web/.next/server/chunks/[root-of-the-server]__2b71641f._.js +1 -1
  143. package/web/.next/server/chunks/[root-of-the-server]__2b71641f._.js.map +1 -1
  144. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  145. package/web/.next/server/chunks/{[root-of-the-server]__beda892a._.js → [root-of-the-server]__c78383b1._.js} +2 -2
  146. package/web/.next/server/chunks/{[root-of-the-server]__beda892a._.js.map → [root-of-the-server]__c78383b1._.js.map} +1 -1
  147. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_ceb2fa1e._.js +1 -1
  148. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  149. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
  151. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/{7f428_lucide-react_dist_esm_icons_4b319ae6._.js → 7f428_lucide-react_dist_esm_icons_281e0ef8._.js} +2 -2
  153. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_281e0ef8._.js.map +1 -0
  154. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_a593f310._.js +3 -0
  155. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_a593f310._.js.map +1 -0
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js +2 -2
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__23b5ca2c._.js +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__7528eb6f._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js +2 -2
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +7 -0
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js.map +1 -0
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0be67c7._.js +3 -0
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0be67c7._.js.map +1 -0
  182. package/web/.next/server/chunks/ssr/{_8b57edb8._.js → _0020fddd._.js} +2 -2
  183. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -0
  184. package/web/.next/server/chunks/ssr/_02e01240._.js +4 -0
  185. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -0
  186. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  187. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/_0727935d._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_0727935d._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  191. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/_18886033._.js +4 -0
  193. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -0
  194. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  195. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/_4d49a312._.js +3 -0
  197. package/web/.next/server/chunks/ssr/_4d49a312._.js.map +1 -0
  198. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  199. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  200. package/web/.next/server/chunks/ssr/_7a6f6a76._.js +3 -0
  201. package/web/.next/server/chunks/ssr/_7a6f6a76._.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/{_def82237._.js → _8276397a._.js} +2 -2
  203. package/web/.next/server/chunks/ssr/{_def82237._.js.map → _8276397a._.js.map} +1 -1
  204. package/web/.next/server/chunks/ssr/_9215e9ec._.js +3 -0
  205. package/web/.next/server/chunks/ssr/_9215e9ec._.js.map +1 -0
  206. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  207. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/_ad09f271._.js +4 -0
  209. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -0
  210. package/web/.next/server/chunks/ssr/_b7a43c05._.js +3 -0
  211. package/web/.next/server/chunks/ssr/_b7a43c05._.js.map +1 -0
  212. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  213. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/_c45aee16._.js +3 -0
  215. package/web/.next/server/chunks/ssr/_c45aee16._.js.map +1 -0
  216. package/web/.next/server/chunks/ssr/{_ce97386b._.js → _cc654b75._.js} +3 -3
  217. package/web/.next/server/chunks/ssr/_cc654b75._.js.map +1 -0
  218. package/web/.next/server/chunks/ssr/_ea9e1556._.js +4 -0
  219. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  221. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  223. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  225. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/{_b881a389._.js → _fdc356bf._.js} +2 -2
  227. package/web/.next/server/chunks/ssr/_fdc356bf._.js.map +1 -0
  228. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  229. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +3 -0
  231. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js +3 -0
  233. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js.map +1 -0
  234. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  239. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  241. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
  242. package/web/.next/server/pages/500.html +2 -2
  243. package/web/.next/server/server-reference-manifest.js +1 -1
  244. package/web/.next/server/server-reference-manifest.json +190 -154
  245. package/web/.next/static/chunks/16eea21868510afd.js +5 -0
  246. package/web/.next/static/chunks/1ad664f7081cf4c0.js +1 -0
  247. package/web/.next/static/chunks/{0613d3829ce90fe9.js → 4788a37d8c608e30.js} +1 -1
  248. package/web/.next/static/chunks/4f7d9c08a205bc4e.js +1 -0
  249. package/web/.next/static/chunks/5d8c83c576ec1a7b.js +1 -0
  250. package/web/.next/static/chunks/779b5c49587b074e.js +1 -0
  251. package/web/.next/static/chunks/7cec51e9bd7d1f4f.js +1 -0
  252. package/web/.next/static/chunks/{780f688b8568331d.js → 7d40e79e524c8d18.js} +2 -2
  253. package/web/.next/static/chunks/{5f40b5c4f859b573.js → 8094762f5cda4934.js} +1 -1
  254. package/web/.next/static/chunks/9162bb869b3543e2.js +7 -0
  255. package/web/.next/static/chunks/940bca62e44f3e90.js +5 -0
  256. package/web/.next/static/chunks/966eb2688300b7f5.js +1 -0
  257. package/web/.next/static/chunks/971e52f3f386ccfd.js +1 -0
  258. package/web/.next/static/chunks/a760d5829014058d.js +1 -0
  259. package/web/.next/static/chunks/b63e6727c84f30e2.js +1 -0
  260. package/web/.next/static/chunks/d6a1a06ee3c12489.js +1 -0
  261. package/web/.next/static/chunks/dedf6ca63c5468fa.js +5 -0
  262. package/web/.next/static/chunks/e77d053610055e0c.js +1 -0
  263. package/web/.next/static/chunks/{0d9e3aa7e10cf6e6.js → ee9fe376b60c3cab.js} +2 -2
  264. package/web/.next/static/chunks/eeadf13c0ea6cbe0.css +1 -0
  265. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_4b319ae6._.js.map +0 -1
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5ceba65._.js +0 -3
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5ceba65._.js.map +0 -1
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js +0 -7
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/_075fae20._.js +0 -4
  271. package/web/.next/server/chunks/ssr/_075fae20._.js.map +0 -1
  272. package/web/.next/server/chunks/ssr/_125c55af._.js +0 -4
  273. package/web/.next/server/chunks/ssr/_125c55af._.js.map +0 -1
  274. package/web/.next/server/chunks/ssr/_391e499a._.js +0 -3
  275. package/web/.next/server/chunks/ssr/_391e499a._.js.map +0 -1
  276. package/web/.next/server/chunks/ssr/_573caadf._.js +0 -3
  277. package/web/.next/server/chunks/ssr/_573caadf._.js.map +0 -1
  278. package/web/.next/server/chunks/ssr/_628621c7._.js +0 -4
  279. package/web/.next/server/chunks/ssr/_628621c7._.js.map +0 -1
  280. package/web/.next/server/chunks/ssr/_68996e5b._.js +0 -3
  281. package/web/.next/server/chunks/ssr/_68996e5b._.js.map +0 -1
  282. package/web/.next/server/chunks/ssr/_8b57edb8._.js.map +0 -1
  283. package/web/.next/server/chunks/ssr/_9412b27f._.js +0 -4
  284. package/web/.next/server/chunks/ssr/_9412b27f._.js.map +0 -1
  285. package/web/.next/server/chunks/ssr/_ac4a3873._.js +0 -3
  286. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +0 -1
  287. package/web/.next/server/chunks/ssr/_b881a389._.js.map +0 -1
  288. package/web/.next/server/chunks/ssr/_ce97386b._.js.map +0 -1
  289. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +0 -3
  290. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +0 -1
  291. package/web/.next/server/chunks/ssr/node_modules__pnpm_8ec2c790._.js +0 -3
  292. package/web/.next/server/chunks/ssr/node_modules__pnpm_8ec2c790._.js.map +0 -1
  293. package/web/.next/static/chunks/0a79dfbb8486b66e.js +0 -5
  294. package/web/.next/static/chunks/14d9d9181bb4e337.js +0 -1
  295. package/web/.next/static/chunks/4581eaf51543601d.js +0 -1
  296. package/web/.next/static/chunks/47477ed4c5871747.js +0 -1
  297. package/web/.next/static/chunks/74db65fa7bfb80bd.js +0 -1
  298. package/web/.next/static/chunks/8b64414cdb4a4dc7.js +0 -1
  299. package/web/.next/static/chunks/bf55fb50a69f7350.js +0 -5
  300. package/web/.next/static/chunks/c04ada25ace6f30c.js +0 -1
  301. package/web/.next/static/chunks/c3a67566f78b5bc3.js +0 -1
  302. package/web/.next/static/chunks/ca8752df0e809c1b.js +0 -7
  303. package/web/.next/static/chunks/d2cbeefbc8967b16.js +0 -1
  304. package/web/.next/static/chunks/d39ae882d080aa52.js +0 -1
  305. package/web/.next/static/chunks/d6e702c209c413ce.js +0 -5
  306. package/web/.next/static/chunks/dbfbd9d9ee5eb2d0.js +0 -1
  307. package/web/.next/static/chunks/dc39dd4276779dec.js +0 -1
  308. package/web/.next/static/chunks/e779296e738a812b.css +0 -1
  309. /package/web/.next/static/{qfCnoWSr4qmt2_dT28B-O → lQkUWQQS5aR4vq6WUZ2yr}/_buildManifest.js +0 -0
  310. /package/web/.next/static/{qfCnoWSr4qmt2_dT28B-O → lQkUWQQS5aR4vq6WUZ2yr}/_clientMiddlewareManifest.json +0 -0
  311. /package/web/.next/static/{qfCnoWSr4qmt2_dT28B-O → lQkUWQQS5aR4vq6WUZ2yr}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[92163,a=>{"use strict";var b=a.i(10973),c=a.i(96960),d=a.i(17300),e=a.i(41305),f=a.i(85536),g=a.i(88064),h=a.i(87926),i=a.i(9955),j=a.i(25700);let k=(0,j.default)("monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);var l=a.i(63698),m=a.i(53170),n=a.i(56926),o=a.i(4019),p=a.i(67075);let q=(0,j.default)("package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);var r=a.i(18948),s=a.i(82934),t=a.i(98410),u=a.i(72016),v=a.i(71238),w=a.i(24255);let x={linux:"Linux",darwin:"macOS",win32:"Windows"},y={ide:{label:"IDE",icon:k},"cli-agent":{label:"CLI Agent",icon:l.Terminal},vcs:{label:"VCS",icon:m.GitBranch},terminal:{label:"Terminal",icon:l.Terminal}};function z({status:a}){return"available"===a?(0,b.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-emerald-100 px-2 py-0.5 text-xs font-medium text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400",children:[(0,b.jsx)(u.Check,{className:"h-3 w-3"}),"Installed"]}):"error"===a?(0,b.jsx)("span",{className:"inline-flex items-center gap-1 rounded-full bg-red-100 px-2 py-0.5 text-xs font-medium text-red-700 dark:bg-red-900/30 dark:text-red-400",children:"Error"}):(0,b.jsx)("span",{className:"inline-flex items-center gap-1 rounded-full bg-amber-100 px-2 py-0.5 text-xs font-medium text-amber-700 dark:bg-amber-900/30 dark:text-amber-400",children:"Missing"})}function A({tool:a,open:d,onClose:e,onRefresh:f,autoStart:j}){let[l,m]=(0,c.useState)(!1),[n,o]=(0,c.useState)(!1),{logs:p,status:s,startInstall:A}=function(a){let[b,d]=(0,c.useState)([]),[e,f]=(0,c.useState)("idle"),[g,h]=(0,c.useState)(null),i=(0,c.useRef)(null),j=(0,c.useCallback)(()=>{i.current&&(i.current.close(),i.current=null)},[]);return(0,c.useEffect)(()=>j,[j]),{logs:b,status:e,result:g,startInstall:(0,c.useCallback)(()=>{j(),d([]),h(null),f("streaming");let b=new EventSource(`/api/tools/${a}/install/stream`);i.current=b,b.onmessage=a=>{d(b=>[...b,a.data])},b.addEventListener("done",a=>{let b=JSON.parse(a.data);h(b),f("error"===b.status?"error":"done"),j()}),b.onerror=()=>{f("error"),j()}},[a,j])}}(a.id),B=(0,c.useRef)(null),C=(0,c.useRef)(!0),D=(0,c.useRef)(!1),E="available"===a.status.status,F="error"===a.status.status,G=E&&!!a.openDirectory,H=!E&&!F&&a.autoInstall;async function I(){o(!0);try{await fetch(`/api/tools/${a.id}/launch`,{method:"POST"})}finally{o(!1)}}(0,c.useEffect)(()=>{d&&j&&H&&"idle"===s&&!D.current&&(D.current=!0,A()),d||(D.current=!1)},[d,j,H,s,A]);let J=(0,c.useCallback)(()=>{let a=B.current;a&&(C.current=a.scrollTop+a.clientHeight>=a.scrollHeight-50)},[]);(0,c.useEffect)(()=>{C.current&&B.current&&(B.current.scrollTop=B.current.scrollHeight)},[p,s]),(0,c.useEffect)(()=>{"done"===s&&f&&f()},[s,f]);let K=(0,b.jsxs)("div",{className:"flex flex-col gap-1.5 pe-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[a.iconUrl?(0,b.jsx)("img",{src:a.iconUrl,alt:"",width:24,height:24,className:"shrink-0 dark:invert"}):(0,b.jsx)(q,{className:"text-muted-foreground h-6 w-6 shrink-0"}),(0,b.jsx)("h2",{className:"text-base font-bold",children:a.name}),(0,b.jsx)(z,{status:a.status.status})]}),(0,b.jsx)("div",{className:"flex items-center gap-2",children:a.tags.map(a=>{let c=y[a]??{label:a,icon:k},d=c.icon;return(0,b.jsxs)("span",{className:"text-muted-foreground/70 inline-flex items-center gap-0.5 text-[10px]",children:[(0,b.jsx)(d,{className:"h-3 w-3"}),c.label]},a)})})]});return(0,b.jsx)(w.BaseDrawer,{open:d,onClose:e,size:"md",modal:!0,title:a.name,header:K,"data-testid":"tool-detail-drawer",children:(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-4 overflow-y-auto p-4",children:[(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:a.description}),a.author||a.platforms?(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs",children:[a.author?(0,b.jsxs)("span",{className:"text-muted-foreground",children:["by"," ",a.website?(0,b.jsx)("a",{href:a.website,target:"_blank",rel:"noopener noreferrer",className:"text-foreground hover:underline",children:a.author}):(0,b.jsx)("span",{className:"text-foreground",children:a.author})]}):null,a.platforms&&a.platforms.length>0?(0,b.jsx)("span",{className:"text-muted-foreground",children:a.platforms.map(a=>x[a]??a).join(" · ")}):null]}):null,a.installCommand?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-semibold tracking-wide uppercase",children:"Install command"}),(0,b.jsxs)("div",{className:"relative rounded-md bg-zinc-900 text-zinc-100",children:[(0,b.jsx)("pre",{className:"overflow-x-auto px-3 py-2.5 pe-16 font-mono text-xs leading-relaxed break-all whitespace-pre-wrap",children:(0,b.jsx)("code",{children:a.installCommand})}),(0,b.jsxs)(r.Button,{variant:"ghost",size:"sm",className:"absolute top-1.5 right-1.5 h-7 cursor-pointer px-2 text-zinc-400 hover:text-zinc-100",onClick:function(){a.installCommand&&navigator.clipboard.writeText(a.installCommand).then(()=>{m(!0),setTimeout(()=>m(!1),2e3)})},"aria-label":l?"Copied!":"Copy install command",children:[l?(0,b.jsx)(u.Check,{className:"h-3.5 w-3.5 text-emerald-500"}):(0,b.jsx)(t.Copy,{className:"h-3.5 w-3.5"}),(0,b.jsx)("span",{className:"ms-1 text-[10px]",children:l?"Copied!":"Copy"})]})]})]}):null,(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[H?(0,b.jsxs)(r.Button,{size:"sm",onClick:A,disabled:"streaming"===s,"aria-label":`Install ${a.name}`,className:"cursor-pointer",children:["streaming"===s?(0,b.jsx)(g.Loader2,{className:"me-1.5 h-3.5 w-3.5 animate-spin"}):(0,b.jsx)(i.Download,{className:"me-1.5 h-3.5 w-3.5"}),"streaming"===s?"Installing...":"Install"]}):null,G?(0,b.jsxs)(r.Button,{size:"sm",variant:"outline",onClick:()=>void I(),disabled:n,"aria-label":`Launch ${a.name}`,className:"cursor-pointer",children:[n?(0,b.jsx)(g.Loader2,{className:"me-1.5 h-3.5 w-3.5 animate-spin"}):(0,b.jsx)(h.Rocket,{className:"me-1.5 h-3.5 w-3.5"}),"Launch"]}):null,a.documentationUrl?(0,b.jsx)(r.Button,{variant:"outline",size:"sm",className:"cursor-pointer",asChild:!0,children:(0,b.jsxs)("a",{href:a.documentationUrl,target:"_blank",rel:"noopener noreferrer",children:["Docs",(0,b.jsx)(v.ExternalLink,{className:"ms-1 h-3 w-3"})]})}):null]}),("streaming"===s||"done"===s||"error"===s)&&p.length>0?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-semibold tracking-wide uppercase",children:"Install log"}),(0,b.jsxs)("div",{ref:B,onScroll:J,className:"max-h-60 overflow-auto rounded-md bg-zinc-900 p-3 font-mono text-xs leading-relaxed text-zinc-100","data-testid":"tool-install-log",children:[p.map((a,c)=>(0,b.jsx)("div",{className:"break-all whitespace-pre-wrap",children:a},c)),"done"===s?(0,b.jsx)("div",{className:"mt-2 border-t border-zinc-700 pt-2 text-emerald-400",children:"Installation complete"}):null,"error"===s?(0,b.jsx)("div",{className:"mt-2 border-t border-zinc-700 pt-2 text-red-400",children:"Installation failed"}):null]})]}):null]})})}let B={ide:{label:"IDE",icon:k},"cli-agent":{label:"CLI Agent",icon:l.Terminal},vcs:{label:"VCS",icon:m.GitBranch},terminal:{label:"Terminal",icon:l.Terminal}};function C({tool:a,onRefresh:d,className:e}){let[j,l]=(0,c.useState)(!1),[m,t]=(0,c.useState)(!1),[u,v]=(0,c.useTransition)(),w="available"===a.status.status,x="error"===a.status.status,y=w&&!!a.openDirectory;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{"data-testid":"tool-card",onClick:function(){t(!1),l(!0)},className:(0,f.cn)("bg-card group flex h-30 w-full cursor-pointer flex-col rounded-lg border p-3 transition-shadow hover:shadow-md",e),children:[(0,b.jsxs)("div",{className:"mb-2 flex items-start justify-between gap-2",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[a.iconUrl?(0,b.jsx)("img",{src:a.iconUrl,alt:"",width:20,height:20,className:"shrink-0 dark:invert"}):(0,b.jsx)(q,{className:"text-muted-foreground h-5 w-5 shrink-0"}),(0,b.jsx)("h3",{"data-testid":"tool-card-name",className:"truncate text-sm font-bold",children:a.name})]}),(0,b.jsx)("div",{"data-testid":"tool-card-tags",className:"flex shrink-0 items-center gap-1",children:a.tags.map(a=>{let c=B[a]??{label:a,icon:k},d=c.icon;return(0,b.jsxs)("span",{className:"text-muted-foreground/70 inline-flex items-center gap-0.5 text-[9px]",children:[(0,b.jsx)(d,{className:"h-2.5 w-2.5"}),c.label]},a)})})]}),(0,b.jsx)("p",{"data-testid":"tool-card-summary",className:"text-muted-foreground mt-1 truncate text-xs",children:a.summary}),(0,b.jsxs)("div",{className:"mt-auto flex items-center justify-between pt-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[x&&"error"===a.status.status?(0,b.jsxs)("span",{className:"flex items-center gap-1 truncate text-[10px] text-red-600 dark:text-red-400",title:a.status.errorMessage,children:[(0,b.jsx)(n.CircleX,{className:"h-3 w-3 shrink-0"}),a.status.errorMessage??"Error"]}):w?(0,b.jsxs)("span",{className:"flex items-center gap-1 text-[10px] text-emerald-600 dark:text-emerald-400",children:[(0,b.jsx)(p.CheckCircle2,{className:"h-3 w-3"}),"Installed"]}):(0,b.jsxs)("span",{className:"text-muted-foreground flex items-center gap-1 text-[10px]",children:[(0,b.jsx)(o.Circle,{className:"h-3 w-3"}),"Not installed"]}),a.required?(0,b.jsx)(s.TooltipProvider,{children:(0,b.jsxs)(s.Tooltip,{children:[(0,b.jsx)(s.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"rounded bg-amber-100 px-1.5 py-0.5 text-[9px] font-medium text-amber-700 dark:bg-amber-900/50 dark:text-amber-400",children:"Required"})}),(0,b.jsx)(s.TooltipContent,{side:"top",children:"This tool is required for Shep to function properly"})]})}):null]}),(0,b.jsx)("div",{className:"flex items-center gap-1",children:w&&y?(0,b.jsxs)(r.Button,{size:"sm",variant:"outline",onClick:function(b){b.stopPropagation(),v(async()=>{await fetch(`/api/tools/${a.id}/launch`,{method:"POST"})})},disabled:u,"aria-label":`Launch ${a.name}`,"data-testid":"tool-card-launch-button",className:"h-7 cursor-pointer rounded-md px-3 text-xs",children:[u?(0,b.jsx)(g.Loader2,{className:"me-1 h-3 w-3 animate-spin"}):(0,b.jsx)(h.Rocket,{className:"me-1 h-3 w-3"}),"Launch"]}):w||x?null:(0,b.jsxs)(r.Button,{size:"sm",variant:"default",onClick:function(b){b.stopPropagation(),t(a.autoInstall),l(!0)},"aria-label":`Install ${a.name}`,"data-testid":"tool-card-install-button",className:"h-7 cursor-pointer rounded-md px-3 text-xs",children:[(0,b.jsx)(i.Download,{className:"me-1 h-3 w-3"}),"Install"]})})]})]}),(0,b.jsx)(A,{tool:a,open:j,onClose:()=>l(!1),onRefresh:d,autoStart:m})]})}let D={all:()=>!0,ide:a=>a.tags.includes("ide"),"cli-agent":a=>a.tags.includes("cli-agent"),vcs:a=>a.tags.includes("vcs"),terminal:a=>a.tags.includes("terminal")};function E({tools:a,className:g}){let[h,i]=(0,c.useState)(a),[j,k]=(0,c.useState)("all"),l=(0,c.useCallback)(async()=>{try{let a=await fetch("/api/tools");if(a.ok){let b=await a.json();i(b)}}catch{}},[]),m=h.filter(D[j]);return(0,b.jsxs)("div",{"data-testid":"tools-page-client",className:(0,f.cn)("space-y-4",g),children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(d.Wrench,{className:"text-muted-foreground h-4 w-4"}),(0,b.jsx)("h1",{className:"text-sm font-bold tracking-tight",children:"Tools"}),(0,b.jsxs)("span",{className:"text-muted-foreground text-[10px]",children:[h.filter(a=>"available"===a.status.status).length,"/",h.length," installed"]})]}),(0,b.jsxs)(e.Tabs,{value:j,onValueChange:a=>k(a),"data-testid":"tools-page-tabs",children:[(0,b.jsxs)(e.TabsList,{className:"h-7",children:[(0,b.jsx)(e.TabsTrigger,{value:"all","data-testid":"tools-tab-all",className:"px-2.5 text-xs",children:"All"}),(0,b.jsx)(e.TabsTrigger,{value:"ide","data-testid":"tools-tab-ide",className:"px-2.5 text-xs",children:"IDEs"}),(0,b.jsx)(e.TabsTrigger,{value:"cli-agent","data-testid":"tools-tab-cli-agent",className:"px-2.5 text-xs",children:"CLI Agents"}),(0,b.jsx)(e.TabsTrigger,{value:"vcs","data-testid":"tools-tab-vcs",className:"px-2.5 text-xs",children:"Version Control"}),(0,b.jsx)(e.TabsTrigger,{value:"terminal","data-testid":"tools-tab-terminal",className:"px-2.5 text-xs",children:"Terminals"})]}),(0,b.jsx)(e.TabsContent,{value:j,className:"mt-3",children:0===m.length?(0,b.jsxs)("div",{"data-testid":"tools-page-empty",className:"text-muted-foreground flex flex-col items-center justify-center py-12 text-center",children:[(0,b.jsx)(d.Wrench,{className:"mb-2 h-6 w-6 opacity-20"}),(0,b.jsx)("p",{className:"text-xs",children:"No tools in this category."})]}):(0,b.jsx)("div",{"data-testid":"tools-page-grid",className:"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:m.map(a=>(0,b.jsx)(C,{tool:a,onRefresh:l},a.id))})})]})]})}a.s(["ToolsPageClient",()=>E],92163)}];
1
+ module.exports=[92163,a=>{"use strict";var b=a.i(10973),c=a.i(96960),d=a.i(17300),e=a.i(41305),f=a.i(85536),g=a.i(88064),h=a.i(87926),i=a.i(9955);let j=(0,a.i(25700).default)("monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);var k=a.i(63698),l=a.i(53170),m=a.i(56926),n=a.i(4019),o=a.i(67075),p=a.i(21084),q=a.i(18948),r=a.i(82934),s=a.i(98410),t=a.i(72016),u=a.i(71238),v=a.i(24255);let w={linux:"Linux",darwin:"macOS",win32:"Windows"},x={ide:{label:"IDE",icon:j},"cli-agent":{label:"CLI Agent",icon:k.Terminal},vcs:{label:"VCS",icon:l.GitBranch},terminal:{label:"Terminal",icon:k.Terminal}};function y({status:a}){return"available"===a?(0,b.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-emerald-100 px-2 py-0.5 text-xs font-medium text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400",children:[(0,b.jsx)(t.Check,{className:"h-3 w-3"}),"Installed"]}):"error"===a?(0,b.jsx)("span",{className:"inline-flex items-center gap-1 rounded-full bg-red-100 px-2 py-0.5 text-xs font-medium text-red-700 dark:bg-red-900/30 dark:text-red-400",children:"Error"}):(0,b.jsx)("span",{className:"inline-flex items-center gap-1 rounded-full bg-amber-100 px-2 py-0.5 text-xs font-medium text-amber-700 dark:bg-amber-900/30 dark:text-amber-400",children:"Missing"})}function z({tool:a,open:d,onClose:e,onRefresh:f,autoStart:k}){let[l,m]=(0,c.useState)(!1),[n,o]=(0,c.useState)(!1),{logs:r,status:z,startInstall:A}=function(a){let[b,d]=(0,c.useState)([]),[e,f]=(0,c.useState)("idle"),[g,h]=(0,c.useState)(null),i=(0,c.useRef)(null),j=(0,c.useCallback)(()=>{i.current&&(i.current.close(),i.current=null)},[]);return(0,c.useEffect)(()=>j,[j]),{logs:b,status:e,result:g,startInstall:(0,c.useCallback)(()=>{j(),d([]),h(null),f("streaming");let b=new EventSource(`/api/tools/${a}/install/stream`);i.current=b,b.onmessage=a=>{d(b=>[...b,a.data])},b.addEventListener("done",a=>{let b=JSON.parse(a.data);h(b),f("error"===b.status?"error":"done"),j()}),b.onerror=()=>{f("error"),j()}},[a,j])}}(a.id),B=(0,c.useRef)(null),C=(0,c.useRef)(!0),D=(0,c.useRef)(!1),E="available"===a.status.status,F="error"===a.status.status,G=E&&!!a.openDirectory,H=!E&&!F&&a.autoInstall;async function I(){o(!0);try{await fetch(`/api/tools/${a.id}/launch`,{method:"POST"})}finally{o(!1)}}(0,c.useEffect)(()=>{d&&k&&H&&"idle"===z&&!D.current&&(D.current=!0,A()),d||(D.current=!1)},[d,k,H,z,A]);let J=(0,c.useCallback)(()=>{let a=B.current;a&&(C.current=a.scrollTop+a.clientHeight>=a.scrollHeight-50)},[]);(0,c.useEffect)(()=>{C.current&&B.current&&(B.current.scrollTop=B.current.scrollHeight)},[r,z]),(0,c.useEffect)(()=>{"done"===z&&f&&f()},[z,f]);let K=(0,b.jsxs)("div",{className:"flex flex-col gap-1.5 pe-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[a.iconUrl?(0,b.jsx)("img",{src:a.iconUrl,alt:"",width:24,height:24,className:"shrink-0 dark:invert"}):(0,b.jsx)(p.Package,{className:"text-muted-foreground h-6 w-6 shrink-0"}),(0,b.jsx)("h2",{className:"text-base font-bold",children:a.name}),(0,b.jsx)(y,{status:a.status.status})]}),(0,b.jsx)("div",{className:"flex items-center gap-2",children:a.tags.map(a=>{let c=x[a]??{label:a,icon:j},d=c.icon;return(0,b.jsxs)("span",{className:"text-muted-foreground/70 inline-flex items-center gap-0.5 text-[10px]",children:[(0,b.jsx)(d,{className:"h-3 w-3"}),c.label]},a)})})]});return(0,b.jsx)(v.BaseDrawer,{open:d,onClose:e,size:"md",modal:!0,title:a.name,header:K,"data-testid":"tool-detail-drawer",children:(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-4 overflow-y-auto p-4",children:[(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:a.description}),a.author||a.platforms?(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs",children:[a.author?(0,b.jsxs)("span",{className:"text-muted-foreground",children:["by"," ",a.website?(0,b.jsx)("a",{href:a.website,target:"_blank",rel:"noopener noreferrer",className:"text-foreground hover:underline",children:a.author}):(0,b.jsx)("span",{className:"text-foreground",children:a.author})]}):null,a.platforms&&a.platforms.length>0?(0,b.jsx)("span",{className:"text-muted-foreground",children:a.platforms.map(a=>w[a]??a).join(" · ")}):null]}):null,a.installCommand?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-semibold tracking-wide uppercase",children:"Install command"}),(0,b.jsxs)("div",{className:"relative rounded-md bg-zinc-900 text-zinc-100",children:[(0,b.jsx)("pre",{className:"overflow-x-auto px-3 py-2.5 pe-16 font-mono text-xs leading-relaxed break-all whitespace-pre-wrap",children:(0,b.jsx)("code",{children:a.installCommand})}),(0,b.jsxs)(q.Button,{variant:"ghost",size:"sm",className:"absolute top-1.5 right-1.5 h-7 cursor-pointer px-2 text-zinc-400 hover:text-zinc-100",onClick:function(){a.installCommand&&navigator.clipboard.writeText(a.installCommand).then(()=>{m(!0),setTimeout(()=>m(!1),2e3)})},"aria-label":l?"Copied!":"Copy install command",children:[l?(0,b.jsx)(t.Check,{className:"h-3.5 w-3.5 text-emerald-500"}):(0,b.jsx)(s.Copy,{className:"h-3.5 w-3.5"}),(0,b.jsx)("span",{className:"ms-1 text-[10px]",children:l?"Copied!":"Copy"})]})]})]}):null,(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[H?(0,b.jsxs)(q.Button,{size:"sm",onClick:A,disabled:"streaming"===z,"aria-label":`Install ${a.name}`,className:"cursor-pointer",children:["streaming"===z?(0,b.jsx)(g.Loader2,{className:"me-1.5 h-3.5 w-3.5 animate-spin"}):(0,b.jsx)(i.Download,{className:"me-1.5 h-3.5 w-3.5"}),"streaming"===z?"Installing...":"Install"]}):null,G?(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>void I(),disabled:n,"aria-label":`Launch ${a.name}`,className:"cursor-pointer",children:[n?(0,b.jsx)(g.Loader2,{className:"me-1.5 h-3.5 w-3.5 animate-spin"}):(0,b.jsx)(h.Rocket,{className:"me-1.5 h-3.5 w-3.5"}),"Launch"]}):null,a.documentationUrl?(0,b.jsx)(q.Button,{variant:"outline",size:"sm",className:"cursor-pointer",asChild:!0,children:(0,b.jsxs)("a",{href:a.documentationUrl,target:"_blank",rel:"noopener noreferrer",children:["Docs",(0,b.jsx)(u.ExternalLink,{className:"ms-1 h-3 w-3"})]})}):null]}),("streaming"===z||"done"===z||"error"===z)&&r.length>0?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs font-semibold tracking-wide uppercase",children:"Install log"}),(0,b.jsxs)("div",{ref:B,onScroll:J,className:"max-h-60 overflow-auto rounded-md bg-zinc-900 p-3 font-mono text-xs leading-relaxed text-zinc-100","data-testid":"tool-install-log",children:[r.map((a,c)=>(0,b.jsx)("div",{className:"break-all whitespace-pre-wrap",children:a},c)),"done"===z?(0,b.jsx)("div",{className:"mt-2 border-t border-zinc-700 pt-2 text-emerald-400",children:"Installation complete"}):null,"error"===z?(0,b.jsx)("div",{className:"mt-2 border-t border-zinc-700 pt-2 text-red-400",children:"Installation failed"}):null]})]}):null]})})}let A={ide:{label:"IDE",icon:j},"cli-agent":{label:"CLI Agent",icon:k.Terminal},vcs:{label:"VCS",icon:l.GitBranch},terminal:{label:"Terminal",icon:k.Terminal}};function B({tool:a,onRefresh:d,className:e}){let[k,l]=(0,c.useState)(!1),[s,t]=(0,c.useState)(!1),[u,v]=(0,c.useTransition)(),w="available"===a.status.status,x="error"===a.status.status,y=w&&!!a.openDirectory;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{"data-testid":"tool-card",onClick:function(){t(!1),l(!0)},className:(0,f.cn)("bg-card group flex h-30 w-full cursor-pointer flex-col rounded-lg border p-3 transition-shadow hover:shadow-md",e),children:[(0,b.jsxs)("div",{className:"mb-2 flex items-start justify-between gap-2",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[a.iconUrl?(0,b.jsx)("img",{src:a.iconUrl,alt:"",width:20,height:20,className:"shrink-0 dark:invert"}):(0,b.jsx)(p.Package,{className:"text-muted-foreground h-5 w-5 shrink-0"}),(0,b.jsx)("h3",{"data-testid":"tool-card-name",className:"truncate text-sm font-bold",children:a.name})]}),(0,b.jsx)("div",{"data-testid":"tool-card-tags",className:"flex shrink-0 items-center gap-1",children:a.tags.map(a=>{let c=A[a]??{label:a,icon:j},d=c.icon;return(0,b.jsxs)("span",{className:"text-muted-foreground/70 inline-flex items-center gap-0.5 text-[9px]",children:[(0,b.jsx)(d,{className:"h-2.5 w-2.5"}),c.label]},a)})})]}),(0,b.jsx)("p",{"data-testid":"tool-card-summary",className:"text-muted-foreground mt-1 truncate text-xs",children:a.summary}),(0,b.jsxs)("div",{className:"mt-auto flex items-center justify-between pt-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[x&&"error"===a.status.status?(0,b.jsxs)("span",{className:"flex items-center gap-1 truncate text-[10px] text-red-600 dark:text-red-400",title:a.status.errorMessage,children:[(0,b.jsx)(m.CircleX,{className:"h-3 w-3 shrink-0"}),a.status.errorMessage??"Error"]}):w?(0,b.jsxs)("span",{className:"flex items-center gap-1 text-[10px] text-emerald-600 dark:text-emerald-400",children:[(0,b.jsx)(o.CheckCircle2,{className:"h-3 w-3"}),"Installed"]}):(0,b.jsxs)("span",{className:"text-muted-foreground flex items-center gap-1 text-[10px]",children:[(0,b.jsx)(n.Circle,{className:"h-3 w-3"}),"Not installed"]}),a.required?(0,b.jsx)(r.TooltipProvider,{children:(0,b.jsxs)(r.Tooltip,{children:[(0,b.jsx)(r.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"rounded bg-amber-100 px-1.5 py-0.5 text-[9px] font-medium text-amber-700 dark:bg-amber-900/50 dark:text-amber-400",children:"Required"})}),(0,b.jsx)(r.TooltipContent,{side:"top",children:"This tool is required for Shep to function properly"})]})}):null]}),(0,b.jsx)("div",{className:"flex items-center gap-1",children:w&&y?(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:function(b){b.stopPropagation(),v(async()=>{await fetch(`/api/tools/${a.id}/launch`,{method:"POST"})})},disabled:u,"aria-label":`Launch ${a.name}`,"data-testid":"tool-card-launch-button",className:"h-7 cursor-pointer rounded-md px-3 text-xs",children:[u?(0,b.jsx)(g.Loader2,{className:"me-1 h-3 w-3 animate-spin"}):(0,b.jsx)(h.Rocket,{className:"me-1 h-3 w-3"}),"Launch"]}):w||x?null:(0,b.jsxs)(q.Button,{size:"sm",variant:"default",onClick:function(b){b.stopPropagation(),t(a.autoInstall),l(!0)},"aria-label":`Install ${a.name}`,"data-testid":"tool-card-install-button",className:"h-7 cursor-pointer rounded-md px-3 text-xs",children:[(0,b.jsx)(i.Download,{className:"me-1 h-3 w-3"}),"Install"]})})]})]}),(0,b.jsx)(z,{tool:a,open:k,onClose:()=>l(!1),onRefresh:d,autoStart:s})]})}let C={all:()=>!0,ide:a=>a.tags.includes("ide"),"cli-agent":a=>a.tags.includes("cli-agent"),vcs:a=>a.tags.includes("vcs"),terminal:a=>a.tags.includes("terminal")};function D({tools:a,className:g}){let[h,i]=(0,c.useState)(a),[j,k]=(0,c.useState)("all"),l=(0,c.useCallback)(async()=>{try{let a=await fetch("/api/tools");if(a.ok){let b=await a.json();i(b)}}catch{}},[]),m=h.filter(C[j]);return(0,b.jsxs)("div",{"data-testid":"tools-page-client",className:(0,f.cn)("space-y-4",g),children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(d.Wrench,{className:"text-muted-foreground h-4 w-4"}),(0,b.jsx)("h1",{className:"text-sm font-bold tracking-tight",children:"Tools"}),(0,b.jsxs)("span",{className:"text-muted-foreground text-[10px]",children:[h.filter(a=>"available"===a.status.status).length,"/",h.length," installed"]})]}),(0,b.jsxs)(e.Tabs,{value:j,onValueChange:a=>k(a),"data-testid":"tools-page-tabs",children:[(0,b.jsxs)(e.TabsList,{className:"h-7",children:[(0,b.jsx)(e.TabsTrigger,{value:"all","data-testid":"tools-tab-all",className:"px-2.5 text-xs",children:"All"}),(0,b.jsx)(e.TabsTrigger,{value:"ide","data-testid":"tools-tab-ide",className:"px-2.5 text-xs",children:"IDEs"}),(0,b.jsx)(e.TabsTrigger,{value:"cli-agent","data-testid":"tools-tab-cli-agent",className:"px-2.5 text-xs",children:"CLI Agents"}),(0,b.jsx)(e.TabsTrigger,{value:"vcs","data-testid":"tools-tab-vcs",className:"px-2.5 text-xs",children:"Version Control"}),(0,b.jsx)(e.TabsTrigger,{value:"terminal","data-testid":"tools-tab-terminal",className:"px-2.5 text-xs",children:"Terminals"})]}),(0,b.jsx)(e.TabsContent,{value:j,className:"mt-3",children:0===m.length?(0,b.jsxs)("div",{"data-testid":"tools-page-empty",className:"text-muted-foreground flex flex-col items-center justify-center py-12 text-center",children:[(0,b.jsx)(d.Wrench,{className:"mb-2 h-6 w-6 opacity-20"}),(0,b.jsx)("p",{className:"text-xs",children:"No tools in this category."})]}):(0,b.jsx)("div",{"data-testid":"tools-page-grid",className:"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:m.map(a=>(0,b.jsx)(B,{tool:a,onRefresh:l},a.id))})})]})]})}a.s(["ToolsPageClient",()=>D],92163)}];
2
2
 
3
3
  //# sourceMappingURL=src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/hooks/use-tool-install-stream.ts","../../../../../../../src/presentation/web/components/features/tools/tool-detail-drawer.tsx","../../../../../../../src/presentation/web/components/features/tools/tool-card.tsx","../../../../../../../src/presentation/web/components/features/tools/tools-page-client.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/package.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/monitor.ts"],"sourcesContent":["'use client';\n\nimport { useState, useRef, useCallback, useEffect } from 'react';\nimport type { ToolInstallationStatus } from '@shepai/core/domain/generated/output';\n\nexport type InstallStreamStatus = 'idle' | 'streaming' | 'done' | 'error';\n\nexport interface UseToolInstallStreamResult {\n logs: string[];\n status: InstallStreamStatus;\n result: ToolInstallationStatus | null;\n startInstall: () => void;\n}\n\nexport function useToolInstallStream(toolId: string): UseToolInstallStreamResult {\n const [logs, setLogs] = useState<string[]>([]);\n const [status, setStatus] = useState<InstallStreamStatus>('idle');\n const [result, setResult] = useState<ToolInstallationStatus | null>(null);\n const esRef = useRef<EventSource | null>(null);\n\n const cleanup = useCallback(() => {\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => cleanup, [cleanup]);\n\n const startInstall = useCallback(() => {\n cleanup();\n setLogs([]);\n setResult(null);\n setStatus('streaming');\n\n const es = new EventSource(`/api/tools/${toolId}/install/stream`);\n esRef.current = es;\n\n es.onmessage = (event: MessageEvent) => {\n setLogs((prev) => [...prev, event.data]);\n };\n\n es.addEventListener('done', (event: MessageEvent) => {\n const installResult: ToolInstallationStatus = JSON.parse(event.data);\n setResult(installResult);\n setStatus(installResult.status === 'error' ? 'error' : 'done');\n cleanup();\n });\n\n es.onerror = () => {\n setStatus('error');\n cleanup();\n };\n }, [toolId, cleanup]);\n\n return { logs, status, result, startInstall };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport {\n Copy,\n Check,\n ExternalLink,\n Download,\n Rocket,\n Loader2,\n Monitor,\n Terminal,\n GitBranch,\n Package,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { BaseDrawer } from '@/components/common/base-drawer/base-drawer';\nimport { useToolInstallStream } from '@/hooks/use-tool-install-stream';\nimport type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nconst PLATFORM_LABELS: Record<string, string> = {\n linux: 'Linux',\n darwin: 'macOS',\n win32: 'Windows',\n};\n\nexport interface ToolDetailDrawerProps {\n tool: ToolItem;\n open: boolean;\n onClose: () => void;\n onRefresh?: () => Promise<void>;\n autoStart?: boolean;\n}\n\nconst TAG_CONFIG: Record<string, { label: string; icon: typeof Monitor }> = {\n ide: { label: 'IDE', icon: Monitor },\n 'cli-agent': { label: 'CLI Agent', icon: Terminal },\n vcs: { label: 'VCS', icon: GitBranch },\n terminal: { label: 'Terminal', icon: Terminal },\n};\n\nconst AUTO_SCROLL_THRESHOLD = 50;\n\nfunction StatusBadge({ status }: { status: string }) {\n if (status === 'available') {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-emerald-100 px-2 py-0.5 text-xs font-medium text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400\">\n <Check className=\"h-3 w-3\" />\n Installed\n </span>\n );\n }\n if (status === 'error') {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-red-100 px-2 py-0.5 text-xs font-medium text-red-700 dark:bg-red-900/30 dark:text-red-400\">\n Error\n </span>\n );\n }\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-amber-100 px-2 py-0.5 text-xs font-medium text-amber-700 dark:bg-amber-900/30 dark:text-amber-400\">\n Missing\n </span>\n );\n}\n\nexport function ToolDetailDrawer({\n tool,\n open,\n onClose,\n onRefresh,\n autoStart,\n}: ToolDetailDrawerProps) {\n const [copied, setCopied] = useState(false);\n const [isLaunching, setIsLaunching] = useState(false);\n const { logs, status, startInstall } = useToolInstallStream(tool.id);\n const logRef = useRef<HTMLDivElement>(null);\n const isAtBottomRef = useRef(true);\n const autoStartedRef = useRef(false);\n\n const isInstalled = tool.status.status === 'available';\n const isError = tool.status.status === 'error';\n const canLaunch = isInstalled && Boolean(tool.openDirectory);\n const canInstall = !isInstalled && !isError && tool.autoInstall;\n\n // Auto-start install when drawer opens with autoStart flag\n useEffect(() => {\n if (open && autoStart && canInstall && status === 'idle' && !autoStartedRef.current) {\n autoStartedRef.current = true;\n startInstall();\n }\n if (!open) {\n autoStartedRef.current = false;\n }\n }, [open, autoStart, canInstall, status, startInstall]);\n\n function handleCopy() {\n if (!tool.installCommand) return;\n void navigator.clipboard.writeText(tool.installCommand).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n async function handleLaunch() {\n setIsLaunching(true);\n try {\n await fetch(`/api/tools/${tool.id}/launch`, { method: 'POST' });\n } finally {\n setIsLaunching(false);\n }\n }\n\n const handleScroll = useCallback(() => {\n const el = logRef.current;\n if (!el) return;\n isAtBottomRef.current =\n el.scrollTop + el.clientHeight >= el.scrollHeight - AUTO_SCROLL_THRESHOLD;\n }, []);\n\n useEffect(() => {\n if (isAtBottomRef.current && logRef.current) {\n logRef.current.scrollTop = logRef.current.scrollHeight;\n }\n }, [logs, status]);\n\n // Refresh tool status after install completes\n useEffect(() => {\n if (status === 'done' && onRefresh) {\n void onRefresh();\n }\n }, [status, onRefresh]);\n\n const header = (\n <div className=\"flex flex-col gap-1.5 pe-6\">\n <div className=\"flex items-center gap-2\">\n {tool.iconUrl ? (\n /* eslint-disable-next-line @next/next/no-img-element */\n <img src={tool.iconUrl} alt=\"\" width={24} height={24} className=\"shrink-0 dark:invert\" />\n ) : (\n <Package className=\"text-muted-foreground h-6 w-6 shrink-0\" />\n )}\n <h2 className=\"text-base font-bold\">{tool.name}</h2>\n <StatusBadge status={tool.status.status} />\n </div>\n <div className=\"flex items-center gap-2\">\n {tool.tags.map((tag) => {\n const config = TAG_CONFIG[tag] ?? { label: tag, icon: Monitor };\n const TagIcon = config.icon;\n return (\n <span\n key={tag}\n className=\"text-muted-foreground/70 inline-flex items-center gap-0.5 text-[10px]\"\n >\n <TagIcon className=\"h-3 w-3\" />\n {config.label}\n </span>\n );\n })}\n </div>\n </div>\n );\n\n return (\n <BaseDrawer\n open={open}\n onClose={onClose}\n size=\"md\"\n modal\n title={tool.name}\n header={header}\n data-testid=\"tool-detail-drawer\"\n >\n <div className=\"flex flex-1 flex-col gap-4 overflow-y-auto p-4\">\n {/* Description */}\n <p className=\"text-muted-foreground text-sm\">{tool.description}</p>\n\n {/* Meta info row: author + platforms */}\n {tool.author || tool.platforms ? (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs\">\n {tool.author ? (\n <span className=\"text-muted-foreground\">\n by{' '}\n {tool.website ? (\n <a\n href={tool.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-foreground hover:underline\"\n >\n {tool.author}\n </a>\n ) : (\n <span className=\"text-foreground\">{tool.author}</span>\n )}\n </span>\n ) : null}\n {tool.platforms && tool.platforms.length > 0 ? (\n <span className=\"text-muted-foreground\">\n {tool.platforms.map((p) => PLATFORM_LABELS[p] ?? p).join(' · ')}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Install Command */}\n {tool.installCommand ? (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Install command\n </span>\n <div className=\"relative rounded-md bg-zinc-900 text-zinc-100\">\n <pre className=\"overflow-x-auto px-3 py-2.5 pe-16 font-mono text-xs leading-relaxed break-all whitespace-pre-wrap\">\n <code>{tool.installCommand}</code>\n </pre>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-1.5 right-1.5 h-7 cursor-pointer px-2 text-zinc-400 hover:text-zinc-100\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied!' : 'Copy install command'}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5 text-emerald-500\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" />\n )}\n <span className=\"ms-1 text-[10px]\">{copied ? 'Copied!' : 'Copy'}</span>\n </Button>\n </div>\n </div>\n ) : null}\n\n {/* Action Bar */}\n <div className=\"flex items-center gap-2\">\n {canInstall ? (\n <Button\n size=\"sm\"\n onClick={startInstall}\n disabled={status === 'streaming'}\n aria-label={`Install ${tool.name}`}\n className=\"cursor-pointer\"\n >\n {status === 'streaming' ? (\n <Loader2 className=\"me-1.5 h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Download className=\"me-1.5 h-3.5 w-3.5\" />\n )}\n {status === 'streaming' ? 'Installing...' : 'Install'}\n </Button>\n ) : null}\n {canLaunch ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void handleLaunch()}\n disabled={isLaunching}\n aria-label={`Launch ${tool.name}`}\n className=\"cursor-pointer\"\n >\n {isLaunching ? (\n <Loader2 className=\"me-1.5 h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Rocket className=\"me-1.5 h-3.5 w-3.5\" />\n )}\n Launch\n </Button>\n ) : null}\n {tool.documentationUrl ? (\n <Button variant=\"outline\" size=\"sm\" className=\"cursor-pointer\" asChild>\n <a href={tool.documentationUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Docs\n <ExternalLink className=\"ms-1 h-3 w-3\" />\n </a>\n </Button>\n ) : null}\n </div>\n\n {/* Install Log */}\n {(status === 'streaming' || status === 'done' || status === 'error') && logs.length > 0 ? (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Install log\n </span>\n <div\n ref={logRef}\n onScroll={handleScroll}\n className=\"max-h-60 overflow-auto rounded-md bg-zinc-900 p-3 font-mono text-xs leading-relaxed text-zinc-100\"\n data-testid=\"tool-install-log\"\n >\n {logs.map((line, idx) => (\n // eslint-disable-next-line react/no-array-index-key -- logs are append-only, never reorder\n <div key={idx} className=\"break-all whitespace-pre-wrap\">\n {line}\n </div>\n ))}\n {status === 'done' ? (\n <div className=\"mt-2 border-t border-zinc-700 pt-2 text-emerald-400\">\n Installation complete\n </div>\n ) : null}\n {status === 'error' ? (\n <div className=\"mt-2 border-t border-zinc-700 pt-2 text-red-400\">\n Installation failed\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useState, useTransition } from 'react';\nimport {\n Loader2,\n Rocket,\n Download,\n Monitor,\n Terminal,\n GitBranch,\n CircleX,\n Circle,\n CheckCircle2,\n Package,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { cn } from '@/lib/utils';\nimport { ToolDetailDrawer } from './tool-detail-drawer';\nimport type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolCardProps {\n tool: ToolItem;\n onRefresh?: () => Promise<void>;\n className?: string;\n}\n\nconst TAG_CONFIG: Record<string, { label: string; icon: typeof Monitor }> = {\n ide: { label: 'IDE', icon: Monitor },\n 'cli-agent': { label: 'CLI Agent', icon: Terminal },\n vcs: { label: 'VCS', icon: GitBranch },\n terminal: { label: 'Terminal', icon: Terminal },\n};\n\nexport function ToolCard({ tool, onRefresh, className }: ToolCardProps) {\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [autoStartInstall, setAutoStartInstall] = useState(false);\n const [isPending, startTransition] = useTransition();\n\n const isInstalled = tool.status.status === 'available';\n const isError = tool.status.status === 'error';\n const canLaunch = isInstalled && Boolean(tool.openDirectory);\n\n function handleLaunch(e: React.MouseEvent) {\n e.stopPropagation();\n startTransition(async () => {\n await fetch(`/api/tools/${tool.id}/launch`, { method: 'POST' });\n });\n }\n\n function handleCardClick() {\n setAutoStartInstall(false);\n setDrawerOpen(true);\n }\n\n function handleInstallClick(e: React.MouseEvent) {\n e.stopPropagation();\n setAutoStartInstall(tool.autoInstall);\n setDrawerOpen(true);\n }\n\n return (\n <>\n <div\n data-testid=\"tool-card\"\n onClick={handleCardClick}\n className={cn(\n 'bg-card group flex h-30 w-full cursor-pointer flex-col rounded-lg border p-3 transition-shadow hover:shadow-md',\n className\n )}\n >\n {/* Top row: icon + name left, tag badges right */}\n <div className=\"mb-2 flex items-start justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n {tool.iconUrl ? (\n /* eslint-disable-next-line @next/next/no-img-element */\n <img\n src={tool.iconUrl}\n alt=\"\"\n width={20}\n height={20}\n className=\"shrink-0 dark:invert\"\n />\n ) : (\n <Package className=\"text-muted-foreground h-5 w-5 shrink-0\" />\n )}\n <h3 data-testid=\"tool-card-name\" className=\"truncate text-sm font-bold\">\n {tool.name}\n </h3>\n </div>\n <div data-testid=\"tool-card-tags\" className=\"flex shrink-0 items-center gap-1\">\n {tool.tags.map((tag) => {\n const config = TAG_CONFIG[tag] ?? { label: tag, icon: Monitor };\n const TagIcon = config.icon;\n return (\n <span\n key={tag}\n className=\"text-muted-foreground/70 inline-flex items-center gap-0.5 text-[9px]\"\n >\n <TagIcon className=\"h-2.5 w-2.5\" />\n {config.label}\n </span>\n );\n })}\n </div>\n </div>\n\n {/* Summary */}\n <p data-testid=\"tool-card-summary\" className=\"text-muted-foreground mt-1 truncate text-xs\">\n {tool.summary}\n </p>\n\n {/* Bottom section — pushed to bottom */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n {/* Status text */}\n <div className=\"flex items-center gap-2\">\n {isError && tool.status.status === 'error' ? (\n <span\n className=\"flex items-center gap-1 truncate text-[10px] text-red-600 dark:text-red-400\"\n title={tool.status.errorMessage}\n >\n <CircleX className=\"h-3 w-3 shrink-0\" />\n {tool.status.errorMessage ?? 'Error'}\n </span>\n ) : isInstalled ? (\n <span className=\"flex items-center gap-1 text-[10px] text-emerald-600 dark:text-emerald-400\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Installed\n </span>\n ) : (\n <span className=\"text-muted-foreground flex items-center gap-1 text-[10px]\">\n <Circle className=\"h-3 w-3\" />\n Not installed\n </span>\n )}\n {tool.required ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"rounded bg-amber-100 px-1.5 py-0.5 text-[9px] font-medium text-amber-700 dark:bg-amber-900/50 dark:text-amber-400\">\n Required\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n This tool is required for Shep to function properly\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </div>\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-1\">\n {isInstalled && canLaunch ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleLaunch}\n disabled={isPending}\n aria-label={`Launch ${tool.name}`}\n data-testid=\"tool-card-launch-button\"\n className=\"h-7 cursor-pointer rounded-md px-3 text-xs\"\n >\n {isPending ? (\n <Loader2 className=\"me-1 h-3 w-3 animate-spin\" />\n ) : (\n <Rocket className=\"me-1 h-3 w-3\" />\n )}\n Launch\n </Button>\n ) : !isInstalled && !isError ? (\n <Button\n size=\"sm\"\n variant=\"default\"\n onClick={handleInstallClick}\n aria-label={`Install ${tool.name}`}\n data-testid=\"tool-card-install-button\"\n className=\"h-7 cursor-pointer rounded-md px-3 text-xs\"\n >\n <Download className=\"me-1 h-3 w-3\" />\n Install\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n\n <ToolDetailDrawer\n tool={tool}\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n onRefresh={onRefresh}\n autoStart={autoStartInstall}\n />\n </>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { Wrench } from 'lucide-react';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { cn } from '@/lib/utils';\nimport { ToolCard } from './tool-card';\nimport type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolsPageClientProps {\n tools: ToolItem[];\n className?: string;\n}\n\ntype TabValue = 'all' | 'ide' | 'cli-agent' | 'vcs' | 'terminal';\n\nconst TAB_FILTER: Record<TabValue, (tool: ToolItem) => boolean> = {\n all: () => true,\n ide: (tool) => tool.tags.includes('ide'),\n 'cli-agent': (tool) => tool.tags.includes('cli-agent'),\n vcs: (tool) => tool.tags.includes('vcs'),\n terminal: (tool) => tool.tags.includes('terminal'),\n};\n\nexport function ToolsPageClient({ tools: initialTools, className }: ToolsPageClientProps) {\n const [tools, setTools] = useState<ToolItem[]>(initialTools);\n const [activeTab, setActiveTab] = useState<TabValue>('all');\n\n const refreshTools = useCallback(async () => {\n try {\n const res = await fetch('/api/tools');\n if (res.ok) {\n const updated = (await res.json()) as ToolItem[];\n setTools(updated);\n }\n } catch {\n // Silently ignore refresh errors; user can re-navigate to refresh\n }\n }, []);\n\n const filtered = tools.filter(TAB_FILTER[activeTab]);\n\n return (\n <div data-testid=\"tools-page-client\" className={cn('space-y-4', className)}>\n {/* Compact header */}\n <div className=\"flex items-center gap-2\">\n <Wrench className=\"text-muted-foreground h-4 w-4\" />\n <h1 className=\"text-sm font-bold tracking-tight\">Tools</h1>\n <span className=\"text-muted-foreground text-[10px]\">\n {tools.filter((t) => t.status.status === 'available').length}/{tools.length} installed\n </span>\n </div>\n\n <Tabs\n value={activeTab}\n onValueChange={(value) => setActiveTab(value as TabValue)}\n data-testid=\"tools-page-tabs\"\n >\n <TabsList className=\"h-7\">\n <TabsTrigger value=\"all\" data-testid=\"tools-tab-all\" className=\"px-2.5 text-xs\">\n All\n </TabsTrigger>\n <TabsTrigger value=\"ide\" data-testid=\"tools-tab-ide\" className=\"px-2.5 text-xs\">\n IDEs\n </TabsTrigger>\n <TabsTrigger\n value=\"cli-agent\"\n data-testid=\"tools-tab-cli-agent\"\n className=\"px-2.5 text-xs\"\n >\n CLI Agents\n </TabsTrigger>\n <TabsTrigger value=\"vcs\" data-testid=\"tools-tab-vcs\" className=\"px-2.5 text-xs\">\n Version Control\n </TabsTrigger>\n <TabsTrigger value=\"terminal\" data-testid=\"tools-tab-terminal\" className=\"px-2.5 text-xs\">\n Terminals\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value={activeTab} className=\"mt-3\">\n {filtered.length === 0 ? (\n <div\n data-testid=\"tools-page-empty\"\n className=\"text-muted-foreground flex flex-col items-center justify-center py-12 text-center\"\n >\n <Wrench className=\"mb-2 h-6 w-6 opacity-20\" />\n <p className=\"text-xs\">No tools in this category.</p>\n </div>\n ) : (\n <div\n data-testid=\"tools-page-grid\"\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\"\n >\n {filtered.map((tool) => (\n <ToolCard key={tool.id} tool={tool} onRefresh={refreshTools} />\n ))}\n </div>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z',\n key: '1a0edw',\n },\n ],\n ['path', { d: 'M12 22V12', key: 'd0xqtd' }],\n ['polyline', { points: '3.29 7 12 12 20.71 7', key: 'ousv84' }],\n ['path', { d: 'm7.5 4.27 9 5.15', key: '1c824w' }],\n];\n\n/**\n * @component @name Package\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTEgMjEuNzNhMiAyIDAgMCAwIDIgMGw3LTRBMiAyIDAgMCAwIDIxIDE2VjhhMiAyIDAgMCAwLTEtMS43M2wtNy00YTIgMiAwIDAgMC0yIDBsLTcgNEEyIDIgMCAwIDAgMyA4djhhMiAyIDAgMCAwIDEgMS43M3oiIC8+CiAgPHBhdGggZD0iTTEyIDIyVjEyIiAvPgogIDxwb2x5bGluZSBwb2ludHM9IjMuMjkgNyAxMiAxMiAyMC43MSA3IiAvPgogIDxwYXRoIGQ9Im03LjUgNC4yNyA5IDUuMTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/package\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Package = createLucideIcon('package', __iconNode);\n\nexport default Package;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n"],"names":[],"mappings":"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","ignoreList":[4,5]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/hooks/use-tool-install-stream.ts","../../../../../../../src/presentation/web/components/features/tools/tool-detail-drawer.tsx","../../../../../../../src/presentation/web/components/features/tools/tool-card.tsx","../../../../../../../src/presentation/web/components/features/tools/tools-page-client.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/monitor.ts"],"sourcesContent":["'use client';\n\nimport { useState, useRef, useCallback, useEffect } from 'react';\nimport type { ToolInstallationStatus } from '@shepai/core/domain/generated/output';\n\nexport type InstallStreamStatus = 'idle' | 'streaming' | 'done' | 'error';\n\nexport interface UseToolInstallStreamResult {\n logs: string[];\n status: InstallStreamStatus;\n result: ToolInstallationStatus | null;\n startInstall: () => void;\n}\n\nexport function useToolInstallStream(toolId: string): UseToolInstallStreamResult {\n const [logs, setLogs] = useState<string[]>([]);\n const [status, setStatus] = useState<InstallStreamStatus>('idle');\n const [result, setResult] = useState<ToolInstallationStatus | null>(null);\n const esRef = useRef<EventSource | null>(null);\n\n const cleanup = useCallback(() => {\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => cleanup, [cleanup]);\n\n const startInstall = useCallback(() => {\n cleanup();\n setLogs([]);\n setResult(null);\n setStatus('streaming');\n\n const es = new EventSource(`/api/tools/${toolId}/install/stream`);\n esRef.current = es;\n\n es.onmessage = (event: MessageEvent) => {\n setLogs((prev) => [...prev, event.data]);\n };\n\n es.addEventListener('done', (event: MessageEvent) => {\n const installResult: ToolInstallationStatus = JSON.parse(event.data);\n setResult(installResult);\n setStatus(installResult.status === 'error' ? 'error' : 'done');\n cleanup();\n });\n\n es.onerror = () => {\n setStatus('error');\n cleanup();\n };\n }, [toolId, cleanup]);\n\n return { logs, status, result, startInstall };\n}\n","'use client';\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport {\n Copy,\n Check,\n ExternalLink,\n Download,\n Rocket,\n Loader2,\n Monitor,\n Terminal,\n GitBranch,\n Package,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { BaseDrawer } from '@/components/common/base-drawer/base-drawer';\nimport { useToolInstallStream } from '@/hooks/use-tool-install-stream';\nimport type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nconst PLATFORM_LABELS: Record<string, string> = {\n linux: 'Linux',\n darwin: 'macOS',\n win32: 'Windows',\n};\n\nexport interface ToolDetailDrawerProps {\n tool: ToolItem;\n open: boolean;\n onClose: () => void;\n onRefresh?: () => Promise<void>;\n autoStart?: boolean;\n}\n\nconst TAG_CONFIG: Record<string, { label: string; icon: typeof Monitor }> = {\n ide: { label: 'IDE', icon: Monitor },\n 'cli-agent': { label: 'CLI Agent', icon: Terminal },\n vcs: { label: 'VCS', icon: GitBranch },\n terminal: { label: 'Terminal', icon: Terminal },\n};\n\nconst AUTO_SCROLL_THRESHOLD = 50;\n\nfunction StatusBadge({ status }: { status: string }) {\n if (status === 'available') {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-emerald-100 px-2 py-0.5 text-xs font-medium text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400\">\n <Check className=\"h-3 w-3\" />\n Installed\n </span>\n );\n }\n if (status === 'error') {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-red-100 px-2 py-0.5 text-xs font-medium text-red-700 dark:bg-red-900/30 dark:text-red-400\">\n Error\n </span>\n );\n }\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-amber-100 px-2 py-0.5 text-xs font-medium text-amber-700 dark:bg-amber-900/30 dark:text-amber-400\">\n Missing\n </span>\n );\n}\n\nexport function ToolDetailDrawer({\n tool,\n open,\n onClose,\n onRefresh,\n autoStart,\n}: ToolDetailDrawerProps) {\n const [copied, setCopied] = useState(false);\n const [isLaunching, setIsLaunching] = useState(false);\n const { logs, status, startInstall } = useToolInstallStream(tool.id);\n const logRef = useRef<HTMLDivElement>(null);\n const isAtBottomRef = useRef(true);\n const autoStartedRef = useRef(false);\n\n const isInstalled = tool.status.status === 'available';\n const isError = tool.status.status === 'error';\n const canLaunch = isInstalled && Boolean(tool.openDirectory);\n const canInstall = !isInstalled && !isError && tool.autoInstall;\n\n // Auto-start install when drawer opens with autoStart flag\n useEffect(() => {\n if (open && autoStart && canInstall && status === 'idle' && !autoStartedRef.current) {\n autoStartedRef.current = true;\n startInstall();\n }\n if (!open) {\n autoStartedRef.current = false;\n }\n }, [open, autoStart, canInstall, status, startInstall]);\n\n function handleCopy() {\n if (!tool.installCommand) return;\n void navigator.clipboard.writeText(tool.installCommand).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n async function handleLaunch() {\n setIsLaunching(true);\n try {\n await fetch(`/api/tools/${tool.id}/launch`, { method: 'POST' });\n } finally {\n setIsLaunching(false);\n }\n }\n\n const handleScroll = useCallback(() => {\n const el = logRef.current;\n if (!el) return;\n isAtBottomRef.current =\n el.scrollTop + el.clientHeight >= el.scrollHeight - AUTO_SCROLL_THRESHOLD;\n }, []);\n\n useEffect(() => {\n if (isAtBottomRef.current && logRef.current) {\n logRef.current.scrollTop = logRef.current.scrollHeight;\n }\n }, [logs, status]);\n\n // Refresh tool status after install completes\n useEffect(() => {\n if (status === 'done' && onRefresh) {\n void onRefresh();\n }\n }, [status, onRefresh]);\n\n const header = (\n <div className=\"flex flex-col gap-1.5 pe-6\">\n <div className=\"flex items-center gap-2\">\n {tool.iconUrl ? (\n /* eslint-disable-next-line @next/next/no-img-element */\n <img src={tool.iconUrl} alt=\"\" width={24} height={24} className=\"shrink-0 dark:invert\" />\n ) : (\n <Package className=\"text-muted-foreground h-6 w-6 shrink-0\" />\n )}\n <h2 className=\"text-base font-bold\">{tool.name}</h2>\n <StatusBadge status={tool.status.status} />\n </div>\n <div className=\"flex items-center gap-2\">\n {tool.tags.map((tag) => {\n const config = TAG_CONFIG[tag] ?? { label: tag, icon: Monitor };\n const TagIcon = config.icon;\n return (\n <span\n key={tag}\n className=\"text-muted-foreground/70 inline-flex items-center gap-0.5 text-[10px]\"\n >\n <TagIcon className=\"h-3 w-3\" />\n {config.label}\n </span>\n );\n })}\n </div>\n </div>\n );\n\n return (\n <BaseDrawer\n open={open}\n onClose={onClose}\n size=\"md\"\n modal\n title={tool.name}\n header={header}\n data-testid=\"tool-detail-drawer\"\n >\n <div className=\"flex flex-1 flex-col gap-4 overflow-y-auto p-4\">\n {/* Description */}\n <p className=\"text-muted-foreground text-sm\">{tool.description}</p>\n\n {/* Meta info row: author + platforms */}\n {tool.author || tool.platforms ? (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs\">\n {tool.author ? (\n <span className=\"text-muted-foreground\">\n by{' '}\n {tool.website ? (\n <a\n href={tool.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-foreground hover:underline\"\n >\n {tool.author}\n </a>\n ) : (\n <span className=\"text-foreground\">{tool.author}</span>\n )}\n </span>\n ) : null}\n {tool.platforms && tool.platforms.length > 0 ? (\n <span className=\"text-muted-foreground\">\n {tool.platforms.map((p) => PLATFORM_LABELS[p] ?? p).join(' · ')}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* Install Command */}\n {tool.installCommand ? (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Install command\n </span>\n <div className=\"relative rounded-md bg-zinc-900 text-zinc-100\">\n <pre className=\"overflow-x-auto px-3 py-2.5 pe-16 font-mono text-xs leading-relaxed break-all whitespace-pre-wrap\">\n <code>{tool.installCommand}</code>\n </pre>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-1.5 right-1.5 h-7 cursor-pointer px-2 text-zinc-400 hover:text-zinc-100\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied!' : 'Copy install command'}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5 text-emerald-500\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" />\n )}\n <span className=\"ms-1 text-[10px]\">{copied ? 'Copied!' : 'Copy'}</span>\n </Button>\n </div>\n </div>\n ) : null}\n\n {/* Action Bar */}\n <div className=\"flex items-center gap-2\">\n {canInstall ? (\n <Button\n size=\"sm\"\n onClick={startInstall}\n disabled={status === 'streaming'}\n aria-label={`Install ${tool.name}`}\n className=\"cursor-pointer\"\n >\n {status === 'streaming' ? (\n <Loader2 className=\"me-1.5 h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Download className=\"me-1.5 h-3.5 w-3.5\" />\n )}\n {status === 'streaming' ? 'Installing...' : 'Install'}\n </Button>\n ) : null}\n {canLaunch ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void handleLaunch()}\n disabled={isLaunching}\n aria-label={`Launch ${tool.name}`}\n className=\"cursor-pointer\"\n >\n {isLaunching ? (\n <Loader2 className=\"me-1.5 h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Rocket className=\"me-1.5 h-3.5 w-3.5\" />\n )}\n Launch\n </Button>\n ) : null}\n {tool.documentationUrl ? (\n <Button variant=\"outline\" size=\"sm\" className=\"cursor-pointer\" asChild>\n <a href={tool.documentationUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Docs\n <ExternalLink className=\"ms-1 h-3 w-3\" />\n </a>\n </Button>\n ) : null}\n </div>\n\n {/* Install Log */}\n {(status === 'streaming' || status === 'done' || status === 'error') && logs.length > 0 ? (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n Install log\n </span>\n <div\n ref={logRef}\n onScroll={handleScroll}\n className=\"max-h-60 overflow-auto rounded-md bg-zinc-900 p-3 font-mono text-xs leading-relaxed text-zinc-100\"\n data-testid=\"tool-install-log\"\n >\n {logs.map((line, idx) => (\n // eslint-disable-next-line react/no-array-index-key -- logs are append-only, never reorder\n <div key={idx} className=\"break-all whitespace-pre-wrap\">\n {line}\n </div>\n ))}\n {status === 'done' ? (\n <div className=\"mt-2 border-t border-zinc-700 pt-2 text-emerald-400\">\n Installation complete\n </div>\n ) : null}\n {status === 'error' ? (\n <div className=\"mt-2 border-t border-zinc-700 pt-2 text-red-400\">\n Installation failed\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useState, useTransition } from 'react';\nimport {\n Loader2,\n Rocket,\n Download,\n Monitor,\n Terminal,\n GitBranch,\n CircleX,\n Circle,\n CheckCircle2,\n Package,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { cn } from '@/lib/utils';\nimport { ToolDetailDrawer } from './tool-detail-drawer';\nimport type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolCardProps {\n tool: ToolItem;\n onRefresh?: () => Promise<void>;\n className?: string;\n}\n\nconst TAG_CONFIG: Record<string, { label: string; icon: typeof Monitor }> = {\n ide: { label: 'IDE', icon: Monitor },\n 'cli-agent': { label: 'CLI Agent', icon: Terminal },\n vcs: { label: 'VCS', icon: GitBranch },\n terminal: { label: 'Terminal', icon: Terminal },\n};\n\nexport function ToolCard({ tool, onRefresh, className }: ToolCardProps) {\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [autoStartInstall, setAutoStartInstall] = useState(false);\n const [isPending, startTransition] = useTransition();\n\n const isInstalled = tool.status.status === 'available';\n const isError = tool.status.status === 'error';\n const canLaunch = isInstalled && Boolean(tool.openDirectory);\n\n function handleLaunch(e: React.MouseEvent) {\n e.stopPropagation();\n startTransition(async () => {\n await fetch(`/api/tools/${tool.id}/launch`, { method: 'POST' });\n });\n }\n\n function handleCardClick() {\n setAutoStartInstall(false);\n setDrawerOpen(true);\n }\n\n function handleInstallClick(e: React.MouseEvent) {\n e.stopPropagation();\n setAutoStartInstall(tool.autoInstall);\n setDrawerOpen(true);\n }\n\n return (\n <>\n <div\n data-testid=\"tool-card\"\n onClick={handleCardClick}\n className={cn(\n 'bg-card group flex h-30 w-full cursor-pointer flex-col rounded-lg border p-3 transition-shadow hover:shadow-md',\n className\n )}\n >\n {/* Top row: icon + name left, tag badges right */}\n <div className=\"mb-2 flex items-start justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n {tool.iconUrl ? (\n /* eslint-disable-next-line @next/next/no-img-element */\n <img\n src={tool.iconUrl}\n alt=\"\"\n width={20}\n height={20}\n className=\"shrink-0 dark:invert\"\n />\n ) : (\n <Package className=\"text-muted-foreground h-5 w-5 shrink-0\" />\n )}\n <h3 data-testid=\"tool-card-name\" className=\"truncate text-sm font-bold\">\n {tool.name}\n </h3>\n </div>\n <div data-testid=\"tool-card-tags\" className=\"flex shrink-0 items-center gap-1\">\n {tool.tags.map((tag) => {\n const config = TAG_CONFIG[tag] ?? { label: tag, icon: Monitor };\n const TagIcon = config.icon;\n return (\n <span\n key={tag}\n className=\"text-muted-foreground/70 inline-flex items-center gap-0.5 text-[9px]\"\n >\n <TagIcon className=\"h-2.5 w-2.5\" />\n {config.label}\n </span>\n );\n })}\n </div>\n </div>\n\n {/* Summary */}\n <p data-testid=\"tool-card-summary\" className=\"text-muted-foreground mt-1 truncate text-xs\">\n {tool.summary}\n </p>\n\n {/* Bottom section — pushed to bottom */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n {/* Status text */}\n <div className=\"flex items-center gap-2\">\n {isError && tool.status.status === 'error' ? (\n <span\n className=\"flex items-center gap-1 truncate text-[10px] text-red-600 dark:text-red-400\"\n title={tool.status.errorMessage}\n >\n <CircleX className=\"h-3 w-3 shrink-0\" />\n {tool.status.errorMessage ?? 'Error'}\n </span>\n ) : isInstalled ? (\n <span className=\"flex items-center gap-1 text-[10px] text-emerald-600 dark:text-emerald-400\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Installed\n </span>\n ) : (\n <span className=\"text-muted-foreground flex items-center gap-1 text-[10px]\">\n <Circle className=\"h-3 w-3\" />\n Not installed\n </span>\n )}\n {tool.required ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"rounded bg-amber-100 px-1.5 py-0.5 text-[9px] font-medium text-amber-700 dark:bg-amber-900/50 dark:text-amber-400\">\n Required\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n This tool is required for Shep to function properly\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </div>\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-1\">\n {isInstalled && canLaunch ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleLaunch}\n disabled={isPending}\n aria-label={`Launch ${tool.name}`}\n data-testid=\"tool-card-launch-button\"\n className=\"h-7 cursor-pointer rounded-md px-3 text-xs\"\n >\n {isPending ? (\n <Loader2 className=\"me-1 h-3 w-3 animate-spin\" />\n ) : (\n <Rocket className=\"me-1 h-3 w-3\" />\n )}\n Launch\n </Button>\n ) : !isInstalled && !isError ? (\n <Button\n size=\"sm\"\n variant=\"default\"\n onClick={handleInstallClick}\n aria-label={`Install ${tool.name}`}\n data-testid=\"tool-card-install-button\"\n className=\"h-7 cursor-pointer rounded-md px-3 text-xs\"\n >\n <Download className=\"me-1 h-3 w-3\" />\n Install\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n\n <ToolDetailDrawer\n tool={tool}\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n onRefresh={onRefresh}\n autoStart={autoStartInstall}\n />\n </>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { Wrench } from 'lucide-react';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { cn } from '@/lib/utils';\nimport { ToolCard } from './tool-card';\nimport type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolsPageClientProps {\n tools: ToolItem[];\n className?: string;\n}\n\ntype TabValue = 'all' | 'ide' | 'cli-agent' | 'vcs' | 'terminal';\n\nconst TAB_FILTER: Record<TabValue, (tool: ToolItem) => boolean> = {\n all: () => true,\n ide: (tool) => tool.tags.includes('ide'),\n 'cli-agent': (tool) => tool.tags.includes('cli-agent'),\n vcs: (tool) => tool.tags.includes('vcs'),\n terminal: (tool) => tool.tags.includes('terminal'),\n};\n\nexport function ToolsPageClient({ tools: initialTools, className }: ToolsPageClientProps) {\n const [tools, setTools] = useState<ToolItem[]>(initialTools);\n const [activeTab, setActiveTab] = useState<TabValue>('all');\n\n const refreshTools = useCallback(async () => {\n try {\n const res = await fetch('/api/tools');\n if (res.ok) {\n const updated = (await res.json()) as ToolItem[];\n setTools(updated);\n }\n } catch {\n // Silently ignore refresh errors; user can re-navigate to refresh\n }\n }, []);\n\n const filtered = tools.filter(TAB_FILTER[activeTab]);\n\n return (\n <div data-testid=\"tools-page-client\" className={cn('space-y-4', className)}>\n {/* Compact header */}\n <div className=\"flex items-center gap-2\">\n <Wrench className=\"text-muted-foreground h-4 w-4\" />\n <h1 className=\"text-sm font-bold tracking-tight\">Tools</h1>\n <span className=\"text-muted-foreground text-[10px]\">\n {tools.filter((t) => t.status.status === 'available').length}/{tools.length} installed\n </span>\n </div>\n\n <Tabs\n value={activeTab}\n onValueChange={(value) => setActiveTab(value as TabValue)}\n data-testid=\"tools-page-tabs\"\n >\n <TabsList className=\"h-7\">\n <TabsTrigger value=\"all\" data-testid=\"tools-tab-all\" className=\"px-2.5 text-xs\">\n All\n </TabsTrigger>\n <TabsTrigger value=\"ide\" data-testid=\"tools-tab-ide\" className=\"px-2.5 text-xs\">\n IDEs\n </TabsTrigger>\n <TabsTrigger\n value=\"cli-agent\"\n data-testid=\"tools-tab-cli-agent\"\n className=\"px-2.5 text-xs\"\n >\n CLI Agents\n </TabsTrigger>\n <TabsTrigger value=\"vcs\" data-testid=\"tools-tab-vcs\" className=\"px-2.5 text-xs\">\n Version Control\n </TabsTrigger>\n <TabsTrigger value=\"terminal\" data-testid=\"tools-tab-terminal\" className=\"px-2.5 text-xs\">\n Terminals\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value={activeTab} className=\"mt-3\">\n {filtered.length === 0 ? (\n <div\n data-testid=\"tools-page-empty\"\n className=\"text-muted-foreground flex flex-col items-center justify-center py-12 text-center\"\n >\n <Wrench className=\"mb-2 h-6 w-6 opacity-20\" />\n <p className=\"text-xs\">No tools in this category.</p>\n </div>\n ) : (\n <div\n data-testid=\"tools-page-grid\"\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\"\n >\n {filtered.map((tool) => (\n <ToolCard key={tool.id} tool={tool} onRefresh={refreshTools} />\n ))}\n </div>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n"],"names":[],"mappings":"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","ignoreList":[4]}
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--qfCnoWSr4qmt2_dT28B_O--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/40b6bcf1a2de4a0f.js"/><script src="/_next/static/chunks/c7e793951b20a67f.js" async=""></script><script src="/_next/static/chunks/4b6cc9f65260f2bd.js" async=""></script><script src="/_next/static/chunks/d0e04c4bd51d2553.js" async=""></script><script src="/_next/static/chunks/d4d8f0a137bd2eb4.js" async=""></script><script src="/_next/static/chunks/turbopack-432ef324fc27240c.js" async=""></script><script src="/_next/static/chunks/ab02eec995295bef.js" async=""></script><script src="/_next/static/chunks/fe70e73feb07bcfd.js" async=""></script><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/40b6bcf1a2de4a0f.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[40799,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n3:I[73006,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n4:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"ViewportBoundary\"]\n9:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"MetadataBoundary\"]\nb:I[42726,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"qfCnoWSr4qmt2_dT28B-O\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ab02eec995295bef.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/fe70e73feb07bcfd.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--lQkUWQQS5aR4vq6WUZ2yr--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/40b6bcf1a2de4a0f.js"/><script src="/_next/static/chunks/c7e793951b20a67f.js" async=""></script><script src="/_next/static/chunks/4b6cc9f65260f2bd.js" async=""></script><script src="/_next/static/chunks/d0e04c4bd51d2553.js" async=""></script><script src="/_next/static/chunks/d4d8f0a137bd2eb4.js" async=""></script><script src="/_next/static/chunks/turbopack-432ef324fc27240c.js" async=""></script><script src="/_next/static/chunks/ab02eec995295bef.js" async=""></script><script src="/_next/static/chunks/fe70e73feb07bcfd.js" async=""></script><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/40b6bcf1a2de4a0f.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[40799,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n3:I[73006,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n4:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"ViewportBoundary\"]\n9:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"MetadataBoundary\"]\nb:I[42726,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"lQkUWQQS5aR4vq6WUZ2yr\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ab02eec995295bef.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/fe70e73feb07bcfd.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>