@shepai/cli 1.77.2-pr240.88b3534 → 1.77.2-pr243.1fc63c3
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 +17 -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 +21 -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 +4 -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/api/agent-events/route.js +1 -1
- 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/control-center-drawer/drawer-view.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +2 -4
- 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-drawer/feature-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +0 -2
- 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/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +2 -3
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +3 -1
- 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-state-config.js +0 -4
- 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 +14 -15
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +0 -1
- 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 -23
- 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/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 +2 -2
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js +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]__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/_04968d9f._.js +3 -0
- package/web/.next/server/chunks/ssr/_04968d9f._.js.map +1 -0
- 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/_16235e5e._.js +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6e08ce21._.js +1 -1
- package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_6645f218._.js → _8dacd1e7._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_6645f218._.js.map → _8dacd1e7._.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/_ba1ec9b2._.js +3 -0
- package/web/.next/server/chunks/ssr/_ba1ec9b2._.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/{_2557e3df._.js → _e3da8cc8._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_2557e3df._.js.map → _e3da8cc8._.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/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/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/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__9191749c._.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]__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/_04968d9f._.js +3 -0
- 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/_16235e5e._.js +1 -1
- 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/_6e08ce21._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_6645f218._.js → _8dacd1e7._.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/_ba1ec9b2._.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/{_2557e3df._.js → _e3da8cc8._.js} +2 -2
- 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/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/api/agent-events/route.ts +1 -1
- 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/control-center-drawer/drawer-view.ts +2 -10
- 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-drawer/feature-drawer.stories.tsx +0 -2
- 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/derive-feature-state.ts +2 -3
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +2 -6
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +19 -24
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +43 -24
- 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/static/chunks/007be9fab4adea42.js +1 -0
- package/web/.next/static/chunks/{25a8e4460619670a.js → 34eb9cda9da722b6.js} +1 -1
- package/web/.next/static/chunks/{6205ca0c28401b31.js → 3790f4bb02b9f6e0.js} +2 -2
- package/web/.next/static/chunks/42bd17823c7f41a1.css +2 -0
- package/web/.next/static/chunks/{5ea9cc400337eeae.js → 494800b05a910e69.js} +1 -1
- package/web/.next/static/chunks/4b652ede9c20379c.js +1 -0
- package/web/.next/static/chunks/{f8e33bd4c6770071.js → 4d09dc48abcae1fd.js} +1 -1
- package/web/.next/static/chunks/51454a23ce051ec9.js +1 -0
- package/web/.next/static/chunks/{3f88555d42e6c0a5.js → 596adcd6a1f862cc.js} +1 -1
- package/web/.next/static/chunks/{98e3a7cf58fc912a.js → 672e3da3ad26005b.js} +1 -1
- package/web/.next/static/chunks/70b820a4be378635.js +1 -0
- 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/96ba74ac76fe6826.js +1 -0
- package/web/.next/static/chunks/a1ddf1f9b1435434.js +3 -0
- package/web/.next/static/chunks/b5696d211be51b4d.js +1 -0
- package/web/.next/static/chunks/c8b2868ae430a586.js +1 -0
- package/web/.next/static/chunks/dfcdd7e8249e47fd.js +1 -0
- package/web/.next/static/chunks/{89aac43287d73b02.js → ed3a602003bcb31b.js} +1 -1
- 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/0d1285175b320302.js +0 -1
- package/web/.next/static/chunks/146c0a7697bc5a5c.js +0 -1
- package/web/.next/static/chunks/16c1db929d7ed3c9.js +0 -1
- package/web/.next/static/chunks/18deef44e5e36e2b.js +0 -3
- package/web/.next/static/chunks/3479d6ae297e5410.css +0 -2
- 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/c63d1c145c5a07dc.js +0 -1
- package/web/.next/static/chunks/fc00e1b83852da4e.js +0 -1
- package/web/.next/static/chunks/fe80866e23f343eb.js +0 -1
- /package/web/.next/static/{x8A1bt8tX5vg9IpB1ksif → r7LAkVhSBzOwbRx2bcqLy}/_buildManifest.js +0 -0
- /package/web/.next/static/{x8A1bt8tX5vg9IpB1ksif → r7LAkVhSBzOwbRx2bcqLy}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{x8A1bt8tX5vg9IpB1ksif → r7LAkVhSBzOwbRx2bcqLy}/_ssgManifest.js +0 -0
|
@@ -13,9 +13,7 @@ export type FeatureNodeState =
|
|
|
13
13
|
|
|
14
14
|
export type FeatureLifecyclePhase =
|
|
15
15
|
| 'requirements'
|
|
16
|
-
| 'gathering'
|
|
17
16
|
| 'research'
|
|
18
|
-
| 'planning'
|
|
19
17
|
| 'implementation'
|
|
20
18
|
| 'review'
|
|
21
19
|
| 'deploy'
|
|
@@ -24,9 +22,7 @@ export type FeatureLifecyclePhase =
|
|
|
24
22
|
/** Human-readable display labels for lifecycle phases. */
|
|
25
23
|
export const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string> = {
|
|
26
24
|
requirements: 'REQUIREMENTS',
|
|
27
|
-
gathering: 'REQUIREMENTS',
|
|
28
25
|
research: 'RESEARCH',
|
|
29
|
-
planning: 'PLANNING',
|
|
30
26
|
implementation: 'IMPLEMENTATION',
|
|
31
27
|
review: 'REVIEW',
|
|
32
28
|
deploy: 'DEPLOY & QA',
|
|
@@ -36,9 +32,7 @@ export const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string> = {
|
|
|
36
32
|
/** Present-participle verbs for the running badge, keyed by lifecycle phase. */
|
|
37
33
|
export const lifecycleRunningVerbs: Record<FeatureLifecyclePhase, string> = {
|
|
38
34
|
requirements: 'Analyzing',
|
|
39
|
-
gathering: 'Gathering Requirements',
|
|
40
35
|
research: 'Researching',
|
|
41
|
-
planning: 'Planning',
|
|
42
36
|
implementation: 'Implementing',
|
|
43
37
|
review: 'Reviewing',
|
|
44
38
|
deploy: 'Deploying',
|
|
@@ -69,6 +63,8 @@ export interface FeatureNodeData {
|
|
|
69
63
|
errorMessage?: string;
|
|
70
64
|
/** Agent executor type (e.g. "claude-code", "cursor"). */
|
|
71
65
|
agentType?: AgentTypeValue;
|
|
66
|
+
/** LLM model identifier used for this feature's agent run. */
|
|
67
|
+
modelId?: string;
|
|
72
68
|
/** PR metadata for features with an associated pull request */
|
|
73
69
|
pr?: {
|
|
74
70
|
url: string;
|
|
@@ -83,6 +83,8 @@ const allStatesData: FeatureNodeData[] = [
|
|
|
83
83
|
lifecycle: 'implementation' as FeatureLifecyclePhase,
|
|
84
84
|
state: 'running',
|
|
85
85
|
progress: 45,
|
|
86
|
+
agentType: 'claude-code' as AgentTypeValue,
|
|
87
|
+
modelId: 'claude-sonnet-4-6',
|
|
86
88
|
repositoryPath: '/home/user/my-repo',
|
|
87
89
|
branch: 'feat/auth-module',
|
|
88
90
|
},
|
|
@@ -93,6 +95,8 @@ const allStatesData: FeatureNodeData[] = [
|
|
|
93
95
|
lifecycle: 'requirements' as FeatureLifecyclePhase,
|
|
94
96
|
state: 'action-required',
|
|
95
97
|
progress: 22,
|
|
98
|
+
agentType: 'claude-code' as AgentTypeValue,
|
|
99
|
+
modelId: 'claude-sonnet-4-6',
|
|
96
100
|
repositoryPath: '/home/user/my-repo',
|
|
97
101
|
branch: 'feat/api-rate-limiting',
|
|
98
102
|
},
|
|
@@ -103,19 +107,11 @@ const allStatesData: FeatureNodeData[] = [
|
|
|
103
107
|
lifecycle: 'implementation' as FeatureLifecyclePhase,
|
|
104
108
|
state: 'action-required',
|
|
105
109
|
progress: 40,
|
|
110
|
+
agentType: 'cursor' as AgentTypeValue,
|
|
111
|
+
modelId: 'claude-opus-4-6',
|
|
106
112
|
repositoryPath: '/home/user/my-repo',
|
|
107
113
|
branch: 'feat/data-pipeline',
|
|
108
114
|
},
|
|
109
|
-
{
|
|
110
|
-
name: 'Tech Plan Review',
|
|
111
|
-
description: 'Technical plan awaiting review',
|
|
112
|
-
featureId: '#bi4',
|
|
113
|
-
lifecycle: 'planning' as FeatureLifecyclePhase,
|
|
114
|
-
state: 'action-required',
|
|
115
|
-
progress: 25,
|
|
116
|
-
repositoryPath: '/home/user/my-repo',
|
|
117
|
-
branch: 'feat/tech-plan',
|
|
118
|
-
},
|
|
119
115
|
{
|
|
120
116
|
name: 'Merge Review',
|
|
121
117
|
description: 'PR ready for merge approval',
|
|
@@ -123,6 +119,8 @@ const allStatesData: FeatureNodeData[] = [
|
|
|
123
119
|
lifecycle: 'review' as FeatureLifecyclePhase,
|
|
124
120
|
state: 'action-required',
|
|
125
121
|
progress: 90,
|
|
122
|
+
agentType: 'gemini-cli' as AgentTypeValue,
|
|
123
|
+
modelId: 'gemini-2.5-pro',
|
|
126
124
|
repositoryPath: '/home/user/my-repo',
|
|
127
125
|
branch: 'feat/merge-review',
|
|
128
126
|
},
|
|
@@ -134,6 +132,8 @@ const allStatesData: FeatureNodeData[] = [
|
|
|
134
132
|
state: 'done',
|
|
135
133
|
progress: 100,
|
|
136
134
|
runtime: '1h 42m',
|
|
135
|
+
agentType: 'claude-code' as AgentTypeValue,
|
|
136
|
+
modelId: 'claude-sonnet-4-6',
|
|
137
137
|
repositoryPath: '/home/user/my-repo',
|
|
138
138
|
branch: 'feat/payment-gateway',
|
|
139
139
|
},
|
|
@@ -145,6 +145,8 @@ const allStatesData: FeatureNodeData[] = [
|
|
|
145
145
|
state: 'blocked',
|
|
146
146
|
progress: 20,
|
|
147
147
|
blockedBy: 'Auth Module',
|
|
148
|
+
agentType: 'claude-code' as AgentTypeValue,
|
|
149
|
+
modelId: 'claude-opus-4-6',
|
|
148
150
|
repositoryPath: '/home/user/my-repo',
|
|
149
151
|
branch: 'feat/search-index',
|
|
150
152
|
},
|
|
@@ -156,6 +158,8 @@ const allStatesData: FeatureNodeData[] = [
|
|
|
156
158
|
state: 'error',
|
|
157
159
|
progress: 30,
|
|
158
160
|
errorMessage: 'Build failed: type mismatch',
|
|
161
|
+
agentType: 'dev' as AgentTypeValue,
|
|
162
|
+
modelId: 'gpt-8',
|
|
159
163
|
repositoryPath: '/home/user/my-repo',
|
|
160
164
|
branch: 'feat/email-service',
|
|
161
165
|
},
|
|
@@ -173,9 +177,7 @@ export const AllStates: Story = {
|
|
|
173
177
|
|
|
174
178
|
const allLifecycles: FeatureLifecyclePhase[] = [
|
|
175
179
|
'requirements',
|
|
176
|
-
'gathering',
|
|
177
180
|
'research',
|
|
178
|
-
'planning',
|
|
179
181
|
'implementation',
|
|
180
182
|
'review',
|
|
181
183
|
'deploy',
|
|
@@ -214,6 +216,7 @@ const allAgentTypesData: FeatureNodeData[] = [
|
|
|
214
216
|
state: 'running',
|
|
215
217
|
progress: 50,
|
|
216
218
|
agentType: 'claude-code' as AgentTypeValue,
|
|
219
|
+
modelId: 'claude-sonnet-4-6',
|
|
217
220
|
repositoryPath: '/home/user/my-repo',
|
|
218
221
|
branch: 'feat/claude-code',
|
|
219
222
|
},
|
|
@@ -225,6 +228,7 @@ const allAgentTypesData: FeatureNodeData[] = [
|
|
|
225
228
|
state: 'running',
|
|
226
229
|
progress: 50,
|
|
227
230
|
agentType: 'cursor' as AgentTypeValue,
|
|
231
|
+
modelId: 'claude-opus-4-6',
|
|
228
232
|
repositoryPath: '/home/user/my-repo',
|
|
229
233
|
branch: 'feat/cursor',
|
|
230
234
|
},
|
|
@@ -236,6 +240,7 @@ const allAgentTypesData: FeatureNodeData[] = [
|
|
|
236
240
|
state: 'running',
|
|
237
241
|
progress: 50,
|
|
238
242
|
agentType: 'gemini-cli' as AgentTypeValue,
|
|
243
|
+
modelId: 'gemini-2.5-pro',
|
|
239
244
|
repositoryPath: '/home/user/my-repo',
|
|
240
245
|
branch: 'feat/gemini-cli',
|
|
241
246
|
},
|
|
@@ -247,6 +252,7 @@ const allAgentTypesData: FeatureNodeData[] = [
|
|
|
247
252
|
state: 'running',
|
|
248
253
|
progress: 50,
|
|
249
254
|
agentType: 'aider' as AgentTypeValue,
|
|
255
|
+
modelId: 'claude-sonnet-4-6',
|
|
250
256
|
repositoryPath: '/home/user/my-repo',
|
|
251
257
|
branch: 'feat/aider',
|
|
252
258
|
},
|
|
@@ -258,6 +264,7 @@ const allAgentTypesData: FeatureNodeData[] = [
|
|
|
258
264
|
state: 'running',
|
|
259
265
|
progress: 50,
|
|
260
266
|
agentType: 'continue' as AgentTypeValue,
|
|
267
|
+
modelId: 'claude-sonnet-4-6',
|
|
261
268
|
repositoryPath: '/home/user/my-repo',
|
|
262
269
|
branch: 'feat/continue',
|
|
263
270
|
},
|
|
@@ -338,18 +345,6 @@ export const Creating: Story = {
|
|
|
338
345
|
render: (args) => <FeatureNodeCanvas data={args} />,
|
|
339
346
|
};
|
|
340
347
|
|
|
341
|
-
export const PlanningActionRequired: Story = {
|
|
342
|
-
args: {
|
|
343
|
-
name: 'Tech Plan Review',
|
|
344
|
-
description: 'Technical planning awaiting review',
|
|
345
|
-
featureId: '#bi4',
|
|
346
|
-
lifecycle: 'planning',
|
|
347
|
-
state: 'action-required',
|
|
348
|
-
progress: 30,
|
|
349
|
-
},
|
|
350
|
-
render: (args) => <FeatureNodeCanvas data={args} />,
|
|
351
|
-
};
|
|
352
|
-
|
|
353
348
|
export const MergeReviewActionRequired: Story = {
|
|
354
349
|
args: {
|
|
355
350
|
name: 'Merge Review',
|
package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { Handle, Position } from '@xyflow/react';
|
|
5
|
-
import {
|
|
5
|
+
import { Plus, FileText, Wrench, GitMerge, Trash2, type LucideIcon } from 'lucide-react';
|
|
6
6
|
import { cn } from '@/lib/utils';
|
|
7
7
|
import {
|
|
8
8
|
Dialog,
|
|
@@ -21,7 +21,8 @@ import {
|
|
|
21
21
|
lifecycleRunningVerbs,
|
|
22
22
|
} from './feature-node-state-config';
|
|
23
23
|
import type { FeatureNodeData } from './feature-node-state-config';
|
|
24
|
-
import { getAgentTypeIcon } from './agent-type-icons';
|
|
24
|
+
import { getAgentTypeIcon, agentTypeLabels, type AgentTypeValue } from './agent-type-icons';
|
|
25
|
+
import { getModelMeta } from '@/lib/model-metadata';
|
|
25
26
|
|
|
26
27
|
function AgentIcon({ agentType, className }: { agentType?: string; className?: string }) {
|
|
27
28
|
const IconComponent = getAgentTypeIcon(agentType);
|
|
@@ -31,8 +32,7 @@ function AgentIcon({ agentType, className }: { agentType?: string; className?: s
|
|
|
31
32
|
function getBadgeIcon(data: FeatureNodeData): LucideIcon {
|
|
32
33
|
const config = featureNodeStateConfig[data.state];
|
|
33
34
|
if (data.state === 'action-required') {
|
|
34
|
-
if (data.lifecycle === 'requirements'
|
|
35
|
-
if (data.lifecycle === 'planning') return Wrench;
|
|
35
|
+
if (data.lifecycle === 'requirements') return FileText;
|
|
36
36
|
if (data.lifecycle === 'implementation') return Wrench;
|
|
37
37
|
if (data.lifecycle === 'review') return GitMerge;
|
|
38
38
|
}
|
|
@@ -45,13 +45,13 @@ function getActionRequiredBadgeClasses(data: FeatureNodeData): {
|
|
|
45
45
|
badgeBgClass: string;
|
|
46
46
|
} | null {
|
|
47
47
|
if (data.state !== 'action-required') return null;
|
|
48
|
-
if (data.lifecycle === '
|
|
48
|
+
if (data.lifecycle === 'implementation') {
|
|
49
49
|
return { badgeClass: 'text-indigo-700', badgeBgClass: 'bg-indigo-50' };
|
|
50
50
|
}
|
|
51
51
|
if (data.lifecycle === 'review') {
|
|
52
52
|
return { badgeClass: 'text-emerald-700', badgeBgClass: 'bg-emerald-50' };
|
|
53
53
|
}
|
|
54
|
-
return null; // requirements
|
|
54
|
+
return null; // requirements stays amber (default)
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function getBadgeText(data: FeatureNodeData): string {
|
|
@@ -66,10 +66,8 @@ function getBadgeText(data: FeatureNodeData): string {
|
|
|
66
66
|
case 'blocked':
|
|
67
67
|
return data.blockedBy ? `Waiting on ${data.blockedBy}` : 'Blocked';
|
|
68
68
|
case 'action-required':
|
|
69
|
-
if (data.lifecycle === 'requirements'
|
|
70
|
-
|
|
71
|
-
if (data.lifecycle === 'planning') return 'Review Technical Planning';
|
|
72
|
-
if (data.lifecycle === 'implementation') return 'Review Implementation';
|
|
69
|
+
if (data.lifecycle === 'requirements') return 'Review Product Requirements';
|
|
70
|
+
if (data.lifecycle === 'implementation') return 'Review Technical Planning';
|
|
73
71
|
if (data.lifecycle === 'review') return 'Review Merge Request';
|
|
74
72
|
return config.label;
|
|
75
73
|
case 'error':
|
|
@@ -163,7 +161,7 @@ export function FeatureNode({
|
|
|
163
161
|
selected && 'ring-primary ring-2'
|
|
164
162
|
)}
|
|
165
163
|
>
|
|
166
|
-
{/* Top row: lifecycle label +
|
|
164
|
+
{/* Top row: lifecycle label + agent icon */}
|
|
167
165
|
<div className="flex items-center justify-between">
|
|
168
166
|
<span
|
|
169
167
|
data-testid="feature-node-lifecycle-label"
|
|
@@ -171,19 +169,40 @@ export function FeatureNode({
|
|
|
171
169
|
>
|
|
172
170
|
{data.state === 'blocked' ? 'BLOCKED' : lifecycleDisplayLabels[data.lifecycle]}
|
|
173
171
|
</span>
|
|
174
|
-
{data.
|
|
175
|
-
<
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
172
|
+
{data.agentType ? (
|
|
173
|
+
<TooltipProvider>
|
|
174
|
+
<Tooltip>
|
|
175
|
+
<TooltipTrigger asChild>
|
|
176
|
+
<button
|
|
177
|
+
type="button"
|
|
178
|
+
aria-label={agentTypeLabels[data.agentType as AgentTypeValue] ?? data.agentType}
|
|
179
|
+
data-testid="feature-node-agent-badge"
|
|
180
|
+
onClick={(e) => {
|
|
181
|
+
e.stopPropagation();
|
|
182
|
+
data.onSettings?.();
|
|
183
|
+
}}
|
|
184
|
+
className={cn(
|
|
185
|
+
'nodrag -mt-1 -mr-1 p-1',
|
|
186
|
+
data.onSettings
|
|
187
|
+
? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
|
|
188
|
+
: 'cursor-default'
|
|
189
|
+
)}
|
|
190
|
+
>
|
|
191
|
+
<AgentIcon agentType={data.agentType} className="h-3.5 w-3.5" />
|
|
192
|
+
</button>
|
|
193
|
+
</TooltipTrigger>
|
|
194
|
+
<TooltipContent side="bottom">
|
|
195
|
+
<span className="font-medium">
|
|
196
|
+
{agentTypeLabels[data.agentType as AgentTypeValue] ?? data.agentType}
|
|
197
|
+
</span>
|
|
198
|
+
{data.modelId ? (
|
|
199
|
+
<span className="ml-1 opacity-70">
|
|
200
|
+
· {getModelMeta(data.modelId).displayName || data.modelId}
|
|
201
|
+
</span>
|
|
202
|
+
) : null}
|
|
203
|
+
</TooltipContent>
|
|
204
|
+
</Tooltip>
|
|
205
|
+
</TooltipProvider>
|
|
187
206
|
) : null}
|
|
188
207
|
</div>
|
|
189
208
|
|
|
@@ -86,6 +86,8 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
86
86
|
status,
|
|
87
87
|
...(d.startedAt != null && { startedAt: d.startedAt }),
|
|
88
88
|
...(d.runtime != null && { duration: d.runtime }),
|
|
89
|
+
...(d.agentType && { agentType: d.agentType }),
|
|
90
|
+
...(d.modelId && { modelId: d.modelId }),
|
|
89
91
|
};
|
|
90
92
|
})
|
|
91
93
|
.filter(Boolean) as {
|
|
@@ -94,6 +96,8 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
94
96
|
status: 'action-needed' | 'in-progress' | 'done';
|
|
95
97
|
startedAt?: number;
|
|
96
98
|
duration?: string;
|
|
99
|
+
agentType?: string;
|
|
100
|
+
modelId?: string;
|
|
97
101
|
}[];
|
|
98
102
|
|
|
99
103
|
setSidebarFeatures(sidebarItems);
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
3
|
+
import { AgentModelPicker } from './index';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof AgentModelPicker> = {
|
|
6
|
+
title: 'Features/Settings/AgentModelPicker',
|
|
7
|
+
component: AgentModelPicker,
|
|
8
|
+
parameters: { layout: 'centered' },
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
decorators: [
|
|
11
|
+
(Story) => (
|
|
12
|
+
<div className="w-80">
|
|
13
|
+
<Story />
|
|
14
|
+
</div>
|
|
15
|
+
),
|
|
16
|
+
],
|
|
17
|
+
args: {
|
|
18
|
+
onAgentModelChange: fn(),
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default meta;
|
|
23
|
+
type Story = StoryObj<typeof meta>;
|
|
24
|
+
|
|
25
|
+
export const ClaudeCodeDefault: Story = {
|
|
26
|
+
args: {
|
|
27
|
+
initialAgentType: 'claude-code',
|
|
28
|
+
initialModel: 'claude-sonnet-4-6',
|
|
29
|
+
mode: 'settings',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const CursorSelected: Story = {
|
|
34
|
+
args: {
|
|
35
|
+
initialAgentType: 'cursor',
|
|
36
|
+
initialModel: 'gpt-5.4',
|
|
37
|
+
mode: 'settings',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const GeminiCli: Story = {
|
|
42
|
+
args: {
|
|
43
|
+
initialAgentType: 'gemini-cli',
|
|
44
|
+
initialModel: 'gemini-2.5-pro',
|
|
45
|
+
mode: 'settings',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const DemoAgent: Story = {
|
|
50
|
+
args: {
|
|
51
|
+
initialAgentType: 'dev',
|
|
52
|
+
initialModel: '',
|
|
53
|
+
mode: 'settings',
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const OverrideMode: Story = {
|
|
58
|
+
args: {
|
|
59
|
+
initialAgentType: 'claude-code',
|
|
60
|
+
initialModel: 'claude-sonnet-4-6',
|
|
61
|
+
mode: 'override',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const Disabled: Story = {
|
|
66
|
+
args: {
|
|
67
|
+
initialAgentType: 'claude-code',
|
|
68
|
+
initialModel: 'claude-sonnet-4-6',
|
|
69
|
+
mode: 'settings',
|
|
70
|
+
disabled: true,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Check, ChevronLeft, ChevronRight } from 'lucide-react';
|
|
5
|
+
import { getAllAgentModels } from '@/app/actions/get-all-agent-models';
|
|
6
|
+
import type { AgentModelGroup } from '@/app/actions/get-all-agent-models';
|
|
7
|
+
import { updateAgentAndModel } from '@/app/actions/update-agent-and-model';
|
|
8
|
+
import { getAgentTypeIcon } from '@/components/common/feature-node/agent-type-icons';
|
|
9
|
+
import { getModelMeta } from '@/lib/model-metadata';
|
|
10
|
+
import { Button } from '@/components/ui/button';
|
|
11
|
+
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
|
|
12
|
+
import { cn } from '@/lib/utils';
|
|
13
|
+
|
|
14
|
+
export interface AgentModelPickerProps {
|
|
15
|
+
initialAgentType: string;
|
|
16
|
+
initialModel: string;
|
|
17
|
+
onAgentModelChange?: (agentType: string, model: string) => void;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
className?: string;
|
|
20
|
+
/** 'settings' persists to DB; 'override' only calls onAgentModelChange */
|
|
21
|
+
mode: 'settings' | 'override';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function AgentModelPicker({
|
|
25
|
+
initialAgentType,
|
|
26
|
+
initialModel,
|
|
27
|
+
onAgentModelChange,
|
|
28
|
+
disabled,
|
|
29
|
+
className,
|
|
30
|
+
mode,
|
|
31
|
+
}: AgentModelPickerProps) {
|
|
32
|
+
const [open, setOpen] = React.useState(false);
|
|
33
|
+
const [groups, setGroups] = React.useState<AgentModelGroup[]>([]);
|
|
34
|
+
const [loading, setLoading] = React.useState(true);
|
|
35
|
+
const [agentType, setAgentType] = React.useState(initialAgentType);
|
|
36
|
+
const [model, setModel] = React.useState(initialModel);
|
|
37
|
+
const [error, setError] = React.useState<string | null>(null);
|
|
38
|
+
|
|
39
|
+
// 0 = agent list visible, 1 = model list visible
|
|
40
|
+
const [level, setLevel] = React.useState(0);
|
|
41
|
+
// Which agent's models to show (kept separate from level for animation)
|
|
42
|
+
const [drillAgent, setDrillAgent] = React.useState<string | null>(null);
|
|
43
|
+
|
|
44
|
+
React.useEffect(() => {
|
|
45
|
+
getAllAgentModels()
|
|
46
|
+
.then(setGroups)
|
|
47
|
+
.finally(() => setLoading(false));
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
// Reset drill-down when popover closes
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
if (!open) {
|
|
53
|
+
const t = setTimeout(() => {
|
|
54
|
+
setLevel(0);
|
|
55
|
+
setDrillAgent(null);
|
|
56
|
+
}, 150);
|
|
57
|
+
return () => clearTimeout(t);
|
|
58
|
+
}
|
|
59
|
+
}, [open]);
|
|
60
|
+
|
|
61
|
+
const drillInto = (agent: string) => {
|
|
62
|
+
setDrillAgent(agent);
|
|
63
|
+
requestAnimationFrame(() => {
|
|
64
|
+
requestAnimationFrame(() => setLevel(1));
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const drillBack = () => {
|
|
69
|
+
setLevel(0);
|
|
70
|
+
setTimeout(() => setDrillAgent(null), 220);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const handleSelect = async (newAgentType: string, newModel: string) => {
|
|
74
|
+
setOpen(false);
|
|
75
|
+
|
|
76
|
+
if (newAgentType === agentType && newModel === model) return;
|
|
77
|
+
|
|
78
|
+
if (mode === 'override') {
|
|
79
|
+
setAgentType(newAgentType);
|
|
80
|
+
setModel(newModel);
|
|
81
|
+
onAgentModelChange?.(newAgentType, newModel);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// mode === 'settings' — optimistically update, then persist
|
|
86
|
+
const prevAgent = agentType;
|
|
87
|
+
const prevModel = model;
|
|
88
|
+
setAgentType(newAgentType);
|
|
89
|
+
setModel(newModel);
|
|
90
|
+
onAgentModelChange?.(newAgentType, newModel);
|
|
91
|
+
|
|
92
|
+
setError(null);
|
|
93
|
+
try {
|
|
94
|
+
const result = await updateAgentAndModel(newAgentType, newModel || null);
|
|
95
|
+
if (!result.ok) {
|
|
96
|
+
// Revert on failure
|
|
97
|
+
setAgentType(prevAgent);
|
|
98
|
+
setModel(prevModel);
|
|
99
|
+
onAgentModelChange?.(prevAgent, prevModel);
|
|
100
|
+
setError(result.error ?? 'Failed to save');
|
|
101
|
+
}
|
|
102
|
+
} catch {
|
|
103
|
+
setAgentType(prevAgent);
|
|
104
|
+
setModel(prevModel);
|
|
105
|
+
onAgentModelChange?.(prevAgent, prevModel);
|
|
106
|
+
setError('Failed to save');
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const isDisabled = (disabled ?? false) || loading;
|
|
111
|
+
|
|
112
|
+
const AgentIcon = getAgentTypeIcon(agentType);
|
|
113
|
+
const agentLabel = groups.find((g) => g.agentType === agentType)?.label ?? agentType;
|
|
114
|
+
const displayModel = model ? getModelMeta(model).displayName || model : agentLabel;
|
|
115
|
+
|
|
116
|
+
const activeGroup = drillAgent ? groups.find((g) => g.agentType === drillAgent) : null;
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<div className={cn('flex flex-col gap-1', className)}>
|
|
120
|
+
<Popover open={open} onOpenChange={setOpen}>
|
|
121
|
+
<PopoverTrigger asChild>
|
|
122
|
+
<Button
|
|
123
|
+
variant="outline"
|
|
124
|
+
role="combobox"
|
|
125
|
+
aria-expanded={open}
|
|
126
|
+
disabled={isDisabled}
|
|
127
|
+
className="w-auto cursor-pointer font-normal"
|
|
128
|
+
>
|
|
129
|
+
<span className="flex items-center gap-2 truncate">
|
|
130
|
+
<AgentIcon className="h-4 w-4 shrink-0" />
|
|
131
|
+
{loading ? 'Loading…' : displayModel}
|
|
132
|
+
</span>
|
|
133
|
+
</Button>
|
|
134
|
+
</PopoverTrigger>
|
|
135
|
+
<PopoverContent className="w-64 overflow-hidden p-0" align="start">
|
|
136
|
+
{/* Sliding container — both panels side by side, translateX controlled by level */}
|
|
137
|
+
<div
|
|
138
|
+
className="flex transition-transform duration-200 ease-in-out"
|
|
139
|
+
style={{ transform: `translateX(${level === 1 ? '-50%' : '0%'})`, width: '200%' }}
|
|
140
|
+
>
|
|
141
|
+
{/* ── Level 1: Agent list ── */}
|
|
142
|
+
<div className="w-1/2 shrink-0">
|
|
143
|
+
<div className="text-muted-foreground border-b px-3 py-2 text-xs font-medium">
|
|
144
|
+
Select agent
|
|
145
|
+
</div>
|
|
146
|
+
{groups.map((group) => {
|
|
147
|
+
const GroupIcon = getAgentTypeIcon(group.agentType);
|
|
148
|
+
const isActive = agentType === group.agentType;
|
|
149
|
+
const hasModels = group.models.length > 0;
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<button
|
|
153
|
+
key={group.agentType}
|
|
154
|
+
type="button"
|
|
155
|
+
className={cn(
|
|
156
|
+
'flex w-full cursor-pointer items-center gap-2.5 px-3 py-2 text-sm transition-colors',
|
|
157
|
+
'hover:bg-accent hover:text-accent-foreground',
|
|
158
|
+
isActive && 'bg-accent/50'
|
|
159
|
+
)}
|
|
160
|
+
onClick={() => {
|
|
161
|
+
if (hasModels) {
|
|
162
|
+
drillInto(group.agentType);
|
|
163
|
+
} else {
|
|
164
|
+
handleSelect(group.agentType, '');
|
|
165
|
+
}
|
|
166
|
+
}}
|
|
167
|
+
>
|
|
168
|
+
<GroupIcon className="h-4 w-4 shrink-0" />
|
|
169
|
+
<span className="flex-1 text-left">{group.label}</span>
|
|
170
|
+
{isActive && !hasModels ? (
|
|
171
|
+
<Check className="text-primary h-3.5 w-3.5 shrink-0" />
|
|
172
|
+
) : null}
|
|
173
|
+
{hasModels ? (
|
|
174
|
+
<ChevronRight className="text-muted-foreground h-3.5 w-3.5 shrink-0" />
|
|
175
|
+
) : null}
|
|
176
|
+
</button>
|
|
177
|
+
);
|
|
178
|
+
})}
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
{/* ── Level 2: Model list for selected agent ── */}
|
|
182
|
+
<div className="w-1/2 shrink-0">
|
|
183
|
+
{activeGroup ? (
|
|
184
|
+
<>
|
|
185
|
+
{/* Back header */}
|
|
186
|
+
<button
|
|
187
|
+
type="button"
|
|
188
|
+
className="text-muted-foreground hover:text-foreground flex w-full cursor-pointer items-center gap-1.5 border-b px-3 py-2 text-xs font-medium transition-colors"
|
|
189
|
+
onClick={drillBack}
|
|
190
|
+
>
|
|
191
|
+
<ChevronLeft className="h-3.5 w-3.5" />
|
|
192
|
+
{activeGroup.label}
|
|
193
|
+
</button>
|
|
194
|
+
|
|
195
|
+
{/* Model items */}
|
|
196
|
+
{activeGroup.models.map((m) => {
|
|
197
|
+
const isSelected = agentType === activeGroup.agentType && model === m.id;
|
|
198
|
+
return (
|
|
199
|
+
<button
|
|
200
|
+
key={m.id}
|
|
201
|
+
type="button"
|
|
202
|
+
className={cn(
|
|
203
|
+
'flex w-full cursor-pointer items-center gap-3 px-3 py-2 text-left transition-colors',
|
|
204
|
+
'hover:bg-accent hover:text-accent-foreground',
|
|
205
|
+
isSelected && 'bg-accent/50'
|
|
206
|
+
)}
|
|
207
|
+
onClick={() => handleSelect(activeGroup.agentType, m.id)}
|
|
208
|
+
>
|
|
209
|
+
<div className="flex min-w-0 flex-1 flex-col">
|
|
210
|
+
<span className="text-sm font-medium">{m.displayName}</span>
|
|
211
|
+
<span className="text-muted-foreground text-xs">{m.description}</span>
|
|
212
|
+
</div>
|
|
213
|
+
{isSelected ? (
|
|
214
|
+
<Check className="text-primary h-3.5 w-3.5 shrink-0" />
|
|
215
|
+
) : null}
|
|
216
|
+
</button>
|
|
217
|
+
);
|
|
218
|
+
})}
|
|
219
|
+
</>
|
|
220
|
+
) : null}
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</PopoverContent>
|
|
224
|
+
</Popover>
|
|
225
|
+
{Boolean(error) && <p className="text-destructive text-sm">{error}</p>}
|
|
226
|
+
</div>
|
|
227
|
+
);
|
|
228
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
3
|
+
import { ModelPicker } from './index';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof ModelPicker> = {
|
|
6
|
+
title: 'Features/Settings/ModelPicker',
|
|
7
|
+
component: ModelPicker,
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'centered',
|
|
10
|
+
},
|
|
11
|
+
tags: ['autodocs'],
|
|
12
|
+
decorators: [
|
|
13
|
+
(Story) => (
|
|
14
|
+
<div className="w-80">
|
|
15
|
+
<Story />
|
|
16
|
+
</div>
|
|
17
|
+
),
|
|
18
|
+
],
|
|
19
|
+
args: {
|
|
20
|
+
onModelChange: fn(),
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default meta;
|
|
25
|
+
type Story = StoryObj<typeof meta>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Default state — current model is claude-sonnet-4-6, the advertised list
|
|
29
|
+
* for claude-code is populated from the mock server action.
|
|
30
|
+
*/
|
|
31
|
+
export const Default: Story = {
|
|
32
|
+
args: {
|
|
33
|
+
initialModel: 'claude-sonnet-4-6',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Custom model — a free-text identifier not present in the advertised list.
|
|
39
|
+
* Demonstrates that the combobox accepts arbitrary strings.
|
|
40
|
+
*/
|
|
41
|
+
export const CustomModel: Story = {
|
|
42
|
+
args: {
|
|
43
|
+
initialModel: 'claude-opus-4-7-experimental',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Disabled state — picker is non-interactive (e.g. during form submission).
|
|
49
|
+
*/
|
|
50
|
+
export const Disabled: Story = {
|
|
51
|
+
args: {
|
|
52
|
+
initialModel: 'claude-sonnet-4-6',
|
|
53
|
+
disabled: true,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Opus selected — verifies the checkmark appears on the right item.
|
|
59
|
+
*/
|
|
60
|
+
export const OpusSelected: Story = {
|
|
61
|
+
args: {
|
|
62
|
+
initialModel: 'claude-opus-4-6',
|
|
63
|
+
},
|
|
64
|
+
};
|