@shepai/cli 1.202.1-pr606.60460ac → 1.202.2
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/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 +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +35 -35
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +38 -38
- 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/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +47 -47
- 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/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +47 -47
- 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]/[tab]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +36 -36
- 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)/chat/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +35 -35
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/control-center/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/control-center/page/server-reference-manifest.json +35 -35
- package/web/.next/server/app/(dashboard)/control-center/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/control-center/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +38 -38
- 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/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +47 -47
- 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/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +47 -47
- 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)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +36 -36
- 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/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/agent-questions/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/agent-questions/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/agent-questions/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/agents/[agentType]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/agents/[agentType]/page/server-reference-manifest.json +13 -13
- package/web/.next/server/app/agents/[agentType]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/agents/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/agents/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/application/[id]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
- package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/application/[id]/supervisor/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/application/[id]/supervisor/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/application/[id]/supervisor/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/applications/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/applications/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/applications/page.js.nft.json +1 -1
- package/web/.next/server/app/applications/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/features/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/features/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/features/page.js.nft.json +1 -1
- package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/onboarding/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/onboarding/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/projects/[slug]/items/[itemId]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/projects/[slug]/items/[itemId]/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/projects/[slug]/items/[itemId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/projects/[slug]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/projects/[slug]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/projects/[slug]/pages/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/projects/[slug]/pages/page/server-reference-manifest.json +12 -12
- package/web/.next/server/app/projects/[slug]/pages/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/projects/[slug]/settings/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/projects/[slug]/settings/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/projects/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/projects/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/settings/page/server-reference-manifest.json +15 -15
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/skills/page/server-reference-manifest.json +17 -17
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/supervisor/feature/[featureId]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/supervisor/feature/[featureId]/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/supervisor/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/supervisor/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/supervisor/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/supervisor/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/supervisor/repo/[repositoryId]/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/supervisor/repo/[repositoryId]/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/supervisor/repo/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/tools/page/server-reference-manifest.json +15 -15
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/react-loadable-manifest.json +4 -4
- package/web/.next/server/app/version/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__10e976f3._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agent-questions_page_actions_4b694f8d.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agent-questions_page_actions_4b694f8d.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agents_[agentType]_page_actions_103679a6.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agents_[agentType]_page_actions_103679a6.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_projects_[slug]_pages_page_actions_19d50f6c.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_projects_[slug]_pages_page_actions_19d50f6c.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0af8610a._.js +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0af8610a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0b652a2f._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b73253b._.js → [root-of-the-server]__2e388ba3._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b73253b._.js.map → [root-of-the-server]__2e388ba3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56cf47e7._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56cf47e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__648730d4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__68df6415._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__68df6415._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bc6bf96._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bc6bf96._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9852cb08._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9852cb08._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a1167cec._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a1167cec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a12d0ad7._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__52ca7f88._.js.map → [root-of-the-server]__a12d0ad7._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba699bec._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba699bec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e0741ee1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e0fa59e6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e0fa59e6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ea26ff90._.js +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ff0095e3._.js +1 -1
- package/web/.next/server/chunks/ssr/_07036593._.js +1 -1
- package/web/.next/server/chunks/ssr/_07036593._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0d2a7595._.js +1 -1
- package/web/.next/server/chunks/ssr/_0d2a7595._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_101de7c3._.js +1 -1
- package/web/.next/server/chunks/ssr/_101de7c3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_db111d21._.js → _10f54ace._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_db111d21._.js.map → _10f54ace._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_24fca3cf._.js +1 -1
- package/web/.next/server/chunks/ssr/_24fca3cf._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_6ff832ad._.js → _2759af76._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_6ff832ad._.js.map → _2759af76._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_2bc48f3d._.js +1 -1
- package/web/.next/server/chunks/ssr/_2bc48f3d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_fb539286._.js → _2bef1982._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_fb539286._.js.map → _2bef1982._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_32f66845._.js +1 -1
- package/web/.next/server/chunks/ssr/_408848e6._.js +1 -1
- package/web/.next/server/chunks/ssr/_408848e6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_40e02782._.js +1 -1
- package/web/.next/server/chunks/ssr/_40e02782._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_486d45d6._.js +1 -1
- package/web/.next/server/chunks/ssr/_486d45d6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_824d5772._.js → _498cba11._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_824d5772._.js.map → _498cba11._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_5cbb0e22._.js +1 -1
- package/web/.next/server/chunks/ssr/_5cbb0e22._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_5a3edc88._.js → _673be4f1._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_5a3edc88._.js.map → _673be4f1._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_7ba67729._.js +1 -1
- package/web/.next/server/chunks/ssr/_7ba67729._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_805ae1aa._.js +1 -1
- package/web/.next/server/chunks/ssr/_805ae1aa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_87cf18c3._.js +1 -1
- package/web/.next/server/chunks/ssr/_87cf18c3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8a700ff4._.js +1 -1
- package/web/.next/server/chunks/ssr/_8a700ff4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_95b97274._.js +1 -1
- package/web/.next/server/chunks/ssr/_95b97274._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_fbcfaf3a._.js → _9d18d1b1._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_fbcfaf3a._.js.map → _9d18d1b1._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_70ff64a1._.js → _a93687e6._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_70ff64a1._.js.map → _a93687e6._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_c2e196ee._.js +1 -1
- package/web/.next/server/chunks/ssr/_c2e196ee._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_ca3b7bf7._.js +1 -1
- package/web/.next/server/chunks/ssr/_ca3b7bf7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d53224a9._.js +1 -1
- package/web/.next/server/chunks/ssr/_d53224a9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d573dcc2._.js +1 -1
- package/web/.next/server/chunks/ssr/_e2671e14._.js +1 -1
- package/web/.next/server/chunks/ssr/_e2671e14._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_ecd45b17._.js +1 -1
- package/web/.next/server/chunks/ssr/_ecd45b17._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_f0d45e47._.js → _f46d2018._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_f0d45e47._.js.map → _f46d2018._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_f602cc9f._.js +1 -1
- package/web/.next/server/chunks/ssr/_f602cc9f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_20a56008._.js → _f71954a5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_20a56008._.js.map → _f71954a5._.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/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_0e291f0b._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_0e291f0b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_40673f0c._.js → src_presentation_web_16c83ab4._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_40673f0c._.js.map → src_presentation_web_16c83ab4._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_1d8d177f._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_1d8d177f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_450b58fc._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_450b58fc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_47727150._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_47727150._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_64fcfc84._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_64fcfc84._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_74b7bdb2._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_74b7bdb2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_82aeca34._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_82aeca34._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_8a564d47._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_8a564d47._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_f4f3fad9.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_f4f3fad9.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_agents_page_actions_d4bd4711.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_agents_page_actions_d4bd4711.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_onboarding_page_actions_bb695e8d.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_onboarding_page_actions_bb695e8d.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_ac47e420.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_ac47e420.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_projects_page_actions_c91a23a8.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_projects_page_actions_c91a23a8.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_63c2d912.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_63c2d912.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_a53a3da6._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_a53a3da6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_246617fe._.js +3 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b1b3c26c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b1b3c26c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b98a4353._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b98a4353._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c96ca051._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c96ca051._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_e812a69b._.js → src_presentation_web_cb0d2c28._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_e812a69b._.js.map → src_presentation_web_cb0d2c28._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_d3858f16._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_d3858f16._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_d7f8130c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_d7f8130c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_dddd8ccd._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_dddd8ccd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e13d58b0._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e13d58b0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ee94a9aa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ee94a9aa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f0fcfdff._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f0fcfdff._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f17e8516._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f17e8516._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f7180fec._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f7180fec._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +111 -111
- package/web/.next/static/chunks/{5faa828877b1e669.js → 03dda23205877d8b.js} +1 -1
- package/web/.next/static/chunks/{4bf4f333302e24a4.js → 054e3a5f5ff4db71.js} +1 -1
- package/web/.next/static/chunks/{a868014dbe1b4e42.js → 06e58041911c290b.js} +1 -1
- package/web/.next/static/chunks/{b5ff852fee23795d.js → 089ef5b749d79ebd.js} +1 -1
- package/web/.next/static/chunks/{1a093b13a9d6952e.js → 0d106010c498c198.js} +2 -2
- package/web/.next/static/chunks/193e5a0540757f5e.js +1 -0
- package/web/.next/static/chunks/{9abc3e68af98e636.js → 25111a2f2597f500.js} +1 -1
- package/web/.next/static/chunks/285e724d07901ef6.js +1 -0
- package/web/.next/static/chunks/{3c396f63ebefe875.js → 2b2bfc0465b18a7d.js} +1 -1
- package/web/.next/static/chunks/{6af99a08ccacdbce.js → 2b436562e69d2827.js} +1 -1
- package/web/.next/static/chunks/{8c96a835b3b0dc44.js → 2e3844d0ac487ac7.js} +1 -1
- package/web/.next/static/chunks/325859b8a9482427.js +1 -0
- package/web/.next/static/chunks/{2773e7b2587bc9cc.js → 44ab458ceb89d85d.js} +1 -1
- package/web/.next/static/chunks/4fdf36904f5421a6.js +1 -0
- package/web/.next/static/chunks/59004c65d552581c.js +1 -0
- package/web/.next/static/chunks/{0edcdc8a2dd06b7a.js → 5c4837e88a3431b8.js} +1 -1
- package/web/.next/static/chunks/{a131f868af7f1f7c.js → 74cdd562eb663f72.js} +1 -1
- package/web/.next/static/chunks/{0315591c972888a6.js → 7670d76d4ee743e6.js} +1 -1
- package/web/.next/static/chunks/{02d88da9fd656fcd.js → 83fc784ce05a701e.js} +1 -1
- package/web/.next/static/chunks/{460cedaa85c821e7.js → 8dd4fdd20b103a66.js} +1 -1
- package/web/.next/static/chunks/9336bdc7fc319282.js +1 -0
- package/web/.next/static/chunks/9d285565922b2de7.js +1 -0
- package/web/.next/static/chunks/{45eeca36eabbed23.js → 9f7f2a11937d87eb.js} +1 -1
- package/web/.next/static/chunks/{c3931fdbae836be6.js → a7c7bcfb6f7696a3.js} +1 -1
- package/web/.next/static/chunks/{9f7985e2a73929a2.js → a8f57d2a12849f32.js} +1 -1
- package/web/.next/static/chunks/{0e1c933065a1100a.js → abe98954ccdf29db.js} +1 -1
- package/web/.next/static/chunks/{4378715fa2b5e7de.js → b05808da85e8b34c.js} +1 -1
- package/web/.next/static/chunks/{b5dc7979d66caa38.js → b5f83e5e1dad23d5.js} +1 -1
- package/web/.next/static/chunks/{6d2074fa3453d333.js → b8293a56f257e5a2.js} +1 -1
- package/web/.next/static/chunks/{bc5b87e4068ba11d.js → c61c5e97c76dc733.js} +1 -1
- package/web/.next/static/chunks/c6b411bf31744ca7.js +1 -0
- package/web/.next/static/chunks/{bdaa907bf3d1d932.js → c732d6cc4c5e4343.js} +1 -1
- package/web/.next/static/chunks/{25a200f055ae5cba.js → d214d6a670f48d79.js} +1 -1
- package/web/.next/static/chunks/{6901861cb53ab483.js → d7b17a93a26e97c8.js} +1 -1
- package/web/.next/static/chunks/{a0325f77bbccc63d.js → d8f14fac959a6bd0.js} +1 -1
- package/web/.next/static/chunks/{24ea54516dc249c0.js → d98912f5b6cf4938.js} +1 -1
- package/web/.next/static/chunks/{21500b3fe3754296.js → df79667c16344317.js} +1 -1
- package/web/.next/static/chunks/{05e8df10619fb980.js → ec8f19328ad1ecd4.js} +1 -1
- package/web/.next/static/chunks/{e6e6ba783b2e4d14.js → f0157331838ac962.js} +1 -1
- package/web/.next/static/chunks/{c687ed21b9518d73.js → f757d865fae71faf.js} +1 -1
- package/web/.next/static/chunks/fb3cbb7f575a7128.js +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__52ca7f88._.js +0 -3
- package/web/.next/static/chunks/03d7b81c2554d52f.js +0 -1
- package/web/.next/static/chunks/15acdaaea57bb459.js +0 -1
- package/web/.next/static/chunks/39fe1c1397d5483b.js +0 -1
- package/web/.next/static/chunks/495883829026f13f.js +0 -1
- package/web/.next/static/chunks/4b3a4f416a6eb1ac.js +0 -1
- package/web/.next/static/chunks/4b4160f36cf2a3d6.js +0 -1
- package/web/.next/static/chunks/7269537b2188650d.js +0 -1
- package/web/.next/static/chunks/b1534b2f3d814fef.js +0 -1
- package/web/.next/static/chunks/f6dc1ba364203bb2.js +0 -1
- /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_buildManifest.js +0 -0
- /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/presentation/web/components/features/skills/skill-detail-drawer.tsx","../../../../../../../src/presentation/web/components/features/skills/skills-page-client.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-card.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-list.tsx","../../../../../../../src/presentation/web/components/features/skills/category-filter.tsx","../../../../../../../src/presentation/web/components/features/skills/auto-injected-skills-section.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ab494e8%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/skills/add-skill-dialog.tsx","../../../../../../../src/presentation/web/app/actions/data%3Af17a1e%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { FolderOpen } from 'lucide-react';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface SkillDetailDrawerProps {\n skill: SkillData | null;\n onClose: () => void;\n}\n\nexport function SkillDetailDrawer({ skill, onClose }: SkillDetailDrawerProps) {\n return (\n <BaseDrawer\n open={skill !== null}\n onClose={onClose}\n size=\"sm\"\n modal\n data-testid=\"skill-detail-drawer\"\n header={\n skill ? (\n <>\n <DrawerTitle>{skill.displayName}</DrawerTitle>\n <DrawerDescription>{skill.name}</DrawerDescription>\n </>\n ) : undefined\n }\n >\n {skill ? (\n <div className=\"px-4 pb-4\">\n {/* Description */}\n <p className=\"text-muted-foreground text-sm\">{skill.description}</p>\n\n {/* Badges */}\n <div className=\"mt-4 flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n <Badge variant=\"outline\">{skill.category}</Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n </div>\n\n {/* Allowed Tools */}\n {skill.allowedTools ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Allowed Tools</h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">{skill.allowedTools}</p>\n </div>\n </>\n ) : null}\n\n {/* Resources */}\n {skill.resources.length > 0 ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Resources</h3>\n <ul className=\"mt-2 space-y-1.5\">\n {skill.resources.map((resource) => (\n <li\n key={resource.name}\n className=\"text-muted-foreground flex items-center gap-2 text-sm\"\n >\n <FolderOpen className=\"size-3.5 shrink-0\" />\n <span>\n {resource.name}/ — {resource.fileCount}{' '}\n {resource.fileCount === 1 ? 'file' : 'files'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n </>\n ) : null}\n\n {/* Body */}\n {skill.body ? (\n <>\n <Separator className=\"my-4\" />\n <pre className=\"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap\">\n {skill.body}\n </pre>\n </>\n ) : null}\n </div>\n ) : null}\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from 'react';\nimport { Search, Puzzle } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { PageHeader } from '@/components/common/page-header';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { SkillList } from './skill-list';\nimport { CategoryFilter } from './category-filter';\nimport { SkillDetailDrawer } from './skill-detail-drawer';\nimport type { SkillInjectionConfig } from '@shepai/core/domain/generated/output';\nimport { Separator } from '@/components/ui/separator';\nimport { AutoInjectedSkillsSection } from './auto-injected-skills-section';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nexport interface SkillsPageClientProps {\n skills: SkillData[];\n injectionConfig: SkillInjectionConfig;\n}\n\nfunction computeCategoryCounts(skills: SkillData[]): Record<SkillCategory, number> {\n const counts: Record<SkillCategory, number> = {\n Workflow: 0,\n 'Code Generation': 0,\n Analysis: 0,\n Reference: 0,\n };\n for (const skill of skills) {\n counts[skill.category]++;\n }\n return counts;\n}\n\nexport function SkillsPageClient({ skills, injectionConfig }: SkillsPageClientProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] = useState<SkillCategory | null>(null);\n const [selectedSkill, setSelectedSkill] = useState<SkillData | null>(null);\n\n const categoryCounts = useMemo(() => computeCategoryCounts(skills), [skills]);\n\n const filteredSkills = useMemo(() => {\n const query = searchQuery.toLowerCase();\n return skills.filter((skill) => {\n if (activeCategory && skill.category !== activeCategory) return false;\n if (query) {\n const matchesName = skill.name.toLowerCase().includes(query);\n const matchesDescription = skill.description.toLowerCase().includes(query);\n if (!matchesName && !matchesDescription) return false;\n }\n return true;\n });\n }, [skills, searchQuery, activeCategory]);\n\n const clearFilters = () => {\n setSearchQuery('');\n setActiveCategory(null);\n };\n\n // No skills installed at all\n if (skills.length === 0) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n <EmptyState\n icon={<Puzzle className=\"size-10\" />}\n title=\"No skills found\"\n description=\"No Claude Code skills are installed. Add skills to .claude/skills/ to get started.\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n\n {/* Feature Skills */}\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search skills...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-9\"\n />\n </div>\n\n {/* Category Filter */}\n <CategoryFilter\n activeCategory={activeCategory}\n onCategoryChange={setActiveCategory}\n counts={categoryCounts}\n />\n\n {/* Skill List or Empty Filter State */}\n {filteredSkills.length > 0 ? (\n <SkillList skills={filteredSkills} onSkillSelect={setSelectedSkill} />\n ) : (\n <EmptyState\n icon={<Search className=\"size-10\" />}\n title=\"No matching skills\"\n description=\"No skills match your current search and filter criteria.\"\n action={\n <Button variant=\"outline\" onClick={clearFilters}>\n Clear filters\n </Button>\n }\n />\n )}\n\n {/* Skill Detail Drawer */}\n <SkillDetailDrawer skill={selectedSkill} onClose={() => setSelectedSkill(null)} />\n </div>\n );\n}\n","import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport type { SkillData } from '@/lib/skills';\nimport { FolderOpen } from 'lucide-react';\n\nexport interface SkillCardProps {\n skill: SkillData;\n onSelect: (skill: SkillData) => void;\n}\n\nexport function SkillCard({ skill, onSelect }: SkillCardProps) {\n return (\n <Card\n className=\"hover:border-primary/50 cursor-pointer transition-colors\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(skill)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(skill);\n }\n }}\n data-testid={`skill-card-${skill.name}`}\n >\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base\">{skill.displayName}</CardTitle>\n <p className=\"text-muted-foreground font-mono text-xs\">{skill.name}</p>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-muted-foreground line-clamp-2 text-sm\">{skill.description}</p>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n {skill.allowedTools ? <Badge variant=\"outline\">Tools</Badge> : null}\n {skill.resources.length > 0 ? (\n <span className=\"text-muted-foreground inline-flex items-center gap-1 text-xs\">\n <FolderOpen className=\"size-3\" />\n {skill.resources.length} {skill.resources.length === 1 ? 'resource' : 'resources'}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { SkillCard } from './skill-card';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nconst CATEGORY_ORDER: SkillCategory[] = ['Workflow', 'Code Generation', 'Analysis', 'Reference'];\n\nexport interface SkillListProps {\n skills: SkillData[];\n onSkillSelect: (skill: SkillData) => void;\n}\n\nfunction groupByCategory(skills: SkillData[]): Map<SkillCategory, SkillData[]> {\n const groups = new Map<SkillCategory, SkillData[]>();\n for (const skill of skills) {\n const group = groups.get(skill.category) ?? [];\n group.push(skill);\n groups.set(skill.category, group);\n }\n return groups;\n}\n\nexport function SkillList({ skills, onSkillSelect }: SkillListProps) {\n const groups = groupByCategory(skills);\n\n return (\n <div className=\"space-y-8\">\n {CATEGORY_ORDER.map((category) => {\n const categorySkills = groups.get(category);\n if (!categorySkills || categorySkills.length === 0) return null;\n\n return (\n <section key={category}>\n <h2 className=\"mb-4 text-lg font-semibold\">\n {category}{' '}\n <span className=\"text-muted-foreground text-sm font-normal\">\n ({categorySkills.length})\n </span>\n </h2>\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {categorySkills.map((skill) => (\n <SkillCard key={skill.name} skill={skill} onSelect={onSkillSelect} />\n ))}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import { Button } from '@/components/ui/button';\nimport type { SkillCategory } from '@/lib/skills';\n\nconst CATEGORIES: { label: string; value: SkillCategory | null }[] = [\n { label: 'All', value: null },\n { label: 'Workflow', value: 'Workflow' },\n { label: 'Code Generation', value: 'Code Generation' },\n { label: 'Analysis', value: 'Analysis' },\n { label: 'Reference', value: 'Reference' },\n];\n\nexport interface CategoryFilterProps {\n activeCategory: SkillCategory | null;\n onCategoryChange: (category: SkillCategory | null) => void;\n counts?: Record<SkillCategory, number>;\n}\n\nexport function CategoryFilter({ activeCategory, onCategoryChange, counts }: CategoryFilterProps) {\n return (\n <div className=\"flex flex-wrap gap-2\" role=\"group\" aria-label=\"Filter by category\">\n {CATEGORIES.map(({ label, value }) => (\n <Button\n key={label}\n variant={activeCategory === value ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => onCategoryChange(value)}\n >\n {label}\n {counts && value ? (\n <span className=\"ms-1 text-xs opacity-70\">({counts[value]})</span>\n ) : null}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { Plus, X } from 'lucide-react';\nimport { toast } from 'sonner';\nimport type { SkillInjectionConfig, SkillSource } from '@shepai/core/domain/generated/output';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { removeInjectedSkill } from '@/app/actions/remove-injected-skill';\nimport { AddSkillDialog } from './add-skill-dialog';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AutoInjectedSkillsSectionProps {\n config: SkillInjectionConfig;\n discoveredSkills: SkillData[];\n}\n\nexport function AutoInjectedSkillsSection({\n config,\n discoveredSkills,\n}: AutoInjectedSkillsSectionProps) {\n const router = useRouter();\n const [addDialogOpen, setAddDialogOpen] = useState(false);\n const [removingSkill, setRemovingSkill] = useState<string | null>(null);\n\n const skillDescriptions = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of discoveredSkills) {\n map.set(s.name, s.description);\n }\n return map;\n }, [discoveredSkills]);\n\n const handleRemove = async (skillName: string) => {\n setRemovingSkill(skillName);\n const result = await removeInjectedSkill(skillName);\n setRemovingSkill(null);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to remove skill');\n return;\n }\n toast.success(`Removed \"${skillName}\" from feature skills`);\n router.refresh();\n };\n\n const handleAdded = () => {\n setAddDialogOpen(false);\n router.refresh();\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <h2 className=\"text-base font-semibold\">Feature Skills</h2>\n <p className=\"text-muted-foreground text-sm\">\n Curated skills included in new feature worktrees to guide the agent\n </p>\n </div>\n {config.skills.length > 0 ? (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-3\">\n {config.skills.map((skill) => (\n <InjectedSkillCard\n key={skill.name}\n skill={skill}\n description={skillDescriptions.get(skill.name)}\n onRemove={() => handleRemove(skill.name)}\n isRemoving={removingSkill === skill.name}\n />\n ))}\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n No skills configured. Add skills to guide the agent when working on new features.\n </p>\n )}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAddDialogOpen(true)}\n data-testid=\"add-injected-skill-button\"\n >\n <Plus className=\"mr-1.5 size-4\" />\n Add Skill\n </Button>\n </div>\n <AddSkillDialog\n open={addDialogOpen}\n onOpenChange={setAddDialogOpen}\n onAdded={handleAdded}\n discoveredSkills={discoveredSkills}\n existingSkillNames={config.skills.map((s) => s.name)}\n />\n </div>\n );\n}\n\nfunction InjectedSkillCard({\n skill,\n description,\n onRemove,\n isRemoving,\n}: {\n skill: SkillSource;\n description?: string;\n onRemove: () => void;\n isRemoving: boolean;\n}) {\n return (\n <Card data-testid={`injected-skill-${skill.name}`}>\n <CardHeader className=\"flex flex-row items-start justify-between gap-2 pb-2\">\n <div className=\"min-w-0\">\n <CardTitle className=\"truncate text-sm\">{skill.name}</CardTitle>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n onClick={onRemove}\n disabled={isRemoving}\n aria-label={`Remove ${skill.name}`}\n data-testid={`remove-injected-skill-${skill.name}`}\n >\n <X className=\"size-4\" />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-2 pt-0\">\n {description ? (\n <p className=\"text-muted-foreground line-clamp-2 text-xs\">{description}</p>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <Badge variant={skill.type === 'local' ? 'secondary' : 'outline'} className=\"text-xs\">\n {skill.type === 'local' ? 'Local' : 'Remote'}\n </Badge>\n <span className=\"text-muted-foreground max-w-37.5 truncate text-xs\">{skill.source}</span>\n </div>\n </CardContent>\n </Card>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"404cbbf5cbe0cfdf07d93183de60894f8629e44bbf\":\"removeInjectedSkill\"},\"src/presentation/web/app/actions/remove-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"404cbbf5cbe0cfdf07d93183de60894f8629e44bbf\",callServer,void 0,findSourceMapURL,\"removeInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as removeInjectedSkill};","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport type { SkillSourceType } from '@shepai/core/domain/generated/output';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { addInjectedSkill } from '@/app/actions/add-injected-skill';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AddSkillDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onAdded: () => void;\n discoveredSkills: SkillData[];\n existingSkillNames: string[];\n}\n\nexport function AddSkillDialog({\n open,\n onOpenChange,\n onAdded,\n discoveredSkills,\n existingSkillNames,\n}: AddSkillDialogProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [remoteName, setRemoteName] = useState('');\n const [remoteSource, setRemoteSource] = useState('');\n const [remoteSkillName, setRemoteSkillName] = useState('');\n\n const availableSkills = discoveredSkills.filter((s) => !existingSkillNames.includes(s.name));\n\n const handleAddLocal = async (skill: SkillData) => {\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: skill.name,\n type: 'local' as SkillSourceType,\n source: `.claude/skills/${skill.name}`,\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${skill.name}\" to feature skills`);\n onAdded();\n };\n\n const handleAddRemote = async () => {\n if (!remoteName.trim() || !remoteSource.trim()) {\n toast.error('Name and source are required');\n return;\n }\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: remoteName.trim(),\n type: 'remote' as SkillSourceType,\n source: remoteSource.trim(),\n ...(remoteSkillName.trim() && { remoteSkillName: remoteSkillName.trim() }),\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${remoteName.trim()}\" to feature skills`);\n setRemoteName('');\n setRemoteSource('');\n setRemoteSkillName('');\n onAdded();\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"add-skill-dialog\">\n <DialogHeader>\n <DialogTitle>Add Skill to Features</DialogTitle>\n </DialogHeader>\n <Tabs defaultValue=\"local\">\n <TabsList className=\"w-full\">\n <TabsTrigger value=\"local\" className=\"flex-1\">\n Local\n </TabsTrigger>\n <TabsTrigger value=\"remote\" className=\"flex-1\">\n Remote\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"local\" className=\"mt-4\">\n {availableSkills.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n All discovered skills are already configured.\n </p>\n ) : (\n <div className=\"flex max-h-60 flex-col gap-2 overflow-y-auto\">\n {availableSkills.map((skill) => (\n <button\n key={skill.name}\n type=\"button\"\n className=\"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors\"\n onClick={() => handleAddLocal(skill)}\n disabled={isSubmitting}\n data-testid={`add-local-skill-${skill.name}`}\n >\n <span className=\"text-sm font-medium\">{skill.displayName}</span>\n <span className=\"text-muted-foreground line-clamp-1 text-xs\">\n {skill.description}\n </span>\n </button>\n ))}\n </div>\n )}\n </TabsContent>\n <TabsContent value=\"remote\" className=\"mt-4\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-name\">Name</Label>\n <Input\n id=\"remote-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteName}\n onChange={(e) => setRemoteName(e.target.value)}\n data-testid=\"remote-skill-name\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-source\">Source (npm package or URL)</Label>\n <Input\n id=\"remote-source\"\n placeholder=\"e.g. @anthropic/remotion-skills\"\n value={remoteSource}\n onChange={(e) => setRemoteSource(e.target.value)}\n data-testid=\"remote-skill-source\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-skill-name\">Skill Name (optional)</Label>\n <Input\n id=\"remote-skill-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteSkillName}\n onChange={(e) => setRemoteSkillName(e.target.value)}\n data-testid=\"remote-skill-skill-name\"\n />\n </div>\n <DialogFooter>\n <Button\n onClick={handleAddRemote}\n disabled={isSubmitting || !remoteName.trim() || !remoteSource.trim()}\n data-testid=\"add-remote-skill-submit\"\n >\n Add Remote Skill\n </Button>\n </DialogFooter>\n </div>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40f4b35b187e528b58a0ceffc79c02c821fbf3d40b\":\"addInjectedSkill\"},\"src/presentation/web/app/actions/add-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40f4b35b187e528b58a0ceffc79c02c821fbf3d40b\",callServer,void 0,findSourceMapURL,\"addInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as addInjectedSkill};"],"names":[],"mappings":"0DAEA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QAQO,SAAS,EAAkB,OAAE,CAAK,CAAE,SAAO,CAA0B,EAC1E,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CACT,KAAgB,OAAV,EACN,QAAS,EACT,KAAK,KACL,KAAK,CAAA,CAAA,EACL,cAAY,sBACZ,OACE,EACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,UAAE,EAAM,WAAW,GAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,UAAE,EAAM,IAAI,WAE9B,WAGL,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBAEb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,yCAAiC,EAAM,WAAW,GAG/D,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAA0B,YAAjB,EAAM,MAAM,CAAiB,YAAc,mBACvC,AAAjB,cAAM,MAAM,CAAiB,UAAY,WAE5C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,mBAAW,EAAM,QAAQ,GACvC,EAAM,OAAO,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,mBAAW,EAAM,OAAO,GAAY,QAIrE,EAAM,YAAY,CACjB,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,SACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iCAAwB,kBACtC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAsC,EAAM,YAAY,SAGvE,KAGH,EAAM,SAAS,CAAC,MAAM,CAAG,EACxB,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,SACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iCAAwB,cACtC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,4BACX,EAAM,SAAS,CAAC,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAEC,UAAU,kEAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,sBACtB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACE,EAAS,IAAI,CAAC,OAAK,EAAS,SAAS,CAAE,IAChB,IAAvB,EAAS,SAAS,CAAS,OAAS,aANlC,EAAS,IAAI,WAa1B,KAGH,EAAM,IAAI,CACT,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6EACZ,EAAM,IAAI,MAGb,QAEJ,MAGV,6EC3FA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QCPA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QAEA,EAAA,EAAA,CAAA,CAAA,QAOO,SAAS,EAAU,OAAE,CAAK,UAAE,CAAQ,CAAkB,EAC3D,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,IAAI,CAAA,CACH,UAAU,2DACV,KAAK,SACL,SAAU,EACV,QAAS,IAAM,EAAS,GACxB,UAAW,AAAC,KACI,UAAV,EAAE,GAAG,EAA0B,MAAV,EAAE,GAAG,AAAK,GAAK,CACtC,EAAE,cAAc,GAChB,EAAS,GAEb,EACA,cAAa,CAAC,WAAW,EAAE,EAAM,IAAI,CAAA,CAAE,WAEvC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,iBACpB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,qBAAa,EAAM,WAAW,GACnD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,mDAA2C,EAAM,IAAI,MAEpE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,WAAW,CAAA,CAAC,UAAU,sBACrB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,sDAA8C,EAAM,WAAW,GAC5E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAS,AAAiB,cAAX,MAAM,CAAiB,YAAc,mBACvC,YAAjB,EAAM,MAAM,CAAiB,UAAY,WAE3C,EAAM,OAAO,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,mBAAW,EAAM,OAAO,GAAY,KACnE,EAAM,YAAY,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,mBAAU,UAAgB,KAC9D,EAAM,SAAS,CAAC,MAAM,CAAG,EACxB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,yEACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,WACrB,EAAM,SAAS,CAAC,MAAM,CAAC,IAA6B,IAA3B,EAAM,SAAS,CAAC,MAAM,CAAS,WAAa,eAEtE,aAKd,CC5CA,IAAM,EAAkC,CAAC,WAAY,kBAAmB,WAAY,YAAY,CAiBzF,SAAS,EAAU,CAAE,QAAM,eAAE,CAAa,CAAkB,EACjE,IAAM,EAXR,AAWiB,SAXR,AAAgB,CAAmB,EAC1C,IAAM,EAAS,IAAI,IACnB,IAAK,IAAM,KAAS,EAAQ,CAC1B,IAAM,EAAQ,EAAO,GAAG,CAAC,EAAM,QAAQ,GAAK,EAAE,CAC9C,EAAM,IAAI,CAAC,GACX,EAAO,GAAG,CAAC,EAAM,QAAQ,CAAE,EAC7B,CACA,OAAO,CACT,EAGiC,GAE/B,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBACZ,EAAe,GAAG,CAAC,AAAC,IACnB,IAAM,EAAiB,EAAO,GAAG,CAAC,UAClC,AAAI,AAAC,GAA4C,GAAG,CAA7B,EAAe,MAAM,CAG1C,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,uCACX,EAAU,IACX,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,sDAA4C,IACxD,EAAe,MAAM,CAAC,UAG5B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gEACZ,EAAe,GAAG,CAAC,AAAC,GACnB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAA2B,MAAO,EAAO,SAAU,GAApC,EAAM,IAAI,OATlB,GAH2C,IAiB7D,IAGN,CC5CA,IAAM,EAA+D,CACnE,CAAE,MAAO,MAAO,MAAO,IAAK,EAC5B,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,kBAAmB,MAAO,iBAAkB,EACrD,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,YAAa,MAAO,WAAY,EAC1C,CAQM,SAAS,EAAe,gBAAE,CAAc,kBAAE,CAAgB,CAAE,QAAM,CAAuB,EAC9F,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBAAuB,KAAK,QAAQ,aAAW,8BAC3D,EAAW,GAAG,CAAC,CAAC,OAAE,CAAK,OAAE,CAAK,CAAE,GAC/B,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,MAAM,CAAA,CAEL,QAAS,IAAmB,EAAQ,UAAY,UAChD,KAAK,KACL,QAAS,IAAM,EAAiB,aAE/B,EACA,GAAU,EACT,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,oCAA0B,IAAE,CAAM,CAAC,EAAM,CAAC,OACxD,OARC,KAaf,CHzBA,IAAA,EAAA,EAAA,CAAA,CAAA,QAEA,EAAA,EAAA,CAAA,CAAA,QITA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QCLqN,EAAA,EAAA,CAAA,CAAA,QAAsG,IAAM,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,uBCK1c,IAAA,EAAA,EAAA,CAAA,CAAA,QASA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QCfqT,IAAM,EAAmC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,oBD2B7b,SAAS,EAAe,MAC7B,CAAI,cACJ,CAAY,SACZ,CAAO,kBACP,CAAgB,oBAChB,CAAkB,CACE,EACpB,GAAM,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC3C,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,IACvC,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC3C,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAEjD,EAAkB,EAAiB,MAAM,CAAC,AAAC,GAAM,CAAC,EAAmB,QAAQ,CAAC,EAAE,IAAI,GAEpF,EAAiB,MAAO,IAC5B,GAAgB,GAChB,IAAM,EAAS,MAAM,EAAiB,CACpC,KAAM,EAAM,IAAI,CAChB,KAAM,QACN,OAAQ,CAAC,eAAe,EAAE,EAAM,IAAI,CAAA,CAAE,AACxC,EAEA,EADA,EACI,AADY,IACX,EAAO,OAAO,EAAE,CAIrB,EAAA,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAM,IAAI,CAAC,mBAAmB,CAAC,EACvD,KAJE,EAAA,KAAK,CAAC,KAAK,CAAC,EAAO,KAAK,EAAI,sBAKhC,EAEM,EAAkB,UACtB,GAAI,CAAC,EAAW,IAAI,IAAM,CAAC,EAAa,IAAI,GAAI,YAC9C,EAAA,KAAK,CAAC,KAAK,CAAC,gCAGd,GAAgB,GAChB,IAAM,EAAS,MAAM,EAAiB,CACpC,KAAM,EAAW,IAAI,GACrB,KAAM,SACN,OAAQ,EAAa,IAAI,GACzB,GAAI,EAAgB,IAAI,IAAM,CAAE,gBAAiB,EAAgB,IAAI,EAAG,CAAC,AAC3E,EAEA,EADA,EACI,CADY,GACX,EAAO,OAAO,EAAE,CAIrB,EAAA,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAW,IAAI,GAAG,mBAAmB,CAAC,EAC9D,EAAc,IACd,EAAgB,IAChB,EAAmB,IACnB,KAPE,EAAA,KAAK,CAAC,KAAK,CAAC,EAAO,KAAK,EAAI,sBAQhC,EAEA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,KAAM,EAAM,aAAc,WAChC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,aAAa,CAAA,CAAC,UAAU,cAAc,cAAY,6BACjD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,YAAY,CAAA,UACX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,UAAC,4BAEf,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,IAAI,CAAA,CAAC,aAAa,kBACjB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,QAAQ,CAAA,CAAC,UAAU,mBAClB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,MAAM,QAAQ,UAAU,kBAAS,UAG9C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,MAAM,SAAS,UAAU,kBAAS,cAIjD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,MAAM,QAAQ,UAAU,gBACP,IAA3B,EAAgB,MAAM,CACrB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,yCAAgC,kDAI7C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDACZ,EAAgB,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,UAAU,0FACV,QAAS,IAAM,EAAe,GAC9B,SAAU,EACV,cAAa,CAAC,gBAAgB,EAAE,EAAM,IAAI,CAAA,CAAE,WAE5C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,+BAAuB,EAAM,WAAW,GACxD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sDACb,EAAM,WAAW,KATf,EAAM,IAAI,OAgBzB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,MAAM,SAAS,UAAU,gBACpC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,uBAAc,SAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,GAAG,cACH,YAAY,+BACZ,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,cAAY,yBAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,yBAAgB,gCAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,GAAG,gBACH,YAAY,kCACZ,MAAO,EACP,SAAU,AAAC,GAAM,EAAgB,EAAE,MAAM,CAAC,KAAK,EAC/C,cAAY,2BAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,6BAAoB,0BACnC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,GAAG,oBACH,YAAY,+BACZ,MAAO,EACP,SAAU,AAAC,GAAM,EAAmB,EAAE,MAAM,CAAC,KAAK,EAClD,cAAY,+BAGhB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,YAAY,CAAA,UACX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,QAAS,EACT,SAAU,GAAgB,CAAC,EAAW,IAAI,IAAM,CAAC,EAAa,IAAI,GAClE,cAAY,mCACb,mCAUjB,CFrJO,SAAS,EAA0B,QACxC,CAAM,kBACN,CAAgB,CACe,EAC/B,IAAM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAClB,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC7C,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAE5D,EAAoB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAChC,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAK,EACd,EAAI,GAAG,CAAC,EAAE,IAAI,CAAE,EAAE,AADc,WACH,EAE/B,OAAO,CACT,EAAG,CAAC,EAAiB,EAEf,EAAe,MAAO,IAC1B,EAAiB,GACjB,IAAM,EAAS,MAAM,EAAoB,EAEzC,EADA,EAAiB,AACb,MAAC,EAAO,OAAO,EAAE,CAIrB,EAAA,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAU,qBAAqB,CAAC,EAC1D,EAAO,OAAO,IAJZ,EAAA,KAAK,CAAC,KAAK,CAAC,EAAO,KAAK,EAAI,yBAKhC,EAOA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,mCAA0B,mBACxC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,yCAAgC,2EAI9C,EAAO,MAAM,CAAC,MAAM,CAAG,EACtB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oDACZ,EAAO,MAAM,CAAC,GAAG,CAAE,AAAD,GACjB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAEC,MAAO,EACP,YAAa,EAAkB,GAAG,CAAC,EAAM,IAAI,EAC7C,SAAU,IAAM,EAAa,EAAM,IAAI,EACvC,WAAY,IAAkB,EAAM,IAAI,EAJnC,EAAM,IAAI,KASrB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,yCAAgC,sFAI/C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UACC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,MAAM,CAAA,CACL,QAAQ,UACR,KAAK,KACL,QAAS,IAAM,GAAiB,GAChC,cAAY,sCAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC,UAAU,kBAAkB,iBAItC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,KAAM,EACN,aAAc,EACd,QA5Cc,CA4CL,IA3Cb,GAAiB,GACjB,EAAO,OAAO,EAChB,EA0CM,iBAAkB,EAClB,mBAAoB,EAAO,MAAM,CAAC,GAAG,CAAC,AAAC,GAAM,EAAE,IAAI,MAI3D,CAEA,SAAS,EAAkB,OACzB,CAAK,aACL,CAAW,UACX,CAAQ,YACR,CAAU,CAMX,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,IAAI,CAAA,CAAC,cAAa,CAAC,eAAe,EAAE,EAAM,IAAI,CAAA,CAAE,WAC/C,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,iEACpB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,4BAAoB,EAAM,IAAI,KAErD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,QAAQ,QACR,KAAK,UACL,UAAU,WACV,QAAS,EACT,SAAU,EACV,aAAY,CAAC,OAAO,EAAE,EAAM,IAAI,CAAA,CAAE,CAClC,cAAa,CAAC,sBAAsB,EAAE,EAAM,IAAI,CAAA,CAAE,UAElD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAC,CAAA,CAAC,UAAU,gBAGjB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,WAAW,CAAA,CAAC,UAAU,2BACpB,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,sDAA8C,IACzD,KACJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAwB,AAAf,YAAM,IAAI,CAAe,YAAc,UAAW,UAAU,mBAC1D,UAAf,EAAM,IAAI,CAAe,QAAU,WAEtC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6DAAqD,EAAM,MAAM,WAK3F,CJ3GO,SAAS,EAAiB,QAAE,CAAM,iBAAE,CAAe,CAAyB,EACjF,GAAM,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACzC,CAAC,EAAgB,EAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAuB,MACrE,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAmB,MAE/D,EAAiB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,CAlBvC,SAAS,AAAsB,CAAmB,EAChD,IAAM,EAAwC,CAC5C,SAAU,EACV,kBAAmB,EACnB,SAAU,EACV,UAAW,CACb,EACA,IAAK,IAAM,KAAS,EAClB,CAAM,CAAC,EAAM,CADa,OACL,CAAC,GAExB,OAAO,CACT,GAO6D,GAAS,CAAC,EAAO,EAEtE,EAAiB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAC7B,IAAM,EAAQ,EAAY,WAAW,GACrC,OAAO,EAAO,MAAM,CAAE,AAAD,IACnB,GAAI,GAAkB,EAAM,QAAQ,GAAK,EAAgB,OAAO,EAChE,GAAI,EAAO,CACT,IAAM,EAAc,EAAM,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,GAChD,EAAqB,EAAM,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,GACpE,GAAI,CAAC,GAAe,CAAC,EAAoB,OAAO,CAClD,CACA,MAAO,EACT,EACF,EAAG,CAAC,EAAQ,EAAa,EAAe,SAQlB,AAAtB,GAAyB,CAArB,EAAO,MAAM,CAEb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,MAAM,SAAS,YAAY,iDACvC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAA0B,OAAQ,EAAiB,iBAAkB,IACtE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAA,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CACT,KAAM,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,UAAU,YACxB,MAAM,kBACN,YAAY,0FAOlB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,MAAM,SAAS,YAAY,iDAGvC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAA0B,OAAQ,EAAiB,iBAAkB,IACtE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAA,GAGV,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,UAAU,0EAClB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,YAAY,mBACZ,MAAO,EACP,SAAW,AAAD,GAAO,EAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,UAAU,YAKd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,eAAgB,EAChB,iBAAkB,EAClB,OAAQ,IAIT,EAAe,MAAM,CAAG,EACvB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAU,OAAQ,EAAgB,cAAe,IAElD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CACT,KAAM,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,UAAU,YACxB,MAAM,qBACN,YAAY,2DACZ,OACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,QAAQ,UAAU,QAxDf,CAwDwB,IAvD3C,EAAe,IACf,EAAkB,KACpB,WAqD2D,oBAQvD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CAAC,MAAO,EAAe,QAAS,IAAM,EAAiB,UAG/E"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/presentation/web/components/features/skills/skill-detail-drawer.tsx","../../../../../../../src/presentation/web/components/features/skills/skills-page-client.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-card.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-list.tsx","../../../../../../../src/presentation/web/components/features/skills/category-filter.tsx","../../../../../../../src/presentation/web/components/features/skills/auto-injected-skills-section.tsx","../../../../../../../src/presentation/web/app/actions/data%3A021eb1%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/skills/add-skill-dialog.tsx","../../../../../../../src/presentation/web/app/actions/data%3A04799b%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { FolderOpen } from 'lucide-react';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface SkillDetailDrawerProps {\n skill: SkillData | null;\n onClose: () => void;\n}\n\nexport function SkillDetailDrawer({ skill, onClose }: SkillDetailDrawerProps) {\n return (\n <BaseDrawer\n open={skill !== null}\n onClose={onClose}\n size=\"sm\"\n modal\n data-testid=\"skill-detail-drawer\"\n header={\n skill ? (\n <>\n <DrawerTitle>{skill.displayName}</DrawerTitle>\n <DrawerDescription>{skill.name}</DrawerDescription>\n </>\n ) : undefined\n }\n >\n {skill ? (\n <div className=\"px-4 pb-4\">\n {/* Description */}\n <p className=\"text-muted-foreground text-sm\">{skill.description}</p>\n\n {/* Badges */}\n <div className=\"mt-4 flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n <Badge variant=\"outline\">{skill.category}</Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n </div>\n\n {/* Allowed Tools */}\n {skill.allowedTools ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Allowed Tools</h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">{skill.allowedTools}</p>\n </div>\n </>\n ) : null}\n\n {/* Resources */}\n {skill.resources.length > 0 ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Resources</h3>\n <ul className=\"mt-2 space-y-1.5\">\n {skill.resources.map((resource) => (\n <li\n key={resource.name}\n className=\"text-muted-foreground flex items-center gap-2 text-sm\"\n >\n <FolderOpen className=\"size-3.5 shrink-0\" />\n <span>\n {resource.name}/ — {resource.fileCount}{' '}\n {resource.fileCount === 1 ? 'file' : 'files'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n </>\n ) : null}\n\n {/* Body */}\n {skill.body ? (\n <>\n <Separator className=\"my-4\" />\n <pre className=\"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap\">\n {skill.body}\n </pre>\n </>\n ) : null}\n </div>\n ) : null}\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from 'react';\nimport { Search, Puzzle } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { PageHeader } from '@/components/common/page-header';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { SkillList } from './skill-list';\nimport { CategoryFilter } from './category-filter';\nimport { SkillDetailDrawer } from './skill-detail-drawer';\nimport type { SkillInjectionConfig } from '@shepai/core/domain/generated/output';\nimport { Separator } from '@/components/ui/separator';\nimport { AutoInjectedSkillsSection } from './auto-injected-skills-section';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nexport interface SkillsPageClientProps {\n skills: SkillData[];\n injectionConfig: SkillInjectionConfig;\n}\n\nfunction computeCategoryCounts(skills: SkillData[]): Record<SkillCategory, number> {\n const counts: Record<SkillCategory, number> = {\n Workflow: 0,\n 'Code Generation': 0,\n Analysis: 0,\n Reference: 0,\n };\n for (const skill of skills) {\n counts[skill.category]++;\n }\n return counts;\n}\n\nexport function SkillsPageClient({ skills, injectionConfig }: SkillsPageClientProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] = useState<SkillCategory | null>(null);\n const [selectedSkill, setSelectedSkill] = useState<SkillData | null>(null);\n\n const categoryCounts = useMemo(() => computeCategoryCounts(skills), [skills]);\n\n const filteredSkills = useMemo(() => {\n const query = searchQuery.toLowerCase();\n return skills.filter((skill) => {\n if (activeCategory && skill.category !== activeCategory) return false;\n if (query) {\n const matchesName = skill.name.toLowerCase().includes(query);\n const matchesDescription = skill.description.toLowerCase().includes(query);\n if (!matchesName && !matchesDescription) return false;\n }\n return true;\n });\n }, [skills, searchQuery, activeCategory]);\n\n const clearFilters = () => {\n setSearchQuery('');\n setActiveCategory(null);\n };\n\n // No skills installed at all\n if (skills.length === 0) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n <EmptyState\n icon={<Puzzle className=\"size-10\" />}\n title=\"No skills found\"\n description=\"No Claude Code skills are installed. Add skills to .claude/skills/ to get started.\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n\n {/* Feature Skills */}\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search skills...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-9\"\n />\n </div>\n\n {/* Category Filter */}\n <CategoryFilter\n activeCategory={activeCategory}\n onCategoryChange={setActiveCategory}\n counts={categoryCounts}\n />\n\n {/* Skill List or Empty Filter State */}\n {filteredSkills.length > 0 ? (\n <SkillList skills={filteredSkills} onSkillSelect={setSelectedSkill} />\n ) : (\n <EmptyState\n icon={<Search className=\"size-10\" />}\n title=\"No matching skills\"\n description=\"No skills match your current search and filter criteria.\"\n action={\n <Button variant=\"outline\" onClick={clearFilters}>\n Clear filters\n </Button>\n }\n />\n )}\n\n {/* Skill Detail Drawer */}\n <SkillDetailDrawer skill={selectedSkill} onClose={() => setSelectedSkill(null)} />\n </div>\n );\n}\n","import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport type { SkillData } from '@/lib/skills';\nimport { FolderOpen } from 'lucide-react';\n\nexport interface SkillCardProps {\n skill: SkillData;\n onSelect: (skill: SkillData) => void;\n}\n\nexport function SkillCard({ skill, onSelect }: SkillCardProps) {\n return (\n <Card\n className=\"hover:border-primary/50 cursor-pointer transition-colors\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(skill)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(skill);\n }\n }}\n data-testid={`skill-card-${skill.name}`}\n >\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base\">{skill.displayName}</CardTitle>\n <p className=\"text-muted-foreground font-mono text-xs\">{skill.name}</p>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-muted-foreground line-clamp-2 text-sm\">{skill.description}</p>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n {skill.allowedTools ? <Badge variant=\"outline\">Tools</Badge> : null}\n {skill.resources.length > 0 ? (\n <span className=\"text-muted-foreground inline-flex items-center gap-1 text-xs\">\n <FolderOpen className=\"size-3\" />\n {skill.resources.length} {skill.resources.length === 1 ? 'resource' : 'resources'}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { SkillCard } from './skill-card';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nconst CATEGORY_ORDER: SkillCategory[] = ['Workflow', 'Code Generation', 'Analysis', 'Reference'];\n\nexport interface SkillListProps {\n skills: SkillData[];\n onSkillSelect: (skill: SkillData) => void;\n}\n\nfunction groupByCategory(skills: SkillData[]): Map<SkillCategory, SkillData[]> {\n const groups = new Map<SkillCategory, SkillData[]>();\n for (const skill of skills) {\n const group = groups.get(skill.category) ?? [];\n group.push(skill);\n groups.set(skill.category, group);\n }\n return groups;\n}\n\nexport function SkillList({ skills, onSkillSelect }: SkillListProps) {\n const groups = groupByCategory(skills);\n\n return (\n <div className=\"space-y-8\">\n {CATEGORY_ORDER.map((category) => {\n const categorySkills = groups.get(category);\n if (!categorySkills || categorySkills.length === 0) return null;\n\n return (\n <section key={category}>\n <h2 className=\"mb-4 text-lg font-semibold\">\n {category}{' '}\n <span className=\"text-muted-foreground text-sm font-normal\">\n ({categorySkills.length})\n </span>\n </h2>\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {categorySkills.map((skill) => (\n <SkillCard key={skill.name} skill={skill} onSelect={onSkillSelect} />\n ))}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import { Button } from '@/components/ui/button';\nimport type { SkillCategory } from '@/lib/skills';\n\nconst CATEGORIES: { label: string; value: SkillCategory | null }[] = [\n { label: 'All', value: null },\n { label: 'Workflow', value: 'Workflow' },\n { label: 'Code Generation', value: 'Code Generation' },\n { label: 'Analysis', value: 'Analysis' },\n { label: 'Reference', value: 'Reference' },\n];\n\nexport interface CategoryFilterProps {\n activeCategory: SkillCategory | null;\n onCategoryChange: (category: SkillCategory | null) => void;\n counts?: Record<SkillCategory, number>;\n}\n\nexport function CategoryFilter({ activeCategory, onCategoryChange, counts }: CategoryFilterProps) {\n return (\n <div className=\"flex flex-wrap gap-2\" role=\"group\" aria-label=\"Filter by category\">\n {CATEGORIES.map(({ label, value }) => (\n <Button\n key={label}\n variant={activeCategory === value ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => onCategoryChange(value)}\n >\n {label}\n {counts && value ? (\n <span className=\"ms-1 text-xs opacity-70\">({counts[value]})</span>\n ) : null}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { Plus, X } from 'lucide-react';\nimport { toast } from 'sonner';\nimport type { SkillInjectionConfig, SkillSource } from '@shepai/core/domain/generated/output';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { removeInjectedSkill } from '@/app/actions/remove-injected-skill';\nimport { AddSkillDialog } from './add-skill-dialog';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AutoInjectedSkillsSectionProps {\n config: SkillInjectionConfig;\n discoveredSkills: SkillData[];\n}\n\nexport function AutoInjectedSkillsSection({\n config,\n discoveredSkills,\n}: AutoInjectedSkillsSectionProps) {\n const router = useRouter();\n const [addDialogOpen, setAddDialogOpen] = useState(false);\n const [removingSkill, setRemovingSkill] = useState<string | null>(null);\n\n const skillDescriptions = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of discoveredSkills) {\n map.set(s.name, s.description);\n }\n return map;\n }, [discoveredSkills]);\n\n const handleRemove = async (skillName: string) => {\n setRemovingSkill(skillName);\n const result = await removeInjectedSkill(skillName);\n setRemovingSkill(null);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to remove skill');\n return;\n }\n toast.success(`Removed \"${skillName}\" from feature skills`);\n router.refresh();\n };\n\n const handleAdded = () => {\n setAddDialogOpen(false);\n router.refresh();\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <h2 className=\"text-base font-semibold\">Feature Skills</h2>\n <p className=\"text-muted-foreground text-sm\">\n Curated skills included in new feature worktrees to guide the agent\n </p>\n </div>\n {config.skills.length > 0 ? (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-3\">\n {config.skills.map((skill) => (\n <InjectedSkillCard\n key={skill.name}\n skill={skill}\n description={skillDescriptions.get(skill.name)}\n onRemove={() => handleRemove(skill.name)}\n isRemoving={removingSkill === skill.name}\n />\n ))}\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n No skills configured. Add skills to guide the agent when working on new features.\n </p>\n )}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAddDialogOpen(true)}\n data-testid=\"add-injected-skill-button\"\n >\n <Plus className=\"mr-1.5 size-4\" />\n Add Skill\n </Button>\n </div>\n <AddSkillDialog\n open={addDialogOpen}\n onOpenChange={setAddDialogOpen}\n onAdded={handleAdded}\n discoveredSkills={discoveredSkills}\n existingSkillNames={config.skills.map((s) => s.name)}\n />\n </div>\n );\n}\n\nfunction InjectedSkillCard({\n skill,\n description,\n onRemove,\n isRemoving,\n}: {\n skill: SkillSource;\n description?: string;\n onRemove: () => void;\n isRemoving: boolean;\n}) {\n return (\n <Card data-testid={`injected-skill-${skill.name}`}>\n <CardHeader className=\"flex flex-row items-start justify-between gap-2 pb-2\">\n <div className=\"min-w-0\">\n <CardTitle className=\"truncate text-sm\">{skill.name}</CardTitle>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n onClick={onRemove}\n disabled={isRemoving}\n aria-label={`Remove ${skill.name}`}\n data-testid={`remove-injected-skill-${skill.name}`}\n >\n <X className=\"size-4\" />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-2 pt-0\">\n {description ? (\n <p className=\"text-muted-foreground line-clamp-2 text-xs\">{description}</p>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <Badge variant={skill.type === 'local' ? 'secondary' : 'outline'} className=\"text-xs\">\n {skill.type === 'local' ? 'Local' : 'Remote'}\n </Badge>\n <span className=\"text-muted-foreground max-w-37.5 truncate text-xs\">{skill.source}</span>\n </div>\n </CardContent>\n </Card>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40bbc7a178882065cb023af5e8c819713966705830\":\"removeInjectedSkill\"},\"src/presentation/web/app/actions/remove-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40bbc7a178882065cb023af5e8c819713966705830\",callServer,void 0,findSourceMapURL,\"removeInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as removeInjectedSkill};","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport type { SkillSourceType } from '@shepai/core/domain/generated/output';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { addInjectedSkill } from '@/app/actions/add-injected-skill';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AddSkillDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onAdded: () => void;\n discoveredSkills: SkillData[];\n existingSkillNames: string[];\n}\n\nexport function AddSkillDialog({\n open,\n onOpenChange,\n onAdded,\n discoveredSkills,\n existingSkillNames,\n}: AddSkillDialogProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [remoteName, setRemoteName] = useState('');\n const [remoteSource, setRemoteSource] = useState('');\n const [remoteSkillName, setRemoteSkillName] = useState('');\n\n const availableSkills = discoveredSkills.filter((s) => !existingSkillNames.includes(s.name));\n\n const handleAddLocal = async (skill: SkillData) => {\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: skill.name,\n type: 'local' as SkillSourceType,\n source: `.claude/skills/${skill.name}`,\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${skill.name}\" to feature skills`);\n onAdded();\n };\n\n const handleAddRemote = async () => {\n if (!remoteName.trim() || !remoteSource.trim()) {\n toast.error('Name and source are required');\n return;\n }\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: remoteName.trim(),\n type: 'remote' as SkillSourceType,\n source: remoteSource.trim(),\n ...(remoteSkillName.trim() && { remoteSkillName: remoteSkillName.trim() }),\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${remoteName.trim()}\" to feature skills`);\n setRemoteName('');\n setRemoteSource('');\n setRemoteSkillName('');\n onAdded();\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"add-skill-dialog\">\n <DialogHeader>\n <DialogTitle>Add Skill to Features</DialogTitle>\n </DialogHeader>\n <Tabs defaultValue=\"local\">\n <TabsList className=\"w-full\">\n <TabsTrigger value=\"local\" className=\"flex-1\">\n Local\n </TabsTrigger>\n <TabsTrigger value=\"remote\" className=\"flex-1\">\n Remote\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"local\" className=\"mt-4\">\n {availableSkills.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n All discovered skills are already configured.\n </p>\n ) : (\n <div className=\"flex max-h-60 flex-col gap-2 overflow-y-auto\">\n {availableSkills.map((skill) => (\n <button\n key={skill.name}\n type=\"button\"\n className=\"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors\"\n onClick={() => handleAddLocal(skill)}\n disabled={isSubmitting}\n data-testid={`add-local-skill-${skill.name}`}\n >\n <span className=\"text-sm font-medium\">{skill.displayName}</span>\n <span className=\"text-muted-foreground line-clamp-1 text-xs\">\n {skill.description}\n </span>\n </button>\n ))}\n </div>\n )}\n </TabsContent>\n <TabsContent value=\"remote\" className=\"mt-4\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-name\">Name</Label>\n <Input\n id=\"remote-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteName}\n onChange={(e) => setRemoteName(e.target.value)}\n data-testid=\"remote-skill-name\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-source\">Source (npm package or URL)</Label>\n <Input\n id=\"remote-source\"\n placeholder=\"e.g. @anthropic/remotion-skills\"\n value={remoteSource}\n onChange={(e) => setRemoteSource(e.target.value)}\n data-testid=\"remote-skill-source\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-skill-name\">Skill Name (optional)</Label>\n <Input\n id=\"remote-skill-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteSkillName}\n onChange={(e) => setRemoteSkillName(e.target.value)}\n data-testid=\"remote-skill-skill-name\"\n />\n </div>\n <DialogFooter>\n <Button\n onClick={handleAddRemote}\n disabled={isSubmitting || !remoteName.trim() || !remoteSource.trim()}\n data-testid=\"add-remote-skill-submit\"\n >\n Add Remote Skill\n </Button>\n </DialogFooter>\n </div>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40e2f63b6c84afbed3693cc4359e99d9f35adc1047\":\"addInjectedSkill\"},\"src/presentation/web/app/actions/add-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40e2f63b6c84afbed3693cc4359e99d9f35adc1047\",callServer,void 0,findSourceMapURL,\"addInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as addInjectedSkill};"],"names":[],"mappings":"0DAEA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QAQO,SAAS,EAAkB,OAAE,CAAK,CAAE,SAAO,CAA0B,EAC1E,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CACT,KAAgB,OAAV,EACN,QAAS,EACT,KAAK,KACL,KAAK,CAAA,CAAA,EACL,cAAY,sBACZ,OACE,EACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,UAAE,EAAM,WAAW,GAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,UAAE,EAAM,IAAI,WAE9B,WAGL,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBAEb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,yCAAiC,EAAM,WAAW,GAG/D,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAA0B,YAAjB,EAAM,MAAM,CAAiB,YAAc,mBACvC,AAAjB,cAAM,MAAM,CAAiB,UAAY,WAE5C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,mBAAW,EAAM,QAAQ,GACvC,EAAM,OAAO,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,mBAAW,EAAM,OAAO,GAAY,QAIrE,EAAM,YAAY,CACjB,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,SACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iCAAwB,kBACtC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAsC,EAAM,YAAY,SAGvE,KAGH,EAAM,SAAS,CAAC,MAAM,CAAG,EACxB,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,SACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iCAAwB,cACtC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,4BACX,EAAM,SAAS,CAAC,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAEC,UAAU,kEAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,sBACtB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACE,EAAS,IAAI,CAAC,OAAK,EAAS,SAAS,CAAE,IAChB,IAAvB,EAAS,SAAS,CAAS,OAAS,aANlC,EAAS,IAAI,WAa1B,KAGH,EAAM,IAAI,CACT,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6EACZ,EAAM,IAAI,MAGb,QAEJ,MAGV,6EC3FA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QCPA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QAEA,EAAA,EAAA,CAAA,CAAA,QAOO,SAAS,EAAU,OAAE,CAAK,UAAE,CAAQ,CAAkB,EAC3D,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,IAAI,CAAA,CACH,UAAU,2DACV,KAAK,SACL,SAAU,EACV,QAAS,IAAM,EAAS,GACxB,UAAW,AAAC,KACI,UAAV,EAAE,GAAG,EAA0B,MAAV,EAAE,GAAG,AAAK,GAAK,CACtC,EAAE,cAAc,GAChB,EAAS,GAEb,EACA,cAAa,CAAC,WAAW,EAAE,EAAM,IAAI,CAAA,CAAE,WAEvC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,iBACpB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,qBAAa,EAAM,WAAW,GACnD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,mDAA2C,EAAM,IAAI,MAEpE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,WAAW,CAAA,CAAC,UAAU,sBACrB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,sDAA8C,EAAM,WAAW,GAC5E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAS,AAAiB,cAAX,MAAM,CAAiB,YAAc,mBACvC,YAAjB,EAAM,MAAM,CAAiB,UAAY,WAE3C,EAAM,OAAO,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,mBAAW,EAAM,OAAO,GAAY,KACnE,EAAM,YAAY,CAAG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,mBAAU,UAAgB,KAC9D,EAAM,SAAS,CAAC,MAAM,CAAG,EACxB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,yEACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,WACrB,EAAM,SAAS,CAAC,MAAM,CAAC,IAA6B,IAA3B,EAAM,SAAS,CAAC,MAAM,CAAS,WAAa,eAEtE,aAKd,CC5CA,IAAM,EAAkC,CAAC,WAAY,kBAAmB,WAAY,YAAY,CAiBzF,SAAS,EAAU,CAAE,QAAM,eAAE,CAAa,CAAkB,EACjE,IAAM,EAXR,AAWiB,SAXR,AAAgB,CAAmB,EAC1C,IAAM,EAAS,IAAI,IACnB,IAAK,IAAM,KAAS,EAAQ,CAC1B,IAAM,EAAQ,EAAO,GAAG,CAAC,EAAM,QAAQ,GAAK,EAAE,CAC9C,EAAM,IAAI,CAAC,GACX,EAAO,GAAG,CAAC,EAAM,QAAQ,CAAE,EAC7B,CACA,OAAO,CACT,EAGiC,GAE/B,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBACZ,EAAe,GAAG,CAAC,AAAC,IACnB,IAAM,EAAiB,EAAO,GAAG,CAAC,UAClC,AAAI,AAAC,GAA4C,GAAG,CAA7B,EAAe,MAAM,CAG1C,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,uCACX,EAAU,IACX,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,sDAA4C,IACxD,EAAe,MAAM,CAAC,UAG5B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gEACZ,EAAe,GAAG,CAAC,AAAC,GACnB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAA2B,MAAO,EAAO,SAAU,GAApC,EAAM,IAAI,OATlB,GAH2C,IAiB7D,IAGN,CC5CA,IAAM,EAA+D,CACnE,CAAE,MAAO,MAAO,MAAO,IAAK,EAC5B,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,kBAAmB,MAAO,iBAAkB,EACrD,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,YAAa,MAAO,WAAY,EAC1C,CAQM,SAAS,EAAe,gBAAE,CAAc,kBAAE,CAAgB,CAAE,QAAM,CAAuB,EAC9F,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBAAuB,KAAK,QAAQ,aAAW,8BAC3D,EAAW,GAAG,CAAC,CAAC,OAAE,CAAK,OAAE,CAAK,CAAE,GAC/B,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,MAAM,CAAA,CAEL,QAAS,IAAmB,EAAQ,UAAY,UAChD,KAAK,KACL,QAAS,IAAM,EAAiB,aAE/B,EACA,GAAU,EACT,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,oCAA0B,IAAE,CAAM,CAAC,EAAM,CAAC,OACxD,OARC,KAaf,CHzBA,IAAA,EAAA,EAAA,CAAA,CAAA,QAEA,EAAA,EAAA,CAAA,CAAA,QITA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QCLqN,EAAA,EAAA,CAAA,CAAA,QAAsG,IAAM,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,uBCK1c,IAAA,EAAA,EAAA,CAAA,CAAA,QASA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QCfqT,IAAM,EAAmC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,oBD2B7b,SAAS,EAAe,MAC7B,CAAI,cACJ,CAAY,SACZ,CAAO,kBACP,CAAgB,oBAChB,CAAkB,CACE,EACpB,GAAM,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC3C,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,IACvC,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC3C,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAEjD,EAAkB,EAAiB,MAAM,CAAC,AAAC,GAAM,CAAC,EAAmB,QAAQ,CAAC,EAAE,IAAI,GAEpF,EAAiB,MAAO,IAC5B,GAAgB,GAChB,IAAM,EAAS,MAAM,EAAiB,CACpC,KAAM,EAAM,IAAI,CAChB,KAAM,QACN,OAAQ,CAAC,eAAe,EAAE,EAAM,IAAI,CAAA,CAAE,AACxC,EAEA,EADA,EACI,AADY,IACX,EAAO,OAAO,EAAE,CAIrB,EAAA,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAM,IAAI,CAAC,mBAAmB,CAAC,EACvD,KAJE,EAAA,KAAK,CAAC,KAAK,CAAC,EAAO,KAAK,EAAI,sBAKhC,EAEM,EAAkB,UACtB,GAAI,CAAC,EAAW,IAAI,IAAM,CAAC,EAAa,IAAI,GAAI,YAC9C,EAAA,KAAK,CAAC,KAAK,CAAC,gCAGd,GAAgB,GAChB,IAAM,EAAS,MAAM,EAAiB,CACpC,KAAM,EAAW,IAAI,GACrB,KAAM,SACN,OAAQ,EAAa,IAAI,GACzB,GAAI,EAAgB,IAAI,IAAM,CAAE,gBAAiB,EAAgB,IAAI,EAAG,CAAC,AAC3E,EAEA,EADA,EACI,CADY,GACX,EAAO,OAAO,EAAE,CAIrB,EAAA,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAW,IAAI,GAAG,mBAAmB,CAAC,EAC9D,EAAc,IACd,EAAgB,IAChB,EAAmB,IACnB,KAPE,EAAA,KAAK,CAAC,KAAK,CAAC,EAAO,KAAK,EAAI,sBAQhC,EAEA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,KAAM,EAAM,aAAc,WAChC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,aAAa,CAAA,CAAC,UAAU,cAAc,cAAY,6BACjD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,YAAY,CAAA,UACX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,UAAC,4BAEf,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,IAAI,CAAA,CAAC,aAAa,kBACjB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,QAAQ,CAAA,CAAC,UAAU,mBAClB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,MAAM,QAAQ,UAAU,kBAAS,UAG9C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,MAAM,SAAS,UAAU,kBAAS,cAIjD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,MAAM,QAAQ,UAAU,gBACP,IAA3B,EAAgB,MAAM,CACrB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,yCAAgC,kDAI7C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDACZ,EAAgB,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,UAAU,0FACV,QAAS,IAAM,EAAe,GAC9B,SAAU,EACV,cAAa,CAAC,gBAAgB,EAAE,EAAM,IAAI,CAAA,CAAE,WAE5C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,+BAAuB,EAAM,WAAW,GACxD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sDACb,EAAM,WAAW,KATf,EAAM,IAAI,OAgBzB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,MAAM,SAAS,UAAU,gBACpC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,uBAAc,SAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,GAAG,cACH,YAAY,+BACZ,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,cAAY,yBAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,yBAAgB,gCAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,GAAG,gBACH,YAAY,kCACZ,MAAO,EACP,SAAU,AAAC,GAAM,EAAgB,EAAE,MAAM,CAAC,KAAK,EAC/C,cAAY,2BAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,6BAAoB,0BACnC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,GAAG,oBACH,YAAY,+BACZ,MAAO,EACP,SAAU,AAAC,GAAM,EAAmB,EAAE,MAAM,CAAC,KAAK,EAClD,cAAY,+BAGhB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,YAAY,CAAA,UACX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,QAAS,EACT,SAAU,GAAgB,CAAC,EAAW,IAAI,IAAM,CAAC,EAAa,IAAI,GAClE,cAAY,mCACb,mCAUjB,CFrJO,SAAS,EAA0B,QACxC,CAAM,kBACN,CAAgB,CACe,EAC/B,IAAM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAClB,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC7C,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAE5D,EAAoB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAChC,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAK,EACd,EAAI,GAAG,CAAC,EAAE,IAAI,CAAE,EAAE,AADc,WACH,EAE/B,OAAO,CACT,EAAG,CAAC,EAAiB,EAEf,EAAe,MAAO,IAC1B,EAAiB,GACjB,IAAM,EAAS,MAAM,EAAoB,EAEzC,EADA,EAAiB,AACb,MAAC,EAAO,OAAO,EAAE,CAIrB,EAAA,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAU,qBAAqB,CAAC,EAC1D,EAAO,OAAO,IAJZ,EAAA,KAAK,CAAC,KAAK,CAAC,EAAO,KAAK,EAAI,yBAKhC,EAOA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,mCAA0B,mBACxC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,yCAAgC,2EAI9C,EAAO,MAAM,CAAC,MAAM,CAAG,EACtB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oDACZ,EAAO,MAAM,CAAC,GAAG,CAAE,AAAD,GACjB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAEC,MAAO,EACP,YAAa,EAAkB,GAAG,CAAC,EAAM,IAAI,EAC7C,SAAU,IAAM,EAAa,EAAM,IAAI,EACvC,WAAY,IAAkB,EAAM,IAAI,EAJnC,EAAM,IAAI,KASrB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,yCAAgC,sFAI/C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UACC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,MAAM,CAAA,CACL,QAAQ,UACR,KAAK,KACL,QAAS,IAAM,GAAiB,GAChC,cAAY,sCAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC,UAAU,kBAAkB,iBAItC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,KAAM,EACN,aAAc,EACd,QA5Cc,CA4CL,IA3Cb,GAAiB,GACjB,EAAO,OAAO,EAChB,EA0CM,iBAAkB,EAClB,mBAAoB,EAAO,MAAM,CAAC,GAAG,CAAC,AAAC,GAAM,EAAE,IAAI,MAI3D,CAEA,SAAS,EAAkB,OACzB,CAAK,aACL,CAAW,UACX,CAAQ,YACR,CAAU,CAMX,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,IAAI,CAAA,CAAC,cAAa,CAAC,eAAe,EAAE,EAAM,IAAI,CAAA,CAAE,WAC/C,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,iEACpB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,4BAAoB,EAAM,IAAI,KAErD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,QAAQ,QACR,KAAK,UACL,UAAU,WACV,QAAS,EACT,SAAU,EACV,aAAY,CAAC,OAAO,EAAE,EAAM,IAAI,CAAA,CAAE,CAClC,cAAa,CAAC,sBAAsB,EAAE,EAAM,IAAI,CAAA,CAAE,UAElD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAC,CAAA,CAAC,UAAU,gBAGjB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,WAAW,CAAA,CAAC,UAAU,2BACpB,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,sDAA8C,IACzD,KACJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAwB,AAAf,YAAM,IAAI,CAAe,YAAc,UAAW,UAAU,mBAC1D,UAAf,EAAM,IAAI,CAAe,QAAU,WAEtC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6DAAqD,EAAM,MAAM,WAK3F,CJ3GO,SAAS,EAAiB,QAAE,CAAM,iBAAE,CAAe,CAAyB,EACjF,GAAM,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACzC,CAAC,EAAgB,EAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAuB,MACrE,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAmB,MAE/D,EAAiB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,CAlBvC,SAAS,AAAsB,CAAmB,EAChD,IAAM,EAAwC,CAC5C,SAAU,EACV,kBAAmB,EACnB,SAAU,EACV,UAAW,CACb,EACA,IAAK,IAAM,KAAS,EAClB,CAAM,CAAC,EAAM,CADa,OACL,CAAC,GAExB,OAAO,CACT,GAO6D,GAAS,CAAC,EAAO,EAEtE,EAAiB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAC7B,IAAM,EAAQ,EAAY,WAAW,GACrC,OAAO,EAAO,MAAM,CAAE,AAAD,IACnB,GAAI,GAAkB,EAAM,QAAQ,GAAK,EAAgB,OAAO,EAChE,GAAI,EAAO,CACT,IAAM,EAAc,EAAM,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,GAChD,EAAqB,EAAM,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,GACpE,GAAI,CAAC,GAAe,CAAC,EAAoB,OAAO,CAClD,CACA,MAAO,EACT,EACF,EAAG,CAAC,EAAQ,EAAa,EAAe,SAQlB,AAAtB,GAAyB,CAArB,EAAO,MAAM,CAEb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,MAAM,SAAS,YAAY,iDACvC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAA0B,OAAQ,EAAiB,iBAAkB,IACtE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAA,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CACT,KAAM,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,UAAU,YACxB,MAAM,kBACN,YAAY,0FAOlB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,MAAM,SAAS,YAAY,iDAGvC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAA0B,OAAQ,EAAiB,iBAAkB,IACtE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAA,GAGV,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,UAAU,0EAClB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,YAAY,mBACZ,MAAO,EACP,SAAW,AAAD,GAAO,EAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,UAAU,YAKd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,eAAgB,EAChB,iBAAkB,EAClB,OAAQ,IAIT,EAAe,MAAM,CAAG,EACvB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAU,OAAQ,EAAgB,cAAe,IAElD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CACT,KAAM,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,UAAU,YACxB,MAAM,qBACN,YAAY,2DACZ,OACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,QAAQ,UAAU,QAxDf,CAwDwB,IAvD3C,EAAe,IACf,EAAkB,KACpB,WAqD2D,oBAQvD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CAAC,MAAO,EAAe,QAAS,IAAM,EAAiB,UAG/E"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[495072,a=>{"use strict";var b=a.i(237705),c=a.i(996380);async function d(a){if(!a?.trim())return{error:"Application ID is required"};try{let b=(0,c.resolve)("DeleteApplicationUseCase");return await b.execute(a),{}}catch(a){return{error:a instanceof Error?a.message:"Failed to delete application"}}}(0,a.i(701904).ensureServerEntryExports)([d]),(0,b.registerServerReference)(d,"
|
|
1
|
+
module.exports=[495072,a=>{"use strict";var b=a.i(237705),c=a.i(996380);async function d(a){if(!a?.trim())return{error:"Application ID is required"};try{let b=(0,c.resolve)("DeleteApplicationUseCase");return await b.execute(a),{}}catch(a){return{error:a instanceof Error?a.message:"Failed to delete application"}}}(0,a.i(701904).ensureServerEntryExports)([d]),(0,b.registerServerReference)(d,"400601cc704fc3a542db95c4219b7261168cbe675d",null),a.s(["deleteApplication",()=>d])},280496,a=>{"use strict";var b=a.i(237705),c=a.i(902157),d=a.i(660526),e=a.i(750227),f=a.i(874533),g=a.i(701904);let h={darwin:{cmd:"open",args:a=>[a]},linux:{cmd:"xdg-open",args:a=>[a]},win32:{cmd:"explorer",args:a=>[a]}};async function i(a){if(!a||!(0,e.isAbsolute)(a))return{success:!1,error:"repositoryPath must be an absolute path"};try{if(!(0,c.existsSync)(a))return{success:!1,error:"Directory not found"};let b=h[(0,d.platform)()];if(!b)return{success:!1,error:`Unsupported platform: ${(0,d.platform)()}`};let g=(0,e.normalize)(a),i=(0,f.spawn)(b.cmd,b.args(g),{detached:!0,stdio:"ignore"});return i.on("error",()=>void 0),i.unref(),{success:!0,path:a}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to open folder"}}}(0,g.ensureServerEntryExports)([i]),(0,b.registerServerReference)(i,"40024b9babaf0ccba2c9644e1719947f9662db82da",null),a.s(["openFolder",()=>i])},93225,941872,609959,879124,839353,529207,a=>{"use strict";var b=a.i(237705),c=a.i(996380),d=a.i(701904);async function e(a){if(!a?.trim())return{success:!1,error:"Repository id is required"};try{let b=(0,c.resolve)("SyncRepositoryMainUseCase");return await b.execute(a),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to sync repository"}}}(0,d.ensureServerEntryExports)([e]),(0,b.registerServerReference)(e,"403bcc64cd5c7afe5cb7933130b5d71e9cb6913d44",null),a.s(["syncRepository",()=>e],93225);var f=a.i(633244);async function g(){try{return(0,f.getSettings)().onboardingComplete}catch{return!1}}async function h(){return(0,c.resolve)("CheckAgentAuthUseCase").execute()}(0,d.ensureServerEntryExports)([g]),(0,b.registerServerReference)(g,"000dc696afafd019691d30ebc74c3bb2bf6be80fc9",null),a.s(["isAgentSetupComplete",()=>g],941872),(0,d.ensureServerEntryExports)([h]),(0,b.registerServerReference)(h,"00043b20dfa79e7ce6d504a372669a2b7396e4f421",null),a.s(["checkAgentAuth",()=>h],609959);var i=a.i(874533),j=a.i(825832);function k(a,b){return new Promise(c=>{try{let d=j.IS_WINDOWS?{timeout:5e3,windowsHide:!0}:{timeout:5e3};(0,i.execFile)(a,b,d,(a,b)=>{if(a)return void c({installed:!1,version:null});let d=b.match(/(\d+\.\d+(?:\.\d+)?)/);c({installed:!0,version:d?.[1]??null})})}catch{c({installed:!1,version:null})}})}async function l(){let[a,b,d]=await Promise.all([k("git",["--version"]),k("gh",["--version"]),(async()=>{try{let a=(0,c.resolve)("ListToolsUseCase");return await a.execute()}catch{return[]}})()]),e=d.find(a=>"git"===a.id),f=d.find(a=>"gh"===a.id);return{git:{...a,installCommand:e?.installCommand??null,installUrl:e?.website??"https://git-scm.com"},gh:{...b,installCommand:f?.installCommand??null,installUrl:f?.website??"https://cli.github.com"}}}async function m(a,b){if(!a?.trim())return{success:!1,error:"id is required"};try{let d=(0,c.resolve)("DeleteRepositoryUseCase");return await d.execute(a,{deleteFromDisk:b?.deleteFromDisk===!0}),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to delete repository"}}}async function n(a){let b=(0,c.resolve)("IFeatureRepository"),d=await b.findById(a);return d?{name:d.name,description:d.description}:null}(0,d.ensureServerEntryExports)([l]),(0,b.registerServerReference)(l,"00fd3bb249b5c2f4771f7eac594bf5656eaf959cdb",null),a.s(["checkToolStatus",()=>l],879124),(0,d.ensureServerEntryExports)([m]),(0,b.registerServerReference)(m,"608cb7bed4e740de6ec1034873b198d85e0771cdfb",null),a.s(["deleteRepository",()=>m],839353),(0,d.ensureServerEntryExports)([n]),(0,b.registerServerReference)(n,"40127b07baac3bb5494e3d8ad7b721b35a467f4a93",null),a.s(["getFeatureMetadata",()=>n],529207)},235556,a=>{"use strict";var b=a.i(237705),c=a.i(874533),d=a.i(812057),e=a.i(701904);let f=(0,d.promisify)(c.execFile);async function g(a,b){let{stdout:c}=await f("git",b,{cwd:a,timeout:5e3});return c.trim()}async function h(a,b=8){if(!a.trim())return{commits:[],branches:[],remotes:[],tags:[],stashCount:0,currentBranch:"",diffStats:null,workingTree:{staged:0,modified:0,untracked:0},error:"Repository path is required"};let c=await Promise.allSettled([g(a,["log",`--max-count=${b}`,"--format=%H%x00%h%x00%s%x00%an%x00%cr","--no-color"]),g(a,["branch","--show-current"]),g(a,["branch","--sort=-committerdate","--format=%(HEAD)%(refname:short)%00%(committerdate:relative)","--no-color"]),g(a,["remote","-v"]),g(a,["tag","--sort=-creatordate","-l","--format=%(refname:short)"]),g(a,["stash","list"]),g(a,["status","--porcelain"]),g(a,["diff","HEAD","--shortstat"])]),d=a=>"fulfilled"===c[a].status?c[a].value:"",e=d(0).split("\n").filter(Boolean).map(a=>{let[b,c,d,e,f]=a.split("\0");return{hash:b,shortHash:c,subject:d,author:e,relativeDate:f}}),f=d(1);e.length>0&&f&&(e[0].branch=f);let i=d(2).split("\n").filter(Boolean).slice(0,10).map(a=>{let b=a.startsWith("*"),[c,d]=(b?a.slice(1):a).split("\0");return{name:c.trim(),isCurrent:b,lastCommitDate:d?.trim()??""}}),j=new Map;d(3).split("\n").filter(Boolean).forEach(a=>{let b=a.match(/^(\S+)\s+(\S+)\s+\(fetch\)/);if(b){let a=b[2].replace(/\/\/[^@]+@/,"//").replace(/x-access-token:[^@]+@/,"");j.set(b[1],a)}});let k=Array.from(j,([a,b])=>({name:a,url:b})),l=d(4).split("\n").filter(Boolean).slice(0,5),m=d(5).split("\n").filter(Boolean).length,n=d(6).split("\n").filter(Boolean),o={staged:0,modified:0,untracked:0};for(let a of n){let b=a[0],c=a[1];"?"===b&&"?"===c?o.untracked++:" "!==b&&"?"!==b&&o.staged++," "!==c&&"?"!==c&&o.modified++}let p=null,q=d(7);if(q){let a=q.match(/(\d+) file/),b=q.match(/(\d+) insertion/),c=q.match(/(\d+) deletion/);p={filesChanged:a?parseInt(a[1],10):0,insertions:b?parseInt(b[1],10):0,deletions:c?parseInt(c[1],10):0}}return{commits:e,branches:i,remotes:k,tags:l,stashCount:m,currentBranch:f,diffStats:p,workingTree:o}}async function i(a,b=10){let c=await h(a,b);return{entries:c.commits,error:c.error}}(0,e.ensureServerEntryExports)([h,i]),(0,b.registerServerReference)(h,"60dd3bba8d40f7d7eaab9cf25cfc4a5eedd85c6c3c",null),(0,b.registerServerReference)(i,"60edd8fb9c2f2b88ef5efc6ae8270fc513c08281a5",null),a.s(["getGitRepoInfo",()=>h])},329490,a=>{"use strict";var b=a.i(912513),c=a.i(889253),d=a.i(723504),e=a.i(408115),f=a.i(827900),g=a.i(673350),h=a.i(673101),i=a.i(654775),j=a.i(265324),k=a.i(433841),l=a.i(46646),m=a.i(868378),n=a.i(268670),o=a.i(685321),p=a.i(284095),q=a.i(656799),r=a.i(280496),s=a.i(93225),t=a.i(794691),u=a.i(477710),v=a.i(145395),w=a.i(941872),x=a.i(609959),y=a.i(879124),z=a.i(576707),A=a.i(410528),B=a.i(150845),C=a.i(26604),D=a.i(354723),E=a.i(118942),F=a.i(342886),G=a.i(649560),H=a.i(839353),I=a.i(495072),J=a.i(529207),K=a.i(235556);a.s([],827769),a.i(827769),a.s(["00043b20dfa79e7ce6d504a372669a2b7396e4f421",()=>x.checkAgentAuth,"000dc696afafd019691d30ebc74c3bb2bf6be80fc9",()=>w.isAgentSetupComplete,"00c270c7a6f9c21fabe7b7271a4bf75d5cef02d22a",()=>c.getDefaultAgentAndModel,"00c38b234d35460bb11ea6a1b0fff1c22e01c08873",()=>e.checkAllAgentsStatus,"00c4af7e37cefa35ac7db65fa9b45995caf677a597",()=>i.listGitHubOrganizations,"00c6d708f17ef9dc5f3443dc4d3b3f3756c20b1392",()=>d.getAllAgentModels,"00e58a33ab1b838c8207f1b7dbe831d7a7b8cd3330",()=>b.pickFolder,"00fd3bb249b5c2f4771f7eac594bf5656eaf959cdb",()=>y.checkToolStatus,"40024b9babaf0ccba2c9644e1719947f9662db82da",()=>r.openFolder,"400601cc704fc3a542db95c4219b7261168cbe675d",()=>I.deleteApplication,"40127b07baac3bb5494e3d8ad7b721b35a467f4a93",()=>J.getFeatureMetadata,"4015ea81e1b2a02fe57f374a012b37e2cd322146f1",()=>g.globalSearch,"402a545f24583952d99d18566abf474dd10d07741b",()=>o.getDeploymentStatus,"402a7da73158b6bd6c8fb8ab5b0344dc0e0f08e228",()=>u.createProjectAndFeature,"402b7881a750d5c7c7125153b65fdd64c555ddcdc2",()=>v.createApplication,"403a844cbb36e5d50051fe552f050ed35a8b88f317",()=>l.deployRepository,"403bcc64cd5c7afe5cb7933130b5d71e9cb6913d44",()=>s.syncRepository,"403c93928208c54fe25784ff60dcb073f25d1055c1",()=>n.stopDeployment,"4047cfaa45cd7417712356735bfbb78f93a103592a",()=>F.unarchiveFeature,"40559cc32878be443a5d902e563fa65ac29566c575",()=>m.deployApplication,"405f5f5259eaed6742d1a59f416d4319ea63f3bb3d",()=>j.importGitHubRepository,"405f73e1d0740c127aafceadc63304676969dbb19a",()=>A.archiveFeature,"406f6bfbd22a176bf6d0bca648d1bd1ef29efb8c31",()=>p.openIde,"4093cfae5c300fc17a16104784825641972f80a2c2",()=>E.stopFeature,"40a8e46a1833838a96e4b3f97741ab37054dc3a415",()=>G.addRepository,"40aa1efa0fed8941c16c9537ba0c5d988cf13fecaf",()=>k.deployFeature,"40b195fc3bd3d0b6f99d9ba0ce3b624b5201e8e478",()=>D.startFeature,"40cede021cd5c33e6bf9d5871c23ea5e73f6809b4b",()=>q.openShell,"40d1082c73e97a2c5f99ef11d815cefe59a26e8998",()=>h.listGitHubRepositories,"40da762c4b34966ae0ac466fdc38dd417bb5f12247",()=>z.createProjectFolder,"40e827f64795e580b75e126ddfefa3a9a722da877c",()=>t.getDeploymentLogs,"40ef132579c95dc894986b34b75cb89dd65b39da86",()=>C.resumeFeature,"608cb7bed4e740de6ec1034873b198d85e0771cdfb",()=>H.deleteRepository,"60afd0d4fa2a6638646f7d23dc6c8673fd27a69207",()=>f.updateAgentAndModel,"60dd3bba8d40f7d7eaab9cf25cfc4a5eedd85c6c3c",()=>K.getGitRepoInfo,"782094d73ba803f25ee4b483796e8b0625c3c6564f",()=>B.deleteFeature],329490)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_presentation_web_d3858f16._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/delete-application.ts","../../../../../../../src/presentation/web/app/actions/open-folder.ts","../../../../../../../src/presentation/web/app/actions/sync-repository.ts","../../../../../../../src/presentation/web/app/actions/agent-setup-flag.ts","../../../../../../../src/presentation/web/app/actions/check-agent-auth.ts","../../../../../../../src/presentation/web/app/actions/check-tool-status.ts","../../../../../../../src/presentation/web/app/actions/delete-repository.ts","../../../../../../../src/presentation/web/app/actions/get-feature-metadata.ts","../../../../../../../src/presentation/web/app/actions/get-git-log.ts","../../../../../../../src/presentation/web/.next-internal/server/app/%28dashboard%29/repository/%5BrepositoryId%5D/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteApplicationUseCase } from '@shepai/core/application/use-cases/applications/delete-application.use-case';\n\nexport async function deleteApplication(id: string): Promise<{ error?: string }> {\n if (!id?.trim()) {\n return { error: 'Application ID is required' };\n }\n\n try {\n const useCase = resolve<DeleteApplicationUseCase>('DeleteApplicationUseCase');\n await useCase.execute(id);\n return {};\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete application';\n return { error: message };\n }\n}\n","'use server';\n\nimport { existsSync } from 'node:fs';\nimport { platform } from 'node:os';\nimport { isAbsolute, normalize } from 'node:path';\nimport { spawn } from 'node:child_process';\n\n// Use a record lookup instead of if/else to prevent the bundler from\n// tree-shaking platform branches at build time. Turbopack evaluates\n// os.platform() during the build and dead-code-eliminates unused branches,\n// baking in the CI platform (linux) and breaking macOS/Windows installs.\nconst FOLDER_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> = {\n darwin: { cmd: 'open', args: (p) => [p] },\n linux: { cmd: 'xdg-open', args: (p) => [p] },\n win32: { cmd: 'explorer', args: (p) => [p] },\n};\n\nexport async function openFolder(\n repositoryPath: string\n): Promise<{ success: boolean; error?: string; path?: string }> {\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n if (!existsSync(repositoryPath)) {\n return { success: false, error: 'Directory not found' };\n }\n\n const entry = FOLDER_COMMANDS[platform()];\n if (!entry) {\n return {\n success: false,\n error: `Unsupported platform: ${platform()}`,\n };\n }\n\n // Normalize to platform-native separators — explorer.exe on Windows\n // does not understand forward-slash paths and falls back to Documents.\n const nativePath = normalize(repositoryPath);\n\n const child = spawn(entry.cmd, entry.args(nativePath), {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined); // Prevent uncaught exception on spawn failure\n child.unref();\n\n return { success: true, path: repositoryPath };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { SyncRepositoryMainUseCase } from '@shepai/core/application/use-cases/repositories/sync-repository-main.use-case';\n\nexport async function syncRepository(\n repositoryId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'Repository id is required' };\n }\n\n try {\n const useCase = resolve<SyncRepositoryMainUseCase>('SyncRepositoryMainUseCase');\n await useCase.execute(repositoryId);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to sync repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { getSettings } from '@shepai/core/infrastructure/services/settings.service';\n\n/**\n * Check whether onboarding has been completed.\n * Delegates to the in-memory settings singleton (zero DB overhead).\n */\nexport async function isAgentSetupComplete(): Promise<boolean> {\n try {\n return getSettings().onboardingComplete;\n } catch {\n return false;\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { CheckAgentAuthUseCase } from '@shepai/core/application/use-cases/agents/check-agent-auth.use-case';\n\n/**\n * Result shape for the agent auth checklist on the onboarding empty state.\n * Matches CheckAgentAuthResult from the use case 1:1 — kept locally so the\n * web type stays serializable through the Server Actions boundary.\n */\nexport interface AgentAuthStatus {\n agentType: string;\n /** Whether the CLI tool binary is installed */\n installed: boolean;\n /** Whether credentials / auth appear valid */\n authenticated: boolean;\n /** Human-readable label for the agent */\n label: string;\n /** CLI binary name (e.g. \"claude\", \"gemini\") */\n binaryName: string | null;\n /** Shell command to install the tool (e.g. \"npm install -g @anthropic-ai/claude-code\") */\n installCommand: string | null;\n /** Instructions to authenticate if not authenticated */\n authCommand: string | null;\n}\n\n/**\n * Thin server-action wrapper around CheckAgentAuthUseCase. All agent-type\n * mapping, tool lookup, and platform credential detection live in:\n *\n * packages/core/src/application/use-cases/agents/check-agent-auth.use-case.ts\n * packages/core/src/infrastructure/services/agent-auth-detector/platform-agent-auth-detector.service.ts\n */\nexport async function checkAgentAuth(): Promise<AgentAuthStatus> {\n const useCase = resolve<CheckAgentAuthUseCase>('CheckAgentAuthUseCase');\n return useCase.execute();\n}\n","'use server';\n\nimport { execFile } from 'node:child_process';\nimport { IS_WINDOWS } from '@shepai/core/infrastructure/platform';\nimport { resolve } from '@/lib/server-container';\nimport type { ListToolsUseCase } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolStatusEntry {\n installed: boolean;\n version: string | null;\n /** Platform-specific install command from tool JSON metadata */\n installCommand: string | null;\n /** Documentation/website URL */\n installUrl: string | null;\n}\n\nexport interface ToolStatusResult {\n git: ToolStatusEntry;\n gh: ToolStatusEntry;\n}\n\nfunction getVersion(\n command: string,\n args: string[]\n): Promise<{ installed: boolean; version: string | null }> {\n return new Promise((resolve) => {\n try {\n const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile(command, args, opts, (error, stdout) => {\n if (error) {\n resolve({ installed: false, version: null });\n return;\n }\n // Extract version number from output like \"git version 2.43.0\" or \"gh version 2.40.1\"\n const match = stdout.match(/(\\d+\\.\\d+(?:\\.\\d+)?)/);\n resolve({ installed: true, version: match?.[1] ?? null });\n });\n } catch {\n resolve({ installed: false, version: null });\n }\n });\n}\n\nexport async function checkToolStatus(): Promise<ToolStatusResult> {\n // Run version checks and tool metadata lookup in parallel\n const [gitVersion, ghVersion, tools] = await Promise.all([\n getVersion('git', ['--version']),\n getVersion('gh', ['--version']),\n (async () => {\n try {\n const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');\n return await useCase.execute();\n } catch {\n return [];\n }\n })(),\n ]);\n\n const gitTool = tools.find((t) => t.id === 'git');\n const ghTool = tools.find((t) => t.id === 'gh');\n\n return {\n git: {\n ...gitVersion,\n installCommand: gitTool?.installCommand ?? null,\n installUrl: gitTool?.website ?? 'https://git-scm.com',\n },\n gh: {\n ...ghVersion,\n installCommand: ghTool?.installCommand ?? null,\n installUrl: ghTool?.website ?? 'https://cli.github.com',\n },\n };\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteRepositoryUseCase } from '@shepai/core/application/use-cases/repositories/delete-repository.use-case';\n\nexport interface DeleteRepositoryActionOptions {\n deleteFromDisk?: boolean;\n}\n\nexport async function deleteRepository(\n repositoryId: string,\n options?: DeleteRepositoryActionOptions\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'id is required' };\n }\n\n try {\n const useCase = resolve<DeleteRepositoryUseCase>('DeleteRepositoryUseCase');\n await useCase.execute(repositoryId, { deleteFromDisk: options?.deleteFromDisk === true });\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';\n\n/**\n * Lightweight server action to fetch a single feature's name and description.\n * Used by the SSE effect to update node metadata after AI metadata generation\n * without a full graph reconcile (which can overwrite SSE-driven state).\n */\nexport async function getFeatureMetadata(\n featureId: string\n): Promise<{ name: string; description: string } | null> {\n const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');\n const feature = await featureRepo.findById(featureId);\n if (!feature) return null;\n return { name: feature.name, description: feature.description };\n}\n","'use server';\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nasync function git(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await execFileAsync('git', args, { cwd, timeout: 5000 });\n return stdout.trim();\n}\n\nexport interface GitLogEntry {\n hash: string;\n shortHash: string;\n subject: string;\n author: string;\n relativeDate: string;\n branch?: string;\n}\n\nexport interface GitBranchInfo {\n name: string;\n isCurrent: boolean;\n lastCommitDate: string;\n}\n\nexport interface GitRemoteInfo {\n name: string;\n url: string;\n}\n\nexport interface GitWorkingTreeStatus {\n staged: number;\n modified: number;\n untracked: number;\n}\n\nexport interface GitDiffStats {\n filesChanged: number;\n insertions: number;\n deletions: number;\n}\n\nexport interface GitRepoInfo {\n commits: GitLogEntry[];\n branches: GitBranchInfo[];\n remotes: GitRemoteInfo[];\n tags: string[];\n stashCount: number;\n currentBranch: string;\n diffStats: GitDiffStats | null;\n workingTree: GitWorkingTreeStatus;\n error?: string;\n}\n\nexport async function getGitRepoInfo(\n repositoryPath: string,\n commitLimit = 8\n): Promise<GitRepoInfo> {\n const empty: GitRepoInfo = {\n commits: [],\n branches: [],\n remotes: [],\n tags: [],\n stashCount: 0,\n currentBranch: '',\n diffStats: null,\n workingTree: { staged: 0, modified: 0, untracked: 0 },\n };\n\n if (!repositoryPath.trim()) {\n return { ...empty, error: 'Repository path is required' };\n }\n\n const results = await Promise.allSettled([\n // 0: commits\n git(repositoryPath, [\n 'log',\n `--max-count=${commitLimit}`,\n '--format=%H%x00%h%x00%s%x00%an%x00%cr',\n '--no-color',\n ]),\n // 1: current branch\n git(repositoryPath, ['branch', '--show-current']),\n // 2: branches with dates\n git(repositoryPath, [\n 'branch',\n '--sort=-committerdate',\n '--format=%(HEAD)%(refname:short)%00%(committerdate:relative)',\n '--no-color',\n ]),\n // 3: remotes\n git(repositoryPath, ['remote', '-v']),\n // 4: tags (recent 5)\n git(repositoryPath, ['tag', '--sort=-creatordate', '-l', '--format=%(refname:short)']),\n // 5: stash count\n git(repositoryPath, ['stash', 'list']),\n // 6: working tree status\n git(repositoryPath, ['status', '--porcelain']),\n // 7: diff stats (uncommitted — includes staged + unstaged vs HEAD)\n git(repositoryPath, ['diff', 'HEAD', '--shortstat']),\n ]);\n\n const val = (i: number) => (results[i].status === 'fulfilled' ? results[i].value : '');\n\n // Parse commits\n const commits: GitLogEntry[] = val(0)\n .split('\\n')\n .filter(Boolean)\n .map((line: string) => {\n const [hash, shortHash, subject, author, relativeDate] = line.split('\\0');\n return { hash, shortHash, subject, author, relativeDate };\n });\n\n const currentBranch = val(1);\n if (commits.length > 0 && currentBranch) {\n commits[0].branch = currentBranch;\n }\n\n // Parse branches\n const branches: GitBranchInfo[] = val(2)\n .split('\\n')\n .filter(Boolean)\n .slice(0, 10)\n .map((line: string) => {\n const isCurrent = line.startsWith('*');\n const clean = isCurrent ? line.slice(1) : line;\n const [name, lastCommitDate] = clean.split('\\0');\n return { name: name.trim(), isCurrent, lastCommitDate: lastCommitDate?.trim() ?? '' };\n });\n\n // Parse remotes (dedup fetch/push)\n const remoteMap = new Map<string, string>();\n val(3)\n .split('\\n')\n .filter(Boolean)\n .forEach((line: string) => {\n const match = line.match(/^(\\S+)\\s+(\\S+)\\s+\\(fetch\\)/);\n if (match) {\n // Strip credentials/tokens from URL before sending to client\n const sanitized = match[2].replace(/\\/\\/[^@]+@/, '//').replace(/x-access-token:[^@]+@/, '');\n remoteMap.set(match[1], sanitized);\n }\n });\n const remotes: GitRemoteInfo[] = Array.from(remoteMap, ([name, url]) => ({ name, url }));\n\n // Parse tags (top 5)\n const tags = val(4).split('\\n').filter(Boolean).slice(0, 5);\n\n // Stash count\n const stashCount = val(5).split('\\n').filter(Boolean).length;\n\n // Working tree status\n const statusLines = val(6).split('\\n').filter(Boolean);\n const workingTree: GitWorkingTreeStatus = { staged: 0, modified: 0, untracked: 0 };\n for (const line of statusLines) {\n const x = line[0];\n const y = line[1];\n if (x === '?' && y === '?') workingTree.untracked++;\n else if (x !== ' ' && x !== '?') workingTree.staged++;\n if (y !== ' ' && y !== '?') workingTree.modified++;\n }\n\n // Diff stats\n let diffStats: GitDiffStats | null = null;\n const diffLine = val(7);\n if (diffLine) {\n const files = diffLine.match(/(\\d+) file/);\n const ins = diffLine.match(/(\\d+) insertion/);\n const del = diffLine.match(/(\\d+) deletion/);\n diffStats = {\n filesChanged: files ? parseInt(files[1], 10) : 0,\n insertions: ins ? parseInt(ins[1], 10) : 0,\n deletions: del ? parseInt(del[1], 10) : 0,\n };\n }\n\n return { commits, branches, remotes, tags, stashCount, currentBranch, diffStats, workingTree };\n}\n\n// Keep backward compat\nexport async function getGitLog(\n repositoryPath: string,\n limit = 10\n): Promise<{ entries: GitLogEntry[]; error?: string }> {\n const info = await getGitRepoInfo(repositoryPath, limit);\n return { entries: info.commits, error: info.error };\n}\n","export {pickFolder as '0015f0a240c29915a74257d5ff2d7d15b32c6a778d'} from 'ACTIONS_MODULE0'\nexport {getDefaultAgentAndModel as '006ff5a74754817b8a495d7ba26e66c354851f6c99'} from 'ACTIONS_MODULE1'\nexport {getAllAgentModels as '00d43390ab8112b0e6ec134ef3485ab210e36f7842'} from 'ACTIONS_MODULE2'\nexport {checkAllAgentsStatus as '00d2c30c2b08e36b014924412d0cd61610cd91c78e'} from 'ACTIONS_MODULE3'\nexport {updateAgentAndModel as '60036293085b1751ff35875b7762b2353bb09757b5'} from 'ACTIONS_MODULE4'\nexport {globalSearch as '40fcb38a7daafc835826043ee30ef771eae2a2f635'} from 'ACTIONS_MODULE5'\nexport {listGitHubRepositories as '403ab98df2cf8db571b47142cd90ab7c7f297fa90f'} from 'ACTIONS_MODULE6'\nexport {listGitHubOrganizations as '00613a83ba2b2619c9ef46303abae5aded26339bc3'} from 'ACTIONS_MODULE7'\nexport {importGitHubRepository as '40e011f8f2f54f36460ff5310dd49178590a992d44'} from 'ACTIONS_MODULE8'\nexport {deployFeature as '401846920f6fb739e32233d9d6a6df7945b8621c00'} from 'ACTIONS_MODULE9'\nexport {deployRepository as '408a28f520d819792447d4b47d9b73a5ddf7296469'} from 'ACTIONS_MODULE10'\nexport {deployApplication as '4005923232df16201d86b35c46dbbe719725cbcd26'} from 'ACTIONS_MODULE11'\nexport {stopDeployment as '409ab95b1ec58ad7dd578b018e11d5bd766839f8bc'} from 'ACTIONS_MODULE12'\nexport {getDeploymentStatus as '40ed3ea24841c9c4280513ab004dcdbce3d545bcdb'} from 'ACTIONS_MODULE13'\nexport {openIde as '40ab7fa1f69e2aec8b94563e16d0019f3589ec2f2e'} from 'ACTIONS_MODULE14'\nexport {openShell as '40b95792d8bb0de2aa9914ff42b671ff42b87c24ba'} from 'ACTIONS_MODULE15'\nexport {openFolder as '40e7ea921079c1a8fe79fc7cfb59743f718c5944f7'} from 'ACTIONS_MODULE16'\nexport {syncRepository as '40eb53de65273a529e251542555f94321ea9c2fcaf'} from 'ACTIONS_MODULE17'\nexport {getDeploymentLogs as '405723722c9eb9b4888b52203cfb121401f0c61a80'} from 'ACTIONS_MODULE18'\nexport {createProjectAndFeature as '40ba17f62f174f4f88aa0ea4a373db347247ae1171'} from 'ACTIONS_MODULE19'\nexport {createApplication as '40f744f8f8785a86cc8dc9487da8d64ca353d264af'} from 'ACTIONS_MODULE20'\nexport {isAgentSetupComplete as '002230a65a9a52766f2fac7b9bafe2f0a0ab4ff5f5'} from 'ACTIONS_MODULE21'\nexport {checkAgentAuth as '003eb1909cd10ed1e04526145e4a21282e819a745e'} from 'ACTIONS_MODULE22'\nexport {checkToolStatus as '00f312436a846d36665ad6519b2a873685e7baa13f'} from 'ACTIONS_MODULE23'\nexport {createProjectFolder as '40c4d25fb30555d92bf75dd650e2cce9b8be92dc0b'} from 'ACTIONS_MODULE24'\nexport {archiveFeature as '40d0ac4c8ca5c179014f909f203d903942417295df'} from 'ACTIONS_MODULE25'\nexport {deleteFeature as '783175472a45c2823bb1c4751b36e777308131d27d'} from 'ACTIONS_MODULE26'\nexport {resumeFeature as '4070f2c934a9ed351d223ad18ae9602cff12614292'} from 'ACTIONS_MODULE27'\nexport {startFeature as '4047fcf9280c5bc168edadf9f0c951bc2514b41fe0'} from 'ACTIONS_MODULE28'\nexport {stopFeature as '404b80493cf36c04e22e68ebf8f56c46bf55d904c0'} from 'ACTIONS_MODULE29'\nexport {unarchiveFeature as '40c64b253cb9310f09f151401d5eb06957db761efa'} from 'ACTIONS_MODULE30'\nexport {addRepository as '40d4837169557e75f0be6d0f89f7fea0ff41eb89fc'} from 'ACTIONS_MODULE31'\nexport {deleteRepository as '60495f1a3ee94d5d2693e35665a5b94c6c425339ab'} from 'ACTIONS_MODULE32'\nexport {deleteApplication as '40af1b8d14947496efa0de09d2e46341cfadd226ac'} from 'ACTIONS_MODULE33'\nexport {getFeatureMetadata as '4094d93eeeace2053edf550148c9336dfa0384d465'} from 'ACTIONS_MODULE34'\nexport {getGitRepoInfo as '60f4c819a13f54bcc8320595c03e11fb6cafe8913b'} from 'ACTIONS_MODULE35'\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/delete-application.ts","../../../../../../../src/presentation/web/app/actions/open-folder.ts","../../../../../../../src/presentation/web/app/actions/sync-repository.ts","../../../../../../../src/presentation/web/app/actions/agent-setup-flag.ts","../../../../../../../src/presentation/web/app/actions/check-agent-auth.ts","../../../../../../../src/presentation/web/app/actions/check-tool-status.ts","../../../../../../../src/presentation/web/app/actions/delete-repository.ts","../../../../../../../src/presentation/web/app/actions/get-feature-metadata.ts","../../../../../../../src/presentation/web/app/actions/get-git-log.ts","../../../../../../../src/presentation/web/.next-internal/server/app/%28dashboard%29/repository/%5BrepositoryId%5D/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteApplicationUseCase } from '@shepai/core/application/use-cases/applications/delete-application.use-case';\n\nexport async function deleteApplication(id: string): Promise<{ error?: string }> {\n if (!id?.trim()) {\n return { error: 'Application ID is required' };\n }\n\n try {\n const useCase = resolve<DeleteApplicationUseCase>('DeleteApplicationUseCase');\n await useCase.execute(id);\n return {};\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete application';\n return { error: message };\n }\n}\n","'use server';\n\nimport { existsSync } from 'node:fs';\nimport { platform } from 'node:os';\nimport { isAbsolute, normalize } from 'node:path';\nimport { spawn } from 'node:child_process';\n\n// Use a record lookup instead of if/else to prevent the bundler from\n// tree-shaking platform branches at build time. Turbopack evaluates\n// os.platform() during the build and dead-code-eliminates unused branches,\n// baking in the CI platform (linux) and breaking macOS/Windows installs.\nconst FOLDER_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> = {\n darwin: { cmd: 'open', args: (p) => [p] },\n linux: { cmd: 'xdg-open', args: (p) => [p] },\n win32: { cmd: 'explorer', args: (p) => [p] },\n};\n\nexport async function openFolder(\n repositoryPath: string\n): Promise<{ success: boolean; error?: string; path?: string }> {\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n if (!existsSync(repositoryPath)) {\n return { success: false, error: 'Directory not found' };\n }\n\n const entry = FOLDER_COMMANDS[platform()];\n if (!entry) {\n return {\n success: false,\n error: `Unsupported platform: ${platform()}`,\n };\n }\n\n // Normalize to platform-native separators — explorer.exe on Windows\n // does not understand forward-slash paths and falls back to Documents.\n const nativePath = normalize(repositoryPath);\n\n const child = spawn(entry.cmd, entry.args(nativePath), {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined); // Prevent uncaught exception on spawn failure\n child.unref();\n\n return { success: true, path: repositoryPath };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { SyncRepositoryMainUseCase } from '@shepai/core/application/use-cases/repositories/sync-repository-main.use-case';\n\nexport async function syncRepository(\n repositoryId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'Repository id is required' };\n }\n\n try {\n const useCase = resolve<SyncRepositoryMainUseCase>('SyncRepositoryMainUseCase');\n await useCase.execute(repositoryId);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to sync repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { getSettings } from '@shepai/core/infrastructure/services/settings.service';\n\n/**\n * Check whether onboarding has been completed.\n * Delegates to the in-memory settings singleton (zero DB overhead).\n */\nexport async function isAgentSetupComplete(): Promise<boolean> {\n try {\n return getSettings().onboardingComplete;\n } catch {\n return false;\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { CheckAgentAuthUseCase } from '@shepai/core/application/use-cases/agents/check-agent-auth.use-case';\n\n/**\n * Result shape for the agent auth checklist on the onboarding empty state.\n * Matches CheckAgentAuthResult from the use case 1:1 — kept locally so the\n * web type stays serializable through the Server Actions boundary.\n */\nexport interface AgentAuthStatus {\n agentType: string;\n /** Whether the CLI tool binary is installed */\n installed: boolean;\n /** Whether credentials / auth appear valid */\n authenticated: boolean;\n /** Human-readable label for the agent */\n label: string;\n /** CLI binary name (e.g. \"claude\", \"gemini\") */\n binaryName: string | null;\n /** Shell command to install the tool (e.g. \"npm install -g @anthropic-ai/claude-code\") */\n installCommand: string | null;\n /** Instructions to authenticate if not authenticated */\n authCommand: string | null;\n}\n\n/**\n * Thin server-action wrapper around CheckAgentAuthUseCase. All agent-type\n * mapping, tool lookup, and platform credential detection live in:\n *\n * packages/core/src/application/use-cases/agents/check-agent-auth.use-case.ts\n * packages/core/src/infrastructure/services/agent-auth-detector/platform-agent-auth-detector.service.ts\n */\nexport async function checkAgentAuth(): Promise<AgentAuthStatus> {\n const useCase = resolve<CheckAgentAuthUseCase>('CheckAgentAuthUseCase');\n return useCase.execute();\n}\n","'use server';\n\nimport { execFile } from 'node:child_process';\nimport { IS_WINDOWS } from '@shepai/core/infrastructure/platform';\nimport { resolve } from '@/lib/server-container';\nimport type { ListToolsUseCase } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolStatusEntry {\n installed: boolean;\n version: string | null;\n /** Platform-specific install command from tool JSON metadata */\n installCommand: string | null;\n /** Documentation/website URL */\n installUrl: string | null;\n}\n\nexport interface ToolStatusResult {\n git: ToolStatusEntry;\n gh: ToolStatusEntry;\n}\n\nfunction getVersion(\n command: string,\n args: string[]\n): Promise<{ installed: boolean; version: string | null }> {\n return new Promise((resolve) => {\n try {\n const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile(command, args, opts, (error, stdout) => {\n if (error) {\n resolve({ installed: false, version: null });\n return;\n }\n // Extract version number from output like \"git version 2.43.0\" or \"gh version 2.40.1\"\n const match = stdout.match(/(\\d+\\.\\d+(?:\\.\\d+)?)/);\n resolve({ installed: true, version: match?.[1] ?? null });\n });\n } catch {\n resolve({ installed: false, version: null });\n }\n });\n}\n\nexport async function checkToolStatus(): Promise<ToolStatusResult> {\n // Run version checks and tool metadata lookup in parallel\n const [gitVersion, ghVersion, tools] = await Promise.all([\n getVersion('git', ['--version']),\n getVersion('gh', ['--version']),\n (async () => {\n try {\n const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');\n return await useCase.execute();\n } catch {\n return [];\n }\n })(),\n ]);\n\n const gitTool = tools.find((t) => t.id === 'git');\n const ghTool = tools.find((t) => t.id === 'gh');\n\n return {\n git: {\n ...gitVersion,\n installCommand: gitTool?.installCommand ?? null,\n installUrl: gitTool?.website ?? 'https://git-scm.com',\n },\n gh: {\n ...ghVersion,\n installCommand: ghTool?.installCommand ?? null,\n installUrl: ghTool?.website ?? 'https://cli.github.com',\n },\n };\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteRepositoryUseCase } from '@shepai/core/application/use-cases/repositories/delete-repository.use-case';\n\nexport interface DeleteRepositoryActionOptions {\n deleteFromDisk?: boolean;\n}\n\nexport async function deleteRepository(\n repositoryId: string,\n options?: DeleteRepositoryActionOptions\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'id is required' };\n }\n\n try {\n const useCase = resolve<DeleteRepositoryUseCase>('DeleteRepositoryUseCase');\n await useCase.execute(repositoryId, { deleteFromDisk: options?.deleteFromDisk === true });\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';\n\n/**\n * Lightweight server action to fetch a single feature's name and description.\n * Used by the SSE effect to update node metadata after AI metadata generation\n * without a full graph reconcile (which can overwrite SSE-driven state).\n */\nexport async function getFeatureMetadata(\n featureId: string\n): Promise<{ name: string; description: string } | null> {\n const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');\n const feature = await featureRepo.findById(featureId);\n if (!feature) return null;\n return { name: feature.name, description: feature.description };\n}\n","'use server';\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nasync function git(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await execFileAsync('git', args, { cwd, timeout: 5000 });\n return stdout.trim();\n}\n\nexport interface GitLogEntry {\n hash: string;\n shortHash: string;\n subject: string;\n author: string;\n relativeDate: string;\n branch?: string;\n}\n\nexport interface GitBranchInfo {\n name: string;\n isCurrent: boolean;\n lastCommitDate: string;\n}\n\nexport interface GitRemoteInfo {\n name: string;\n url: string;\n}\n\nexport interface GitWorkingTreeStatus {\n staged: number;\n modified: number;\n untracked: number;\n}\n\nexport interface GitDiffStats {\n filesChanged: number;\n insertions: number;\n deletions: number;\n}\n\nexport interface GitRepoInfo {\n commits: GitLogEntry[];\n branches: GitBranchInfo[];\n remotes: GitRemoteInfo[];\n tags: string[];\n stashCount: number;\n currentBranch: string;\n diffStats: GitDiffStats | null;\n workingTree: GitWorkingTreeStatus;\n error?: string;\n}\n\nexport async function getGitRepoInfo(\n repositoryPath: string,\n commitLimit = 8\n): Promise<GitRepoInfo> {\n const empty: GitRepoInfo = {\n commits: [],\n branches: [],\n remotes: [],\n tags: [],\n stashCount: 0,\n currentBranch: '',\n diffStats: null,\n workingTree: { staged: 0, modified: 0, untracked: 0 },\n };\n\n if (!repositoryPath.trim()) {\n return { ...empty, error: 'Repository path is required' };\n }\n\n const results = await Promise.allSettled([\n // 0: commits\n git(repositoryPath, [\n 'log',\n `--max-count=${commitLimit}`,\n '--format=%H%x00%h%x00%s%x00%an%x00%cr',\n '--no-color',\n ]),\n // 1: current branch\n git(repositoryPath, ['branch', '--show-current']),\n // 2: branches with dates\n git(repositoryPath, [\n 'branch',\n '--sort=-committerdate',\n '--format=%(HEAD)%(refname:short)%00%(committerdate:relative)',\n '--no-color',\n ]),\n // 3: remotes\n git(repositoryPath, ['remote', '-v']),\n // 4: tags (recent 5)\n git(repositoryPath, ['tag', '--sort=-creatordate', '-l', '--format=%(refname:short)']),\n // 5: stash count\n git(repositoryPath, ['stash', 'list']),\n // 6: working tree status\n git(repositoryPath, ['status', '--porcelain']),\n // 7: diff stats (uncommitted — includes staged + unstaged vs HEAD)\n git(repositoryPath, ['diff', 'HEAD', '--shortstat']),\n ]);\n\n const val = (i: number) => (results[i].status === 'fulfilled' ? results[i].value : '');\n\n // Parse commits\n const commits: GitLogEntry[] = val(0)\n .split('\\n')\n .filter(Boolean)\n .map((line: string) => {\n const [hash, shortHash, subject, author, relativeDate] = line.split('\\0');\n return { hash, shortHash, subject, author, relativeDate };\n });\n\n const currentBranch = val(1);\n if (commits.length > 0 && currentBranch) {\n commits[0].branch = currentBranch;\n }\n\n // Parse branches\n const branches: GitBranchInfo[] = val(2)\n .split('\\n')\n .filter(Boolean)\n .slice(0, 10)\n .map((line: string) => {\n const isCurrent = line.startsWith('*');\n const clean = isCurrent ? line.slice(1) : line;\n const [name, lastCommitDate] = clean.split('\\0');\n return { name: name.trim(), isCurrent, lastCommitDate: lastCommitDate?.trim() ?? '' };\n });\n\n // Parse remotes (dedup fetch/push)\n const remoteMap = new Map<string, string>();\n val(3)\n .split('\\n')\n .filter(Boolean)\n .forEach((line: string) => {\n const match = line.match(/^(\\S+)\\s+(\\S+)\\s+\\(fetch\\)/);\n if (match) {\n // Strip credentials/tokens from URL before sending to client\n const sanitized = match[2].replace(/\\/\\/[^@]+@/, '//').replace(/x-access-token:[^@]+@/, '');\n remoteMap.set(match[1], sanitized);\n }\n });\n const remotes: GitRemoteInfo[] = Array.from(remoteMap, ([name, url]) => ({ name, url }));\n\n // Parse tags (top 5)\n const tags = val(4).split('\\n').filter(Boolean).slice(0, 5);\n\n // Stash count\n const stashCount = val(5).split('\\n').filter(Boolean).length;\n\n // Working tree status\n const statusLines = val(6).split('\\n').filter(Boolean);\n const workingTree: GitWorkingTreeStatus = { staged: 0, modified: 0, untracked: 0 };\n for (const line of statusLines) {\n const x = line[0];\n const y = line[1];\n if (x === '?' && y === '?') workingTree.untracked++;\n else if (x !== ' ' && x !== '?') workingTree.staged++;\n if (y !== ' ' && y !== '?') workingTree.modified++;\n }\n\n // Diff stats\n let diffStats: GitDiffStats | null = null;\n const diffLine = val(7);\n if (diffLine) {\n const files = diffLine.match(/(\\d+) file/);\n const ins = diffLine.match(/(\\d+) insertion/);\n const del = diffLine.match(/(\\d+) deletion/);\n diffStats = {\n filesChanged: files ? parseInt(files[1], 10) : 0,\n insertions: ins ? parseInt(ins[1], 10) : 0,\n deletions: del ? parseInt(del[1], 10) : 0,\n };\n }\n\n return { commits, branches, remotes, tags, stashCount, currentBranch, diffStats, workingTree };\n}\n\n// Keep backward compat\nexport async function getGitLog(\n repositoryPath: string,\n limit = 10\n): Promise<{ entries: GitLogEntry[]; error?: string }> {\n const info = await getGitRepoInfo(repositoryPath, limit);\n return { entries: info.commits, error: info.error };\n}\n","export {pickFolder as '00e58a33ab1b838c8207f1b7dbe831d7a7b8cd3330'} from 'ACTIONS_MODULE0'\nexport {getDefaultAgentAndModel as '00c270c7a6f9c21fabe7b7271a4bf75d5cef02d22a'} from 'ACTIONS_MODULE1'\nexport {getAllAgentModels as '00c6d708f17ef9dc5f3443dc4d3b3f3756c20b1392'} from 'ACTIONS_MODULE2'\nexport {checkAllAgentsStatus as '00c38b234d35460bb11ea6a1b0fff1c22e01c08873'} from 'ACTIONS_MODULE3'\nexport {updateAgentAndModel as '60afd0d4fa2a6638646f7d23dc6c8673fd27a69207'} from 'ACTIONS_MODULE4'\nexport {globalSearch as '4015ea81e1b2a02fe57f374a012b37e2cd322146f1'} from 'ACTIONS_MODULE5'\nexport {listGitHubRepositories as '40d1082c73e97a2c5f99ef11d815cefe59a26e8998'} from 'ACTIONS_MODULE6'\nexport {listGitHubOrganizations as '00c4af7e37cefa35ac7db65fa9b45995caf677a597'} from 'ACTIONS_MODULE7'\nexport {importGitHubRepository as '405f5f5259eaed6742d1a59f416d4319ea63f3bb3d'} from 'ACTIONS_MODULE8'\nexport {deployFeature as '40aa1efa0fed8941c16c9537ba0c5d988cf13fecaf'} from 'ACTIONS_MODULE9'\nexport {deployRepository as '403a844cbb36e5d50051fe552f050ed35a8b88f317'} from 'ACTIONS_MODULE10'\nexport {deployApplication as '40559cc32878be443a5d902e563fa65ac29566c575'} from 'ACTIONS_MODULE11'\nexport {stopDeployment as '403c93928208c54fe25784ff60dcb073f25d1055c1'} from 'ACTIONS_MODULE12'\nexport {getDeploymentStatus as '402a545f24583952d99d18566abf474dd10d07741b'} from 'ACTIONS_MODULE13'\nexport {openIde as '406f6bfbd22a176bf6d0bca648d1bd1ef29efb8c31'} from 'ACTIONS_MODULE14'\nexport {openShell as '40cede021cd5c33e6bf9d5871c23ea5e73f6809b4b'} from 'ACTIONS_MODULE15'\nexport {openFolder as '40024b9babaf0ccba2c9644e1719947f9662db82da'} from 'ACTIONS_MODULE16'\nexport {syncRepository as '403bcc64cd5c7afe5cb7933130b5d71e9cb6913d44'} from 'ACTIONS_MODULE17'\nexport {getDeploymentLogs as '40e827f64795e580b75e126ddfefa3a9a722da877c'} from 'ACTIONS_MODULE18'\nexport {createProjectAndFeature as '402a7da73158b6bd6c8fb8ab5b0344dc0e0f08e228'} from 'ACTIONS_MODULE19'\nexport {createApplication as '402b7881a750d5c7c7125153b65fdd64c555ddcdc2'} from 'ACTIONS_MODULE20'\nexport {isAgentSetupComplete as '000dc696afafd019691d30ebc74c3bb2bf6be80fc9'} from 'ACTIONS_MODULE21'\nexport {checkAgentAuth as '00043b20dfa79e7ce6d504a372669a2b7396e4f421'} from 'ACTIONS_MODULE22'\nexport {checkToolStatus as '00fd3bb249b5c2f4771f7eac594bf5656eaf959cdb'} from 'ACTIONS_MODULE23'\nexport {createProjectFolder as '40da762c4b34966ae0ac466fdc38dd417bb5f12247'} from 'ACTIONS_MODULE24'\nexport {archiveFeature as '405f73e1d0740c127aafceadc63304676969dbb19a'} from 'ACTIONS_MODULE25'\nexport {deleteFeature as '782094d73ba803f25ee4b483796e8b0625c3c6564f'} from 'ACTIONS_MODULE26'\nexport {resumeFeature as '40ef132579c95dc894986b34b75cb89dd65b39da86'} from 'ACTIONS_MODULE27'\nexport {startFeature as '40b195fc3bd3d0b6f99d9ba0ce3b624b5201e8e478'} from 'ACTIONS_MODULE28'\nexport {stopFeature as '4093cfae5c300fc17a16104784825641972f80a2c2'} from 'ACTIONS_MODULE29'\nexport {unarchiveFeature as '4047cfaa45cd7417712356735bfbb78f93a103592a'} from 'ACTIONS_MODULE30'\nexport {addRepository as '40a8e46a1833838a96e4b3f97741ab37054dc3a415'} from 'ACTIONS_MODULE31'\nexport {deleteRepository as '608cb7bed4e740de6ec1034873b198d85e0771cdfb'} from 'ACTIONS_MODULE32'\nexport {deleteApplication as '400601cc704fc3a542db95c4219b7261168cbe675d'} from 'ACTIONS_MODULE33'\nexport {getFeatureMetadata as '40127b07baac3bb5494e3d8ad7b721b35a467f4a93'} from 'ACTIONS_MODULE34'\nexport {getGitRepoInfo as '60dd3bba8d40f7d7eaab9cf25cfc4a5eedd85c6c3c'} from 'ACTIONS_MODULE35'\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[495072,a=>{"use strict";var b=a.i(237705),c=a.i(996380);async function d(a){if(!a?.trim())return{error:"Application ID is required"};try{let b=(0,c.resolve)("DeleteApplicationUseCase");return await b.execute(a),{}}catch(a){return{error:a instanceof Error?a.message:"Failed to delete application"}}}(0,a.i(701904).ensureServerEntryExports)([d]),(0,b.registerServerReference)(d,"
|
|
1
|
+
module.exports=[495072,a=>{"use strict";var b=a.i(237705),c=a.i(996380);async function d(a){if(!a?.trim())return{error:"Application ID is required"};try{let b=(0,c.resolve)("DeleteApplicationUseCase");return await b.execute(a),{}}catch(a){return{error:a instanceof Error?a.message:"Failed to delete application"}}}(0,a.i(701904).ensureServerEntryExports)([d]),(0,b.registerServerReference)(d,"400601cc704fc3a542db95c4219b7261168cbe675d",null),a.s(["deleteApplication",()=>d])},280496,a=>{"use strict";var b=a.i(237705),c=a.i(902157),d=a.i(660526),e=a.i(750227),f=a.i(874533),g=a.i(701904);let h={darwin:{cmd:"open",args:a=>[a]},linux:{cmd:"xdg-open",args:a=>[a]},win32:{cmd:"explorer",args:a=>[a]}};async function i(a){if(!a||!(0,e.isAbsolute)(a))return{success:!1,error:"repositoryPath must be an absolute path"};try{if(!(0,c.existsSync)(a))return{success:!1,error:"Directory not found"};let b=h[(0,d.platform)()];if(!b)return{success:!1,error:`Unsupported platform: ${(0,d.platform)()}`};let g=(0,e.normalize)(a),i=(0,f.spawn)(b.cmd,b.args(g),{detached:!0,stdio:"ignore"});return i.on("error",()=>void 0),i.unref(),{success:!0,path:a}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to open folder"}}}(0,g.ensureServerEntryExports)([i]),(0,b.registerServerReference)(i,"40024b9babaf0ccba2c9644e1719947f9662db82da",null),a.s(["openFolder",()=>i])},93225,941872,609959,879124,839353,529207,a=>{"use strict";var b=a.i(237705),c=a.i(996380),d=a.i(701904);async function e(a){if(!a?.trim())return{success:!1,error:"Repository id is required"};try{let b=(0,c.resolve)("SyncRepositoryMainUseCase");return await b.execute(a),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to sync repository"}}}(0,d.ensureServerEntryExports)([e]),(0,b.registerServerReference)(e,"403bcc64cd5c7afe5cb7933130b5d71e9cb6913d44",null),a.s(["syncRepository",()=>e],93225);var f=a.i(633244);async function g(){try{return(0,f.getSettings)().onboardingComplete}catch{return!1}}async function h(){return(0,c.resolve)("CheckAgentAuthUseCase").execute()}(0,d.ensureServerEntryExports)([g]),(0,b.registerServerReference)(g,"000dc696afafd019691d30ebc74c3bb2bf6be80fc9",null),a.s(["isAgentSetupComplete",()=>g],941872),(0,d.ensureServerEntryExports)([h]),(0,b.registerServerReference)(h,"00043b20dfa79e7ce6d504a372669a2b7396e4f421",null),a.s(["checkAgentAuth",()=>h],609959);var i=a.i(874533),j=a.i(825832);function k(a,b){return new Promise(c=>{try{let d=j.IS_WINDOWS?{timeout:5e3,windowsHide:!0}:{timeout:5e3};(0,i.execFile)(a,b,d,(a,b)=>{if(a)return void c({installed:!1,version:null});let d=b.match(/(\d+\.\d+(?:\.\d+)?)/);c({installed:!0,version:d?.[1]??null})})}catch{c({installed:!1,version:null})}})}async function l(){let[a,b,d]=await Promise.all([k("git",["--version"]),k("gh",["--version"]),(async()=>{try{let a=(0,c.resolve)("ListToolsUseCase");return await a.execute()}catch{return[]}})()]),e=d.find(a=>"git"===a.id),f=d.find(a=>"gh"===a.id);return{git:{...a,installCommand:e?.installCommand??null,installUrl:e?.website??"https://git-scm.com"},gh:{...b,installCommand:f?.installCommand??null,installUrl:f?.website??"https://cli.github.com"}}}async function m(a,b){if(!a?.trim())return{success:!1,error:"id is required"};try{let d=(0,c.resolve)("DeleteRepositoryUseCase");return await d.execute(a,{deleteFromDisk:b?.deleteFromDisk===!0}),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to delete repository"}}}async function n(a){let b=(0,c.resolve)("IFeatureRepository"),d=await b.findById(a);return d?{name:d.name,description:d.description}:null}(0,d.ensureServerEntryExports)([l]),(0,b.registerServerReference)(l,"00fd3bb249b5c2f4771f7eac594bf5656eaf959cdb",null),a.s(["checkToolStatus",()=>l],879124),(0,d.ensureServerEntryExports)([m]),(0,b.registerServerReference)(m,"608cb7bed4e740de6ec1034873b198d85e0771cdfb",null),a.s(["deleteRepository",()=>m],839353),(0,d.ensureServerEntryExports)([n]),(0,b.registerServerReference)(n,"40127b07baac3bb5494e3d8ad7b721b35a467f4a93",null),a.s(["getFeatureMetadata",()=>n],529207)},588286,a=>{"use strict";var b=a.i(912513),c=a.i(889253),d=a.i(723504),e=a.i(408115),f=a.i(827900),g=a.i(673350),h=a.i(673101),i=a.i(654775),j=a.i(265324),k=a.i(433841),l=a.i(46646),m=a.i(868378),n=a.i(268670),o=a.i(685321),p=a.i(284095),q=a.i(656799),r=a.i(280496),s=a.i(93225),t=a.i(794691),u=a.i(477710),v=a.i(145395),w=a.i(941872),x=a.i(609959),y=a.i(879124),z=a.i(576707),A=a.i(410528),B=a.i(150845),C=a.i(26604),D=a.i(354723),E=a.i(118942),F=a.i(342886),G=a.i(649560),H=a.i(839353),I=a.i(495072),J=a.i(529207);a.s([],760749),a.i(760749),a.s(["00043b20dfa79e7ce6d504a372669a2b7396e4f421",()=>x.checkAgentAuth,"000dc696afafd019691d30ebc74c3bb2bf6be80fc9",()=>w.isAgentSetupComplete,"00c270c7a6f9c21fabe7b7271a4bf75d5cef02d22a",()=>c.getDefaultAgentAndModel,"00c38b234d35460bb11ea6a1b0fff1c22e01c08873",()=>e.checkAllAgentsStatus,"00c4af7e37cefa35ac7db65fa9b45995caf677a597",()=>i.listGitHubOrganizations,"00c6d708f17ef9dc5f3443dc4d3b3f3756c20b1392",()=>d.getAllAgentModels,"00e58a33ab1b838c8207f1b7dbe831d7a7b8cd3330",()=>b.pickFolder,"00fd3bb249b5c2f4771f7eac594bf5656eaf959cdb",()=>y.checkToolStatus,"40024b9babaf0ccba2c9644e1719947f9662db82da",()=>r.openFolder,"400601cc704fc3a542db95c4219b7261168cbe675d",()=>I.deleteApplication,"40127b07baac3bb5494e3d8ad7b721b35a467f4a93",()=>J.getFeatureMetadata,"4015ea81e1b2a02fe57f374a012b37e2cd322146f1",()=>g.globalSearch,"402a545f24583952d99d18566abf474dd10d07741b",()=>o.getDeploymentStatus,"402a7da73158b6bd6c8fb8ab5b0344dc0e0f08e228",()=>u.createProjectAndFeature,"402b7881a750d5c7c7125153b65fdd64c555ddcdc2",()=>v.createApplication,"403a844cbb36e5d50051fe552f050ed35a8b88f317",()=>l.deployRepository,"403bcc64cd5c7afe5cb7933130b5d71e9cb6913d44",()=>s.syncRepository,"403c93928208c54fe25784ff60dcb073f25d1055c1",()=>n.stopDeployment,"4047cfaa45cd7417712356735bfbb78f93a103592a",()=>F.unarchiveFeature,"40559cc32878be443a5d902e563fa65ac29566c575",()=>m.deployApplication,"405f5f5259eaed6742d1a59f416d4319ea63f3bb3d",()=>j.importGitHubRepository,"405f73e1d0740c127aafceadc63304676969dbb19a",()=>A.archiveFeature,"406f6bfbd22a176bf6d0bca648d1bd1ef29efb8c31",()=>p.openIde,"4093cfae5c300fc17a16104784825641972f80a2c2",()=>E.stopFeature,"40a8e46a1833838a96e4b3f97741ab37054dc3a415",()=>G.addRepository,"40aa1efa0fed8941c16c9537ba0c5d988cf13fecaf",()=>k.deployFeature,"40b195fc3bd3d0b6f99d9ba0ce3b624b5201e8e478",()=>D.startFeature,"40cede021cd5c33e6bf9d5871c23ea5e73f6809b4b",()=>q.openShell,"40d1082c73e97a2c5f99ef11d815cefe59a26e8998",()=>h.listGitHubRepositories,"40da762c4b34966ae0ac466fdc38dd417bb5f12247",()=>z.createProjectFolder,"40e827f64795e580b75e126ddfefa3a9a722da877c",()=>t.getDeploymentLogs,"40ef132579c95dc894986b34b75cb89dd65b39da86",()=>C.resumeFeature,"608cb7bed4e740de6ec1034873b198d85e0771cdfb",()=>H.deleteRepository,"60afd0d4fa2a6638646f7d23dc6c8673fd27a69207",()=>f.updateAgentAndModel,"782094d73ba803f25ee4b483796e8b0625c3c6564f",()=>B.deleteFeature],588286)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_presentation_web_d7f8130c._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/delete-application.ts","../../../../../../../src/presentation/web/app/actions/open-folder.ts","../../../../../../../src/presentation/web/app/actions/sync-repository.ts","../../../../../../../src/presentation/web/app/actions/agent-setup-flag.ts","../../../../../../../src/presentation/web/app/actions/check-agent-auth.ts","../../../../../../../src/presentation/web/app/actions/check-tool-status.ts","../../../../../../../src/presentation/web/app/actions/delete-repository.ts","../../../../../../../src/presentation/web/app/actions/get-feature-metadata.ts","../../../../../../../src/presentation/web/.next-internal/server/app/%28dashboard%29/chat/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteApplicationUseCase } from '@shepai/core/application/use-cases/applications/delete-application.use-case';\n\nexport async function deleteApplication(id: string): Promise<{ error?: string }> {\n if (!id?.trim()) {\n return { error: 'Application ID is required' };\n }\n\n try {\n const useCase = resolve<DeleteApplicationUseCase>('DeleteApplicationUseCase');\n await useCase.execute(id);\n return {};\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete application';\n return { error: message };\n }\n}\n","'use server';\n\nimport { existsSync } from 'node:fs';\nimport { platform } from 'node:os';\nimport { isAbsolute, normalize } from 'node:path';\nimport { spawn } from 'node:child_process';\n\n// Use a record lookup instead of if/else to prevent the bundler from\n// tree-shaking platform branches at build time. Turbopack evaluates\n// os.platform() during the build and dead-code-eliminates unused branches,\n// baking in the CI platform (linux) and breaking macOS/Windows installs.\nconst FOLDER_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> = {\n darwin: { cmd: 'open', args: (p) => [p] },\n linux: { cmd: 'xdg-open', args: (p) => [p] },\n win32: { cmd: 'explorer', args: (p) => [p] },\n};\n\nexport async function openFolder(\n repositoryPath: string\n): Promise<{ success: boolean; error?: string; path?: string }> {\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n if (!existsSync(repositoryPath)) {\n return { success: false, error: 'Directory not found' };\n }\n\n const entry = FOLDER_COMMANDS[platform()];\n if (!entry) {\n return {\n success: false,\n error: `Unsupported platform: ${platform()}`,\n };\n }\n\n // Normalize to platform-native separators — explorer.exe on Windows\n // does not understand forward-slash paths and falls back to Documents.\n const nativePath = normalize(repositoryPath);\n\n const child = spawn(entry.cmd, entry.args(nativePath), {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined); // Prevent uncaught exception on spawn failure\n child.unref();\n\n return { success: true, path: repositoryPath };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { SyncRepositoryMainUseCase } from '@shepai/core/application/use-cases/repositories/sync-repository-main.use-case';\n\nexport async function syncRepository(\n repositoryId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'Repository id is required' };\n }\n\n try {\n const useCase = resolve<SyncRepositoryMainUseCase>('SyncRepositoryMainUseCase');\n await useCase.execute(repositoryId);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to sync repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { getSettings } from '@shepai/core/infrastructure/services/settings.service';\n\n/**\n * Check whether onboarding has been completed.\n * Delegates to the in-memory settings singleton (zero DB overhead).\n */\nexport async function isAgentSetupComplete(): Promise<boolean> {\n try {\n return getSettings().onboardingComplete;\n } catch {\n return false;\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { CheckAgentAuthUseCase } from '@shepai/core/application/use-cases/agents/check-agent-auth.use-case';\n\n/**\n * Result shape for the agent auth checklist on the onboarding empty state.\n * Matches CheckAgentAuthResult from the use case 1:1 — kept locally so the\n * web type stays serializable through the Server Actions boundary.\n */\nexport interface AgentAuthStatus {\n agentType: string;\n /** Whether the CLI tool binary is installed */\n installed: boolean;\n /** Whether credentials / auth appear valid */\n authenticated: boolean;\n /** Human-readable label for the agent */\n label: string;\n /** CLI binary name (e.g. \"claude\", \"gemini\") */\n binaryName: string | null;\n /** Shell command to install the tool (e.g. \"npm install -g @anthropic-ai/claude-code\") */\n installCommand: string | null;\n /** Instructions to authenticate if not authenticated */\n authCommand: string | null;\n}\n\n/**\n * Thin server-action wrapper around CheckAgentAuthUseCase. All agent-type\n * mapping, tool lookup, and platform credential detection live in:\n *\n * packages/core/src/application/use-cases/agents/check-agent-auth.use-case.ts\n * packages/core/src/infrastructure/services/agent-auth-detector/platform-agent-auth-detector.service.ts\n */\nexport async function checkAgentAuth(): Promise<AgentAuthStatus> {\n const useCase = resolve<CheckAgentAuthUseCase>('CheckAgentAuthUseCase');\n return useCase.execute();\n}\n","'use server';\n\nimport { execFile } from 'node:child_process';\nimport { IS_WINDOWS } from '@shepai/core/infrastructure/platform';\nimport { resolve } from '@/lib/server-container';\nimport type { ListToolsUseCase } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolStatusEntry {\n installed: boolean;\n version: string | null;\n /** Platform-specific install command from tool JSON metadata */\n installCommand: string | null;\n /** Documentation/website URL */\n installUrl: string | null;\n}\n\nexport interface ToolStatusResult {\n git: ToolStatusEntry;\n gh: ToolStatusEntry;\n}\n\nfunction getVersion(\n command: string,\n args: string[]\n): Promise<{ installed: boolean; version: string | null }> {\n return new Promise((resolve) => {\n try {\n const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile(command, args, opts, (error, stdout) => {\n if (error) {\n resolve({ installed: false, version: null });\n return;\n }\n // Extract version number from output like \"git version 2.43.0\" or \"gh version 2.40.1\"\n const match = stdout.match(/(\\d+\\.\\d+(?:\\.\\d+)?)/);\n resolve({ installed: true, version: match?.[1] ?? null });\n });\n } catch {\n resolve({ installed: false, version: null });\n }\n });\n}\n\nexport async function checkToolStatus(): Promise<ToolStatusResult> {\n // Run version checks and tool metadata lookup in parallel\n const [gitVersion, ghVersion, tools] = await Promise.all([\n getVersion('git', ['--version']),\n getVersion('gh', ['--version']),\n (async () => {\n try {\n const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');\n return await useCase.execute();\n } catch {\n return [];\n }\n })(),\n ]);\n\n const gitTool = tools.find((t) => t.id === 'git');\n const ghTool = tools.find((t) => t.id === 'gh');\n\n return {\n git: {\n ...gitVersion,\n installCommand: gitTool?.installCommand ?? null,\n installUrl: gitTool?.website ?? 'https://git-scm.com',\n },\n gh: {\n ...ghVersion,\n installCommand: ghTool?.installCommand ?? null,\n installUrl: ghTool?.website ?? 'https://cli.github.com',\n },\n };\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteRepositoryUseCase } from '@shepai/core/application/use-cases/repositories/delete-repository.use-case';\n\nexport interface DeleteRepositoryActionOptions {\n deleteFromDisk?: boolean;\n}\n\nexport async function deleteRepository(\n repositoryId: string,\n options?: DeleteRepositoryActionOptions\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'id is required' };\n }\n\n try {\n const useCase = resolve<DeleteRepositoryUseCase>('DeleteRepositoryUseCase');\n await useCase.execute(repositoryId, { deleteFromDisk: options?.deleteFromDisk === true });\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';\n\n/**\n * Lightweight server action to fetch a single feature's name and description.\n * Used by the SSE effect to update node metadata after AI metadata generation\n * without a full graph reconcile (which can overwrite SSE-driven state).\n */\nexport async function getFeatureMetadata(\n featureId: string\n): Promise<{ name: string; description: string } | null> {\n const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');\n const feature = await featureRepo.findById(featureId);\n if (!feature) return null;\n return { name: feature.name, description: feature.description };\n}\n","export {pickFolder as '0015f0a240c29915a74257d5ff2d7d15b32c6a778d'} from 'ACTIONS_MODULE0'\nexport {getDefaultAgentAndModel as '006ff5a74754817b8a495d7ba26e66c354851f6c99'} from 'ACTIONS_MODULE1'\nexport {getAllAgentModels as '00d43390ab8112b0e6ec134ef3485ab210e36f7842'} from 'ACTIONS_MODULE2'\nexport {checkAllAgentsStatus as '00d2c30c2b08e36b014924412d0cd61610cd91c78e'} from 'ACTIONS_MODULE3'\nexport {updateAgentAndModel as '60036293085b1751ff35875b7762b2353bb09757b5'} from 'ACTIONS_MODULE4'\nexport {globalSearch as '40fcb38a7daafc835826043ee30ef771eae2a2f635'} from 'ACTIONS_MODULE5'\nexport {listGitHubRepositories as '403ab98df2cf8db571b47142cd90ab7c7f297fa90f'} from 'ACTIONS_MODULE6'\nexport {listGitHubOrganizations as '00613a83ba2b2619c9ef46303abae5aded26339bc3'} from 'ACTIONS_MODULE7'\nexport {importGitHubRepository as '40e011f8f2f54f36460ff5310dd49178590a992d44'} from 'ACTIONS_MODULE8'\nexport {deployFeature as '401846920f6fb739e32233d9d6a6df7945b8621c00'} from 'ACTIONS_MODULE9'\nexport {deployRepository as '408a28f520d819792447d4b47d9b73a5ddf7296469'} from 'ACTIONS_MODULE10'\nexport {deployApplication as '4005923232df16201d86b35c46dbbe719725cbcd26'} from 'ACTIONS_MODULE11'\nexport {stopDeployment as '409ab95b1ec58ad7dd578b018e11d5bd766839f8bc'} from 'ACTIONS_MODULE12'\nexport {getDeploymentStatus as '40ed3ea24841c9c4280513ab004dcdbce3d545bcdb'} from 'ACTIONS_MODULE13'\nexport {openIde as '40ab7fa1f69e2aec8b94563e16d0019f3589ec2f2e'} from 'ACTIONS_MODULE14'\nexport {openShell as '40b95792d8bb0de2aa9914ff42b671ff42b87c24ba'} from 'ACTIONS_MODULE15'\nexport {openFolder as '40e7ea921079c1a8fe79fc7cfb59743f718c5944f7'} from 'ACTIONS_MODULE16'\nexport {syncRepository as '40eb53de65273a529e251542555f94321ea9c2fcaf'} from 'ACTIONS_MODULE17'\nexport {getDeploymentLogs as '405723722c9eb9b4888b52203cfb121401f0c61a80'} from 'ACTIONS_MODULE18'\nexport {createProjectAndFeature as '40ba17f62f174f4f88aa0ea4a373db347247ae1171'} from 'ACTIONS_MODULE19'\nexport {createApplication as '40f744f8f8785a86cc8dc9487da8d64ca353d264af'} from 'ACTIONS_MODULE20'\nexport {isAgentSetupComplete as '002230a65a9a52766f2fac7b9bafe2f0a0ab4ff5f5'} from 'ACTIONS_MODULE21'\nexport {checkAgentAuth as '003eb1909cd10ed1e04526145e4a21282e819a745e'} from 'ACTIONS_MODULE22'\nexport {checkToolStatus as '00f312436a846d36665ad6519b2a873685e7baa13f'} from 'ACTIONS_MODULE23'\nexport {createProjectFolder as '40c4d25fb30555d92bf75dd650e2cce9b8be92dc0b'} from 'ACTIONS_MODULE24'\nexport {archiveFeature as '40d0ac4c8ca5c179014f909f203d903942417295df'} from 'ACTIONS_MODULE25'\nexport {deleteFeature as '783175472a45c2823bb1c4751b36e777308131d27d'} from 'ACTIONS_MODULE26'\nexport {resumeFeature as '4070f2c934a9ed351d223ad18ae9602cff12614292'} from 'ACTIONS_MODULE27'\nexport {startFeature as '4047fcf9280c5bc168edadf9f0c951bc2514b41fe0'} from 'ACTIONS_MODULE28'\nexport {stopFeature as '404b80493cf36c04e22e68ebf8f56c46bf55d904c0'} from 'ACTIONS_MODULE29'\nexport {unarchiveFeature as '40c64b253cb9310f09f151401d5eb06957db761efa'} from 'ACTIONS_MODULE30'\nexport {addRepository as '40d4837169557e75f0be6d0f89f7fea0ff41eb89fc'} from 'ACTIONS_MODULE31'\nexport {deleteRepository as '60495f1a3ee94d5d2693e35665a5b94c6c425339ab'} from 'ACTIONS_MODULE32'\nexport {deleteApplication as '40af1b8d14947496efa0de09d2e46341cfadd226ac'} from 'ACTIONS_MODULE33'\nexport {getFeatureMetadata as '4094d93eeeace2053edf550148c9336dfa0384d465'} from 'ACTIONS_MODULE34'\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/delete-application.ts","../../../../../../../src/presentation/web/app/actions/open-folder.ts","../../../../../../../src/presentation/web/app/actions/sync-repository.ts","../../../../../../../src/presentation/web/app/actions/agent-setup-flag.ts","../../../../../../../src/presentation/web/app/actions/check-agent-auth.ts","../../../../../../../src/presentation/web/app/actions/check-tool-status.ts","../../../../../../../src/presentation/web/app/actions/delete-repository.ts","../../../../../../../src/presentation/web/app/actions/get-feature-metadata.ts","../../../../../../../src/presentation/web/.next-internal/server/app/%28dashboard%29/chat/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteApplicationUseCase } from '@shepai/core/application/use-cases/applications/delete-application.use-case';\n\nexport async function deleteApplication(id: string): Promise<{ error?: string }> {\n if (!id?.trim()) {\n return { error: 'Application ID is required' };\n }\n\n try {\n const useCase = resolve<DeleteApplicationUseCase>('DeleteApplicationUseCase');\n await useCase.execute(id);\n return {};\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete application';\n return { error: message };\n }\n}\n","'use server';\n\nimport { existsSync } from 'node:fs';\nimport { platform } from 'node:os';\nimport { isAbsolute, normalize } from 'node:path';\nimport { spawn } from 'node:child_process';\n\n// Use a record lookup instead of if/else to prevent the bundler from\n// tree-shaking platform branches at build time. Turbopack evaluates\n// os.platform() during the build and dead-code-eliminates unused branches,\n// baking in the CI platform (linux) and breaking macOS/Windows installs.\nconst FOLDER_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> = {\n darwin: { cmd: 'open', args: (p) => [p] },\n linux: { cmd: 'xdg-open', args: (p) => [p] },\n win32: { cmd: 'explorer', args: (p) => [p] },\n};\n\nexport async function openFolder(\n repositoryPath: string\n): Promise<{ success: boolean; error?: string; path?: string }> {\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n if (!existsSync(repositoryPath)) {\n return { success: false, error: 'Directory not found' };\n }\n\n const entry = FOLDER_COMMANDS[platform()];\n if (!entry) {\n return {\n success: false,\n error: `Unsupported platform: ${platform()}`,\n };\n }\n\n // Normalize to platform-native separators — explorer.exe on Windows\n // does not understand forward-slash paths and falls back to Documents.\n const nativePath = normalize(repositoryPath);\n\n const child = spawn(entry.cmd, entry.args(nativePath), {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined); // Prevent uncaught exception on spawn failure\n child.unref();\n\n return { success: true, path: repositoryPath };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { SyncRepositoryMainUseCase } from '@shepai/core/application/use-cases/repositories/sync-repository-main.use-case';\n\nexport async function syncRepository(\n repositoryId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'Repository id is required' };\n }\n\n try {\n const useCase = resolve<SyncRepositoryMainUseCase>('SyncRepositoryMainUseCase');\n await useCase.execute(repositoryId);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to sync repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { getSettings } from '@shepai/core/infrastructure/services/settings.service';\n\n/**\n * Check whether onboarding has been completed.\n * Delegates to the in-memory settings singleton (zero DB overhead).\n */\nexport async function isAgentSetupComplete(): Promise<boolean> {\n try {\n return getSettings().onboardingComplete;\n } catch {\n return false;\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { CheckAgentAuthUseCase } from '@shepai/core/application/use-cases/agents/check-agent-auth.use-case';\n\n/**\n * Result shape for the agent auth checklist on the onboarding empty state.\n * Matches CheckAgentAuthResult from the use case 1:1 — kept locally so the\n * web type stays serializable through the Server Actions boundary.\n */\nexport interface AgentAuthStatus {\n agentType: string;\n /** Whether the CLI tool binary is installed */\n installed: boolean;\n /** Whether credentials / auth appear valid */\n authenticated: boolean;\n /** Human-readable label for the agent */\n label: string;\n /** CLI binary name (e.g. \"claude\", \"gemini\") */\n binaryName: string | null;\n /** Shell command to install the tool (e.g. \"npm install -g @anthropic-ai/claude-code\") */\n installCommand: string | null;\n /** Instructions to authenticate if not authenticated */\n authCommand: string | null;\n}\n\n/**\n * Thin server-action wrapper around CheckAgentAuthUseCase. All agent-type\n * mapping, tool lookup, and platform credential detection live in:\n *\n * packages/core/src/application/use-cases/agents/check-agent-auth.use-case.ts\n * packages/core/src/infrastructure/services/agent-auth-detector/platform-agent-auth-detector.service.ts\n */\nexport async function checkAgentAuth(): Promise<AgentAuthStatus> {\n const useCase = resolve<CheckAgentAuthUseCase>('CheckAgentAuthUseCase');\n return useCase.execute();\n}\n","'use server';\n\nimport { execFile } from 'node:child_process';\nimport { IS_WINDOWS } from '@shepai/core/infrastructure/platform';\nimport { resolve } from '@/lib/server-container';\nimport type { ListToolsUseCase } from '@shepai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolStatusEntry {\n installed: boolean;\n version: string | null;\n /** Platform-specific install command from tool JSON metadata */\n installCommand: string | null;\n /** Documentation/website URL */\n installUrl: string | null;\n}\n\nexport interface ToolStatusResult {\n git: ToolStatusEntry;\n gh: ToolStatusEntry;\n}\n\nfunction getVersion(\n command: string,\n args: string[]\n): Promise<{ installed: boolean; version: string | null }> {\n return new Promise((resolve) => {\n try {\n const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile(command, args, opts, (error, stdout) => {\n if (error) {\n resolve({ installed: false, version: null });\n return;\n }\n // Extract version number from output like \"git version 2.43.0\" or \"gh version 2.40.1\"\n const match = stdout.match(/(\\d+\\.\\d+(?:\\.\\d+)?)/);\n resolve({ installed: true, version: match?.[1] ?? null });\n });\n } catch {\n resolve({ installed: false, version: null });\n }\n });\n}\n\nexport async function checkToolStatus(): Promise<ToolStatusResult> {\n // Run version checks and tool metadata lookup in parallel\n const [gitVersion, ghVersion, tools] = await Promise.all([\n getVersion('git', ['--version']),\n getVersion('gh', ['--version']),\n (async () => {\n try {\n const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');\n return await useCase.execute();\n } catch {\n return [];\n }\n })(),\n ]);\n\n const gitTool = tools.find((t) => t.id === 'git');\n const ghTool = tools.find((t) => t.id === 'gh');\n\n return {\n git: {\n ...gitVersion,\n installCommand: gitTool?.installCommand ?? null,\n installUrl: gitTool?.website ?? 'https://git-scm.com',\n },\n gh: {\n ...ghVersion,\n installCommand: ghTool?.installCommand ?? null,\n installUrl: ghTool?.website ?? 'https://cli.github.com',\n },\n };\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteRepositoryUseCase } from '@shepai/core/application/use-cases/repositories/delete-repository.use-case';\n\nexport interface DeleteRepositoryActionOptions {\n deleteFromDisk?: boolean;\n}\n\nexport async function deleteRepository(\n repositoryId: string,\n options?: DeleteRepositoryActionOptions\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'id is required' };\n }\n\n try {\n const useCase = resolve<DeleteRepositoryUseCase>('DeleteRepositoryUseCase');\n await useCase.execute(repositoryId, { deleteFromDisk: options?.deleteFromDisk === true });\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';\n\n/**\n * Lightweight server action to fetch a single feature's name and description.\n * Used by the SSE effect to update node metadata after AI metadata generation\n * without a full graph reconcile (which can overwrite SSE-driven state).\n */\nexport async function getFeatureMetadata(\n featureId: string\n): Promise<{ name: string; description: string } | null> {\n const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');\n const feature = await featureRepo.findById(featureId);\n if (!feature) return null;\n return { name: feature.name, description: feature.description };\n}\n","export {pickFolder as '00e58a33ab1b838c8207f1b7dbe831d7a7b8cd3330'} from 'ACTIONS_MODULE0'\nexport {getDefaultAgentAndModel as '00c270c7a6f9c21fabe7b7271a4bf75d5cef02d22a'} from 'ACTIONS_MODULE1'\nexport {getAllAgentModels as '00c6d708f17ef9dc5f3443dc4d3b3f3756c20b1392'} from 'ACTIONS_MODULE2'\nexport {checkAllAgentsStatus as '00c38b234d35460bb11ea6a1b0fff1c22e01c08873'} from 'ACTIONS_MODULE3'\nexport {updateAgentAndModel as '60afd0d4fa2a6638646f7d23dc6c8673fd27a69207'} from 'ACTIONS_MODULE4'\nexport {globalSearch as '4015ea81e1b2a02fe57f374a012b37e2cd322146f1'} from 'ACTIONS_MODULE5'\nexport {listGitHubRepositories as '40d1082c73e97a2c5f99ef11d815cefe59a26e8998'} from 'ACTIONS_MODULE6'\nexport {listGitHubOrganizations as '00c4af7e37cefa35ac7db65fa9b45995caf677a597'} from 'ACTIONS_MODULE7'\nexport {importGitHubRepository as '405f5f5259eaed6742d1a59f416d4319ea63f3bb3d'} from 'ACTIONS_MODULE8'\nexport {deployFeature as '40aa1efa0fed8941c16c9537ba0c5d988cf13fecaf'} from 'ACTIONS_MODULE9'\nexport {deployRepository as '403a844cbb36e5d50051fe552f050ed35a8b88f317'} from 'ACTIONS_MODULE10'\nexport {deployApplication as '40559cc32878be443a5d902e563fa65ac29566c575'} from 'ACTIONS_MODULE11'\nexport {stopDeployment as '403c93928208c54fe25784ff60dcb073f25d1055c1'} from 'ACTIONS_MODULE12'\nexport {getDeploymentStatus as '402a545f24583952d99d18566abf474dd10d07741b'} from 'ACTIONS_MODULE13'\nexport {openIde as '406f6bfbd22a176bf6d0bca648d1bd1ef29efb8c31'} from 'ACTIONS_MODULE14'\nexport {openShell as '40cede021cd5c33e6bf9d5871c23ea5e73f6809b4b'} from 'ACTIONS_MODULE15'\nexport {openFolder as '40024b9babaf0ccba2c9644e1719947f9662db82da'} from 'ACTIONS_MODULE16'\nexport {syncRepository as '403bcc64cd5c7afe5cb7933130b5d71e9cb6913d44'} from 'ACTIONS_MODULE17'\nexport {getDeploymentLogs as '40e827f64795e580b75e126ddfefa3a9a722da877c'} from 'ACTIONS_MODULE18'\nexport {createProjectAndFeature as '402a7da73158b6bd6c8fb8ab5b0344dc0e0f08e228'} from 'ACTIONS_MODULE19'\nexport {createApplication as '402b7881a750d5c7c7125153b65fdd64c555ddcdc2'} from 'ACTIONS_MODULE20'\nexport {isAgentSetupComplete as '000dc696afafd019691d30ebc74c3bb2bf6be80fc9'} from 'ACTIONS_MODULE21'\nexport {checkAgentAuth as '00043b20dfa79e7ce6d504a372669a2b7396e4f421'} from 'ACTIONS_MODULE22'\nexport {checkToolStatus as '00fd3bb249b5c2f4771f7eac594bf5656eaf959cdb'} from 'ACTIONS_MODULE23'\nexport {createProjectFolder as '40da762c4b34966ae0ac466fdc38dd417bb5f12247'} from 'ACTIONS_MODULE24'\nexport {archiveFeature as '405f73e1d0740c127aafceadc63304676969dbb19a'} from 'ACTIONS_MODULE25'\nexport {deleteFeature as '782094d73ba803f25ee4b483796e8b0625c3c6564f'} from 'ACTIONS_MODULE26'\nexport {resumeFeature as '40ef132579c95dc894986b34b75cb89dd65b39da86'} from 'ACTIONS_MODULE27'\nexport {startFeature as '40b195fc3bd3d0b6f99d9ba0ce3b624b5201e8e478'} from 'ACTIONS_MODULE28'\nexport {stopFeature as '4093cfae5c300fc17a16104784825641972f80a2c2'} from 'ACTIONS_MODULE29'\nexport {unarchiveFeature as '4047cfaa45cd7417712356735bfbb78f93a103592a'} from 'ACTIONS_MODULE30'\nexport {addRepository as '40a8e46a1833838a96e4b3f97741ab37054dc3a415'} from 'ACTIONS_MODULE31'\nexport {deleteRepository as '608cb7bed4e740de6ec1034873b198d85e0771cdfb'} from 'ACTIONS_MODULE32'\nexport {deleteApplication as '400601cc704fc3a542db95c4219b7261168cbe675d'} from 'ACTIONS_MODULE33'\nexport {getFeatureMetadata as '40127b07baac3bb5494e3d8ad7b721b35a467f4a93'} from 'ACTIONS_MODULE34'\n"],"names":[],"mappings":"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"}
|