@shepai/cli 1.76.0-pr243.b5a1065 → 1.76.0-pr245.808d0f5

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 (242) hide show
  1. package/apis/json-schema/ModelConfiguration.yaml +20 -5
  2. package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts +0 -8
  3. package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +0 -1
  5. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +0 -1
  8. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +0 -2
  9. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  10. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts +3 -3
  11. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  12. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +8 -5
  13. package/dist/packages/core/src/domain/generated/output.d.ts +15 -3
  14. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +0 -1
  16. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +10 -8
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +0 -15
  20. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +2 -3
  22. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts +0 -8
  23. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +0 -28
  25. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts +0 -1
  26. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.js +0 -3
  28. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +0 -1
  29. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +0 -3
  31. package/dist/packages/core/src/infrastructure/services/settings.service.d.ts +1 -1
  32. package/dist/packages/core/src/infrastructure/services/settings.service.js +1 -1
  33. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  34. package/dist/src/presentation/cli/commands/feat/new.command.js +0 -2
  35. package/dist/src/presentation/cli/commands/settings/index.d.ts +0 -1
  36. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  37. package/dist/src/presentation/cli/commands/settings/index.js +1 -4
  38. package/dist/src/presentation/cli/ui/tables.d.ts.map +1 -1
  39. package/dist/src/presentation/cli/ui/tables.js +6 -1
  40. package/dist/tsconfig.build.tsbuildinfo +1 -1
  41. package/package.json +1 -1
  42. package/web/.next/BUILD_ID +1 -1
  43. package/web/.next/build-manifest.json +2 -2
  44. package/web/.next/cache/.previewinfo +1 -1
  45. package/web/.next/cache/.rscinfo +1 -1
  46. package/web/.next/cache/.tsbuildinfo +1 -1
  47. package/web/.next/cache/config.json +3 -3
  48. package/web/.next/fallback-build-manifest.json +2 -2
  49. package/web/.next/prerender-manifest.json +3 -3
  50. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  51. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  57. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  60. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  61. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  64. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  66. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  67. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  69. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/_global-error.html +2 -2
  72. package/web/.next/server/app/_global-error.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  74. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  75. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  78. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  79. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  81. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  82. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  84. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  85. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  87. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  90. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  92. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  94. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  112. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/_5ee4f5a7._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/{_435fea24._.js → _60c2d0fa._.js} +2 -2
  115. package/web/.next/server/chunks/ssr/{_435fea24._.js.map → _60c2d0fa._.js.map} +1 -1
  116. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  117. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  120. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  122. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  124. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  126. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  128. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  130. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  135. package/web/.next/server/pages/500.html +2 -2
  136. package/web/.next/server/server-reference-manifest.js +1 -1
  137. package/web/.next/server/server-reference-manifest.json +22 -22
  138. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  139. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  140. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  141. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  142. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  143. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  144. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  145. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  146. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  147. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  148. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  149. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  150. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  151. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  182. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  183. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  184. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  187. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  190. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_435fea24._.js → _60c2d0fa._.js} +2 -2
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  196. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  198. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  199. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  200. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  201. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  202. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  203. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -22
  204. package/web/.next/static/chunks/{bdbe5f5328a66512.js → 135cdb77e3d27078.js} +1 -1
  205. package/web/.next/static/chunks/{115eab1c5d9aea10.js → 7063e7b488900775.js} +1 -1
  206. package/web/.next/static/chunks/{a32ab061aed15a64.js → 7198c3cfc0c66730.js} +1 -1
  207. package/web/.next/static/chunks/{81e1c1e43ae18086.js → 9ae4377d9691e6a5.js} +1 -1
  208. package/web/.next/static/chunks/{920d18ed1ff267e7.js → a480eff8d4725451.js} +1 -1
  209. package/web/.next/static/chunks/{b1fa3fb02b473f65.js → c3b9d5db135f9a6d.js} +1 -1
  210. package/web/.next/static/chunks/{46c77597b4b8129d.js → c5943035be5216df.js} +1 -1
  211. package/web/.next/static/chunks/e12fff3b57456bc2.css +2 -0
  212. package/web/.next/static/chunks/{9678137ccbb5bdc3.js → e6817324c3802b5b.js} +1 -1
  213. package/web/.next/static/chunks/{faee95b678e8ec64.js → f20d345341fdde0b.js} +1 -1
  214. package/web/.next/trace +1 -1
  215. package/web/.next/trace-build +1 -1
  216. package/dist/src/presentation/cli/commands/settings/model.command.d.ts +0 -17
  217. package/dist/src/presentation/cli/commands/settings/model.command.d.ts.map +0 -1
  218. package/dist/src/presentation/cli/commands/settings/model.command.js +0 -62
  219. package/dist/src/presentation/web/app/actions/get-supported-models.d.ts +0 -11
  220. package/dist/src/presentation/web/app/actions/get-supported-models.d.ts.map +0 -1
  221. package/dist/src/presentation/web/app/actions/get-supported-models.js +0 -24
  222. package/dist/src/presentation/web/app/actions/update-model.d.ts +0 -15
  223. package/dist/src/presentation/web/app/actions/update-model.d.ts.map +0 -1
  224. package/dist/src/presentation/web/app/actions/update-model.js +0 -35
  225. package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.d.ts +0 -24
  226. package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.d.ts.map +0 -1
  227. package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.js +0 -53
  228. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.d.ts +0 -18
  229. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.d.ts.map +0 -1
  230. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.js +0 -84
  231. package/dist/src/presentation/web/components/ui/command.d.ts +0 -19
  232. package/dist/src/presentation/web/components/ui/command.d.ts.map +0 -1
  233. package/dist/src/presentation/web/components/ui/command.js +0 -26
  234. package/web/.next/standalone/src/presentation/web/app/actions/get-supported-models.ts +0 -26
  235. package/web/.next/standalone/src/presentation/web/app/actions/update-model.ts +0 -45
  236. package/web/.next/standalone/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.tsx +0 -64
  237. package/web/.next/standalone/src/presentation/web/components/features/settings/ModelPicker/index.tsx +0 -167
  238. package/web/.next/standalone/src/presentation/web/components/ui/command.tsx +0 -114
  239. package/web/.next/static/chunks/8a68cac7c51df846.css +0 -2
  240. /package/web/.next/static/{dW3UxyG_fKX-TDcK9QVh4 → v-WI-WKnpVXNM4SX7zn33}/_buildManifest.js +0 -0
  241. /package/web/.next/static/{dW3UxyG_fKX-TDcK9QVh4 → v-WI-WKnpVXNM4SX7zn33}/_clientMiddlewareManifest.json +0 -0
  242. /package/web/.next/static/{dW3UxyG_fKX-TDcK9QVh4 → v-WI-WKnpVXNM4SX7zn33}/_ssgManifest.js +0 -0
