@shepai/cli 1.92.0 → 1.92.1-pr278.e659c75
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/dist/packages/core/src/application/ports/output/agents/agent-registry.interface.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/agents/agent-registry.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/run-agent.use-case.js +2 -2
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +24 -8
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.d.ts +3 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.js +43 -11
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.d.ts +1 -3
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.js +19 -6
- package/dist/src/presentation/cli/index.js +2 -1
- package/dist/src/presentation/web/app/actions/check-agent-tool.d.ts +9 -0
- package/dist/src/presentation/web/app/actions/check-agent-tool.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/check-agent-tool.js +28 -0
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +11 -2
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts +6 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +135 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.d.ts +7 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.js +20 -0
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +77 -62
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
- 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]/[tab]/page/server-reference-manifest.json +87 -42
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +87 -42
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +73 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +77 -62
- package/web/.next/server/app/(dashboard)/create/page.js +2 -2
- 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]/[tab]/page/server-reference-manifest.json +87 -42
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +87 -42
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +73 -28
- package/web/.next/server/app/(dashboard)/page.js +2 -2
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +73 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- 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/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/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_2b65878f._.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_2b65878f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_6ba7eb21._.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_6ba7eb21._.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_002ab1c0.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_002ab1c0.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_1bab40be.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_1bab40be.js.map +1 -0
- 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]__17143953._.js → [root-of-the-server]__22751bba._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9de266fa._.js.map → [root-of-the-server]__22751bba._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__45aad79d._.js → [root-of-the-server]__31fc8960._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__5cc4752a._.js.map → [root-of-the-server]__31fc8960._.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]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7b49fcb3._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7b49fcb3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__5cc4752a._.js → [root-of-the-server]__9497d008._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__45aad79d._.js.map → [root-of-the-server]__9497d008._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9de266fa._.js → [root-of-the-server]__fb487740._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__17143953._.js.map → [root-of-the-server]__fb487740._.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/_0901de1b._.js +3 -0
- package/web/.next/server/chunks/ssr/_0901de1b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_12259d8f._.js +3 -0
- package/web/.next/server/chunks/ssr/_12259d8f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_25e25a5c._.js +3 -0
- package/web/.next/server/chunks/ssr/_25e25a5c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_b31870c9._.js → _42d717e9._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_b31870c9._.js.map → _42d717e9._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.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/src_presentation_web_3a8fc63d._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_3a8fc63d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_1695630c.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_1695630c.js.map +1 -0
- 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_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
- 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_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f16e6874._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_f16e6874._.js.map +1 -0
- 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 +411 -242
- package/web/.next/static/chunks/10fa2792235ec990.js +1 -0
- package/web/.next/static/chunks/{a8ef40f9e1dd65a1.js → 1204eca6bcfa0d91.js} +1 -1
- package/web/.next/static/chunks/{6c8e83b9a001e9f6.js → 22ce70698a96441b.js} +1 -1
- package/web/.next/static/chunks/37b4993507880f84.css +2 -0
- package/web/.next/static/chunks/{1178ab163c46f638.js → 5ec5b2d125fcf404.js} +2 -2
- package/web/.next/static/chunks/{1fc219a4c715e4e5.js → 76d20d5cc5750310.js} +1 -1
- package/web/.next/static/chunks/7b3210ed80a750a4.js +1 -0
- package/web/.next/static/chunks/{641f22e428fcb3f9.js → 82bc40eb13750b22.js} +1 -1
- package/web/.next/static/chunks/{a5d2d001031a0d3c.js → 857b67d726d491be.js} +1 -1
- package/web/.next/static/chunks/{91cc5983165efe3c.js → 980d70fe7dd93db1.js} +1 -1
- package/web/.next/static/chunks/9e64c6e926a5fc72.js +1 -0
- package/web/.next/static/chunks/b272ac93b52dceeb.js +1 -0
- package/web/.next/static/chunks/b9aa44f4ae7cff2c.js +1 -0
- package/web/.next/static/chunks/d517923e1f743a20.js +1 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_81a06555._.js +0 -3
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_81a06555._.js.map +0 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +0 -3
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_21c75883._.js +0 -3
- package/web/.next/server/chunks/ssr/_21c75883._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3533fed7._.js +0 -3
- package/web/.next/server/chunks/ssr/_3533fed7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a5c23e45._.js +0 -3
- package/web/.next/server/chunks/ssr/_a5c23e45._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f50485a5._.js +0 -3
- package/web/.next/server/chunks/ssr/_f50485a5._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +0 -1
- package/web/.next/static/chunks/30a344bb33a015e4.js +0 -1
- package/web/.next/static/chunks/3f4e4bce2182fc78.js +0 -1
- package/web/.next/static/chunks/4f94860011f9fb20.css +0 -2
- package/web/.next/static/chunks/68e548df22ca41e8.js +0 -1
- package/web/.next/static/chunks/c8fb1f672ab599be.js +0 -1
- package/web/.next/static/chunks/d9247a52ae260218.js +0 -1
- package/web/.next/static/chunks/fb82a429c1efe88e.js +0 -1
- /package/web/.next/static/{VAODCOhDu1LYPg7Qpw6A2 → xI3YfrsT7xbsvGfXX5Uy2}/_buildManifest.js +0 -0
- /package/web/.next/static/{VAODCOhDu1LYPg7Qpw6A2 → xI3YfrsT7xbsvGfXX5Uy2}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{VAODCOhDu1LYPg7Qpw6A2 → xI3YfrsT7xbsvGfXX5Uy2}/_ssgManifest.js +0 -0
package/dist/packages/core/src/application/ports/output/agents/agent-registry.interface.d.ts
CHANGED
|
@@ -80,7 +80,7 @@ export interface IAgentRegistry {
|
|
|
80
80
|
* @param name - The unique agent name (e.g., 'analyze-repository')
|
|
81
81
|
* @returns The agent definition, or undefined if not registered
|
|
82
82
|
*/
|
|
83
|
-
get(name: string): AgentDefinitionWithFactory | undefined
|
|
83
|
+
get(name: string): Promise<AgentDefinitionWithFactory | undefined>;
|
|
84
84
|
/**
|
|
85
85
|
* List all registered agent definitions.
|
|
86
86
|
*
|
package/dist/packages/core/src/application/ports/output/agents/agent-registry.interface.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registry.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-registry.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA2B,SAAQ,eAAe;IACjE,4EAA4E;IAE5E,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAEvD;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-registry.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-registry.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA2B,SAAQ,eAAe;IACjE,4EAA4E;IAE5E,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAEvD;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAC;IAEnE;;;;OAIG;IACH,IAAI,IAAI,0BAA0B,EAAE,CAAC;CACtC"}
|
|
@@ -45,7 +45,7 @@ let RunAgentUseCase = class RunAgentUseCase {
|
|
|
45
45
|
* @throws Error if the agent name is not registered
|
|
46
46
|
*/
|
|
47
47
|
async execute(input) {
|
|
48
|
-
const definition = this.agentRegistry.get(input.agentName);
|
|
48
|
+
const definition = await this.agentRegistry.get(input.agentName);
|
|
49
49
|
if (!definition) {
|
|
50
50
|
const available = this.agentRegistry.list().map((a) => a.name);
|
|
51
51
|
throw new Error(`Unknown agent: "${input.agentName}". Available agents: ${available.join(', ') || 'none'}`);
|
|
@@ -60,7 +60,7 @@ let RunAgentUseCase = class RunAgentUseCase {
|
|
|
60
60
|
* @throws Error if the agent name is not registered
|
|
61
61
|
*/
|
|
62
62
|
async *executeStream(input) {
|
|
63
|
-
const definition = this.agentRegistry.get(input.agentName);
|
|
63
|
+
const definition = await this.agentRegistry.get(input.agentName);
|
|
64
64
|
if (!definition) {
|
|
65
65
|
const available = this.agentRegistry.list().map((a) => a.name);
|
|
66
66
|
throw new Error(`Unknown agent: "${input.agentName}". Available agents: ${available.join(', ') || 'none'}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAgHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAsSrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -19,7 +19,6 @@ import { AgentValidatorService } from '../services/agents/common/agent-validator
|
|
|
19
19
|
import { promisify } from 'node:util';
|
|
20
20
|
import { execFile } from 'node:child_process';
|
|
21
21
|
import { VersionService } from '../services/version.service.js';
|
|
22
|
-
import { WebServerService } from '../services/web-server.service.js';
|
|
23
22
|
import { WorktreeService } from '../services/git/worktree.service.js';
|
|
24
23
|
import { ToolInstallerServiceImpl } from '../services/tool-installer/tool-installer.service.js';
|
|
25
24
|
import { GitPrService } from '../services/git/git-pr.service.js';
|
|
@@ -40,7 +39,6 @@ import { SpecInitializerService } from '../services/spec/spec-initializer.servic
|
|
|
40
39
|
import { DesktopNotifier } from '../services/notifications/desktop-notifier.js';
|
|
41
40
|
import { NotificationService } from '../services/notifications/notification.service.js';
|
|
42
41
|
import { getNotificationBus } from '../services/notifications/notification-bus.js';
|
|
43
|
-
import { createCheckpointer } from '../services/agents/common/checkpointer.js';
|
|
44
42
|
import { spawn } from 'node:child_process';
|
|
45
43
|
// Use cases
|
|
46
44
|
import { InitializeSettingsUseCase } from '../../application/use-cases/settings/initialize-settings.use-case.js';
|
|
@@ -131,8 +129,28 @@ export async function initializeContainer() {
|
|
|
131
129
|
// Register services (singletons via @injectable + token)
|
|
132
130
|
container.registerSingleton('IAgentValidator', AgentValidatorService);
|
|
133
131
|
container.registerSingleton('IVersionService', VersionService);
|
|
132
|
+
// IWebServerService is registered as a lazy proxy to avoid importing `next`
|
|
133
|
+
// (~80ms) for non-web commands. The actual service is loaded on first method call.
|
|
134
134
|
container.register('IWebServerService', {
|
|
135
|
-
useFactory: () =>
|
|
135
|
+
useFactory: () => {
|
|
136
|
+
let instance = null;
|
|
137
|
+
const getInstance = async () => {
|
|
138
|
+
if (!instance) {
|
|
139
|
+
const { WebServerService } = await import('../services/web-server.service.js');
|
|
140
|
+
instance = new WebServerService();
|
|
141
|
+
}
|
|
142
|
+
return instance;
|
|
143
|
+
};
|
|
144
|
+
return new Proxy({}, {
|
|
145
|
+
get: (_target, prop) => {
|
|
146
|
+
return async (...args) => {
|
|
147
|
+
const svc = await getInstance();
|
|
148
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
149
|
+
return svc[prop](...args);
|
|
150
|
+
};
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
},
|
|
136
154
|
});
|
|
137
155
|
container.registerSingleton('IWorktreeService', WorktreeService);
|
|
138
156
|
container.registerSingleton('IToolInstallerService', ToolInstallerServiceImpl);
|
|
@@ -189,16 +207,14 @@ export async function initializeContainer() {
|
|
|
189
207
|
container.register('IAgentRegistry', {
|
|
190
208
|
useFactory: () => new AgentRegistryService(),
|
|
191
209
|
});
|
|
192
|
-
container.register('Checkpointer', {
|
|
193
|
-
useFactory: () => createCheckpointer(':memory:'),
|
|
194
|
-
});
|
|
195
210
|
container.register('IAgentRunner', {
|
|
196
211
|
useFactory: (c) => {
|
|
197
212
|
const registry = c.resolve('IAgentRegistry');
|
|
198
213
|
const executorProvider = c.resolve('IAgentExecutorProvider');
|
|
199
|
-
const checkpointer = c.resolve('Checkpointer');
|
|
200
214
|
const runRepository = c.resolve('IAgentRunRepository');
|
|
201
|
-
|
|
215
|
+
// Checkpointer is lazy-loaded to avoid ~240ms startup cost from
|
|
216
|
+
// @langchain/langgraph-checkpoint-sqlite on every CLI invocation.
|
|
217
|
+
return new AgentRunnerService(registry, executorProvider, runRepository);
|
|
202
218
|
},
|
|
203
219
|
});
|
|
204
220
|
container.register('IFeatureAgentProcessService', {
|
package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.d.ts
CHANGED
|
@@ -10,9 +10,11 @@
|
|
|
10
10
|
import type { IAgentRegistry, AgentDefinitionWithFactory } from '../../../../application/ports/output/agents/agent-registry.interface.js';
|
|
11
11
|
export declare class AgentRegistryService implements IAgentRegistry {
|
|
12
12
|
private readonly agents;
|
|
13
|
+
private readonly lazyAgents;
|
|
13
14
|
constructor();
|
|
15
|
+
private resolveLazy;
|
|
14
16
|
register(definition: AgentDefinitionWithFactory): void;
|
|
15
|
-
get(name: string): AgentDefinitionWithFactory | undefined
|
|
17
|
+
get(name: string): Promise<AgentDefinitionWithFactory | undefined>;
|
|
16
18
|
list(): AgentDefinitionWithFactory[];
|
|
17
19
|
}
|
|
18
20
|
//# sourceMappingURL=agent-registry.service.d.ts.map
|
package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registry.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-registry.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC3B,MAAM,+DAA+D,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-registry.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-registry.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC3B,MAAM,+DAA+D,CAAC;AAevE,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;IACxE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;;YAqB1C,WAAW;IAczB,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI;IAIhD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAMxE,IAAI,IAAI,0BAA0B,EAAE;CAiBrC"}
|
package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.js
CHANGED
|
@@ -7,30 +7,62 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Pre-registers built-in agents (analyze-repository) at construction time.
|
|
9
9
|
*/
|
|
10
|
-
import { createAnalyzeRepositoryGraph } from '../analyze-repo/analyze-repository-graph.js';
|
|
11
|
-
import { createFeatureAgentGraph } from '../feature-agent/feature-agent-graph.js';
|
|
12
10
|
export class AgentRegistryService {
|
|
13
11
|
agents = new Map();
|
|
12
|
+
lazyAgents = [];
|
|
14
13
|
constructor() {
|
|
15
|
-
// Register built-in agents
|
|
16
|
-
|
|
14
|
+
// Register built-in agents as lazy definitions to avoid importing
|
|
15
|
+
// @langchain/langgraph (~300ms) at CLI startup.
|
|
16
|
+
this.lazyAgents.push({
|
|
17
17
|
name: 'analyze-repository',
|
|
18
18
|
description: 'Analyze repository structure, dependencies, and architecture',
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
importFn: () => import('../analyze-repo/analyze-repository-graph.js'),
|
|
20
|
+
factoryExport: 'createAnalyzeRepositoryGraph',
|
|
21
|
+
}, {
|
|
22
22
|
name: 'feature-agent',
|
|
23
23
|
description: 'Autonomous SDLC agent: analyze → requirements → research → plan → implement',
|
|
24
|
-
|
|
24
|
+
importFn: () => import('../feature-agent/feature-agent-graph.js'),
|
|
25
|
+
factoryExport: 'createFeatureAgentGraph',
|
|
25
26
|
});
|
|
26
27
|
}
|
|
28
|
+
async resolveLazy(name) {
|
|
29
|
+
const lazy = this.lazyAgents.find((a) => a.name === name);
|
|
30
|
+
if (!lazy)
|
|
31
|
+
return undefined;
|
|
32
|
+
const mod = await lazy.importFn();
|
|
33
|
+
const definition = {
|
|
34
|
+
name: lazy.name,
|
|
35
|
+
description: lazy.description,
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
graphFactory: mod[lazy.factoryExport],
|
|
38
|
+
};
|
|
39
|
+
this.agents.set(name, definition);
|
|
40
|
+
return definition;
|
|
41
|
+
}
|
|
27
42
|
register(definition) {
|
|
28
43
|
this.agents.set(definition.name, definition);
|
|
29
44
|
}
|
|
30
|
-
get(name) {
|
|
31
|
-
|
|
45
|
+
async get(name) {
|
|
46
|
+
const eager = this.agents.get(name);
|
|
47
|
+
if (eager)
|
|
48
|
+
return eager;
|
|
49
|
+
return this.resolveLazy(name);
|
|
32
50
|
}
|
|
33
51
|
list() {
|
|
34
|
-
|
|
52
|
+
// Returns eagerly-registered + cached placeholder metadata for lazy agents.
|
|
53
|
+
const all = new Map(this.agents);
|
|
54
|
+
for (const lazy of this.lazyAgents) {
|
|
55
|
+
if (!all.has(lazy.name)) {
|
|
56
|
+
lazy.placeholder ??= {
|
|
57
|
+
name: lazy.name,
|
|
58
|
+
description: lazy.description,
|
|
59
|
+
graphFactory: () => {
|
|
60
|
+
throw new Error(`Agent '${lazy.name}' must be resolved via get() before use`);
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
all.set(lazy.name, lazy.placeholder);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return Array.from(all.values());
|
|
35
67
|
}
|
|
36
68
|
}
|
package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.d.ts
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* creating executors, compiling LangGraph workflows, and tracking runs
|
|
7
7
|
* in the repository.
|
|
8
8
|
*/
|
|
9
|
-
import type { BaseCheckpointSaver } from '@langchain/langgraph';
|
|
10
9
|
import type { IAgentRunner, AgentRunOptions } from '../../../../application/ports/output/agents/agent-runner.interface.js';
|
|
11
10
|
import type { IAgentRegistry } from '../../../../application/ports/output/agents/agent-registry.interface.js';
|
|
12
11
|
import type { IAgentExecutorProvider } from '../../../../application/ports/output/agents/agent-executor-provider.interface.js';
|
|
@@ -15,9 +14,8 @@ import type { AgentRun, AgentRunEvent } from '../../../../domain/generated/outpu
|
|
|
15
14
|
export declare class AgentRunnerService implements IAgentRunner {
|
|
16
15
|
private readonly registry;
|
|
17
16
|
private readonly executorProvider;
|
|
18
|
-
private readonly checkpointer;
|
|
19
17
|
private readonly runRepository;
|
|
20
|
-
constructor(registry: IAgentRegistry, executorProvider: IAgentExecutorProvider,
|
|
18
|
+
constructor(registry: IAgentRegistry, executorProvider: IAgentExecutorProvider, runRepository: IAgentRunRepository);
|
|
21
19
|
runAgent(agentName: string, prompt: string, options?: AgentRunOptions): Promise<AgentRun>;
|
|
22
20
|
runAgentStream(agentName: string, prompt: string, options?: AgentRunOptions): AsyncIterable<AgentRunEvent>;
|
|
23
21
|
private setupRun;
|
package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-runner.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"agent-runner.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-runner.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAChB,MAAM,6DAA6D,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AACrH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAE/G,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAoB5E,qBAAa,kBAAmB,YAAW,YAAY;IAEnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,sBAAsB,EACxC,aAAa,EAAE,mBAAmB;IAG/C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoBxF,cAAc,CACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,aAAa,CAAC,aAAa,CAAC;YAyCjB,QAAQ;YAwCR,aAAa;YAUb,UAAU;CAQzB"}
|
package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.js
CHANGED
|
@@ -11,21 +11,33 @@ import { AgentRunStatus } from '../../../../domain/generated/output.js';
|
|
|
11
11
|
import { getSettings } from '../../../services/settings.service.js';
|
|
12
12
|
import { EventChannel } from '../streaming/event-channel.js';
|
|
13
13
|
import { StreamingExecutorProxy } from '../streaming/streaming-executor-proxy.js';
|
|
14
|
+
/**
|
|
15
|
+
* Lazy-loads the checkpointer to avoid ~240ms startup cost from
|
|
16
|
+
* @langchain/langgraph-checkpoint-sqlite on every CLI invocation.
|
|
17
|
+
* The import only happens when an agent is actually run.
|
|
18
|
+
*/
|
|
19
|
+
let _checkpointer = null;
|
|
20
|
+
async function getCheckpointer() {
|
|
21
|
+
if (!_checkpointer) {
|
|
22
|
+
const { createCheckpointer } = await import('./checkpointer.js');
|
|
23
|
+
_checkpointer = createCheckpointer(':memory:');
|
|
24
|
+
}
|
|
25
|
+
return _checkpointer;
|
|
26
|
+
}
|
|
14
27
|
export class AgentRunnerService {
|
|
15
28
|
registry;
|
|
16
29
|
executorProvider;
|
|
17
|
-
checkpointer;
|
|
18
30
|
runRepository;
|
|
19
|
-
constructor(registry, executorProvider,
|
|
31
|
+
constructor(registry, executorProvider, runRepository) {
|
|
20
32
|
this.registry = registry;
|
|
21
33
|
this.executorProvider = executorProvider;
|
|
22
|
-
this.checkpointer = checkpointer;
|
|
23
34
|
this.runRepository = runRepository;
|
|
24
35
|
}
|
|
25
36
|
async runAgent(agentName, prompt, options) {
|
|
26
37
|
const { definition, executor, runId, threadId } = await this.setupRun(agentName, prompt);
|
|
27
38
|
try {
|
|
28
|
-
const
|
|
39
|
+
const checkpointer = await getCheckpointer();
|
|
40
|
+
const compiledGraph = definition.graphFactory(executor, checkpointer);
|
|
29
41
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
42
|
const result = await compiledGraph.invoke({ repositoryPath: options?.repositoryPath ?? process.cwd() }, { configurable: { thread_id: threadId } });
|
|
31
43
|
await this.markCompleted(runId, result);
|
|
@@ -42,7 +54,8 @@ export class AgentRunnerService {
|
|
|
42
54
|
const channel = new EventChannel();
|
|
43
55
|
const proxy = new StreamingExecutorProxy(executor, channel);
|
|
44
56
|
// Compile graph with proxy (graph doesn't know about streaming)
|
|
45
|
-
const
|
|
57
|
+
const checkpointer = await getCheckpointer();
|
|
58
|
+
const compiledGraph = definition.graphFactory(proxy, checkpointer);
|
|
46
59
|
// Start graph invocation in background
|
|
47
60
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
61
|
const graphPromise = compiledGraph
|
|
@@ -67,7 +80,7 @@ export class AgentRunnerService {
|
|
|
67
80
|
await graphPromise;
|
|
68
81
|
}
|
|
69
82
|
async setupRun(agentName, prompt) {
|
|
70
|
-
const definition = this.registry.get(agentName);
|
|
83
|
+
const definition = await this.registry.get(agentName);
|
|
71
84
|
if (!definition) {
|
|
72
85
|
throw new Error(`Agent '${agentName}' not found. Available: ${this.registry
|
|
73
86
|
.list()
|
|
@@ -55,7 +55,6 @@ import { initializeContainer, container } from '../../../packages/core/src/infra
|
|
|
55
55
|
import { InitializeSettingsUseCase } from '../../../packages/core/src/application/use-cases/settings/initialize-settings.use-case.js';
|
|
56
56
|
import { initializeSettings } from '../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
57
57
|
import { CheckOnboardingStatusUseCase } from '../../../packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.js';
|
|
58
|
-
import { onboardingWizard } from '../tui/wizards/onboarding/onboarding.wizard.js';
|
|
59
58
|
/**
|
|
60
59
|
* Bootstrap function - initializes all dependencies before CLI starts.
|
|
61
60
|
* Performs async initialization (database, settings) before parsing commands.
|
|
@@ -90,6 +89,8 @@ async function bootstrap() {
|
|
|
90
89
|
const onboardingCheck = new CheckOnboardingStatusUseCase();
|
|
91
90
|
const { isComplete } = await onboardingCheck.execute();
|
|
92
91
|
if (!isComplete) {
|
|
92
|
+
// Lazy-import to avoid ~460ms startup cost when onboarding is already complete
|
|
93
|
+
const { onboardingWizard } = await import('../tui/wizards/onboarding/onboarding.wizard.js');
|
|
93
94
|
await onboardingWizard();
|
|
94
95
|
}
|
|
95
96
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ToolItem } from '../../../../../packages/core/src/application/use-cases/tools/list-tools.use-case.js';
|
|
2
|
+
export interface AgentToolStatus {
|
|
3
|
+
agentType: string;
|
|
4
|
+
toolId: string | null;
|
|
5
|
+
tool: ToolItem | null;
|
|
6
|
+
installed: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function checkAgentTool(agentType: string): Promise<AgentToolStatus>;
|
|
9
|
+
//# sourceMappingURL=check-agent-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-agent-tool.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-tool.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAY7F,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAkBhF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
/**
|
|
4
|
+
* Maps agent types to their corresponding tool IDs in the tool registry.
|
|
5
|
+
* These IDs match the JSON file names in tool-installer/tools/.
|
|
6
|
+
*/
|
|
7
|
+
const AGENT_TOOL_MAP = {
|
|
8
|
+
'claude-code': 'claude-code',
|
|
9
|
+
cursor: 'cursor-cli',
|
|
10
|
+
'gemini-cli': 'gemini-cli',
|
|
11
|
+
};
|
|
12
|
+
export async function checkAgentTool(agentType) {
|
|
13
|
+
const toolId = AGENT_TOOL_MAP[agentType] ?? null;
|
|
14
|
+
// Dev agent and unknown agents don't need a tool
|
|
15
|
+
if (!toolId) {
|
|
16
|
+
return { agentType, toolId: null, tool: null, installed: true };
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const useCase = resolve('ListToolsUseCase');
|
|
20
|
+
const tools = await useCase.execute();
|
|
21
|
+
const tool = tools.find((t) => t.id === toolId) ?? null;
|
|
22
|
+
const installed = tool?.status.status === 'available';
|
|
23
|
+
return { agentType, toolId, tool, installed };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { agentType, toolId, tool: null, installed: false };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,uBAAuB,CAAC,EACtC,kBAAkB,EAClB,SAAS,GACV,EAAE,4BAA4B,2CA2H9B"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useCallback } from 'react';
|
|
4
4
|
import { Github, Plus, TerminalSquare, Copy, Check, Loader2 } from 'lucide-react';
|
|
5
5
|
import { cn } from '../../../lib/utils.js';
|
|
6
6
|
import { pickFolder } from '../../common/add-repository-button/pick-folder.js';
|
|
7
|
+
import { WelcomeAgentSetup } from './welcome-agent-setup.js';
|
|
7
8
|
const commands = ['cd ~/my-repo', 'shep feat new "create modern, sleek dashboards"'];
|
|
8
9
|
export function ControlCenterEmptyState({ onRepositorySelect, className, }) {
|
|
9
10
|
const [copied, setCopied] = useState(false);
|
|
10
11
|
const [loading, setLoading] = useState(false);
|
|
12
|
+
const [agentReady, setAgentReady] = useState(false);
|
|
11
13
|
async function handlePickerClick() {
|
|
12
14
|
if (loading)
|
|
13
15
|
return;
|
|
@@ -27,5 +29,12 @@ export function ControlCenterEmptyState({ onRepositorySelect, className, }) {
|
|
|
27
29
|
setCopied(true);
|
|
28
30
|
setTimeout(() => setCopied(false), 2000);
|
|
29
31
|
}, []);
|
|
30
|
-
|
|
32
|
+
const handleAgentSetupComplete = useCallback(() => {
|
|
33
|
+
setAgentReady(true);
|
|
34
|
+
}, []);
|
|
35
|
+
return (_jsxs("div", { "data-testid": "control-center-empty-state", className: cn('relative h-full w-full', className), children: [_jsx("div", { className: "absolute inset-0 [background-image:radial-gradient(circle,_var(--color-border)_1px,_transparent_1px)] [background-size:24px_24px]" }), _jsxs("div", { className: "absolute top-8 left-8 z-10", children: [_jsx("h1", { className: "text-4xl font-bold tracking-tight", children: "Features" }), _jsx("p", { className: "text-muted-foreground text-3xl font-light", children: "Control Center" })] }), _jsx("div", { className: "relative z-10 flex h-full items-center justify-center", children: _jsx("div", { className: "flex max-w-lg flex-col items-center gap-6", children: !agentReady ? (
|
|
36
|
+
/* Step 1: Agent setup */
|
|
37
|
+
_jsx(WelcomeAgentSetup, { onComplete: handleAgentSetupComplete })) : (
|
|
38
|
+
/* Step 2: Add repository (shown after agent is configured) */
|
|
39
|
+
_jsxs(_Fragment, { children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Github, { className: "h-4 w-4" }), _jsx("span", { className: "text-xs font-semibold tracking-widest uppercase", children: "Repositories" })] }), _jsxs("button", { type: "button", "data-testid": "empty-state-add-repository", onClick: handlePickerClick, disabled: loading, className: "border-muted-foreground/30 hover:border-primary hover:text-primary flex cursor-pointer items-center gap-3 rounded-lg border-2 border-dashed px-8 py-4 transition-colors disabled:cursor-wait disabled:opacity-60", children: [loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(Plus, { className: "h-5 w-5" })), _jsx("span", { className: "text-sm font-medium", children: loading ? 'Opening...' : 'Add Repository' })] }), _jsxs("div", { className: "text-muted-foreground flex items-center gap-3", children: [_jsx("div", { className: "bg-border h-px w-16" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(TerminalSquare, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "text-xs font-semibold tracking-widest uppercase", children: "Or start from the command line" })] }), _jsx("div", { className: "bg-border h-px w-16" })] }), _jsxs("div", { "data-testid": "cli-code-block", className: "relative w-full rounded-lg bg-zinc-900 px-5 py-4 font-mono text-sm text-zinc-100", children: [_jsx("button", { type: "button", "data-testid": "cli-code-block-copy", onClick: handleCopy, className: "absolute top-3 right-3 cursor-pointer rounded p-1.5 text-zinc-400 transition-colors hover:bg-zinc-800 hover:text-zinc-200", "aria-label": "Copy commands", children: copied ? _jsx(Check, { className: "h-4 w-4" }) : _jsx(Copy, { className: "h-4 w-4" }) }), _jsx("div", { className: "space-y-1", children: commands.map((cmd) => (_jsxs("div", { children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), _jsx("span", { children: cmd })] }, cmd))) })] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Feature will appear on canvas once created" })] })) }) })] }));
|
|
31
40
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface WelcomeAgentSetupProps {
|
|
2
|
+
onComplete: () => void;
|
|
3
|
+
className?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function WelcomeAgentSetup({ onComplete, className }: WelcomeAgentSetupProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=welcome-agent-setup.d.ts.map
|
package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome-agent-setup.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/welcome-agent-setup.tsx"],"names":[],"mappings":"AAuBA,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CA8MlF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
4
|
+
import { Check, ChevronRight, ChevronLeft, Download, Loader2, CheckCircle2, Circle, AlertCircle, } from 'lucide-react';
|
|
5
|
+
import { getAllAgentModels } from '../../../app/actions/get-all-agent-models.js';
|
|
6
|
+
import { checkAgentTool } from '../../../app/actions/check-agent-tool.js';
|
|
7
|
+
import { updateAgentAndModel } from '../../../app/actions/update-agent-and-model.js';
|
|
8
|
+
import { getAgentTypeIcon } from '../../common/feature-node/agent-type-icons.js';
|
|
9
|
+
import { getModelMeta } from '../../../lib/model-metadata.js';
|
|
10
|
+
import { useToolInstallStream } from '../../../hooks/use-tool-install-stream.js';
|
|
11
|
+
import { cn } from '../../../lib/utils.js';
|
|
12
|
+
export function WelcomeAgentSetup({ onComplete, className }) {
|
|
13
|
+
const [groups, setGroups] = useState([]);
|
|
14
|
+
const [loading, setLoading] = useState(true);
|
|
15
|
+
const [step, setStep] = useState('select-agent');
|
|
16
|
+
const [selectedAgent, setSelectedAgent] = useState(null);
|
|
17
|
+
const [selectedModel, setSelectedModel] = useState(null);
|
|
18
|
+
const [toolStatus, setToolStatus] = useState(null);
|
|
19
|
+
const [checkingTool, setCheckingTool] = useState(false);
|
|
20
|
+
const [saving, setSaving] = useState(false);
|
|
21
|
+
// Load available agents
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
getAllAgentModels()
|
|
24
|
+
.then(setGroups)
|
|
25
|
+
.finally(() => setLoading(false));
|
|
26
|
+
}, []);
|
|
27
|
+
const activeGroup = selectedAgent ? groups.find((g) => g.agentType === selectedAgent) : null;
|
|
28
|
+
const handleAgentSelect = useCallback((agentType) => {
|
|
29
|
+
const group = groups.find((g) => g.agentType === agentType);
|
|
30
|
+
setSelectedAgent(agentType);
|
|
31
|
+
if (group && group.models.length > 0) {
|
|
32
|
+
setStep('select-model');
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Agent without models — go straight to tool check
|
|
36
|
+
setSelectedModel('');
|
|
37
|
+
setStep('check-tool');
|
|
38
|
+
}
|
|
39
|
+
}, [groups]);
|
|
40
|
+
const handleModelSelect = useCallback((model) => {
|
|
41
|
+
setSelectedModel(model);
|
|
42
|
+
setStep('check-tool');
|
|
43
|
+
}, []);
|
|
44
|
+
const handleBack = useCallback(() => {
|
|
45
|
+
if (step === 'select-model') {
|
|
46
|
+
setSelectedAgent(null);
|
|
47
|
+
setStep('select-agent');
|
|
48
|
+
}
|
|
49
|
+
else if (step === 'check-tool') {
|
|
50
|
+
if (activeGroup && activeGroup.models.length > 0) {
|
|
51
|
+
setSelectedModel(null);
|
|
52
|
+
setStep('select-model');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
setSelectedAgent(null);
|
|
56
|
+
setStep('select-agent');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}, [step, activeGroup]);
|
|
60
|
+
// Check tool status when entering check-tool step
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (step !== 'check-tool' || !selectedAgent)
|
|
63
|
+
return;
|
|
64
|
+
setCheckingTool(true);
|
|
65
|
+
checkAgentTool(selectedAgent)
|
|
66
|
+
.then(setToolStatus)
|
|
67
|
+
.finally(() => setCheckingTool(false));
|
|
68
|
+
}, [step, selectedAgent]);
|
|
69
|
+
const handleConfirm = useCallback(async () => {
|
|
70
|
+
if (!selectedAgent)
|
|
71
|
+
return;
|
|
72
|
+
setSaving(true);
|
|
73
|
+
try {
|
|
74
|
+
await updateAgentAndModel(selectedAgent, selectedModel ?? null);
|
|
75
|
+
onComplete();
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
setSaving(false);
|
|
79
|
+
}
|
|
80
|
+
}, [selectedAgent, selectedModel, onComplete]);
|
|
81
|
+
if (loading) {
|
|
82
|
+
return (_jsxs("div", { "data-testid": "welcome-agent-setup", className: cn('bg-card flex flex-col items-center justify-center gap-3 rounded-xl border p-8', className), children: [_jsx(Loader2, { className: "text-muted-foreground h-5 w-5 animate-spin" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Loading agents..." })] }));
|
|
83
|
+
}
|
|
84
|
+
return (_jsxs("div", { "data-testid": "welcome-agent-setup", className: cn('bg-card w-full max-w-md rounded-xl border shadow-sm', className), children: [_jsxs("div", { className: "border-b px-5 py-4", children: [_jsx("h2", { className: "text-sm font-bold", children: "Set up your AI agent" }), _jsxs("p", { className: "text-muted-foreground mt-0.5 text-xs", children: [step === 'select-agent' && 'Choose the coding agent you want to use', step === 'select-model' && 'Pick a model for your agent', step === 'check-tool' && 'Verifying tool availability'] }), _jsx("div", { className: "mt-3 flex items-center gap-1.5", children: ['select-agent', 'select-model', 'check-tool'].map((s, i) => (_jsx("div", { className: cn('h-1 flex-1 rounded-full transition-colors', i <= ['select-agent', 'select-model', 'check-tool'].indexOf(step)
|
|
85
|
+
? 'bg-primary'
|
|
86
|
+
: 'bg-muted') }, s))) })] }), _jsxs("div", { className: "p-2", children: [step === 'select-agent' && (_jsx("div", { "data-testid": "agent-list", children: groups.map((group) => {
|
|
87
|
+
const GroupIcon = getAgentTypeIcon(group.agentType);
|
|
88
|
+
return (_jsxs("button", { type: "button", "data-testid": `agent-option-${group.agentType}`, className: "hover:bg-accent flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-left transition-colors", onClick: () => handleAgentSelect(group.agentType), children: [_jsx(GroupIcon, { className: "h-5 w-5 shrink-0" }), _jsxs("div", { className: "flex-1", children: [_jsx("span", { className: "text-sm font-medium", children: group.label }), group.models.length > 0 && (_jsxs("span", { className: "text-muted-foreground ml-1.5 text-xs", children: [group.models.length, " model", group.models.length !== 1 ? 's' : ''] }))] }), _jsx(ChevronRight, { className: "text-muted-foreground h-4 w-4" })] }, group.agentType));
|
|
89
|
+
}) })), step === 'select-model' && activeGroup ? (_jsxs("div", { "data-testid": "model-list", children: [_jsxs("button", { type: "button", className: "text-muted-foreground hover:text-foreground mb-1 flex w-full cursor-pointer items-center gap-1.5 px-3 py-1.5 text-xs font-medium transition-colors", onClick: handleBack, children: [_jsx(ChevronLeft, { className: "h-3.5 w-3.5" }), "Back to agents"] }), activeGroup.models.map((m) => {
|
|
90
|
+
const meta = getModelMeta(m.id);
|
|
91
|
+
return (_jsxs("button", { type: "button", "data-testid": `model-option-${m.id}`, className: "hover:bg-accent flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-left transition-colors", onClick: () => handleModelSelect(m.id), children: [_jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("span", { className: "text-sm font-medium", children: meta.displayName || m.displayName }), _jsx("span", { className: "text-muted-foreground text-xs", children: meta.description || m.description })] }), _jsx(ChevronRight, { className: "text-muted-foreground h-3.5 w-3.5" })] }, m.id));
|
|
92
|
+
})] })) : null, step === 'check-tool' && (_jsx(ToolCheckStep, { toolStatus: toolStatus, checking: checkingTool, saving: saving, onConfirm: handleConfirm, onBack: handleBack, onToolInstalled: () => {
|
|
93
|
+
// Re-check tool after install
|
|
94
|
+
if (selectedAgent) {
|
|
95
|
+
setCheckingTool(true);
|
|
96
|
+
checkAgentTool(selectedAgent)
|
|
97
|
+
.then(setToolStatus)
|
|
98
|
+
.finally(() => setCheckingTool(false));
|
|
99
|
+
}
|
|
100
|
+
} }))] })] }));
|
|
101
|
+
}
|
|
102
|
+
/** Sub-component for the tool verification step */
|
|
103
|
+
function ToolCheckStep({ toolStatus, checking, saving, onConfirm, onBack, onToolInstalled, }) {
|
|
104
|
+
if (checking || !toolStatus) {
|
|
105
|
+
return (_jsxs("div", { className: "flex flex-col items-center gap-3 px-3 py-6", children: [_jsx(Loader2, { className: "text-muted-foreground h-5 w-5 animate-spin" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Checking tool availability..." })] }));
|
|
106
|
+
}
|
|
107
|
+
// Agent doesn't require a tool (e.g., dev/demo)
|
|
108
|
+
if (!toolStatus.toolId) {
|
|
109
|
+
return (_jsxs("div", { className: "flex flex-col gap-3 px-3 py-4", children: [_jsxs("div", { className: "flex items-center gap-2 text-emerald-600 dark:text-emerald-400", children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), _jsx("span", { className: "text-sm font-medium", children: "No additional tools required" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("button", { type: "button", className: "text-muted-foreground hover:text-foreground cursor-pointer text-xs transition-colors", onClick: onBack, children: [_jsx(ChevronLeft, { className: "mr-0.5 inline h-3.5 w-3.5" }), "Back"] }), _jsxs("button", { type: "button", "data-testid": "agent-setup-confirm", disabled: saving, className: "bg-primary text-primary-foreground hover:bg-primary/90 ml-auto flex cursor-pointer items-center gap-1.5 rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-60", onClick: onConfirm, children: [saving ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Check, { className: "h-3.5 w-3.5" })), "Continue"] })] })] }));
|
|
110
|
+
}
|
|
111
|
+
if (toolStatus.installed) {
|
|
112
|
+
return (_jsxs("div", { className: "flex flex-col gap-3 px-3 py-4", children: [_jsxs("div", { className: "flex items-center gap-2 text-emerald-600 dark:text-emerald-400", children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), _jsxs("span", { className: "text-sm font-medium", children: [toolStatus.tool?.name ?? toolStatus.toolId, " is installed"] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("button", { type: "button", className: "text-muted-foreground hover:text-foreground cursor-pointer text-xs transition-colors", onClick: onBack, children: [_jsx(ChevronLeft, { className: "mr-0.5 inline h-3.5 w-3.5" }), "Back"] }), _jsxs("button", { type: "button", "data-testid": "agent-setup-confirm", disabled: saving, className: "bg-primary text-primary-foreground hover:bg-primary/90 ml-auto flex cursor-pointer items-center gap-1.5 rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-60", onClick: onConfirm, children: [saving ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Check, { className: "h-3.5 w-3.5" })), "Continue"] })] })] }));
|
|
113
|
+
}
|
|
114
|
+
// Tool not installed — show install option
|
|
115
|
+
return (_jsx(ToolInstallInline, { toolStatus: toolStatus, saving: saving, onConfirm: onConfirm, onBack: onBack, onInstalled: onToolInstalled }));
|
|
116
|
+
}
|
|
117
|
+
/** Inline tool installer for the welcome wizard */
|
|
118
|
+
function ToolInstallInline({ toolStatus, saving, onConfirm, onBack, onInstalled, }) {
|
|
119
|
+
const toolId = toolStatus.toolId ?? '';
|
|
120
|
+
const { logs, status, startInstall } = useToolInstallStream(toolId);
|
|
121
|
+
const isInstallDone = status === 'done';
|
|
122
|
+
const isInstallError = status === 'error';
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
if (isInstallDone) {
|
|
125
|
+
onInstalled();
|
|
126
|
+
}
|
|
127
|
+
}, [isInstallDone, onInstalled]);
|
|
128
|
+
return (_jsxs("div", { className: "flex flex-col gap-3 px-3 py-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [isInstallDone ? (_jsx(CheckCircle2, { className: "h-4 w-4 text-emerald-600 dark:text-emerald-400" })) : isInstallError ? (_jsx(AlertCircle, { className: "h-4 w-4 text-red-500" })) : (_jsx(Circle, { className: "text-muted-foreground h-4 w-4" })), _jsxs("span", { className: "text-sm font-medium", children: [toolStatus.tool?.name ?? toolId, ' ', isInstallDone
|
|
129
|
+
? 'installed successfully'
|
|
130
|
+
: isInstallError
|
|
131
|
+
? 'installation failed'
|
|
132
|
+
: 'is not installed'] })] }), toolStatus.tool?.installCommand && status === 'idle' ? (_jsxs("div", { className: "rounded-md bg-zinc-900 px-3 py-2 font-mono text-xs text-zinc-100", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), toolStatus.tool.installCommand] })) : null, (status === 'streaming' || isInstallDone || isInstallError) && logs.length > 0 ? (_jsxs("div", { className: "max-h-32 overflow-auto rounded-md bg-zinc-900 p-2 font-mono text-[11px] leading-relaxed text-zinc-300", children: [logs.map((line, idx) => (
|
|
133
|
+
// eslint-disable-next-line react/no-array-index-key -- logs are append-only, never reorder
|
|
134
|
+
_jsx("div", { className: "break-all whitespace-pre-wrap", children: line }, idx))), isInstallDone ? (_jsx("div", { className: "mt-1 text-emerald-400", children: "Installation complete" })) : null, isInstallError ? (_jsx("div", { className: "mt-1 text-red-400", children: "Installation failed \u2014 try installing manually" })) : null] })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("button", { type: "button", className: "text-muted-foreground hover:text-foreground cursor-pointer text-xs transition-colors", onClick: onBack, children: [_jsx(ChevronLeft, { className: "mr-0.5 inline h-3.5 w-3.5" }), "Back"] }), _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [!isInstallDone && toolStatus.tool?.autoInstall ? (_jsxs("button", { type: "button", "data-testid": "agent-setup-install", disabled: status === 'streaming', className: "bg-primary text-primary-foreground hover:bg-primary/90 flex cursor-pointer items-center gap-1.5 rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-60", onClick: startInstall, children: [status === 'streaming' ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Download, { className: "h-3.5 w-3.5" })), status === 'streaming' ? 'Installing...' : 'Install'] })) : null, isInstallDone ? (_jsxs("button", { type: "button", "data-testid": "agent-setup-confirm", disabled: saving, className: "bg-primary text-primary-foreground hover:bg-primary/90 flex cursor-pointer items-center gap-1.5 rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-60", onClick: onConfirm, children: [saving ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Check, { className: "h-3.5 w-3.5" })), "Continue"] })) : null] })] })] }));
|
|
135
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { WelcomeAgentSetup } from './welcome-agent-setup.js';
|
|
3
|
+
declare const meta: Meta<typeof WelcomeAgentSetup>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof meta>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
//# sourceMappingURL=welcome-agent-setup.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome-agent-setup.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/welcome-agent-setup.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAcxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC"}
|
package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
3
|
+
import { WelcomeAgentSetup } from './welcome-agent-setup.js';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'Features/WelcomeAgentSetup',
|
|
6
|
+
component: WelcomeAgentSetup,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'centered',
|
|
10
|
+
},
|
|
11
|
+
decorators: [
|
|
12
|
+
(Story) => (_jsx("div", { style: { width: 420, padding: 24 }, children: _jsx(Story, {}) })),
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
export default meta;
|
|
16
|
+
export const Default = {
|
|
17
|
+
args: {
|
|
18
|
+
onComplete: fn(),
|
|
19
|
+
},
|
|
20
|
+
};
|
|
@@ -29,7 +29,7 @@ function AppShellInner({ children }) {
|
|
|
29
29
|
const handleRepositorySelect = useCallback((path) => {
|
|
30
30
|
window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));
|
|
31
31
|
}, []);
|
|
32
|
-
return (_jsxs(SidebarProvider, { children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onNewFeature: handleNewFeature, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsxs("div", { className: "absolute top-3 right-3 z-50 flex gap-1", children: [_jsx(AddRepositoryButton, { onSelect: handleRepositorySelect }), _jsx(SoundToggle, {}), _jsx(ThemeToggle, {})] }), _jsx("main", { className: "h-full", children: children })] }) })] }));
|
|
32
|
+
return (_jsxs(SidebarProvider, { defaultOpen: false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onNewFeature: handleNewFeature, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsxs("div", { className: "absolute top-3 right-3 z-50 flex gap-1", children: [_jsx(AddRepositoryButton, { onSelect: handleRepositorySelect }), _jsx(SoundToggle, {}), _jsx(ThemeToggle, {})] }), _jsx("main", { className: "h-full", children: children })] }) })] }));
|
|
33
33
|
}
|
|
34
34
|
export function AppShell({ children }) {
|
|
35
35
|
return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(AppShellInner, { children: children }) }) }) }));
|