@shepai/cli 1.77.2 → 1.78.0
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/AgentRun.yaml +3 -0
- 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/agents/approve-agent-run.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.js +1 -0
- 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 +9 -2
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +4 -0
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +2 -0
- 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 +7 -15
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/agent-run.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/agent-run.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/agent-run.mapper.js +2 -0
- 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 +22 -3
- package/dist/packages/core/src/infrastructure/repositories/agent-run.repository.js +2 -2
- 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 +37 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +3 -2
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.js +3 -2
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.js +3 -2
- 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/fast-feature-agent-graph.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +17 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
- 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/agents/feature-agent/feature-agent-worker.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +35 -8
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/log-context.d.ts +25 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/log-context.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/log-context.js +34 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +6 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +4 -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/feat/show.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/show.command.js +13 -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 +6 -23
- package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.js +3 -1
- package/dist/src/presentation/web/app/actions/create-feature.d.ts +4 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/create-feature.js +5 -1
- package/dist/src/presentation/web/app/actions/get-all-agent-models.d.ts +12 -0
- package/dist/src/presentation/web/app/actions/get-all-agent-models.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-all-agent-models.js +49 -0
- 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-agent-and-model.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/update-agent-and-model.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/update-agent-and-model.js +28 -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/app/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +1 -0
- package/dist/src/presentation/web/app/build-graph-nodes.js +1 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts +3 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +2 -2
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +9 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +29 -4
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +5 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +32 -3
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.d.ts +3 -1
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.js +6 -2
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.js +15 -0
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.js +11 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +9 -6
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +19 -0
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts +12 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.js +59 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts +11 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +103 -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/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +7 -21
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts +2 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +28 -3
- package/dist/src/presentation/web/components/ui/checkbox-group-item.js +1 -1
- package/dist/src/presentation/web/components/ui/checkbox-group.js +1 -1
- 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/src/presentation/web/components/ui/switch.js +1 -1
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts +2 -0
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/model-metadata.d.ts +6 -0
- package/dist/src/presentation/web/lib/model-metadata.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/model-metadata.js +41 -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 +4 -4
- 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/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +62 -32
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +62 -32
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/page/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/build-manifest.json +2 -2
- package/web/.next/server/app/settings/page/server-reference-manifest.json +36 -6
- package/web/.next/server/app/settings/page.js +2 -2
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js.nft.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/7f428_lucide-react_dist_esm_icons_c7cfe351._.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_c7cfe351._.js.map +1 -0
- 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]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js.map +1 -0
- 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/[root-of-the-server]__bff2deea._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bff2deea._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d076a90b._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d076a90b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0bd0fafb._.js +9 -0
- package/web/.next/server/chunks/ssr/_0bd0fafb._.js.map +1 -0
- 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/_14fa79b2._.js +3 -0
- package/web/.next/server/chunks/ssr/_14fa79b2._.js.map +1 -0
- 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/{standalone/src/presentation/web/.next/server/chunks/ssr/_6645f218._.js → server/chunks/ssr/_8dacd1e7._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_6645f218._.js.map → _8dacd1e7._.js.map} +1 -1
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_8a93b402._.js → server/chunks/ssr/_91588d08._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_8a93b402._.js.map → _91588d08._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_9ac70f88._.js +5 -0
- package/web/.next/server/chunks/ssr/_9ac70f88._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
- package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_88c4dab8._.js → _b5fc318a._.js} +2 -2
- package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_cbffd0e9._.js +3 -0
- package/web/.next/server/chunks/ssr/_cbffd0e9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_d4b20e29._.js +1 -1
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_ed356507._.js +3 -0
- package/web/.next/server/chunks/ssr/{_5428b384._.js.map → _ed356507._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_ef9046a1._.js +3 -0
- package/web/.next/server/chunks/ssr/_ef9046a1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_1fcecd3a._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_1fcecd3a._.js.map +1 -0
- 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_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__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +6 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.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/chunks/ssr/src_presentation_web_e4510d10._.js +6 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -0
- package/web/.next/server/middleware-build-manifest.js +2 -2
- 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 +117 -59
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +4 -4
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +62 -32
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +62 -32
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js +1 -1
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/page/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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.js.nft.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/settings/page/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/settings/page/server-reference-manifest.json +36 -6
- package/web/.next/standalone/src/presentation/web/.next/server/app/settings/page.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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.js.nft.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/7f428_lucide-react_dist_esm_icons_c7cfe351._.js +3 -0
- 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]__11033878._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +4 -0
- 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/[root-of-the-server]__bff2deea._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d076a90b._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0bd0fafb._.js +9 -0
- 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/_14fa79b2._.js +3 -0
- 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/{server/chunks/ssr/_6645f218._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_8dacd1e7._.js} +2 -2
- package/web/.next/{server/chunks/ssr/_8a93b402._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_91588d08._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9ac70f88._.js +5 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_88c4dab8._.js → _b5fc318a._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_cbffd0e9._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d4b20e29._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_ed356507._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_ef9046a1._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_1fcecd3a._.js +3 -0
- 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_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__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.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/chunks/ssr/src_presentation_web_e4510d10._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +2 -2
- 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 +117 -59
- package/web/.next/standalone/src/presentation/web/app/(dashboard)/@drawer/create/page.tsx +4 -0
- package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +20 -2
- package/web/.next/standalone/src/presentation/web/app/actions/get-all-agent-models.ts +65 -0
- 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-agent-and-model.ts +41 -0
- package/web/.next/standalone/src/presentation/web/app/actions/update-model.ts +45 -0
- package/web/.next/standalone/src/presentation/web/app/build-feature-node-data.ts +1 -0
- package/web/.next/standalone/src/presentation/web/app/build-graph-nodes.ts +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx +6 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +56 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +238 -118
- package/web/.next/standalone/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.tsx +16 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-list-item/feature-list-item.tsx +33 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/agent-type-icons.tsx +54 -2
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +19 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +38 -16
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +4 -0
- package/web/.next/standalone/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.tsx +72 -0
- package/web/.next/standalone/src/presentation/web/components/features/settings/AgentModelPicker/index.tsx +228 -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/features/settings/settings-page-client.tsx +25 -41
- package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx +28 -3
- package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +4 -0
- package/web/.next/standalone/src/presentation/web/components/ui/checkbox-group-item.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/ui/checkbox-group.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/ui/command.tsx +114 -0
- package/web/.next/standalone/src/presentation/web/components/ui/switch.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/hooks/sidebar-features-context.tsx +2 -0
- package/web/.next/standalone/src/presentation/web/lib/model-metadata.ts +51 -0
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/00bf58dc5071b119.js +1 -0
- package/web/.next/static/chunks/259d3d57e8cfa8a9.js +1 -0
- package/web/.next/static/chunks/{db3fc2ad5e82988a.js → 25db6b51953c2374.js} +1 -1
- package/web/.next/static/chunks/305c7a91027868ab.js +1 -0
- package/web/.next/static/chunks/{97908acfe33c0773.js → 32db703f00225a79.js} +1 -1
- package/web/.next/static/chunks/390b75b02f665809.js +1 -0
- package/web/.next/static/chunks/42bd17823c7f41a1.css +2 -0
- package/web/.next/static/chunks/4ea1b4276f27110b.js +1 -0
- package/web/.next/static/chunks/51454a23ce051ec9.js +1 -0
- package/web/.next/static/chunks/{98e3a7cf58fc912a.js → 672e3da3ad26005b.js} +1 -1
- package/web/.next/static/chunks/7acc79e599df9890.js +1 -0
- package/web/.next/static/chunks/{36d88ff9f7db4eb9.js → 876edf7bbd901942.js} +1 -1
- package/web/.next/static/chunks/8f122c3ac2102300.js +11 -0
- package/web/.next/static/chunks/{1e540786c8710d66.js → a06258d572f4492c.js} +1 -1
- package/web/.next/static/chunks/a1ddf1f9b1435434.js +3 -0
- package/web/.next/static/chunks/{ed9e614e536c06de.js → b9a0a65afea061c5.js} +1 -1
- package/web/.next/static/chunks/c8b2868ae430a586.js +1 -0
- package/web/.next/static/chunks/{b7f32185dc5f8480.js → d1818ddcad8d7b31.js} +2 -2
- package/web/.next/static/chunks/{89aac43287d73b02.js → ed3a602003bcb31b.js} +1 -1
- package/web/.next/static/chunks/f492adb2f80408c6.js +1 -0
- package/web/.next/static/chunks/{turbopack-080e470ea902d0ba.js → turbopack-426d9bc2450816ba.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1c870feb._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1c870feb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aea328fd._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aea328fd._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fd36b8bf._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fd36b8bf._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_4093a637._.js +0 -5
- package/web/.next/server/chunks/ssr/_4093a637._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_5428b384._.js +0 -3
- package/web/.next/server/chunks/ssr/_88c4dab8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_956601a1._.js +0 -9
- package/web/.next/server/chunks/ssr/_956601a1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_c26c679f._.js +0 -3
- package/web/.next/server/chunks/ssr/_c26c679f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_caf6533c._.js +0 -3
- package/web/.next/server/chunks/ssr/_caf6533c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f7f6173c._.js +0 -3
- package/web/.next/server/chunks/ssr/_f7f6173c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +0 -3
- package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +0 -6
- package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +0 -6
- package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__1c870feb._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aea328fd._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fd36b8bf._.js +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_4093a637._.js +0 -5
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_5428b384._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_956601a1._.js +0 -9
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_c26c679f._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_caf6533c._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_f7f6173c._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +0 -6
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +0 -6
- package/web/.next/static/chunks/3479d6ae297e5410.css +0 -2
- package/web/.next/static/chunks/562043dcb8748208.js +0 -1
- package/web/.next/static/chunks/700501f5ac2bb320.js +0 -1
- package/web/.next/static/chunks/730cb306a35d6396.js +0 -1
- package/web/.next/static/chunks/907556417091ee06.js +0 -11
- package/web/.next/static/chunks/aa6cc6df962a3fc0.js +0 -3
- package/web/.next/static/chunks/b551d91ffdbb7c9e.js +0 -1
- package/web/.next/static/chunks/bf8d066811cf0d38.js +0 -3
- package/web/.next/static/chunks/c63d1c145c5a07dc.js +0 -1
- package/web/.next/static/chunks/dcc5fcd1ca8d263d.js +0 -1
- package/web/.next/static/chunks/f57f86dba6d4baba.js +0 -1
- package/web/.next/static/chunks/fc00e1b83852da4e.js +0 -1
- /package/web/.next/static/{5kMkMkfx5JoIMSJH9xQVJ → nwZ6x4KL92z5QBu5a6cPN}/_buildManifest.js +0 -0
- /package/web/.next/static/{5kMkMkfx5JoIMSJH9xQVJ → nwZ6x4KL92z5QBu5a6cPN}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{5kMkMkfx5JoIMSJH9xQVJ → nwZ6x4KL92z5QBu5a6cPN}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Check, ChevronLeft, ChevronRight } from 'lucide-react';
|
|
5
|
+
import { getAllAgentModels } from '@/app/actions/get-all-agent-models';
|
|
6
|
+
import type { AgentModelGroup } from '@/app/actions/get-all-agent-models';
|
|
7
|
+
import { updateAgentAndModel } from '@/app/actions/update-agent-and-model';
|
|
8
|
+
import { getAgentTypeIcon } from '@/components/common/feature-node/agent-type-icons';
|
|
9
|
+
import { getModelMeta } from '@/lib/model-metadata';
|
|
10
|
+
import { Button } from '@/components/ui/button';
|
|
11
|
+
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
|
|
12
|
+
import { cn } from '@/lib/utils';
|
|
13
|
+
|
|
14
|
+
export interface AgentModelPickerProps {
|
|
15
|
+
initialAgentType: string;
|
|
16
|
+
initialModel: string;
|
|
17
|
+
onAgentModelChange?: (agentType: string, model: string) => void;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
className?: string;
|
|
20
|
+
/** 'settings' persists to DB; 'override' only calls onAgentModelChange */
|
|
21
|
+
mode: 'settings' | 'override';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function AgentModelPicker({
|
|
25
|
+
initialAgentType,
|
|
26
|
+
initialModel,
|
|
27
|
+
onAgentModelChange,
|
|
28
|
+
disabled,
|
|
29
|
+
className,
|
|
30
|
+
mode,
|
|
31
|
+
}: AgentModelPickerProps) {
|
|
32
|
+
const [open, setOpen] = React.useState(false);
|
|
33
|
+
const [groups, setGroups] = React.useState<AgentModelGroup[]>([]);
|
|
34
|
+
const [loading, setLoading] = React.useState(true);
|
|
35
|
+
const [agentType, setAgentType] = React.useState(initialAgentType);
|
|
36
|
+
const [model, setModel] = React.useState(initialModel);
|
|
37
|
+
const [error, setError] = React.useState<string | null>(null);
|
|
38
|
+
|
|
39
|
+
// 0 = agent list visible, 1 = model list visible
|
|
40
|
+
const [level, setLevel] = React.useState(0);
|
|
41
|
+
// Which agent's models to show (kept separate from level for animation)
|
|
42
|
+
const [drillAgent, setDrillAgent] = React.useState<string | null>(null);
|
|
43
|
+
|
|
44
|
+
React.useEffect(() => {
|
|
45
|
+
getAllAgentModels()
|
|
46
|
+
.then(setGroups)
|
|
47
|
+
.finally(() => setLoading(false));
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
// Reset drill-down when popover closes
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
if (!open) {
|
|
53
|
+
const t = setTimeout(() => {
|
|
54
|
+
setLevel(0);
|
|
55
|
+
setDrillAgent(null);
|
|
56
|
+
}, 150);
|
|
57
|
+
return () => clearTimeout(t);
|
|
58
|
+
}
|
|
59
|
+
}, [open]);
|
|
60
|
+
|
|
61
|
+
const drillInto = (agent: string) => {
|
|
62
|
+
setDrillAgent(agent);
|
|
63
|
+
requestAnimationFrame(() => {
|
|
64
|
+
requestAnimationFrame(() => setLevel(1));
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const drillBack = () => {
|
|
69
|
+
setLevel(0);
|
|
70
|
+
setTimeout(() => setDrillAgent(null), 220);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const handleSelect = async (newAgentType: string, newModel: string) => {
|
|
74
|
+
setOpen(false);
|
|
75
|
+
|
|
76
|
+
if (newAgentType === agentType && newModel === model) return;
|
|
77
|
+
|
|
78
|
+
if (mode === 'override') {
|
|
79
|
+
setAgentType(newAgentType);
|
|
80
|
+
setModel(newModel);
|
|
81
|
+
onAgentModelChange?.(newAgentType, newModel);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// mode === 'settings' — optimistically update, then persist
|
|
86
|
+
const prevAgent = agentType;
|
|
87
|
+
const prevModel = model;
|
|
88
|
+
setAgentType(newAgentType);
|
|
89
|
+
setModel(newModel);
|
|
90
|
+
onAgentModelChange?.(newAgentType, newModel);
|
|
91
|
+
|
|
92
|
+
setError(null);
|
|
93
|
+
try {
|
|
94
|
+
const result = await updateAgentAndModel(newAgentType, newModel || null);
|
|
95
|
+
if (!result.ok) {
|
|
96
|
+
// Revert on failure
|
|
97
|
+
setAgentType(prevAgent);
|
|
98
|
+
setModel(prevModel);
|
|
99
|
+
onAgentModelChange?.(prevAgent, prevModel);
|
|
100
|
+
setError(result.error ?? 'Failed to save');
|
|
101
|
+
}
|
|
102
|
+
} catch {
|
|
103
|
+
setAgentType(prevAgent);
|
|
104
|
+
setModel(prevModel);
|
|
105
|
+
onAgentModelChange?.(prevAgent, prevModel);
|
|
106
|
+
setError('Failed to save');
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const isDisabled = (disabled ?? false) || loading;
|
|
111
|
+
|
|
112
|
+
const AgentIcon = getAgentTypeIcon(agentType);
|
|
113
|
+
const agentLabel = groups.find((g) => g.agentType === agentType)?.label ?? agentType;
|
|
114
|
+
const displayModel = model ? getModelMeta(model).displayName || model : agentLabel;
|
|
115
|
+
|
|
116
|
+
const activeGroup = drillAgent ? groups.find((g) => g.agentType === drillAgent) : null;
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<div className={cn('flex flex-col gap-1', className)}>
|
|
120
|
+
<Popover open={open} onOpenChange={setOpen}>
|
|
121
|
+
<PopoverTrigger asChild>
|
|
122
|
+
<Button
|
|
123
|
+
variant="outline"
|
|
124
|
+
role="combobox"
|
|
125
|
+
aria-expanded={open}
|
|
126
|
+
disabled={isDisabled}
|
|
127
|
+
className="w-auto cursor-pointer font-normal"
|
|
128
|
+
>
|
|
129
|
+
<span className="flex items-center gap-2 truncate">
|
|
130
|
+
<AgentIcon className="h-4 w-4 shrink-0" />
|
|
131
|
+
{loading ? 'Loading…' : displayModel}
|
|
132
|
+
</span>
|
|
133
|
+
</Button>
|
|
134
|
+
</PopoverTrigger>
|
|
135
|
+
<PopoverContent className="w-64 overflow-hidden p-0" align="start">
|
|
136
|
+
{/* Sliding container — both panels side by side, translateX controlled by level */}
|
|
137
|
+
<div
|
|
138
|
+
className="flex transition-transform duration-200 ease-in-out"
|
|
139
|
+
style={{ transform: `translateX(${level === 1 ? '-50%' : '0%'})`, width: '200%' }}
|
|
140
|
+
>
|
|
141
|
+
{/* ── Level 1: Agent list ── */}
|
|
142
|
+
<div className="w-1/2 shrink-0">
|
|
143
|
+
<div className="text-muted-foreground border-b px-3 py-2 text-xs font-medium">
|
|
144
|
+
Select agent
|
|
145
|
+
</div>
|
|
146
|
+
{groups.map((group) => {
|
|
147
|
+
const GroupIcon = getAgentTypeIcon(group.agentType);
|
|
148
|
+
const isActive = agentType === group.agentType;
|
|
149
|
+
const hasModels = group.models.length > 0;
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<button
|
|
153
|
+
key={group.agentType}
|
|
154
|
+
type="button"
|
|
155
|
+
className={cn(
|
|
156
|
+
'flex w-full cursor-pointer items-center gap-2.5 px-3 py-2 text-sm transition-colors',
|
|
157
|
+
'hover:bg-accent hover:text-accent-foreground',
|
|
158
|
+
isActive && 'bg-accent/50'
|
|
159
|
+
)}
|
|
160
|
+
onClick={() => {
|
|
161
|
+
if (hasModels) {
|
|
162
|
+
drillInto(group.agentType);
|
|
163
|
+
} else {
|
|
164
|
+
handleSelect(group.agentType, '');
|
|
165
|
+
}
|
|
166
|
+
}}
|
|
167
|
+
>
|
|
168
|
+
<GroupIcon className="h-4 w-4 shrink-0" />
|
|
169
|
+
<span className="flex-1 text-left">{group.label}</span>
|
|
170
|
+
{isActive && !hasModels ? (
|
|
171
|
+
<Check className="text-primary h-3.5 w-3.5 shrink-0" />
|
|
172
|
+
) : null}
|
|
173
|
+
{hasModels ? (
|
|
174
|
+
<ChevronRight className="text-muted-foreground h-3.5 w-3.5 shrink-0" />
|
|
175
|
+
) : null}
|
|
176
|
+
</button>
|
|
177
|
+
);
|
|
178
|
+
})}
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
{/* ── Level 2: Model list for selected agent ── */}
|
|
182
|
+
<div className="w-1/2 shrink-0">
|
|
183
|
+
{activeGroup ? (
|
|
184
|
+
<>
|
|
185
|
+
{/* Back header */}
|
|
186
|
+
<button
|
|
187
|
+
type="button"
|
|
188
|
+
className="text-muted-foreground hover:text-foreground flex w-full cursor-pointer items-center gap-1.5 border-b px-3 py-2 text-xs font-medium transition-colors"
|
|
189
|
+
onClick={drillBack}
|
|
190
|
+
>
|
|
191
|
+
<ChevronLeft className="h-3.5 w-3.5" />
|
|
192
|
+
{activeGroup.label}
|
|
193
|
+
</button>
|
|
194
|
+
|
|
195
|
+
{/* Model items */}
|
|
196
|
+
{activeGroup.models.map((m) => {
|
|
197
|
+
const isSelected = agentType === activeGroup.agentType && model === m.id;
|
|
198
|
+
return (
|
|
199
|
+
<button
|
|
200
|
+
key={m.id}
|
|
201
|
+
type="button"
|
|
202
|
+
className={cn(
|
|
203
|
+
'flex w-full cursor-pointer items-center gap-3 px-3 py-2 text-left transition-colors',
|
|
204
|
+
'hover:bg-accent hover:text-accent-foreground',
|
|
205
|
+
isSelected && 'bg-accent/50'
|
|
206
|
+
)}
|
|
207
|
+
onClick={() => handleSelect(activeGroup.agentType, m.id)}
|
|
208
|
+
>
|
|
209
|
+
<div className="flex min-w-0 flex-1 flex-col">
|
|
210
|
+
<span className="text-sm font-medium">{m.displayName}</span>
|
|
211
|
+
<span className="text-muted-foreground text-xs">{m.description}</span>
|
|
212
|
+
</div>
|
|
213
|
+
{isSelected ? (
|
|
214
|
+
<Check className="text-primary h-3.5 w-3.5 shrink-0" />
|
|
215
|
+
) : null}
|
|
216
|
+
</button>
|
|
217
|
+
);
|
|
218
|
+
})}
|
|
219
|
+
</>
|
|
220
|
+
) : null}
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</PopoverContent>
|
|
224
|
+
</Popover>
|
|
225
|
+
{Boolean(error) && <p className="text-destructive text-sm">{error}</p>}
|
|
226
|
+
</div>
|
|
227
|
+
);
|
|
228
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
3
|
+
import { ModelPicker } from './index';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof ModelPicker> = {
|
|
6
|
+
title: 'Features/Settings/ModelPicker',
|
|
7
|
+
component: ModelPicker,
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'centered',
|
|
10
|
+
},
|
|
11
|
+
tags: ['autodocs'],
|
|
12
|
+
decorators: [
|
|
13
|
+
(Story) => (
|
|
14
|
+
<div className="w-80">
|
|
15
|
+
<Story />
|
|
16
|
+
</div>
|
|
17
|
+
),
|
|
18
|
+
],
|
|
19
|
+
args: {
|
|
20
|
+
onModelChange: fn(),
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default meta;
|
|
25
|
+
type Story = StoryObj<typeof meta>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Default state — current model is claude-sonnet-4-6, the advertised list
|
|
29
|
+
* for claude-code is populated from the mock server action.
|
|
30
|
+
*/
|
|
31
|
+
export const Default: Story = {
|
|
32
|
+
args: {
|
|
33
|
+
initialModel: 'claude-sonnet-4-6',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Custom model — a free-text identifier not present in the advertised list.
|
|
39
|
+
* Demonstrates that the combobox accepts arbitrary strings.
|
|
40
|
+
*/
|
|
41
|
+
export const CustomModel: Story = {
|
|
42
|
+
args: {
|
|
43
|
+
initialModel: 'claude-opus-4-7-experimental',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Disabled state — picker is non-interactive (e.g. during form submission).
|
|
49
|
+
*/
|
|
50
|
+
export const Disabled: Story = {
|
|
51
|
+
args: {
|
|
52
|
+
initialModel: 'claude-sonnet-4-6',
|
|
53
|
+
disabled: true,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Opus selected — verifies the checkmark appears on the right item.
|
|
59
|
+
*/
|
|
60
|
+
export const OpusSelected: Story = {
|
|
61
|
+
args: {
|
|
62
|
+
initialModel: 'claude-opus-4-6',
|
|
63
|
+
},
|
|
64
|
+
};
|
package/web/.next/standalone/src/presentation/web/components/features/settings/ModelPicker/index.tsx
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Check, ChevronsUpDown } from 'lucide-react';
|
|
5
|
+
import { getSupportedModels } from '@/app/actions/get-supported-models';
|
|
6
|
+
import { updateModel } from '@/app/actions/update-model';
|
|
7
|
+
import { Button } from '@/components/ui/button';
|
|
8
|
+
import {
|
|
9
|
+
Command,
|
|
10
|
+
CommandEmpty,
|
|
11
|
+
CommandGroup,
|
|
12
|
+
CommandInput,
|
|
13
|
+
CommandItem,
|
|
14
|
+
CommandList,
|
|
15
|
+
} from '@/components/ui/command';
|
|
16
|
+
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
|
|
17
|
+
import { cn } from '@/lib/utils';
|
|
18
|
+
|
|
19
|
+
export interface ModelPickerProps {
|
|
20
|
+
/** Current model identifier shown as the initial selection */
|
|
21
|
+
initialModel: string;
|
|
22
|
+
/** Optional callback notified when the model is successfully persisted */
|
|
23
|
+
onModelChange?: (model: string) => void;
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* ModelPicker
|
|
30
|
+
*
|
|
31
|
+
* A combobox that lets the user choose the default LLM model. On mount it
|
|
32
|
+
* calls the `getSupportedModels` server action to populate suggestions for
|
|
33
|
+
* the currently configured agent; the user may also type any free-text model
|
|
34
|
+
* identifier. On selection the new value is persisted via `updateModel`.
|
|
35
|
+
*/
|
|
36
|
+
export function ModelPicker({
|
|
37
|
+
initialModel,
|
|
38
|
+
onModelChange,
|
|
39
|
+
disabled,
|
|
40
|
+
className,
|
|
41
|
+
}: ModelPickerProps) {
|
|
42
|
+
const [open, setOpen] = React.useState(false);
|
|
43
|
+
const [models, setModels] = React.useState<string[]>([]);
|
|
44
|
+
const [loading, setLoading] = React.useState(true);
|
|
45
|
+
const [saving, setSaving] = React.useState(false);
|
|
46
|
+
const [value, setValue] = React.useState(initialModel);
|
|
47
|
+
const [inputValue, setInputValue] = React.useState(initialModel);
|
|
48
|
+
const [error, setError] = React.useState<string | null>(null);
|
|
49
|
+
|
|
50
|
+
// Load advertised models on mount
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
getSupportedModels()
|
|
53
|
+
.then(setModels)
|
|
54
|
+
.finally(() => setLoading(false));
|
|
55
|
+
}, []);
|
|
56
|
+
|
|
57
|
+
// Keep local state in sync when initialModel prop changes
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
setValue(initialModel);
|
|
60
|
+
setInputValue(initialModel);
|
|
61
|
+
}, [initialModel]);
|
|
62
|
+
|
|
63
|
+
const filteredModels = models.filter((m) => m.toLowerCase().includes(inputValue.toLowerCase()));
|
|
64
|
+
|
|
65
|
+
const handleSelect = async (model: string) => {
|
|
66
|
+
setOpen(false);
|
|
67
|
+
await persist(model);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
71
|
+
setInputValue(e.target.value);
|
|
72
|
+
if (!open) setOpen(true);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const handleInputKeyDown = async (e: React.KeyboardEvent<HTMLInputElement>) => {
|
|
76
|
+
if (e.key === 'Enter') {
|
|
77
|
+
e.preventDefault();
|
|
78
|
+
setOpen(false);
|
|
79
|
+
await persist(inputValue);
|
|
80
|
+
}
|
|
81
|
+
if (e.key === 'Escape') {
|
|
82
|
+
setOpen(false);
|
|
83
|
+
// Revert input to last saved value
|
|
84
|
+
setInputValue(value);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const persist = async (model: string) => {
|
|
89
|
+
if (!model.trim() || model === value) return;
|
|
90
|
+
setSaving(true);
|
|
91
|
+
setError(null);
|
|
92
|
+
try {
|
|
93
|
+
const result = await updateModel(model);
|
|
94
|
+
if (result.ok) {
|
|
95
|
+
setValue(model);
|
|
96
|
+
onModelChange?.(model);
|
|
97
|
+
} else {
|
|
98
|
+
setError(result.error ?? 'Failed to save model');
|
|
99
|
+
setInputValue(value); // revert
|
|
100
|
+
}
|
|
101
|
+
} finally {
|
|
102
|
+
setSaving(false);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const isDisabled = (disabled ?? false) || loading || saving;
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<div className={cn('flex flex-col gap-1', className)}>
|
|
110
|
+
<Popover open={open} onOpenChange={setOpen}>
|
|
111
|
+
<PopoverTrigger asChild>
|
|
112
|
+
<Button
|
|
113
|
+
variant="outline"
|
|
114
|
+
role="combobox"
|
|
115
|
+
aria-expanded={open}
|
|
116
|
+
disabled={isDisabled}
|
|
117
|
+
className="w-full justify-between font-normal"
|
|
118
|
+
>
|
|
119
|
+
<span className="truncate">
|
|
120
|
+
{loading ? 'Loading models…' : saving ? 'Saving…' : (value ?? 'Select model…')}
|
|
121
|
+
</span>
|
|
122
|
+
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
|
123
|
+
</Button>
|
|
124
|
+
</PopoverTrigger>
|
|
125
|
+
<PopoverContent className="w-[var(--radix-popover-trigger-width)] p-0" align="start">
|
|
126
|
+
<Command>
|
|
127
|
+
<CommandInput
|
|
128
|
+
placeholder="Search or type a model ID…"
|
|
129
|
+
value={inputValue}
|
|
130
|
+
onChange={handleInputChange}
|
|
131
|
+
onKeyDown={handleInputKeyDown}
|
|
132
|
+
/>
|
|
133
|
+
<CommandList>
|
|
134
|
+
{!loading && filteredModels.length === 0 && (
|
|
135
|
+
<CommandEmpty>
|
|
136
|
+
{models.length === 0
|
|
137
|
+
? 'No models advertised for this agent.'
|
|
138
|
+
: 'No match — press Enter to use this value.'}
|
|
139
|
+
</CommandEmpty>
|
|
140
|
+
)}
|
|
141
|
+
{filteredModels.length > 0 && (
|
|
142
|
+
<CommandGroup>
|
|
143
|
+
{filteredModels.map((model) => (
|
|
144
|
+
<CommandItem
|
|
145
|
+
key={model}
|
|
146
|
+
selected={model === value}
|
|
147
|
+
onClick={() => handleSelect(model)}
|
|
148
|
+
>
|
|
149
|
+
<Check
|
|
150
|
+
className={cn(
|
|
151
|
+
'mr-2 h-4 w-4',
|
|
152
|
+
model === value ? 'opacity-100' : 'opacity-0'
|
|
153
|
+
)}
|
|
154
|
+
/>
|
|
155
|
+
{model}
|
|
156
|
+
</CommandItem>
|
|
157
|
+
))}
|
|
158
|
+
</CommandGroup>
|
|
159
|
+
)}
|
|
160
|
+
</CommandList>
|
|
161
|
+
</Command>
|
|
162
|
+
</PopoverContent>
|
|
163
|
+
</Popover>
|
|
164
|
+
{Boolean(error) && <p className="text-destructive text-sm">{error}</p>}
|
|
165
|
+
</div>
|
|
166
|
+
);
|
|
167
|
+
}
|
|
@@ -15,24 +15,15 @@ import {
|
|
|
15
15
|
SelectValue,
|
|
16
16
|
} from '@/components/ui/select';
|
|
17
17
|
import { updateSettingsAction } from '@/app/actions/update-settings';
|
|
18
|
-
import { AgentType, AgentAuthMethod, EditorType } from '@shepai/core/domain/generated/output';
|
|
19
|
-
import { getAgentTypeIcon } from '@/components/common/feature-node/agent-type-icons';
|
|
18
|
+
import { type AgentType, AgentAuthMethod, EditorType } from '@shepai/core/domain/generated/output';
|
|
20
19
|
import { getEditorTypeIcon } from '@/components/common/editor-type-icons';
|
|
20
|
+
import { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';
|
|
21
21
|
import type {
|
|
22
22
|
Settings,
|
|
23
23
|
FeatureFlags,
|
|
24
24
|
NotificationPreferences,
|
|
25
25
|
} from '@shepai/core/domain/generated/output';
|
|
26
26
|
|
|
27
|
-
const AGENT_TYPE_OPTIONS = [
|
|
28
|
-
{ value: AgentType.ClaudeCode, label: 'Claude Code' },
|
|
29
|
-
{ value: AgentType.Cursor, label: 'Cursor' },
|
|
30
|
-
{ value: AgentType.GeminiCli, label: 'Gemini CLI' },
|
|
31
|
-
{ value: AgentType.Aider, label: 'Aider' },
|
|
32
|
-
{ value: AgentType.Continue, label: 'Continue' },
|
|
33
|
-
{ value: AgentType.Dev, label: 'Dev' },
|
|
34
|
-
];
|
|
35
|
-
|
|
36
27
|
const AUTH_METHOD_OPTIONS = [
|
|
37
28
|
{ value: AgentAuthMethod.Session, label: 'Session' },
|
|
38
29
|
{ value: AgentAuthMethod.Token, label: 'Token' },
|
|
@@ -92,7 +83,7 @@ function SettingsRow({
|
|
|
92
83
|
}) {
|
|
93
84
|
return (
|
|
94
85
|
<div className="flex items-center justify-between gap-4 border-b py-3 last:border-b-0">
|
|
95
|
-
<Label htmlFor={htmlFor} className="text-sm font-normal whitespace-nowrap">
|
|
86
|
+
<Label htmlFor={htmlFor} className="cursor-pointer text-sm font-normal whitespace-nowrap">
|
|
96
87
|
{label}
|
|
97
88
|
</Label>
|
|
98
89
|
<div className="flex items-center gap-2">{children}</div>
|
|
@@ -118,7 +109,7 @@ function SelectRow({
|
|
|
118
109
|
return (
|
|
119
110
|
<SettingsRow label={label} htmlFor={id}>
|
|
120
111
|
<Select value={value} onValueChange={onChange}>
|
|
121
|
-
<SelectTrigger id={id} data-testid={testId} className="w-45">
|
|
112
|
+
<SelectTrigger id={id} data-testid={testId} className="w-45 cursor-pointer">
|
|
122
113
|
<SelectValue />
|
|
123
114
|
</SelectTrigger>
|
|
124
115
|
<SelectContent>
|
|
@@ -148,7 +139,13 @@ function SwitchRow({
|
|
|
148
139
|
}) {
|
|
149
140
|
return (
|
|
150
141
|
<SettingsRow label={label} htmlFor={id}>
|
|
151
|
-
<Switch
|
|
142
|
+
<Switch
|
|
143
|
+
id={id}
|
|
144
|
+
data-testid={testId}
|
|
145
|
+
checked={checked}
|
|
146
|
+
onCheckedChange={onChange}
|
|
147
|
+
className="cursor-pointer"
|
|
148
|
+
/>
|
|
152
149
|
</SettingsRow>
|
|
153
150
|
);
|
|
154
151
|
}
|
|
@@ -274,7 +271,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }: SettingsP
|
|
|
274
271
|
return (
|
|
275
272
|
<div data-testid="settings-page-client" className="max-w-lg">
|
|
276
273
|
<div className="flex items-center justify-between border-b pb-3">
|
|
277
|
-
<h1 className="text-
|
|
274
|
+
<h1 className="text-sm font-bold tracking-tight">Settings</h1>
|
|
278
275
|
{isPending ? <span className="text-muted-foreground text-xs">Saving...</span> : null}
|
|
279
276
|
{showSaved && !isPending ? (
|
|
280
277
|
<span className="flex items-center gap-1 text-xs text-green-600">
|
|
@@ -291,31 +288,14 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }: SettingsP
|
|
|
291
288
|
>
|
|
292
289
|
Agent
|
|
293
290
|
</h2>
|
|
294
|
-
<SettingsRow label="Agent" htmlFor="agent-
|
|
295
|
-
<
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
<SelectTrigger id="agent-type" data-testid="agent-type-select" className="w-45">
|
|
303
|
-
<SelectValue />
|
|
304
|
-
</SelectTrigger>
|
|
305
|
-
<SelectContent>
|
|
306
|
-
{AGENT_TYPE_OPTIONS.map((opt) => {
|
|
307
|
-
const Icon = getAgentTypeIcon(opt.value);
|
|
308
|
-
return (
|
|
309
|
-
<SelectItem key={opt.value} value={opt.value}>
|
|
310
|
-
<span className="flex items-center gap-2">
|
|
311
|
-
<Icon className="h-4 w-4 shrink-0" />
|
|
312
|
-
{opt.label}
|
|
313
|
-
</span>
|
|
314
|
-
</SelectItem>
|
|
315
|
-
);
|
|
316
|
-
})}
|
|
317
|
-
</SelectContent>
|
|
318
|
-
</Select>
|
|
291
|
+
<SettingsRow label="Agent & Model" htmlFor="agent-model-picker">
|
|
292
|
+
<AgentModelPicker
|
|
293
|
+
initialAgentType={agentType}
|
|
294
|
+
initialModel={settings.models.default}
|
|
295
|
+
mode="settings"
|
|
296
|
+
onAgentModelChange={(newAgent) => setAgentType(newAgent as AgentType)}
|
|
297
|
+
className="w-45"
|
|
298
|
+
/>
|
|
319
299
|
</SettingsRow>
|
|
320
300
|
<SelectRow
|
|
321
301
|
label="Authentication"
|
|
@@ -374,7 +354,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }: SettingsP
|
|
|
374
354
|
save({ environment: { defaultEditor: v as EditorType, shellPreference: shell } });
|
|
375
355
|
}}
|
|
376
356
|
>
|
|
377
|
-
<SelectTrigger
|
|
357
|
+
<SelectTrigger
|
|
358
|
+
id="default-editor"
|
|
359
|
+
data-testid="editor-select"
|
|
360
|
+
className="w-45 cursor-pointer"
|
|
361
|
+
>
|
|
378
362
|
<SelectValue />
|
|
379
363
|
</SelectTrigger>
|
|
380
364
|
<SelectContent>
|
|
@@ -39,27 +39,52 @@ export default meta;
|
|
|
39
39
|
type Story = StoryObj<typeof meta>;
|
|
40
40
|
|
|
41
41
|
const mockFeatures = [
|
|
42
|
-
{
|
|
43
|
-
|
|
42
|
+
{
|
|
43
|
+
featureId: 'feat-auth-001',
|
|
44
|
+
name: 'Auth Module',
|
|
45
|
+
status: 'action-needed' as const,
|
|
46
|
+
agentType: 'claude-code',
|
|
47
|
+
modelId: 'claude-sonnet-4-6',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
featureId: 'feat-payment-002',
|
|
51
|
+
name: 'Payment Flow',
|
|
52
|
+
status: 'action-needed' as const,
|
|
53
|
+
agentType: 'cursor',
|
|
54
|
+
modelId: 'claude-opus-4-6',
|
|
55
|
+
},
|
|
44
56
|
{
|
|
45
57
|
featureId: 'feat-dashboard-003',
|
|
46
58
|
name: 'Dashboard',
|
|
47
59
|
status: 'in-progress' as const,
|
|
48
60
|
startedAt: Date.now() - 330_000,
|
|
61
|
+
agentType: 'gemini-cli',
|
|
62
|
+
modelId: 'gemini-2.5-pro',
|
|
49
63
|
},
|
|
50
64
|
{
|
|
51
65
|
featureId: 'feat-api-004',
|
|
52
66
|
name: 'API Gateway',
|
|
53
67
|
status: 'in-progress' as const,
|
|
54
68
|
startedAt: Date.now() - 60_000,
|
|
69
|
+
agentType: 'claude-code',
|
|
70
|
+
modelId: 'claude-haiku-4-5',
|
|
55
71
|
},
|
|
56
72
|
{
|
|
57
73
|
featureId: 'feat-settings-005',
|
|
58
74
|
name: 'Settings Page',
|
|
59
75
|
status: 'done' as const,
|
|
60
76
|
duration: '2h',
|
|
77
|
+
agentType: 'claude-code',
|
|
78
|
+
modelId: 'claude-sonnet-4-6',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
featureId: 'feat-profile-006',
|
|
82
|
+
name: 'User Profile',
|
|
83
|
+
status: 'done' as const,
|
|
84
|
+
duration: '1h',
|
|
85
|
+
agentType: 'dev',
|
|
86
|
+
modelId: 'gpt-8',
|
|
61
87
|
},
|
|
62
|
-
{ featureId: 'feat-profile-006', name: 'User Profile', status: 'done' as const, duration: '1h' },
|
|
63
88
|
];
|
|
64
89
|
|
|
65
90
|
export const Default: Story = {
|
package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx
CHANGED
|
@@ -31,6 +31,8 @@ export interface FeatureItem {
|
|
|
31
31
|
status: FeatureStatus;
|
|
32
32
|
startedAt?: number;
|
|
33
33
|
duration?: string;
|
|
34
|
+
agentType?: string;
|
|
35
|
+
modelId?: string;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
export interface AppSidebarProps {
|
|
@@ -125,6 +127,8 @@ export function AppSidebar({
|
|
|
125
127
|
status={feature.status}
|
|
126
128
|
startedAt={feature.startedAt}
|
|
127
129
|
duration={feature.duration}
|
|
130
|
+
agentType={feature.agentType}
|
|
131
|
+
modelId={feature.modelId}
|
|
128
132
|
onClick={
|
|
129
133
|
onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined
|
|
130
134
|
}
|
|
@@ -55,7 +55,7 @@ function CheckboxGroup({
|
|
|
55
55
|
return (
|
|
56
56
|
<div className="flex flex-col gap-3">
|
|
57
57
|
{/* Parent checkbox */}
|
|
58
|
-
<div className="flex items-start gap-2">
|
|
58
|
+
<div className="flex cursor-pointer items-start gap-2">
|
|
59
59
|
<Checkbox
|
|
60
60
|
id={parentId}
|
|
61
61
|
className="mt-0.75"
|