@@ -1,18 +0,0 @@
1
- export interface ModelPickerProps {
2
- /** Current model identifier shown as the initial selection */
3
- initialModel: string;
4
- /** Optional callback notified when the model is successfully persisted */
5
- onModelChange?: (model: string) => void;
6
- disabled?: boolean;
7
- className?: string;
8
- }
9
- /**
10
- * ModelPicker
11
- *
12
- * A combobox that lets the user choose the default LLM model. On mount it
13
- * calls the `getSupportedModels` server action to populate suggestions for
14
- * the currently configured agent; the user may also type any free-text model
15
- * identifier. On selection the new value is persisted via `updateModel`.
16
- */
17
- export declare function ModelPicker({ initialModel, onModelChange, disabled, className, }: ModelPickerProps): import("react/jsx-runtime").JSX.Element;
18
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/ModelPicker/index.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,SAAS,GACV,EAAE,gBAAgB,2CA8HlB"}
@@ -1,84 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from 'react';
4
- import { Check, ChevronsUpDown } from 'lucide-react';
5
- import { getSupportedModels } from '../../../../app/actions/get-supported-models.js';
6
- import { updateModel } from '../../../../app/actions/update-model.js';
7
- import { Button } from '../../../ui/button.js';
8
- import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from '../../../ui/command.js';
9
- import { Popover, PopoverContent, PopoverTrigger } from '../../../ui/popover.js';
10
- import { cn } from '../../../../lib/utils.js';
11
- /**
12
- * ModelPicker
13
- *
14
- * A combobox that lets the user choose the default LLM model. On mount it
15
- * calls the `getSupportedModels` server action to populate suggestions for
16
- * the currently configured agent; the user may also type any free-text model
17
- * identifier. On selection the new value is persisted via `updateModel`.
18
- */
19
- export function ModelPicker({ initialModel, onModelChange, disabled, className, }) {
20
- const [open, setOpen] = React.useState(false);
21
- const [models, setModels] = React.useState([]);
22
- const [loading, setLoading] = React.useState(true);
23
- const [saving, setSaving] = React.useState(false);
24
- const [value, setValue] = React.useState(initialModel);
25
- const [inputValue, setInputValue] = React.useState(initialModel);
26
- const [error, setError] = React.useState(null);
27
- // Load advertised models on mount
28
- React.useEffect(() => {
29
- getSupportedModels()
30
- .then(setModels)
31
- .finally(() => setLoading(false));
32
- }, []);
33
- // Keep local state in sync when initialModel prop changes
34
- React.useEffect(() => {
35
- setValue(initialModel);
36
- setInputValue(initialModel);
37
- }, [initialModel]);
38
- const filteredModels = models.filter((m) => m.toLowerCase().includes(inputValue.toLowerCase()));
39
- const handleSelect = async (model) => {
40
- setOpen(false);
41
- await persist(model);
42
- };
43
- const handleInputChange = (e) => {
44
- setInputValue(e.target.value);
45
- if (!open)
46
- setOpen(true);
47
- };
48
- const handleInputKeyDown = async (e) => {
49
- if (e.key === 'Enter') {
50
- e.preventDefault();
51
- setOpen(false);
52
- await persist(inputValue);
53
- }
54
- if (e.key === 'Escape') {
55
- setOpen(false);
56
- // Revert input to last saved value
57
- setInputValue(value);
58
- }
59
- };
60
- const persist = async (model) => {
61
- if (!model.trim() || model === value)
62
- return;
63
- setSaving(true);
64
- setError(null);
65
- try {
66
- const result = await updateModel(model);
67
- if (result.ok) {
68
- setValue(model);
69
- onModelChange?.(model);
70
- }
71
- else {
72
- setError(result.error ?? 'Failed to save model');
73
- setInputValue(value); // revert
74
- }
75
- }
76
- finally {
77
- setSaving(false);
78
- }
79
- };
80
- const isDisabled = (disabled ?? false) || loading || saving;
81
- return (_jsxs("div", { className: cn('flex flex-col gap-1', className), children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", role: "combobox", "aria-expanded": open, disabled: isDisabled, className: "w-full justify-between font-normal", children: [_jsx("span", { className: "truncate", children: loading ? 'Loading models…' : saving ? 'Saving…' : (value ?? 'Select model…') }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: _jsxs(Command, { children: [_jsx(CommandInput, { placeholder: "Search or type a model ID\u2026", value: inputValue, onChange: handleInputChange, onKeyDown: handleInputKeyDown }), _jsxs(CommandList, { children: [!loading && filteredModels.length === 0 && (_jsx(CommandEmpty, { children: models.length === 0
82
- ? 'No models advertised for this agent.'
83
- : 'No match — press Enter to use this value.' })), filteredModels.length > 0 && (_jsx(CommandGroup, { children: filteredModels.map((model) => (_jsxs(CommandItem, { selected: model === value, onClick: () => handleSelect(model), children: [_jsx(Check, { className: cn('mr-2 h-4 w-4', model === value ? 'opacity-100' : 'opacity-0') }), model] }, model))) }))] })] }) })] }), Boolean(error) && _jsx("p", { className: "text-destructive text-sm", children: error })] }));
84
- }
@@ -1,19 +0,0 @@
1
- import * as React from 'react';
2
- /**
3
- * Command — minimal combobox primitives for model/item selection.
4
- *
5
- * Intentionally avoids the `cmdk` dependency and builds on native React +
6
- * Tailwind instead. Filtering logic lives in the consumer component.
7
- */
8
- declare const Command: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
9
- declare const CommandInput: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & React.RefAttributes<HTMLInputElement>>;
10
- declare const CommandList: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
11
- declare const CommandEmpty: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
12
- declare const CommandGroup: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
13
- interface CommandItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
14
- selected?: boolean;
15
- }
16
- declare const CommandItem: React.ForwardRefExoticComponent<CommandItemProps & React.RefAttributes<HTMLButtonElement>>;
17
- declare const CommandSeparator: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
18
- export { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, };
19
- //# sourceMappingURL=command.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/command.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;GAKG;AAEH,QAAA,MAAM,OAAO,6GAWZ,CAAC;AAGF,QAAA,MAAM,YAAY,sHAehB,CAAC;AAGH,QAAA,MAAM,WAAW,6GAQhB,CAAC;AAGF,QAAA,MAAM,YAAY,6GAQjB,CAAC;AAGF,QAAA,MAAM,YAAY,6GAIjB,CAAC;AAGF,UAAU,gBAAiB,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,WAAW,4FAgBhB,CAAC;AAGF,QAAA,MAAM,gBAAgB,6GAIrB,CAAC;AAGF,OAAO,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,gBAAgB,GACjB,CAAC"}
@@ -1,26 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from 'react';
4
- import { Search } from 'lucide-react';
5
- import { cn } from '../../lib/utils.js';
6
- /**
7
- * Command — minimal combobox primitives for model/item selection.
8
- *
9
- * Intentionally avoids the `cmdk` dependency and builds on native React +
10
- * Tailwind instead. Filtering logic lives in the consumer component.
11
- */
12
- const Command = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md', className), ...props })));
13
- Command.displayName = 'Command';
14
- const CommandInput = React.forwardRef(({ className, ...props }, ref) => (_jsxs("div", { className: "flex items-center border-b px-3", children: [_jsx(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }), _jsx("input", { ref: ref, className: cn('placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none disabled:cursor-not-allowed disabled:opacity-50', className), ...props })] })));
15
- CommandInput.displayName = 'CommandInput';
16
- const CommandList = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('max-h-[300px] overflow-x-hidden overflow-y-auto', className), ...props })));
17
- CommandList.displayName = 'CommandList';
18
- const CommandEmpty = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('text-muted-foreground py-6 text-center text-sm', className), ...props })));
19
- CommandEmpty.displayName = 'CommandEmpty';
20
- const CommandGroup = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('text-foreground overflow-hidden p-1', className), ...props })));
21
- CommandGroup.displayName = 'CommandGroup';
22
- const CommandItem = React.forwardRef(({ className, selected, ...props }, ref) => (_jsx("button", { ref: ref, type: "button", "data-selected": selected, className: cn('relative flex w-full cursor-default items-center rounded-sm px-2 py-1.5 text-sm transition-colors outline-none select-none', 'hover:bg-accent hover:text-accent-foreground', 'data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground', 'disabled:pointer-events-none disabled:opacity-50', className), ...props })));
23
- CommandItem.displayName = 'CommandItem';
24
- const CommandSeparator = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('bg-border -mx-1 h-px', className), ...props })));
25
- CommandSeparator.displayName = 'CommandSeparator';
26
- export { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, };
@@ -1,26 +0,0 @@
1
- 'use server';
2
-
3
- import { resolve } from '@/lib/server-container';
4
- import { getSettings } from '@shepai/core/infrastructure/services/settings.service';
5
- import type { IAgentExecutorFactory } from '@shepai/core/application/ports/output/agents/agent-executor-factory.interface';
6
-
7
- /**
8
- * Server action that returns the LLM model identifiers supported by the
9
- * currently configured agent executor.
10
- *
11
- * Resolves IAgentExecutorFactory from the DI container and calls
12
- * getSupportedModels for the agent type stored in settings.
13
- *
14
- * @returns Array of model identifier strings, or [] on error.
15
- */
16
- export async function getSupportedModels(): Promise<string[]> {
17
- try {
18
- const settings = getSettings();
19
- const agentType = settings.agent.type;
20
- const factory = resolve<IAgentExecutorFactory>('IAgentExecutorFactory');
21
- return factory.getSupportedModels(agentType);
22
- } catch (_error: unknown) {
23
- // Settings may not be initialized in some test/preview environments
24
- return [];
25
- }
26
- }
@@ -1,45 +0,0 @@
1
- 'use server';
2
-
3
- import { resolve } from '@/lib/server-container';
4
- import {
5
- getSettings,
6
- resetSettings,
7
- initializeSettings,
8
- } from '@shepai/core/infrastructure/services/settings.service';
9
- import type { UpdateSettingsUseCase } from '@shepai/core/application/use-cases/settings/update-settings.use-case';
10
-
11
- /**
12
- * Server action that updates the default LLM model in settings.
13
- *
14
- * Persists the new model to the database via UpdateSettingsUseCase and
15
- * refreshes the in-memory settings singleton so subsequent reads reflect
16
- * the change within the current server process.
17
- *
18
- * @param model - The model identifier to set as the new default
19
- * @returns `{ ok: true }` on success, or `{ ok: false, error: string }` on failure.
20
- */
21
- export async function updateModel(model: string): Promise<{ ok: boolean; error?: string }> {
22
- if (!model.trim()) {
23
- return { ok: false, error: 'model is required' };
24
- }
25
-
26
- try {
27
- const currentSettings = getSettings();
28
- const updatedSettings = {
29
- ...currentSettings,
30
- models: { default: model.trim() },
31
- };
32
-
33
- const updateUseCase = resolve<UpdateSettingsUseCase>('UpdateSettingsUseCase');
34
- await updateUseCase.execute(updatedSettings);
35
-
36
- // Refresh the in-memory singleton so this server process sees the new value
37
- resetSettings();
38
- initializeSettings(updatedSettings);
39
-
40
- return { ok: true };
41
- } catch (error: unknown) {
42
- const message = error instanceof Error ? error.message : 'Failed to update model';
43
- return { ok: false, error: message };
44
- }
45
- }
@@ -1,64 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { fn } from '@storybook/test';
3
- import { ModelPicker } from './index';
4
-
5
- const meta: Meta<typeof ModelPicker> = {
6
- title: 'Features/Settings/ModelPicker',
7
- component: ModelPicker,
8
- parameters: {
9
- layout: 'centered',
10
- },
11
- tags: ['autodocs'],
12
- decorators: [
13
- (Story) => (
14
- <div className="w-80">
15
- <Story />
16
- </div>
17
- ),
18
- ],
19
- args: {
20
- onModelChange: fn(),
21
- },
22
- };
23
-
24
- export default meta;
25
- type Story = StoryObj<typeof meta>;
26
-
27
- /**
28
- * Default state — current model is claude-sonnet-4-6, the advertised list
29
- * for claude-code is populated from the mock server action.
30
- */
31
- export const Default: Story = {
32
- args: {
33
- initialModel: 'claude-sonnet-4-6',
34
- },
35
- };
36
-
37
- /**
38
- * Custom model — a free-text identifier not present in the advertised list.
39
- * Demonstrates that the combobox accepts arbitrary strings.
40
- */
41
- export const CustomModel: Story = {
42
- args: {
43
- initialModel: 'claude-opus-4-7-experimental',
44
- },
45
- };
46
-
47
- /**
48
- * Disabled state — picker is non-interactive (e.g. during form submission).
49
- */
50
- export const Disabled: Story = {
51
- args: {
52
- initialModel: 'claude-sonnet-4-6',
53
- disabled: true,
54
- },
55
- };
56
-
57
- /**
58
- * Opus selected — verifies the checkmark appears on the right item.
59
- */
60
- export const OpusSelected: Story = {
61
- args: {
62
- initialModel: 'claude-opus-4-6',
63
- },
64
- };
@@ -1,167 +0,0 @@
1
- 'use client';
2
-
3
- import * as React from 'react';
4
- import { Check, ChevronsUpDown } from 'lucide-react';
5
- import { getSupportedModels } from '@/app/actions/get-supported-models';
6
- import { updateModel } from '@/app/actions/update-model';
7
- import { Button } from '@/components/ui/button';
8
- import {
9
- Command,
10
- CommandEmpty,
11
- CommandGroup,
12
- CommandInput,
13
- CommandItem,
14
- CommandList,
15
- } from '@/components/ui/command';
16
- import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
17
- import { cn } from '@/lib/utils';
18
-
19
- export interface ModelPickerProps {
20
- /** Current model identifier shown as the initial selection */
21
- initialModel: string;
22
- /** Optional callback notified when the model is successfully persisted */
23
- onModelChange?: (model: string) => void;
24
- disabled?: boolean;
25
- className?: string;
26
- }
27
-
28
- /**
29
- * ModelPicker
30
- *
31
- * A combobox that lets the user choose the default LLM model. On mount it
32
- * calls the `getSupportedModels` server action to populate suggestions for
33
- * the currently configured agent; the user may also type any free-text model
34
- * identifier. On selection the new value is persisted via `updateModel`.
35
- */
36
- export function ModelPicker({
37
- initialModel,
38
- onModelChange,
39
- disabled,
40
- className,
41
- }: ModelPickerProps) {
42
- const [open, setOpen] = React.useState(false);
43
- const [models, setModels] = React.useState<string[]>([]);
44
- const [loading, setLoading] = React.useState(true);
45
- const [saving, setSaving] = React.useState(false);
46
- const [value, setValue] = React.useState(initialModel);
47
- const [inputValue, setInputValue] = React.useState(initialModel);
48
- const [error, setError] = React.useState<string | null>(null);
49
-
50
- // Load advertised models on mount
51
- React.useEffect(() => {
52
- getSupportedModels()
53
- .then(setModels)
54
- .finally(() => setLoading(false));
55
- }, []);
56
-
57
- // Keep local state in sync when initialModel prop changes
58
- React.useEffect(() => {
59
- setValue(initialModel);
60
- setInputValue(initialModel);
61
- }, [initialModel]);
62
-
63
- const filteredModels = models.filter((m) => m.toLowerCase().includes(inputValue.toLowerCase()));
64
-
65
- const handleSelect = async (model: string) => {
66
- setOpen(false);
67
- await persist(model);
68
- };
69
-
70
- const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
71
- setInputValue(e.target.value);
72
- if (!open) setOpen(true);
73
- };
74
-
75
- const handleInputKeyDown = async (e: React.KeyboardEvent<HTMLInputElement>) => {
76
- if (e.key === 'Enter') {
77
- e.preventDefault();
78
- setOpen(false);
79
- await persist(inputValue);
80
- }
81
- if (e.key === 'Escape') {
82
- setOpen(false);
83
- // Revert input to last saved value
84
- setInputValue(value);
85
- }
86
- };
87
-
88
- const persist = async (model: string) => {
89
- if (!model.trim() || model === value) return;
90
- setSaving(true);
91
- setError(null);
92
- try {
93
- const result = await updateModel(model);
94
- if (result.ok) {
95
- setValue(model);
96
- onModelChange?.(model);
97
- } else {
98
- setError(result.error ?? 'Failed to save model');
99
- setInputValue(value); // revert
100
- }
101
- } finally {
102
- setSaving(false);
103
- }
104
- };
105
-
106
- const isDisabled = (disabled ?? false) || loading || saving;
107
-
108
- return (
109
- <div className={cn('flex flex-col gap-1', className)}>
110
- <Popover open={open} onOpenChange={setOpen}>
111
- <PopoverTrigger asChild>
112
- <Button
113
- variant="outline"
114
- role="combobox"
115
- aria-expanded={open}
116
- disabled={isDisabled}
117
- className="w-full justify-between font-normal"
118
- >
119
- <span className="truncate">
120
- {loading ? 'Loading models…' : saving ? 'Saving…' : (value ?? 'Select model…')}
121
- </span>
122
- <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
123
- </Button>
124
- </PopoverTrigger>
125
- <PopoverContent className="w-[var(--radix-popover-trigger-width)] p-0" align="start">
126
- <Command>
127
- <CommandInput
128
- placeholder="Search or type a model ID…"
129
- value={inputValue}
130
- onChange={handleInputChange}
131
- onKeyDown={handleInputKeyDown}
132
- />
133
- <CommandList>
134
- {!loading && filteredModels.length === 0 && (
135
- <CommandEmpty>
136
- {models.length === 0
137
- ? 'No models advertised for this agent.'
138
- : 'No match — press Enter to use this value.'}
139
- </CommandEmpty>
140
- )}
141
- {filteredModels.length > 0 && (
142
- <CommandGroup>
143
- {filteredModels.map((model) => (
144
- <CommandItem
145
- key={model}
146
- selected={model === value}
147
- onClick={() => handleSelect(model)}
148
- >
149
- <Check
150
- className={cn(
151
- 'mr-2 h-4 w-4',
152
- model === value ? 'opacity-100' : 'opacity-0'
153
- )}
154
- />
155
- {model}
156
- </CommandItem>
157
- ))}
158
- </CommandGroup>
159
- )}
160
- </CommandList>
161
- </Command>
162
- </PopoverContent>
163
- </Popover>
164
- {Boolean(error) && <p className="text-destructive text-sm">{error}</p>}
165
- </div>
166
- );
167
- }
@@ -1,114 +0,0 @@
1
- 'use client';
2
-
3
- import * as React from 'react';
4
- import { Search } from 'lucide-react';
5
-
6
- import { cn } from '@/lib/utils';
7
-
8
- /**
9
- * Command — minimal combobox primitives for model/item selection.
10
- *
11
- * Intentionally avoids the `cmdk` dependency and builds on native React +
12
- * Tailwind instead. Filtering logic lives in the consumer component.
13
- */
14
-
15
- const Command = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
16
- ({ className, ...props }, ref) => (
17
- <div
18
- ref={ref}
19
- className={cn(
20
- 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',
21
- className
22
- )}
23
- {...props}
24
- />
25
- )
26
- );
27
- Command.displayName = 'Command';
28
-
29
- const CommandInput = React.forwardRef<
30
- HTMLInputElement,
31
- React.InputHTMLAttributes<HTMLInputElement>
32
- >(({ className, ...props }, ref) => (
33
- <div className="flex items-center border-b px-3">
34
- <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
35
- <input
36
- ref={ref}
37
- className={cn(
38
- 'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',
39
- className
40
- )}
41
- {...props}
42
- />
43
- </div>
44
- ));
45
- CommandInput.displayName = 'CommandInput';
46
-
47
- const CommandList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
48
- ({ className, ...props }, ref) => (
49
- <div
50
- ref={ref}
51
- className={cn('max-h-[300px] overflow-x-hidden overflow-y-auto', className)}
52
- {...props}
53
- />
54
- )
55
- );
56
- CommandList.displayName = 'CommandList';
57
-
58
- const CommandEmpty = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
59
- ({ className, ...props }, ref) => (
60
- <div
61
- ref={ref}
62
- className={cn('text-muted-foreground py-6 text-center text-sm', className)}
63
- {...props}
64
- />
65
- )
66
- );
67
- CommandEmpty.displayName = 'CommandEmpty';
68
-
69
- const CommandGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
70
- ({ className, ...props }, ref) => (
71
- <div ref={ref} className={cn('text-foreground overflow-hidden p-1', className)} {...props} />
72
- )
73
- );
74
- CommandGroup.displayName = 'CommandGroup';
75
-
76
- interface CommandItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
77
- selected?: boolean;
78
- }
79
-
80
- const CommandItem = React.forwardRef<HTMLButtonElement, CommandItemProps>(
81
- ({ className, selected, ...props }, ref) => (
82
- <button
83
- ref={ref}
84
- type="button"
85
- data-selected={selected}
86
- className={cn(
87
- 'relative flex w-full cursor-default items-center rounded-sm px-2 py-1.5 text-sm transition-colors outline-none select-none',
88
- 'hover:bg-accent hover:text-accent-foreground',
89
- 'data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground',
90
- 'disabled:pointer-events-none disabled:opacity-50',
91
- className
92
- )}
93
- {...props}
94
- />
95
- )
96
- );
97
- CommandItem.displayName = 'CommandItem';
98
-
99
- const CommandSeparator = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
100
- ({ className, ...props }, ref) => (
101
- <div ref={ref} className={cn('bg-border -mx-1 h-px', className)} {...props} />
102
- )
103
- );
104
- CommandSeparator.displayName = 'CommandSeparator';
105
-
106
- export {
107
- Command,
108
- CommandEmpty,
109
- CommandGroup,
110
- CommandInput,
111
- CommandItem,
112
- CommandList,
113
- CommandSeparator,
114
- };