@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,12 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { AgentModelPicker } from './index.js';
|
|
3
|
+
declare const meta: Meta<typeof AgentModelPicker>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof meta>;
|
|
6
|
+
export declare const ClaudeCodeDefault: Story;
|
|
7
|
+
export declare const CursorSelected: Story;
|
|
8
|
+
export declare const GeminiCli: Story;
|
|
9
|
+
export declare const DemoAgent: Story;
|
|
10
|
+
export declare const OverrideMode: Story;
|
|
11
|
+
export declare const Disabled: Story;
|
|
12
|
+
//# sourceMappingURL=AgentModelPicker.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentModelPicker.stories.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAevC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
3
|
+
import { AgentModelPicker } from './index.js';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'Features/Settings/AgentModelPicker',
|
|
6
|
+
component: AgentModelPicker,
|
|
7
|
+
parameters: { layout: 'centered' },
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
decorators: [
|
|
10
|
+
(Story) => (_jsx("div", { className: "w-80", children: _jsx(Story, {}) })),
|
|
11
|
+
],
|
|
12
|
+
args: {
|
|
13
|
+
onAgentModelChange: fn(),
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export default meta;
|
|
17
|
+
export const ClaudeCodeDefault = {
|
|
18
|
+
args: {
|
|
19
|
+
initialAgentType: 'claude-code',
|
|
20
|
+
initialModel: 'claude-sonnet-4-6',
|
|
21
|
+
mode: 'settings',
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export const CursorSelected = {
|
|
25
|
+
args: {
|
|
26
|
+
initialAgentType: 'cursor',
|
|
27
|
+
initialModel: 'gpt-5.4',
|
|
28
|
+
mode: 'settings',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
export const GeminiCli = {
|
|
32
|
+
args: {
|
|
33
|
+
initialAgentType: 'gemini-cli',
|
|
34
|
+
initialModel: 'gemini-2.5-pro',
|
|
35
|
+
mode: 'settings',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
export const DemoAgent = {
|
|
39
|
+
args: {
|
|
40
|
+
initialAgentType: 'dev',
|
|
41
|
+
initialModel: '',
|
|
42
|
+
mode: 'settings',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
export const OverrideMode = {
|
|
46
|
+
args: {
|
|
47
|
+
initialAgentType: 'claude-code',
|
|
48
|
+
initialModel: 'claude-sonnet-4-6',
|
|
49
|
+
mode: 'override',
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
export const Disabled = {
|
|
53
|
+
args: {
|
|
54
|
+
initialAgentType: 'claude-code',
|
|
55
|
+
initialModel: 'claude-sonnet-4-6',
|
|
56
|
+
mode: 'settings',
|
|
57
|
+
disabled: true,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface AgentModelPickerProps {
|
|
2
|
+
initialAgentType: string;
|
|
3
|
+
initialModel: string;
|
|
4
|
+
onAgentModelChange?: (agentType: string, model: string) => void;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
className?: string;
|
|
7
|
+
/** 'settings' persists to DB; 'override' only calls onAgentModelChange */
|
|
8
|
+
mode: 'settings' | 'override';
|
|
9
|
+
}
|
|
10
|
+
export declare function AgentModelPicker({ initialAgentType, initialModel, onAgentModelChange, disabled, className, mode, }: AgentModelPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,IAAI,GACL,EAAE,qBAAqB,2CAqMvB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Check, ChevronLeft, ChevronRight } from 'lucide-react';
|
|
5
|
+
import { getAllAgentModels } from '../../../../app/actions/get-all-agent-models.js';
|
|
6
|
+
import { updateAgentAndModel } from '../../../../app/actions/update-agent-and-model.js';
|
|
7
|
+
import { getAgentTypeIcon } from '../../../common/feature-node/agent-type-icons.js';
|
|
8
|
+
import { getModelMeta } from '../../../../lib/model-metadata.js';
|
|
9
|
+
import { Button } from '../../../ui/button.js';
|
|
10
|
+
import { Popover, PopoverContent, PopoverTrigger } from '../../../ui/popover.js';
|
|
11
|
+
import { cn } from '../../../../lib/utils.js';
|
|
12
|
+
export function AgentModelPicker({ initialAgentType, initialModel, onAgentModelChange, disabled, className, mode, }) {
|
|
13
|
+
const [open, setOpen] = React.useState(false);
|
|
14
|
+
const [groups, setGroups] = React.useState([]);
|
|
15
|
+
const [loading, setLoading] = React.useState(true);
|
|
16
|
+
const [agentType, setAgentType] = React.useState(initialAgentType);
|
|
17
|
+
const [model, setModel] = React.useState(initialModel);
|
|
18
|
+
const [error, setError] = React.useState(null);
|
|
19
|
+
// 0 = agent list visible, 1 = model list visible
|
|
20
|
+
const [level, setLevel] = React.useState(0);
|
|
21
|
+
// Which agent's models to show (kept separate from level for animation)
|
|
22
|
+
const [drillAgent, setDrillAgent] = React.useState(null);
|
|
23
|
+
React.useEffect(() => {
|
|
24
|
+
getAllAgentModels()
|
|
25
|
+
.then(setGroups)
|
|
26
|
+
.finally(() => setLoading(false));
|
|
27
|
+
}, []);
|
|
28
|
+
// Reset drill-down when popover closes
|
|
29
|
+
React.useEffect(() => {
|
|
30
|
+
if (!open) {
|
|
31
|
+
const t = setTimeout(() => {
|
|
32
|
+
setLevel(0);
|
|
33
|
+
setDrillAgent(null);
|
|
34
|
+
}, 150);
|
|
35
|
+
return () => clearTimeout(t);
|
|
36
|
+
}
|
|
37
|
+
}, [open]);
|
|
38
|
+
const drillInto = (agent) => {
|
|
39
|
+
setDrillAgent(agent);
|
|
40
|
+
requestAnimationFrame(() => {
|
|
41
|
+
requestAnimationFrame(() => setLevel(1));
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const drillBack = () => {
|
|
45
|
+
setLevel(0);
|
|
46
|
+
setTimeout(() => setDrillAgent(null), 220);
|
|
47
|
+
};
|
|
48
|
+
const handleSelect = async (newAgentType, newModel) => {
|
|
49
|
+
setOpen(false);
|
|
50
|
+
if (newAgentType === agentType && newModel === model)
|
|
51
|
+
return;
|
|
52
|
+
if (mode === 'override') {
|
|
53
|
+
setAgentType(newAgentType);
|
|
54
|
+
setModel(newModel);
|
|
55
|
+
onAgentModelChange?.(newAgentType, newModel);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// mode === 'settings' — optimistically update, then persist
|
|
59
|
+
const prevAgent = agentType;
|
|
60
|
+
const prevModel = model;
|
|
61
|
+
setAgentType(newAgentType);
|
|
62
|
+
setModel(newModel);
|
|
63
|
+
onAgentModelChange?.(newAgentType, newModel);
|
|
64
|
+
setError(null);
|
|
65
|
+
try {
|
|
66
|
+
const result = await updateAgentAndModel(newAgentType, newModel || null);
|
|
67
|
+
if (!result.ok) {
|
|
68
|
+
// Revert on failure
|
|
69
|
+
setAgentType(prevAgent);
|
|
70
|
+
setModel(prevModel);
|
|
71
|
+
onAgentModelChange?.(prevAgent, prevModel);
|
|
72
|
+
setError(result.error ?? 'Failed to save');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
setAgentType(prevAgent);
|
|
77
|
+
setModel(prevModel);
|
|
78
|
+
onAgentModelChange?.(prevAgent, prevModel);
|
|
79
|
+
setError('Failed to save');
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const isDisabled = (disabled ?? false) || loading;
|
|
83
|
+
const AgentIcon = getAgentTypeIcon(agentType);
|
|
84
|
+
const agentLabel = groups.find((g) => g.agentType === agentType)?.label ?? agentType;
|
|
85
|
+
const displayModel = model ? getModelMeta(model).displayName || model : agentLabel;
|
|
86
|
+
const activeGroup = drillAgent ? groups.find((g) => g.agentType === drillAgent) : null;
|
|
87
|
+
return (_jsxs("div", { className: cn('flex flex-col gap-1', className), children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", role: "combobox", "aria-expanded": open, disabled: isDisabled, className: "w-auto cursor-pointer font-normal", children: _jsxs("span", { className: "flex items-center gap-2 truncate", children: [_jsx(AgentIcon, { className: "h-4 w-4 shrink-0" }), loading ? 'Loading…' : displayModel] }) }) }), _jsx(PopoverContent, { className: "w-64 overflow-hidden p-0", align: "start", children: _jsxs("div", { className: "flex transition-transform duration-200 ease-in-out", style: { transform: `translateX(${level === 1 ? '-50%' : '0%'})`, width: '200%' }, children: [_jsxs("div", { className: "w-1/2 shrink-0", children: [_jsx("div", { className: "text-muted-foreground border-b px-3 py-2 text-xs font-medium", children: "Select agent" }), groups.map((group) => {
|
|
88
|
+
const GroupIcon = getAgentTypeIcon(group.agentType);
|
|
89
|
+
const isActive = agentType === group.agentType;
|
|
90
|
+
const hasModels = group.models.length > 0;
|
|
91
|
+
return (_jsxs("button", { type: "button", className: cn('flex w-full cursor-pointer items-center gap-2.5 px-3 py-2 text-sm transition-colors', 'hover:bg-accent hover:text-accent-foreground', isActive && 'bg-accent/50'), onClick: () => {
|
|
92
|
+
if (hasModels) {
|
|
93
|
+
drillInto(group.agentType);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
handleSelect(group.agentType, '');
|
|
97
|
+
}
|
|
98
|
+
}, children: [_jsx(GroupIcon, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "flex-1 text-left", children: group.label }), isActive && !hasModels ? (_jsx(Check, { className: "text-primary h-3.5 w-3.5 shrink-0" })) : null, hasModels ? (_jsx(ChevronRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" })) : null] }, group.agentType));
|
|
99
|
+
})] }), _jsx("div", { className: "w-1/2 shrink-0", children: activeGroup ? (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", 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", onClick: drillBack, children: [_jsx(ChevronLeft, { className: "h-3.5 w-3.5" }), activeGroup.label] }), activeGroup.models.map((m) => {
|
|
100
|
+
const isSelected = agentType === activeGroup.agentType && model === m.id;
|
|
101
|
+
return (_jsxs("button", { type: "button", className: cn('flex w-full cursor-pointer items-center gap-3 px-3 py-2 text-left transition-colors', 'hover:bg-accent hover:text-accent-foreground', isSelected && 'bg-accent/50'), onClick: () => handleSelect(activeGroup.agentType, m.id), children: [_jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("span", { className: "text-sm font-medium", children: m.displayName }), _jsx("span", { className: "text-muted-foreground text-xs", children: m.description })] }), isSelected ? (_jsx(Check, { className: "text-primary h-3.5 w-3.5 shrink-0" })) : null] }, m.id));
|
|
102
|
+
})] })) : null })] }) })] }), Boolean(error) && _jsx("p", { className: "text-destructive text-sm", children: error })] }));
|
|
103
|
+
}
|
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
|
+
}
|
package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAe9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6GD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,uBAAuB,2CAyhB7F"}
|
|
@@ -9,17 +9,9 @@ import { Button } from '../../ui/button.js';
|
|
|
9
9
|
import { Switch } from '../../ui/switch.js';
|
|
10
10
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
|
|
11
11
|
import { updateSettingsAction } from '../../../app/actions/update-settings.js';
|
|
12
|
-
import {
|
|
13
|
-
import { getAgentTypeIcon } from '../../common/feature-node/agent-type-icons.js';
|
|
12
|
+
import { AgentAuthMethod, EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
14
13
|
import { getEditorTypeIcon } from '../../common/editor-type-icons.js';
|
|
15
|
-
|
|
16
|
-
{ value: AgentType.ClaudeCode, label: 'Claude Code' },
|
|
17
|
-
{ value: AgentType.Cursor, label: 'Cursor' },
|
|
18
|
-
{ value: AgentType.GeminiCli, label: 'Gemini CLI' },
|
|
19
|
-
{ value: AgentType.Aider, label: 'Aider' },
|
|
20
|
-
{ value: AgentType.Continue, label: 'Continue' },
|
|
21
|
-
{ value: AgentType.Dev, label: 'Dev' },
|
|
22
|
-
];
|
|
14
|
+
import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
|
|
23
15
|
const AUTH_METHOD_OPTIONS = [
|
|
24
16
|
{ value: AgentAuthMethod.Session, label: 'Session' },
|
|
25
17
|
{ value: AgentAuthMethod.Token, label: 'Token' },
|
|
@@ -54,13 +46,13 @@ function useSaveIndicator() {
|
|
|
54
46
|
return { isPending, showSaved, save };
|
|
55
47
|
}
|
|
56
48
|
function SettingsRow({ label, htmlFor, children, }) {
|
|
57
|
-
return (_jsxs("div", { className: "flex items-center justify-between gap-4 border-b py-3 last:border-b-0", children: [_jsx(Label, { htmlFor: htmlFor, className: "text-sm font-normal whitespace-nowrap", children: label }), _jsx("div", { className: "flex items-center gap-2", children: children })] }));
|
|
49
|
+
return (_jsxs("div", { className: "flex items-center justify-between gap-4 border-b py-3 last:border-b-0", children: [_jsx(Label, { htmlFor: htmlFor, className: "cursor-pointer text-sm font-normal whitespace-nowrap", children: label }), _jsx("div", { className: "flex items-center gap-2", children: children })] }));
|
|
58
50
|
}
|
|
59
51
|
function SelectRow({ label, id, testId, value, options, onChange, }) {
|
|
60
|
-
return (_jsx(SettingsRow, { label: label, htmlFor: id, children: _jsxs(Select, { value: value, onValueChange: onChange, children: [_jsx(SelectTrigger, { id: id, "data-testid": testId, className: "w-45", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: options.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }));
|
|
52
|
+
return (_jsx(SettingsRow, { label: label, htmlFor: id, children: _jsxs(Select, { value: value, onValueChange: onChange, children: [_jsx(SelectTrigger, { id: id, "data-testid": testId, className: "w-45 cursor-pointer", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: options.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }));
|
|
61
53
|
}
|
|
62
54
|
function SwitchRow({ label, id, testId, checked, onChange, }) {
|
|
63
|
-
return (_jsx(SettingsRow, { label: label, htmlFor: id, children: _jsx(Switch, { id: id, "data-testid": testId, checked: checked, onCheckedChange: onChange }) }));
|
|
55
|
+
return (_jsx(SettingsRow, { label: label, htmlFor: id, children: _jsx(Switch, { id: id, "data-testid": testId, checked: checked, onCheckedChange: onChange, className: "cursor-pointer" }) }));
|
|
64
56
|
}
|
|
65
57
|
export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
|
|
66
58
|
const { isPending, showSaved, save } = useSaveIndicator();
|
|
@@ -141,13 +133,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
|
|
|
141
133
|
},
|
|
142
134
|
};
|
|
143
135
|
}
|
|
144
|
-
return (_jsxs("div", { "data-testid": "settings-page-client", className: "max-w-lg", children: [_jsxs("div", { className: "flex items-center justify-between border-b pb-3", children: [_jsx("h1", { className: "text-
|
|
145
|
-
setAgentType(v);
|
|
146
|
-
save(buildAgentPayload({ type: v }));
|
|
147
|
-
}, children: [_jsx(SelectTrigger, { id: "agent-type", "data-testid": "agent-type-select", className: "w-45", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: AGENT_TYPE_OPTIONS.map((opt) => {
|
|
148
|
-
const Icon = getAgentTypeIcon(opt.value);
|
|
149
|
-
return (_jsx(SelectItem, { value: opt.value, children: _jsxs("span", { className: "flex items-center gap-2", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), opt.label] }) }, opt.value));
|
|
150
|
-
}) })] }) }), _jsx(SelectRow, { label: "Authentication", id: "auth-method", testId: "auth-method-select", value: authMethod, options: AUTH_METHOD_OPTIONS, onChange: (v) => {
|
|
136
|
+
return (_jsxs("div", { "data-testid": "settings-page-client", className: "max-w-lg", children: [_jsxs("div", { className: "flex items-center justify-between border-b pb-3", children: [_jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Settings" }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsxs("div", { children: [_jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "agent-settings-section", children: "Agent" }), _jsx(SettingsRow, { label: "Agent & Model", htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-45" }) }), _jsx(SelectRow, { label: "Authentication", id: "auth-method", testId: "auth-method-select", value: authMethod, options: AUTH_METHOD_OPTIONS, onChange: (v) => {
|
|
151
137
|
setAuthMethod(v);
|
|
152
138
|
save(buildAgentPayload({ authMethod: v }));
|
|
153
139
|
} }), authMethod === AgentAuthMethod.Token && (_jsx(SettingsRow, { label: "API Token", htmlFor: "agent-token", children: _jsxs("div", { className: "relative w-45", children: [_jsx(Input, { id: "agent-token", "data-testid": "agent-token-input", type: showToken ? 'text' : 'password', value: token, onChange: (e) => setToken(e.target.value), onBlur: () => {
|
|
@@ -157,7 +143,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
|
|
|
157
143
|
}, placeholder: "Enter token", className: "pr-8" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "absolute top-0 right-0 h-full px-2 hover:bg-transparent", onClick: () => setShowToken(!showToken), "data-testid": "toggle-token-visibility", "aria-label": showToken ? 'Hide token' : 'Show token', children: showToken ? _jsx(EyeOff, { className: "h-3 w-3" }) : _jsx(Eye, { className: "h-3 w-3" }) })] }) })), _jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "environment-settings-section", children: "Environment" }), _jsx(SettingsRow, { label: "Editor", htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
|
|
158
144
|
setEditor(v);
|
|
159
145
|
save({ environment: { defaultEditor: v, shellPreference: shell } });
|
|
160
|
-
}, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", className: "w-45", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => {
|
|
146
|
+
}, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", className: "w-45 cursor-pointer", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => {
|
|
161
147
|
const Icon = getEditorTypeIcon(opt.value);
|
|
162
148
|
return (_jsx(SelectItem, { value: opt.value, children: _jsxs("span", { className: "flex items-center gap-2", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), opt.label] }) }, opt.value));
|
|
163
149
|
}) })] }) }), _jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "workflow-settings-section", children: "Workflow" }), _jsx(SwitchRow, { label: "Open PR on complete", id: "open-pr", testId: "switch-open-pr", checked: openPr, onChange: (v) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,EAAE,eAAe,2CA6GjB"}
|
|
@@ -30,5 +30,5 @@ export function AppSidebar({ features, featureFlags, onNewFeature, onFeatureClic
|
|
|
30
30
|
'min-w-0 overflow-hidden transition-opacity duration-200 ease-out',
|
|
31
31
|
'[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
|
|
32
32
|
expandedVisible ? 'opacity-100' : 'opacity-0',
|
|
33
|
-
].join(' '), children: [_jsx(SidebarSectionHeader, { label: "Features" }), _jsx(ScrollArea, { children: grouped.map(({ key, label, items }) => items.length > 0 ? (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, key)) : null) })] })) : null }), _jsx(SidebarFooter, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { onClick: onNewFeature, tooltip: "New feature", children: [_jsx(Plus, {}), _jsx("span", { children: "New feature" })] }) }) }) }), _jsx(SidebarRail, {})] }));
|
|
33
|
+
].join(' '), children: [_jsx(SidebarSectionHeader, { label: "Features" }), _jsx(ScrollArea, { children: grouped.map(({ key, label, items }) => items.length > 0 ? (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, agentType: feature.agentType, modelId: feature.modelId, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, key)) : null) })] })) : null }), _jsx(SidebarFooter, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { onClick: onNewFeature, tooltip: "New feature", children: [_jsx(Plus, {}), _jsx("span", { children: "New feature" })] }) }) }) }), _jsx(SidebarRail, {})] }));
|
|
34
34
|
}
|
package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAQ3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAQ3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAmDnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAiB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC"}
|
|
@@ -21,27 +21,52 @@ const meta = {
|
|
|
21
21
|
};
|
|
22
22
|
export default meta;
|
|
23
23
|
const mockFeatures = [
|
|
24
|
-
{
|
|
25
|
-
|
|
24
|
+
{
|
|
25
|
+
featureId: 'feat-auth-001',
|
|
26
|
+
name: 'Auth Module',
|
|
27
|
+
status: 'action-needed',
|
|
28
|
+
agentType: 'claude-code',
|
|
29
|
+
modelId: 'claude-sonnet-4-6',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
featureId: 'feat-payment-002',
|
|
33
|
+
name: 'Payment Flow',
|
|
34
|
+
status: 'action-needed',
|
|
35
|
+
agentType: 'cursor',
|
|
36
|
+
modelId: 'claude-opus-4-6',
|
|
37
|
+
},
|
|
26
38
|
{
|
|
27
39
|
featureId: 'feat-dashboard-003',
|
|
28
40
|
name: 'Dashboard',
|
|
29
41
|
status: 'in-progress',
|
|
30
42
|
startedAt: Date.now() - 330_000,
|
|
43
|
+
agentType: 'gemini-cli',
|
|
44
|
+
modelId: 'gemini-2.5-pro',
|
|
31
45
|
},
|
|
32
46
|
{
|
|
33
47
|
featureId: 'feat-api-004',
|
|
34
48
|
name: 'API Gateway',
|
|
35
49
|
status: 'in-progress',
|
|
36
50
|
startedAt: Date.now() - 60_000,
|
|
51
|
+
agentType: 'claude-code',
|
|
52
|
+
modelId: 'claude-haiku-4-5',
|
|
37
53
|
},
|
|
38
54
|
{
|
|
39
55
|
featureId: 'feat-settings-005',
|
|
40
56
|
name: 'Settings Page',
|
|
41
57
|
status: 'done',
|
|
42
58
|
duration: '2h',
|
|
59
|
+
agentType: 'claude-code',
|
|
60
|
+
modelId: 'claude-sonnet-4-6',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
featureId: 'feat-profile-006',
|
|
64
|
+
name: 'User Profile',
|
|
65
|
+
status: 'done',
|
|
66
|
+
duration: '1h',
|
|
67
|
+
agentType: 'dev',
|
|
68
|
+
modelId: 'gpt-8',
|
|
43
69
|
},
|
|
44
|
-
{ featureId: 'feat-profile-006', name: 'User Profile', status: 'done', duration: '1h' },
|
|
45
70
|
];
|
|
46
71
|
export const Default = {
|
|
47
72
|
args: {
|
|
@@ -3,6 +3,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { Checkbox } from '../ui/checkbox.js';
|
|
4
4
|
import { Label } from '../ui/label.js';
|
|
5
5
|
function CheckboxGroupItem({ id, label, description, checked, onCheckedChange, disabled, }) {
|
|
6
|
-
return (_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Checkbox, { id: id, className: "mt-0.75", checked: checked, onCheckedChange: (v) => onCheckedChange(v === true), disabled: disabled }), _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx(Label, { htmlFor: id, className: "cursor-pointer text-sm font-medium", children: label }), description ? (_jsx(Label, { htmlFor: id, className: "text-muted-foreground cursor-pointer text-xs font-normal", children: description })) : null] })] }));
|
|
6
|
+
return (_jsxs("div", { className: "flex cursor-pointer items-start gap-2", children: [_jsx(Checkbox, { id: id, className: "mt-0.75", checked: checked, onCheckedChange: (v) => onCheckedChange(v === true), disabled: disabled }), _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx(Label, { htmlFor: id, className: "cursor-pointer text-sm font-medium", children: label }), description ? (_jsx(Label, { htmlFor: id, className: "text-muted-foreground cursor-pointer text-xs font-normal", children: description })) : null] })] }));
|
|
7
7
|
}
|
|
8
8
|
export { CheckboxGroupItem };
|
|
@@ -19,6 +19,6 @@ function CheckboxGroup({ label, description, parentAriaLabel, options, value, on
|
|
|
19
19
|
onValueChange({ ...value, [id]: checked });
|
|
20
20
|
};
|
|
21
21
|
const parentId = `${label.toLowerCase().replace(/\s+/g, '-')}-group`;
|
|
22
|
-
return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Checkbox, { id: parentId, className: "mt-0.75", checked: parentIndeterminate ? 'indeterminate' : parentChecked, onCheckedChange: handleParentToggle, disabled: disabled, "aria-label": parentAriaLabel ?? `${label} select all` }), _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx(Label, { htmlFor: parentId, className: "cursor-pointer text-sm font-medium", children: label }), description ? (_jsx(Label, { htmlFor: parentId, className: "text-muted-foreground cursor-pointer text-xs font-normal", children: description })) : null] })] }), _jsx("div", { className: "flex flex-col gap-3 pl-6", children: options.map((option) => (_jsx(CheckboxGroupItem, { id: option.id, label: option.label, description: option.description, checked: value[option.id] ?? false, onCheckedChange: (checked) => handleItemChange(option.id, checked), disabled: disabled }, option.id))) })] }));
|
|
22
|
+
return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex cursor-pointer items-start gap-2", children: [_jsx(Checkbox, { id: parentId, className: "mt-0.75", checked: parentIndeterminate ? 'indeterminate' : parentChecked, onCheckedChange: handleParentToggle, disabled: disabled, "aria-label": parentAriaLabel ?? `${label} select all` }), _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx(Label, { htmlFor: parentId, className: "cursor-pointer text-sm font-medium", children: label }), description ? (_jsx(Label, { htmlFor: parentId, className: "text-muted-foreground cursor-pointer text-xs font-normal", children: description })) : null] })] }), _jsx("div", { className: "flex flex-col gap-3 pl-6", children: options.map((option) => (_jsx(CheckboxGroupItem, { id: option.id, label: option.label, description: option.description, checked: value[option.id] ?? false, onCheckedChange: (checked) => handleItemChange(option.id, checked), disabled: disabled }, option.id))) })] }));
|
|
23
23
|
}
|
|
24
24
|
export { CheckboxGroup };
|
|
@@ -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"}
|