@shepai/cli 1.76.0-pr241.9ff2c05 → 1.76.0-pr243.b5a1065

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 (303) hide show
  1. package/apis/json-schema/ModelConfiguration.yaml +5 -20
  2. package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts +8 -0
  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 +1 -0
  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 +1 -0
  8. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
  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 +5 -8
  13. package/dist/packages/core/src/domain/generated/output.d.ts +3 -15
  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 +1 -0
  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 +8 -10
  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 +15 -0
  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 +3 -2
  22. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts +8 -0
  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 +28 -0
  25. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts +1 -0
  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 +3 -0
  28. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +1 -0
  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 +3 -0
  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 +2 -0
  35. package/dist/src/presentation/cli/commands/settings/index.d.ts +1 -0
  36. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  37. package/dist/src/presentation/cli/commands/settings/index.js +4 -1
  38. package/dist/src/presentation/cli/commands/settings/model.command.d.ts +17 -0
  39. package/dist/src/presentation/cli/commands/settings/model.command.d.ts.map +1 -0
  40. package/dist/src/presentation/cli/commands/settings/model.command.js +62 -0
  41. package/dist/src/presentation/cli/ui/tables.d.ts.map +1 -1
  42. package/dist/src/presentation/cli/ui/tables.js +1 -6
  43. package/dist/src/presentation/web/app/actions/get-supported-models.d.ts +11 -0
  44. package/dist/src/presentation/web/app/actions/get-supported-models.d.ts.map +1 -0
  45. package/dist/src/presentation/web/app/actions/get-supported-models.js +24 -0
  46. package/dist/src/presentation/web/app/actions/update-model.d.ts +15 -0
  47. package/dist/src/presentation/web/app/actions/update-model.d.ts.map +1 -0
  48. package/dist/src/presentation/web/app/actions/update-model.js +35 -0
  49. package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.d.ts +24 -0
  50. package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.d.ts.map +1 -0
  51. package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.js +53 -0
  52. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.d.ts +18 -0
  53. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.d.ts.map +1 -0
  54. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.js +84 -0
  55. package/dist/src/presentation/web/components/ui/command.d.ts +19 -0
  56. package/dist/src/presentation/web/components/ui/command.d.ts.map +1 -0
  57. package/dist/src/presentation/web/components/ui/command.js +26 -0
  58. package/dist/tsconfig.build.tsbuildinfo +1 -1
  59. package/package.json +1 -1
  60. package/web/.next/BUILD_ID +1 -1
  61. package/web/.next/build-manifest.json +2 -2
  62. package/web/.next/cache/.previewinfo +1 -1
  63. package/web/.next/cache/.rscinfo +1 -1
  64. package/web/.next/cache/.tsbuildinfo +1 -1
  65. package/web/.next/cache/config.json +3 -3
  66. package/web/.next/fallback-build-manifest.json +2 -2
  67. package/web/.next/prerender-manifest.json +3 -3
  68. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  69. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  72. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  75. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  78. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  79. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  81. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  82. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  84. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  85. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  87. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/_global-error.html +2 -2
  90. package/web/.next/server/app/_global-error.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  92. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  93. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  94. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  95. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  96. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  97. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  99. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  100. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  102. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  103. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  105. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  108. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  110. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  112. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  130. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/{_30fd6f01._.js → _435fea24._.js} +2 -2
  132. package/web/.next/server/chunks/ssr/{_30fd6f01._.js.map → _435fea24._.js.map} +1 -1
  133. package/web/.next/server/chunks/ssr/_5ee4f5a7._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  138. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  142. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  144. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  146. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  148. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  150. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  152. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  153. package/web/.next/server/pages/500.html +2 -2
  154. package/web/.next/server/server-reference-manifest.js +1 -1
  155. package/web/.next/server/server-reference-manifest.json +22 -22
  156. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  157. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  158. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  181. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  184. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  190. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  192. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  193. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  196. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  197. 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
  198. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  199. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  200. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  201. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  202. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  203. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  204. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  205. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  206. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  207. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  208. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  209. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_30fd6f01._.js → _435fea24._.js} +2 -2
  210. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  211. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  212. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  213. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  214. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  215. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  216. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  217. 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
  218. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  219. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  220. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  221. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -22
  222. package/web/.next/standalone/src/presentation/web/app/actions/get-supported-models.ts +26 -0
  223. package/web/.next/standalone/src/presentation/web/app/actions/update-model.ts +45 -0
  224. package/web/.next/standalone/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.tsx +64 -0
  225. package/web/.next/standalone/src/presentation/web/components/features/settings/ModelPicker/index.tsx +167 -0
  226. package/web/.next/standalone/src/presentation/web/components/ui/command.tsx +114 -0
  227. package/web/.next/static/chunks/115eab1c5d9aea10.js +1 -0
  228. package/web/.next/static/chunks/{2e2355741bd6a9a7.js → 46c77597b4b8129d.js} +1 -1
  229. package/web/.next/static/chunks/{dcb8f73fb28b2a26.js → 81e1c1e43ae18086.js} +1 -1
  230. package/web/.next/static/chunks/8a68cac7c51df846.css +2 -0
  231. package/web/.next/static/chunks/{45b6a69a50b9d9e8.js → 920d18ed1ff267e7.js} +1 -1
  232. package/web/.next/static/chunks/{e37d7d4d215db8f5.js → 9678137ccbb5bdc3.js} +1 -1
  233. package/web/.next/static/chunks/{4e6ecfe539924a71.js → a32ab061aed15a64.js} +1 -1
  234. package/web/.next/static/chunks/{47b5d582b373816d.js → b1fa3fb02b473f65.js} +1 -1
  235. package/web/.next/static/chunks/{437a925303b28b53.js → bdbe5f5328a66512.js} +1 -1
  236. package/web/.next/static/chunks/{b5078ac043e7335a.js → faee95b678e8ec64.js} +1 -1
  237. package/web/.next/trace +1 -1
  238. package/web/.next/trace-build +1 -1
  239. package/dist/src/presentation/web/app/actions/get-feature-messages.d.ts +0 -15
  240. package/dist/src/presentation/web/app/actions/get-feature-messages.d.ts.map +0 -1
  241. package/dist/src/presentation/web/app/actions/get-feature-messages.js +0 -26
  242. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +0 -17
  243. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +0 -1
  244. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +0 -25
  245. package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts +0 -18
  246. package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts.map +0 -1
  247. package/dist/src/presentation/web/app/actions/get-feature-plan.js +0 -31
  248. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts +0 -8
  249. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +0 -1
  250. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +0 -90
  251. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts +0 -20
  252. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts.map +0 -1
  253. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +0 -252
  254. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +0 -7
  255. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +0 -1
  256. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +0 -68
  257. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts +0 -14
  258. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts.map +0 -1
  259. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.js +0 -112
  260. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts +0 -3
  261. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts.map +0 -1
  262. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.js +0 -1
  263. package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.d.ts +0 -8
  264. package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.d.ts.map +0 -1
  265. package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.js +0 -24
  266. package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.d.ts +0 -18
  267. package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.d.ts.map +0 -1
  268. package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.js +0 -125
  269. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +0 -6
  270. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +0 -1
  271. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +0 -35
  272. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +0 -28
  273. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +0 -1
  274. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +0 -157
  275. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts +0 -8
  276. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts.map +0 -1
  277. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.js +0 -40
  278. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts +0 -22
  279. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map +0 -1
  280. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.js +0 -188
  281. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts +0 -30
  282. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts.map +0 -1
  283. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.js +0 -100
  284. package/web/.next/standalone/src/presentation/web/app/actions/get-feature-messages.ts +0 -42
  285. package/web/.next/standalone/src/presentation/web/app/actions/get-feature-phase-timings.ts +0 -42
  286. package/web/.next/standalone/src/presentation/web/app/actions/get-feature-plan.ts +0 -52
  287. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.tsx +0 -272
  288. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx +0 -245
  289. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.tsx +0 -130
  290. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx +0 -136
  291. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/index.ts +0 -2
  292. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.tsx +0 -149
  293. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.tsx +0 -92
  294. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx +0 -186
  295. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx +0 -142
  296. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.tsx +0 -214
  297. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx +0 -121
  298. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.ts +0 -143
  299. package/web/.next/static/chunks/84d2f2d55e5cf753.css +0 -2
  300. package/web/.next/static/chunks/90f36476e66cbace.js +0 -1
  301. /package/web/.next/static/{TuKZpCcwG7RLlpnyasgpZ → dW3UxyG_fKX-TDcK9QVh4}/_buildManifest.js +0 -0
  302. /package/web/.next/static/{TuKZpCcwG7RLlpnyasgpZ → dW3UxyG_fKX-TDcK9QVh4}/_clientMiddlewareManifest.json +0 -0
  303. /package/web/.next/static/{TuKZpCcwG7RLlpnyasgpZ → dW3UxyG_fKX-TDcK9QVh4}/_ssgManifest.js +0 -0
