@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.
- package/apis/json-schema/ModelConfiguration.yaml +5 -20
- package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts +8 -0
- package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +1 -0
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts +3 -3
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +5 -8
- package/dist/packages/core/src/domain/generated/output.d.ts +3 -15
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +8 -10
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +15 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +28 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.js +3 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +3 -0
- package/dist/packages/core/src/infrastructure/services/settings.service.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/services/settings.service.js +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +2 -0
- package/dist/src/presentation/cli/commands/settings/index.d.ts +1 -0
- package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/settings/index.js +4 -1
- package/dist/src/presentation/cli/commands/settings/model.command.d.ts +17 -0
- package/dist/src/presentation/cli/commands/settings/model.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/settings/model.command.js +62 -0
- package/dist/src/presentation/cli/ui/tables.d.ts.map +1 -1
- package/dist/src/presentation/cli/ui/tables.js +1 -6
- package/dist/src/presentation/web/app/actions/get-supported-models.d.ts +11 -0
- package/dist/src/presentation/web/app/actions/get-supported-models.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-supported-models.js +24 -0
- package/dist/src/presentation/web/app/actions/update-model.d.ts +15 -0
- package/dist/src/presentation/web/app/actions/update-model.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/update-model.js +35 -0
- package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.d.ts +24 -0
- package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.js +53 -0
- package/dist/src/presentation/web/components/features/settings/ModelPicker/index.d.ts +18 -0
- package/dist/src/presentation/web/components/features/settings/ModelPicker/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/ModelPicker/index.js +84 -0
- package/dist/src/presentation/web/components/ui/command.d.ts +19 -0
- package/dist/src/presentation/web/components/ui/command.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/command.js +26 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
- package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_30fd6f01._.js → _435fea24._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_30fd6f01._.js.map → _435fea24._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_5ee4f5a7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
- package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +22 -22
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_30fd6f01._.js → _435fea24._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -22
- package/web/.next/standalone/src/presentation/web/app/actions/get-supported-models.ts +26 -0
- package/web/.next/standalone/src/presentation/web/app/actions/update-model.ts +45 -0
- package/web/.next/standalone/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.tsx +64 -0
- package/web/.next/standalone/src/presentation/web/components/features/settings/ModelPicker/index.tsx +167 -0
- package/web/.next/standalone/src/presentation/web/components/ui/command.tsx +114 -0
- package/web/.next/static/chunks/115eab1c5d9aea10.js +1 -0
- package/web/.next/static/chunks/{2e2355741bd6a9a7.js → 46c77597b4b8129d.js} +1 -1
- package/web/.next/static/chunks/{dcb8f73fb28b2a26.js → 81e1c1e43ae18086.js} +1 -1
- package/web/.next/static/chunks/8a68cac7c51df846.css +2 -0
- package/web/.next/static/chunks/{45b6a69a50b9d9e8.js → 920d18ed1ff267e7.js} +1 -1
- package/web/.next/static/chunks/{e37d7d4d215db8f5.js → 9678137ccbb5bdc3.js} +1 -1
- package/web/.next/static/chunks/{4e6ecfe539924a71.js → a32ab061aed15a64.js} +1 -1
- package/web/.next/static/chunks/{47b5d582b373816d.js → b1fa3fb02b473f65.js} +1 -1
- package/web/.next/static/chunks/{437a925303b28b53.js → bdbe5f5328a66512.js} +1 -1
- package/web/.next/static/chunks/{b5078ac043e7335a.js → faee95b678e8ec64.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/dist/src/presentation/web/app/actions/get-feature-messages.d.ts +0 -15
- package/dist/src/presentation/web/app/actions/get-feature-messages.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/get-feature-messages.js +0 -26
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +0 -17
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +0 -25
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts +0 -18
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/get-feature-plan.js +0 -31
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts +0 -8
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +0 -90
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts +0 -20
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +0 -252
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +0 -7
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +0 -68
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts +0 -14
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.js +0 -112
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts +0 -3
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.js +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.d.ts +0 -8
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.js +0 -24
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.d.ts +0 -18
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.js +0 -125
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +0 -6
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +0 -35
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +0 -28
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +0 -157
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts +0 -8
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.js +0 -40
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts +0 -22
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.js +0 -188
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts +0 -30
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.js +0 -100
- package/web/.next/standalone/src/presentation/web/app/actions/get-feature-messages.ts +0 -42
- package/web/.next/standalone/src/presentation/web/app/actions/get-feature-phase-timings.ts +0 -42
- package/web/.next/standalone/src/presentation/web/app/actions/get-feature-plan.ts +0 -52
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.tsx +0 -272
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx +0 -245
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.tsx +0 -130
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx +0 -136
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/index.ts +0 -2
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.tsx +0 -149
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.tsx +0 -92
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx +0 -186
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx +0 -142
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.tsx +0 -214
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx +0 -121
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.ts +0 -143
- package/web/.next/static/chunks/84d2f2d55e5cf753.css +0 -2
- package/web/.next/static/chunks/90f36476e66cbace.js +0 -1
- /package/web/.next/static/{TuKZpCcwG7RLlpnyasgpZ → dW3UxyG_fKX-TDcK9QVh4}/_buildManifest.js +0 -0
- /package/web/.next/static/{TuKZpCcwG7RLlpnyasgpZ → dW3UxyG_fKX-TDcK9QVh4}/_clientMiddlewareManifest.json +0 -0
- /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;
|
|
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
|
+
}
|
package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.d.ts
ADDED
|
@@ -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"}
|
package/dist/src/presentation/web/components/features/settings/ModelPicker/ModelPicker.stories.js
ADDED
|
@@ -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, };
|