@@ -11,6 +11,7 @@
11
11
  * shep settings agent # Configure AI coding agent
12
12
  * shep settings ide # Configure preferred IDE
13
13
  * shep settings workflow # Configure workflow defaults
14
+ * shep settings model # Configure default LLM model
14
15
  */
15
16
  import { Command } from 'commander';
16
17
  import { createShowCommand } from './show.command.js';
@@ -18,6 +19,7 @@ import { createInitCommand } from './init.command.js';
18
19
  import { createAgentCommand } from './agent.command.js';
19
20
  import { createIdeCommand } from './ide.command.js';
20
21
  import { createWorkflowCommand } from './workflow.command.js';
22
+ import { createModelCommand } from './model.command.js';
21
23
  import { onboardingWizard } from '../../../tui/wizards/onboarding/onboarding.wizard.js';
22
24
  import { messages } from '../../ui/index.js';
23
25
  /**
@@ -30,7 +32,8 @@ export function createSettingsCommand() {
30
32
  .addCommand(createInitCommand())
31
33
  .addCommand(createAgentCommand())
32
34
  .addCommand(createIdeCommand())
33
- .addCommand(createWorkflowCommand());
35
+ .addCommand(createWorkflowCommand())
36
+ .addCommand(createModelCommand());
34
37
  // Default action: launch the full setup wizard when no subcommand is given
35
38
  cmd.action(async () => {
36
39
  try {
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Model Configuration Command
3
+ *
4
+ * Configures the default LLM model used for feature runs.
5
+ * The command resolves the list of supported models from the configured agent
6
+ * and presents an interactive prompt — no Shep-side validation against
7
+ * the advertised list, as users may enter newly released identifiers.
8
+ *
9
+ * Usage:
10
+ * shep settings model # Interactive model picker
11
+ */
12
+ import { Command } from 'commander';
13
+ /**
14
+ * Create the model configuration command.
15
+ */
16
+ export declare function createModelCommand(): Command;
17
+ //# sourceMappingURL=model.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/settings/model.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAqD5C"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Model Configuration Command
3
+ *
4
+ * Configures the default LLM model used for feature runs.
5
+ * The command resolves the list of supported models from the configured agent
6
+ * and presents an interactive prompt — no Shep-side validation against
7
+ * the advertised list, as users may enter newly released identifiers.
8
+ *
9
+ * Usage:
10
+ * shep settings model # Interactive model picker
11
+ */
12
+ import { Command } from 'commander';
13
+ import { select } from '@inquirer/prompts';
14
+ import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
15
+ import { UpdateSettingsUseCase } from '../../../../../packages/core/src/application/use-cases/settings/update-settings.use-case.js';
16
+ import { getSettings, resetSettings, initializeSettings, } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
17
+ import { messages } from '../../ui/index.js';
18
+ /**
19
+ * Create the model configuration command.
20
+ */
21
+ export function createModelCommand() {
22
+ return new Command('model')
23
+ .description('Configure the default LLM model for agent runs')
24
+ .addHelpText('after', `
25
+ Examples:
26
+ $ shep settings model Interactive model picker`)
27
+ .action(async () => {
28
+ try {
29
+ const factory = container.resolve('IAgentExecutorFactory');
30
+ const settings = getSettings();
31
+ const agentType = settings.agent.type;
32
+ const supportedModels = factory.getSupportedModels(agentType);
33
+ if (supportedModels.length === 0) {
34
+ messages.info(`No models available for agent "${agentType}". Configure a different agent with: shep settings agent`);
35
+ return;
36
+ }
37
+ const currentModel = settings.models.default;
38
+ const selectedModel = await select({
39
+ message: 'Select default LLM model',
40
+ choices: supportedModels.map((m) => ({ name: m, value: m })),
41
+ default: currentModel,
42
+ });
43
+ // Persist via UpdateSettingsUseCase
44
+ settings.models.default = selectedModel;
45
+ const useCase = container.resolve(UpdateSettingsUseCase);
46
+ const updatedSettings = await useCase.execute(settings);
47
+ // Refresh in-memory singleton
48
+ resetSettings();
49
+ initializeSettings(updatedSettings);
50
+ messages.success(`Model configured: ${selectedModel}`);
51
+ }
52
+ catch (error) {
53
+ const err = error instanceof Error ? error : new Error(String(error));
54
+ if (err.message.includes('force closed') || err.message.includes('User force closed')) {
55
+ messages.info('Configuration cancelled.');
56
+ return;
57
+ }
58
+ messages.error('Failed to configure model', err);
59
+ process.exitCode = 1;
60
+ }
61
+ });
62
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/ui/tables.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;IAEzC;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM;IAgE5E,OAAO,CAAC,MAAM,CAAC,OAAO;CAcvB"}
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/ui/tables.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;IAEzC;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM;IAyD5E,OAAO,CAAC,MAAM,CAAC,OAAO;CAcvB"}
@@ -22,12 +22,7 @@ export class TableFormatter {
22
22
  lines.push(` ${pc.bold(colors.brand('Settings'))}`);
23
23
  lines.push('');
24
24
  // Models
25
- lines.push(...TableFormatter.section('Models', [
26
- ['Analyze', s.models.analyze],
27
- ['Requirements', s.models.requirements],
28
- ['Plan', s.models.plan],
29
- ['Implement', s.models.implement],
30
- ]));
25
+ lines.push(...TableFormatter.section('Models', [['Default', s.models.default]]));
31
26
  // User
32
27
  lines.push(...TableFormatter.section('User', [
33
28
  ['Name', s.user.name],
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Server action that returns the LLM model identifiers supported by the
3
+ * currently configured agent executor.
4
+ *
5
+ * Resolves IAgentExecutorFactory from the DI container and calls
6
+ * getSupportedModels for the agent type stored in settings.
7
+ *
8
+ * @returns Array of model identifier strings, or [] on error.
9
+ */
10
+ export declare function getSupportedModels(): Promise<string[]>;
11
+ //# sourceMappingURL=get-supported-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-supported-models.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-supported-models.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAU5D"}
@@ -0,0 +1,24 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
4
+ /**
5
+ * Server action that returns the LLM model identifiers supported by the
6
+ * currently configured agent executor.
7
+ *
8
+ * Resolves IAgentExecutorFactory from the DI container and calls
9
+ * getSupportedModels for the agent type stored in settings.
10
+ *
11
+ * @returns Array of model identifier strings, or [] on error.
12
+ */
13
+ export async function getSupportedModels() {
14
+ try {
15
+ const settings = getSettings();
16
+ const agentType = settings.agent.type;
17
+ const factory = resolve('IAgentExecutorFactory');
18
+ return factory.getSupportedModels(agentType);
19
+ }
20
+ catch (_error) {
21
+ // Settings may not be initialized in some test/preview environments
22
+ return [];
23
+ }
24
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Server action that updates the default LLM model in settings.
3
+ *
4
+ * Persists the new model to the database via UpdateSettingsUseCase and
5
+ * refreshes the in-memory settings singleton so subsequent reads reflect
6
+ * the change within the current server process.
7
+ *
8
+ * @param model - The model identifier to set as the new default
9
+ * @returns `{ ok: true }` on success, or `{ ok: false, error: string }` on failure.
10
+ */
11
+ export declare function updateModel(model: string): Promise<{
12
+ ok: boolean;
13
+ error?: string;
14
+ }>;
15
+ //# sourceMappingURL=update-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-model.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/update-model.ts"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBzF"}
@@ -0,0 +1,35 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ import { getSettings, resetSettings, initializeSettings, } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
4
+ /**
5
+ * Server action that updates the default LLM model in settings.
6
+ *
7
+ * Persists the new model to the database via UpdateSettingsUseCase and
8
+ * refreshes the in-memory settings singleton so subsequent reads reflect
9
+ * the change within the current server process.
10
+ *
11
+ * @param model - The model identifier to set as the new default
12
+ * @returns `{ ok: true }` on success, or `{ ok: false, error: string }` on failure.
13
+ */
14
+ export async function updateModel(model) {
15
+ if (!model.trim()) {
16
+ return { ok: false, error: 'model is required' };
17
+ }
18
+ try {
19
+ const currentSettings = getSettings();
20
+ const updatedSettings = {
21
+ ...currentSettings,
22
+ models: { default: model.trim() },
23
+ };
24
+ const updateUseCase = resolve('UpdateSettingsUseCase');
25
+ await updateUseCase.execute(updatedSettings);
26
+ // Refresh the in-memory singleton so this server process sees the new value
27
+ resetSettings();
28
+ initializeSettings(updatedSettings);
29
+ return { ok: true };
30
+ }
31
+ catch (error) {
32
+ const message = error instanceof Error ? error.message : 'Failed to update model';
33
+ return { ok: false, error: message };
34
+ }
35
+ }
@@ -0,0 +1,24 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { ModelPicker } from './index.js';
3
+ declare const meta: Meta<typeof ModelPicker>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof meta>;
6
+ /**
7
+ * Default state — current model is claude-sonnet-4-6, the advertised list
8
+ * for claude-code is populated from the mock server action.
9
+ */
10
+ export declare const Default: Story;
11
+ /**
12
+ * Custom model — a free-text identifier not present in the advertised list.
13
+ * Demonstrates that the combobox accepts arbitrary strings.
14
+ */
15
+ export declare const CustomModel: Story;
16
+ /**
17
+ * Disabled state — picker is non-interactive (e.g. during form submission).
18
+ */
19
+ export declare const Disabled: Story;
20
+ /**
21
+ * Opus selected — verifies the checkmark appears on the right item.
22
+ */
23
+ export declare const OpusSelected: Story;
24
+ //# sourceMappingURL=ModelPicker.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelPicker.stories.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAiBlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAKtB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { fn } from '@storybook/test';
3
+ import { ModelPicker } from './index.js';
4
+ const meta = {
5
+ title: 'Features/Settings/ModelPicker',
6
+ component: ModelPicker,
7
+ parameters: {
8
+ layout: 'centered',
9
+ },
10
+ tags: ['autodocs'],
11
+ decorators: [
12
+ (Story) => (_jsx("div", { className: "w-80", children: _jsx(Story, {}) })),
13
+ ],
14
+ args: {
15
+ onModelChange: fn(),
16
+ },
17
+ };
18
+ export default meta;
19
+ /**
20
+ * Default state — current model is claude-sonnet-4-6, the advertised list
21
+ * for claude-code is populated from the mock server action.
22
+ */
23
+ export const Default = {
24
+ args: {
25
+ initialModel: 'claude-sonnet-4-6',
26
+ },
27
+ };
28
+ /**
29
+ * Custom model — a free-text identifier not present in the advertised list.
30
+ * Demonstrates that the combobox accepts arbitrary strings.
31
+ */
32
+ export const CustomModel = {
33
+ args: {
34
+ initialModel: 'claude-opus-4-7-experimental',
35
+ },
36
+ };
37
+ /**
38
+ * Disabled state — picker is non-interactive (e.g. during form submission).
39
+ */
40
+ export const Disabled = {
41
+ args: {
42
+ initialModel: 'claude-sonnet-4-6',
43
+ disabled: true,
44
+ },
45
+ };
46
+ /**
47
+ * Opus selected — verifies the checkmark appears on the right item.
48
+ */
49
+ export const OpusSelected = {
50
+ args: {
51
+ initialModel: 'claude-opus-4-6',
52
+ },
53
+ };
@@ -0,0 +1,18 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,84 @@
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
+ }
@@ -0,0 +1,19 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,26 @@
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, };