@shepai/cli 1.65.0 → 1.66.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts +62 -0
- package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.js +12 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +4 -1
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +5 -2
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +3 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +25 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +5 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +6 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +11 -7
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +11 -7
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +11 -7
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +57 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +192 -0
- package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts +26 -0
- package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.js +59 -0
- package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts +15 -0
- package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/deployment/parse-port.js +52 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +13 -3
- package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/_serve.command.js +2 -0
- package/dist/src/presentation/web/app/actions/deploy-feature.d.ts +7 -0
- package/dist/src/presentation/web/app/actions/deploy-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/deploy-feature.js +28 -0
- package/dist/src/presentation/web/app/actions/deploy-repository.d.ts +7 -0
- package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/deploy-repository.js +21 -0
- package/dist/src/presentation/web/app/actions/get-deployment-status.d.ts +3 -0
- package/dist/src/presentation/web/app/actions/get-deployment-status.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-deployment-status.js +9 -0
- package/dist/src/presentation/web/app/actions/stop-deployment.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/stop-deployment.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/stop-deployment.js +16 -0
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts +20 -0
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -0
- package/dist/src/presentation/web/app/build-graph-nodes.js +142 -0
- package/dist/src/presentation/web/app/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/page.js +2 -112
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts +3 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +13 -3
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +9 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts +7 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +14 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.js +27 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/index.d.ts +2 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/index.js +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +8 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +7 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +13 -2
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +12 -2
- package/dist/src/presentation/web/hooks/use-deploy-action.d.ts +18 -0
- package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-deploy-action.js +130 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts +1 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/feature-flags.js +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +7 -6
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +5 -4
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error/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/build-manifest.json +5 -4
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
- package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
- package/web/.next/server/app/page/build-manifest.json +5 -4
- package/web/.next/server/app/page/server-reference-manifest.json +88 -28
- package/web/.next/server/app/page.js +2 -2
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/build-manifest.json +5 -4
- package/web/.next/server/app/skills/page/server-reference-manifest.json +62 -2
- package/web/.next/server/app/skills/page.js +2 -2
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/build-manifest.json +5 -4
- package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/build-manifest.json +5 -4
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js → [root-of-the-server]__09413611._.js} +2 -2
- package/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js.map → [root-of-the-server]__09413611._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +3 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__248ee887._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js.map → [root-of-the-server]__248ee887._.js.map} +1 -1
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js → server/chunks/ssr/[root-of-the-server]__249c74f6._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js.map +1 -0
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js → server/chunks/ssr/[root-of-the-server]__f5830fa9._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f5830fa9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +9 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_28993370._.js +3 -0
- package/web/.next/server/chunks/ssr/_28993370._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_380c6567._.js +1 -1
- package/web/.next/server/chunks/ssr/_380c6567._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_45715073._.js +3 -0
- package/web/.next/server/chunks/ssr/{_d81184e2._.js.map → _45715073._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_6978d868._.js +3 -0
- package/web/.next/server/chunks/ssr/_6978d868._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_85965278._.js +6 -0
- package/web/.next/server/chunks/ssr/_85965278._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_c52cace8._.js +3 -0
- package/web/.next/server/chunks/ssr/_c52cace8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ed9132c9._.js +3 -0
- package/web/.next/server/chunks/ssr/_ed9132c9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{node_modules__pnpm_87f920e7._.js → node_modules__pnpm_febcbea6._.js} +2 -2
- package/web/.next/server/chunks/ssr/node_modules__pnpm_febcbea6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
- package/web/.next/server/middleware-build-manifest.js +5 -4
- 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 +118 -30
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +7 -6
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +5 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +5 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +5 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +88 -28
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +5 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +62 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +5 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +5 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js → [root-of-the-server]__09413611._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__248ee887._.js} +2 -2
- package/web/.next/{server/chunks/ssr/[root-of-the-server]__fbc89707._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +3 -0
- package/web/.next/{server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f5830fa9._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +9 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_28993370._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_380c6567._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_45715073._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6978d868._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_85965278._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_c52cace8._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_ed9132c9._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{node_modules__pnpm_87f920e7._.js → node_modules__pnpm_febcbea6._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +5 -4
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +118 -30
- package/web/.next/standalone/src/presentation/web/app/actions/deploy-feature.ts +39 -0
- package/web/.next/standalone/src/presentation/web/app/actions/deploy-repository.ts +28 -0
- package/web/.next/standalone/src/presentation/web/app/actions/get-deployment-status.ts +16 -0
- package/web/.next/standalone/src/presentation/web/app/actions/stop-deployment.ts +22 -0
- package/web/.next/standalone/src/presentation/web/app/build-graph-nodes.ts +180 -0
- package/web/.next/standalone/src/presentation/web/app/page.tsx +2 -129
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +26 -0
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +45 -1
- package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.tsx +35 -0
- package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.tsx +42 -0
- package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/index.ts +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +10 -0
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.tsx +9 -0
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +43 -2
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +79 -44
- package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +161 -0
- package/web/.next/standalone/src/presentation/web/lib/feature-flags.ts +1 -0
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/0b99eb9664d47ca7.js +1 -0
- package/web/.next/static/chunks/177f1dcbe83c136a.js +1 -0
- package/web/.next/static/chunks/41a2adc09edfffaf.js +1 -0
- package/web/.next/static/chunks/5054c72b1c8f5912.js +1 -0
- package/web/.next/static/chunks/71d2618e41d7da6d.js +1 -0
- package/web/.next/static/chunks/7ad36bef63f15bc6.js +1 -0
- package/web/.next/static/chunks/{3b941e59ac013e12.js → 87421ab1062a39b7.js} +2 -2
- package/web/.next/static/chunks/{21541b346dd4dd28.js → 8c60d1bd87239066.js} +1 -1
- package/web/.next/static/chunks/96f49affaceab206.css +2 -0
- package/web/.next/static/chunks/a6d1d774260fc927.js +2 -0
- package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
- package/web/.next/static/chunks/f54ff9c15fb7b383.js +1 -0
- package/web/.next/static/chunks/f5fb2f182ae9b015.js +1 -0
- package/web/.next/static/chunks/{fa8058049a43c698.js → f6766e799a69fb5d.js} +7 -7
- package/web/.next/static/chunks/turbopack-b6b5b4f015327a9a.js +4 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +0 -9
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_73d14b70._.js +0 -3
- package/web/.next/server/chunks/ssr/_73d14b70._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_7f386377._.js +0 -3
- package/web/.next/server/chunks/ssr/_7f386377._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d3711354._.js +0 -6
- package/web/.next/server/chunks/ssr/_d3711354._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d81184e2._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_87f920e7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +0 -9
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_73d14b70._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_7f386377._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d3711354._.js +0 -6
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d81184e2._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +0 -3
- package/web/.next/static/chunks/0c6654ec27f11c7e.js +0 -1
- package/web/.next/static/chunks/12c70bfd5951cf9b.js +0 -1
- package/web/.next/static/chunks/1887af4ad3781531.js +0 -2
- package/web/.next/static/chunks/233fbb89beb137e8.js +0 -1
- package/web/.next/static/chunks/78919481e7c5ad4f.js +0 -1
- package/web/.next/static/chunks/a5b6a22de303e877.css +0 -2
- package/web/.next/static/chunks/acdb8af5a21f1ae9.js +0 -1
- package/web/.next/static/chunks/af7a5bcb7c49e46e.js +0 -1
- package/web/.next/static/chunks/be784143669bb992.js +0 -1
- package/web/.next/static/chunks/turbopack-eb24b869babb34b4.js +0 -4
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__fbc89707._.js.map → [root-of-the-server]__249c74f6._.js.map} +0 -0
- /package/web/.next/static/{zuqVLdEhCDdtLqCuWgUm5 → 5RMUwLfTnzL0pvJOwfuxg}/_buildManifest.js +0 -0
- /package/web/.next/static/{zuqVLdEhCDdtLqCuWgUm5 → 5RMUwLfTnzL0pvJOwfuxg}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{zuqVLdEhCDdtLqCuWgUm5 → 5RMUwLfTnzL0pvJOwfuxg}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment Service
|
|
3
|
+
*
|
|
4
|
+
* Infrastructure service that manages local dev server deployments.
|
|
5
|
+
* Holds an in-memory Map of active deployments keyed by targetId.
|
|
6
|
+
* Handles process spawning, stdout-based port detection, and graceful
|
|
7
|
+
* shutdown (SIGTERM → poll → SIGKILL).
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import { DeploymentState } from '../../../domain/generated/output.js';
|
|
11
|
+
import { detectDevScript } from './detect-dev-script.js';
|
|
12
|
+
import { parsePort } from './parse-port.js';
|
|
13
|
+
const POLL_INTERVAL_MS = 200;
|
|
14
|
+
const MAX_WAIT_MS = 5000;
|
|
15
|
+
const defaultDeps = {
|
|
16
|
+
spawn,
|
|
17
|
+
detectDevScript,
|
|
18
|
+
kill: (pid, signal) => process.kill(pid, signal),
|
|
19
|
+
isAlive: (pid) => {
|
|
20
|
+
try {
|
|
21
|
+
process.kill(pid, 0);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
export class DeploymentService {
|
|
30
|
+
deployments = new Map();
|
|
31
|
+
deps;
|
|
32
|
+
constructor(deps = {}) {
|
|
33
|
+
this.deps = { ...defaultDeps, ...deps };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Start a deployment for the given target.
|
|
37
|
+
* If a deployment already exists for this target, it is stopped first.
|
|
38
|
+
*/
|
|
39
|
+
start(targetId, targetPath) {
|
|
40
|
+
// Stop any existing deployment for this target
|
|
41
|
+
const existing = this.deployments.get(targetId);
|
|
42
|
+
if (existing) {
|
|
43
|
+
this.killProcess(existing);
|
|
44
|
+
this.deployments.delete(targetId);
|
|
45
|
+
}
|
|
46
|
+
// Detect the dev script
|
|
47
|
+
const detection = this.deps.detectDevScript(targetPath);
|
|
48
|
+
if (!detection.success) {
|
|
49
|
+
throw new Error(detection.error);
|
|
50
|
+
}
|
|
51
|
+
// Build spawn args based on package manager
|
|
52
|
+
const { packageManager, scriptName } = detection;
|
|
53
|
+
const args = packageManager === 'npm' ? ['run', scriptName] : [scriptName];
|
|
54
|
+
const child = this.deps.spawn(packageManager, args, {
|
|
55
|
+
shell: true,
|
|
56
|
+
cwd: targetPath,
|
|
57
|
+
detached: true,
|
|
58
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
59
|
+
});
|
|
60
|
+
if (!child.pid) {
|
|
61
|
+
throw new Error('Failed to spawn dev server: no PID returned');
|
|
62
|
+
}
|
|
63
|
+
const entry = {
|
|
64
|
+
pid: child.pid,
|
|
65
|
+
child: child,
|
|
66
|
+
state: DeploymentState.Booting,
|
|
67
|
+
url: null,
|
|
68
|
+
targetId,
|
|
69
|
+
stdoutBuffer: '',
|
|
70
|
+
stderrBuffer: '',
|
|
71
|
+
};
|
|
72
|
+
this.deployments.set(targetId, entry);
|
|
73
|
+
// Attach stdout/stderr listeners for port detection
|
|
74
|
+
this.attachOutputListener(entry, 'stdout');
|
|
75
|
+
this.attachOutputListener(entry, 'stderr');
|
|
76
|
+
// Clean up on process exit
|
|
77
|
+
child.on('exit', () => {
|
|
78
|
+
this.deployments.delete(targetId);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the current deployment status for a target.
|
|
83
|
+
* Returns null if no deployment exists for this target.
|
|
84
|
+
*/
|
|
85
|
+
getStatus(targetId) {
|
|
86
|
+
const entry = this.deployments.get(targetId);
|
|
87
|
+
if (!entry)
|
|
88
|
+
return null;
|
|
89
|
+
return { state: entry.state, url: entry.url };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Stop a deployment gracefully: SIGTERM → poll → SIGKILL.
|
|
93
|
+
*/
|
|
94
|
+
async stop(targetId) {
|
|
95
|
+
const entry = this.deployments.get(targetId);
|
|
96
|
+
if (!entry)
|
|
97
|
+
return;
|
|
98
|
+
// Send SIGTERM to process group
|
|
99
|
+
try {
|
|
100
|
+
this.deps.kill(-entry.pid, 'SIGTERM');
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Process may already be dead
|
|
104
|
+
this.deployments.delete(targetId);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Wait for the process to exit
|
|
108
|
+
const died = await this.pollUntilDead(entry.pid, MAX_WAIT_MS, POLL_INTERVAL_MS);
|
|
109
|
+
if (!died) {
|
|
110
|
+
// Escalate to SIGKILL
|
|
111
|
+
try {
|
|
112
|
+
this.deps.kill(-entry.pid, 'SIGKILL');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Process may have exited between check and kill
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Wait for the exit event to clean up the map
|
|
119
|
+
await this.waitForExit(entry.child);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Force-stop all tracked deployments immediately (for daemon shutdown).
|
|
123
|
+
*/
|
|
124
|
+
stopAll() {
|
|
125
|
+
for (const entry of this.deployments.values()) {
|
|
126
|
+
this.killProcess(entry);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Send SIGKILL to a process group.
|
|
131
|
+
*/
|
|
132
|
+
killProcess(entry) {
|
|
133
|
+
try {
|
|
134
|
+
this.deps.kill(-entry.pid, 'SIGKILL');
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Process may already be dead
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Attach a line-buffered listener on stdout or stderr that calls parsePort.
|
|
142
|
+
*/
|
|
143
|
+
attachOutputListener(entry, stream) {
|
|
144
|
+
const bufferKey = stream === 'stdout' ? 'stdoutBuffer' : 'stderrBuffer';
|
|
145
|
+
const childStream = entry.child[stream];
|
|
146
|
+
if (!childStream)
|
|
147
|
+
return;
|
|
148
|
+
childStream.on('data', (chunk) => {
|
|
149
|
+
// Append chunk to buffer
|
|
150
|
+
entry[bufferKey] += chunk.toString();
|
|
151
|
+
// Process complete lines
|
|
152
|
+
const lines = entry[bufferKey].split('\n');
|
|
153
|
+
// Keep the last element (incomplete line) in the buffer
|
|
154
|
+
entry[bufferKey] = lines.pop() ?? '';
|
|
155
|
+
for (const line of lines) {
|
|
156
|
+
if (entry.state !== DeploymentState.Booting)
|
|
157
|
+
break;
|
|
158
|
+
const url = parsePort(line);
|
|
159
|
+
if (url) {
|
|
160
|
+
entry.state = DeploymentState.Ready;
|
|
161
|
+
entry.url = url;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Poll until a process is dead or timeout expires.
|
|
169
|
+
*/
|
|
170
|
+
async pollUntilDead(pid, maxMs, intervalMs) {
|
|
171
|
+
const deadline = Date.now() + maxMs;
|
|
172
|
+
while (Date.now() < deadline) {
|
|
173
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
174
|
+
if (!this.deps.isAlive(pid)) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Wait for a child process to emit 'exit', with a short timeout.
|
|
182
|
+
*/
|
|
183
|
+
waitForExit(child) {
|
|
184
|
+
return new Promise((resolve) => {
|
|
185
|
+
const timeout = setTimeout(() => resolve(), 1000);
|
|
186
|
+
child.on('exit', () => {
|
|
187
|
+
clearTimeout(timeout);
|
|
188
|
+
resolve();
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect Dev Script
|
|
3
|
+
*
|
|
4
|
+
* Pure utility that reads package.json from a directory, scans for common dev
|
|
5
|
+
* scripts (dev, start, serve), and detects the package manager from lockfile
|
|
6
|
+
* presence. Returns the detected command or an error.
|
|
7
|
+
*/
|
|
8
|
+
export interface DetectDevScriptSuccess {
|
|
9
|
+
success: true;
|
|
10
|
+
packageManager: string;
|
|
11
|
+
scriptName: string;
|
|
12
|
+
command: string;
|
|
13
|
+
}
|
|
14
|
+
export interface DetectDevScriptError {
|
|
15
|
+
success: false;
|
|
16
|
+
error: string;
|
|
17
|
+
}
|
|
18
|
+
export type DetectDevScriptResult = DetectDevScriptSuccess | DetectDevScriptError;
|
|
19
|
+
/**
|
|
20
|
+
* Detect the dev script and package manager for a project directory.
|
|
21
|
+
*
|
|
22
|
+
* @param dirPath - Absolute path to the project directory
|
|
23
|
+
* @returns Detection result with command info, or an error
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectDevScript(dirPath: string): DetectDevScriptResult;
|
|
26
|
+
//# sourceMappingURL=detect-dev-script.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-dev-script.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/detect-dev-script.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,IAAI,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAElF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CA4BtE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect Dev Script
|
|
3
|
+
*
|
|
4
|
+
* Pure utility that reads package.json from a directory, scans for common dev
|
|
5
|
+
* scripts (dev, start, serve), and detects the package manager from lockfile
|
|
6
|
+
* presence. Returns the detected command or an error.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
/** Script names to search for, in priority order */
|
|
11
|
+
const SCRIPT_PRIORITY = ['dev', 'start', 'serve'];
|
|
12
|
+
/** Lockfile-to-package-manager mapping, checked in order */
|
|
13
|
+
const LOCKFILE_MANAGERS = [
|
|
14
|
+
{ lockfile: 'pnpm-lock.yaml', manager: 'pnpm' },
|
|
15
|
+
{ lockfile: 'yarn.lock', manager: 'yarn' },
|
|
16
|
+
{ lockfile: 'package-lock.json', manager: 'npm' },
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Detect the dev script and package manager for a project directory.
|
|
20
|
+
*
|
|
21
|
+
* @param dirPath - Absolute path to the project directory
|
|
22
|
+
* @returns Detection result with command info, or an error
|
|
23
|
+
*/
|
|
24
|
+
export function detectDevScript(dirPath) {
|
|
25
|
+
// Read and parse package.json
|
|
26
|
+
let packageJson;
|
|
27
|
+
try {
|
|
28
|
+
const raw = readFileSync(join(dirPath, 'package.json'), 'utf-8');
|
|
29
|
+
packageJson = JSON.parse(raw);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return { success: false, error: `No package.json found in ${dirPath}` };
|
|
33
|
+
}
|
|
34
|
+
// Find the first matching script in priority order
|
|
35
|
+
const scripts = packageJson.scripts ?? {};
|
|
36
|
+
const scriptName = SCRIPT_PRIORITY.find((name) => name in scripts);
|
|
37
|
+
if (!scriptName) {
|
|
38
|
+
return {
|
|
39
|
+
success: false,
|
|
40
|
+
error: `No dev script found in package.json. Expected one of: ${SCRIPT_PRIORITY.join(', ')}`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Detect package manager from lockfile
|
|
44
|
+
const packageManager = detectPackageManager(dirPath);
|
|
45
|
+
// Build the command — pnpm/yarn use `<pm> <script>`, npm uses `npm run <script>`
|
|
46
|
+
const command = packageManager === 'npm' ? `npm run ${scriptName}` : `${packageManager} ${scriptName}`;
|
|
47
|
+
return { success: true, packageManager, scriptName, command };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detect the package manager by checking for lockfile presence.
|
|
51
|
+
*/
|
|
52
|
+
function detectPackageManager(dirPath) {
|
|
53
|
+
for (const { lockfile, manager } of LOCKFILE_MANAGERS) {
|
|
54
|
+
if (existsSync(join(dirPath, lockfile))) {
|
|
55
|
+
return manager;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return 'npm';
|
|
59
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse Port
|
|
3
|
+
*
|
|
4
|
+
* Pure utility that extracts a localhost URL or port number from a line of
|
|
5
|
+
* dev server stdout/stderr output. Handles common patterns from Next.js,
|
|
6
|
+
* Vite, Express, and generic servers.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parse a line of stdout/stderr output for a localhost URL or port.
|
|
10
|
+
*
|
|
11
|
+
* @param line - A single line of process output
|
|
12
|
+
* @returns The detected URL string, or null if no URL/port was found
|
|
13
|
+
*/
|
|
14
|
+
export declare function parsePort(line: string): string | null;
|
|
15
|
+
//# sourceMappingURL=parse-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-port.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/parse-port.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkCH;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAarD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse Port
|
|
3
|
+
*
|
|
4
|
+
* Pure utility that extracts a localhost URL or port number from a line of
|
|
5
|
+
* dev server stdout/stderr output. Handles common patterns from Next.js,
|
|
6
|
+
* Vite, Express, and generic servers.
|
|
7
|
+
*/
|
|
8
|
+
/** Named patterns for port/URL detection, checked in order */
|
|
9
|
+
const PORT_PATTERNS = [
|
|
10
|
+
{
|
|
11
|
+
name: 'local-url',
|
|
12
|
+
// Matches "Local: http://localhost:3000" or "- Local: http://localhost:5173/"
|
|
13
|
+
regex: /Local:\s+(https?:\/\/(?:localhost|127\.0\.0\.1):\d+\S*)/,
|
|
14
|
+
extract: (m) => m[1],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'next-ready',
|
|
18
|
+
// Matches "ready - started server on 0.0.0.0:3000, url: http://localhost:3000"
|
|
19
|
+
regex: /url:\s+(https?:\/\/(?:localhost|127\.0\.0\.1):\d+\S*)/,
|
|
20
|
+
extract: (m) => m[1],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'listening-port',
|
|
24
|
+
// Matches "listening on port 3000", "started on port 9000", etc.
|
|
25
|
+
regex: /(?:listening|started)\s+on\s+port\s+(\d+)/i,
|
|
26
|
+
extract: (m) => `http://localhost:${m[1]}`,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'generic-localhost',
|
|
30
|
+
// Matches any "http://localhost:PORT" or "https://localhost:PORT" in the line
|
|
31
|
+
regex: /(https?:\/\/(?:localhost|127\.0\.0\.1):\d+\S*)/,
|
|
32
|
+
extract: (m) => m[1],
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Parse a line of stdout/stderr output for a localhost URL or port.
|
|
37
|
+
*
|
|
38
|
+
* @param line - A single line of process output
|
|
39
|
+
* @returns The detected URL string, or null if no URL/port was found
|
|
40
|
+
*/
|
|
41
|
+
export function parsePort(line) {
|
|
42
|
+
if (!line?.trim()) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
for (const { regex, extract } of PORT_PATTERNS) {
|
|
46
|
+
const match = line.match(regex);
|
|
47
|
+
if (match) {
|
|
48
|
+
return extract(match);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAQhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuC9C,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAQhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuC9C,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkDjF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkCpD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrF,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAW3F,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -180,9 +180,19 @@ let GitPrService = class GitPrService {
|
|
|
180
180
|
if (message.includes('timed out') || message.includes('timeout')) {
|
|
181
181
|
throw new GitPrError(message, GitPrErrorCode.CI_TIMEOUT, cause);
|
|
182
182
|
}
|
|
183
|
-
// gh run watch --exit-status exits non-zero when the run fails
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
// gh run watch --exit-status exits non-zero when the run fails.
|
|
184
|
+
// Node.js execFile produces errors with a numeric `code` (exit code) and
|
|
185
|
+
// stdout/stderr from the process. The error.message is typically
|
|
186
|
+
// "Command failed: gh run watch <id> --exit-status\n" — detect this by
|
|
187
|
+
// checking for a numeric exit code or the "Command failed" prefix.
|
|
188
|
+
const exitCode = error?.code;
|
|
189
|
+
const hasNumericExitCode = typeof exitCode === 'number';
|
|
190
|
+
const isCommandFailure = message.includes('Command failed') || message.includes('exit code');
|
|
191
|
+
if (hasNumericExitCode || isCommandFailure) {
|
|
192
|
+
// Build a useful log excerpt from stdout/stderr if available
|
|
193
|
+
const errObj = error;
|
|
194
|
+
const parts = [errObj.stdout, errObj.stderr, message].filter(Boolean);
|
|
195
|
+
return { status: 'failure', logExcerpt: parts.join('\n').trim() };
|
|
186
196
|
}
|
|
187
197
|
throw new GitPrError(message, GitPrErrorCode.GIT_ERROR, cause);
|
|
188
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_serve.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/_serve.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"_serve.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/_serve.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAwB1D;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA0D5C"}
|
|
@@ -72,6 +72,8 @@ export function createServeCommand() {
|
|
|
72
72
|
const forceExit = setTimeout(() => process.exit(0), 5000);
|
|
73
73
|
forceExit.unref();
|
|
74
74
|
getNotificationWatcher().stop();
|
|
75
|
+
const deploymentService = container.resolve('IDeploymentService');
|
|
76
|
+
deploymentService.stopAll();
|
|
75
77
|
await service.stop();
|
|
76
78
|
process.exit(0);
|
|
77
79
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
export declare function deployFeature(featureId: string): Promise<{
|
|
3
|
+
success: boolean;
|
|
4
|
+
error?: string;
|
|
5
|
+
state?: DeploymentState;
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=deploy-feature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-feature.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CA2BxE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve } from '../../lib/server-container.js';
|
|
4
|
+
import { computeWorktreePath } from '../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
|
|
5
|
+
import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
6
|
+
export async function deployFeature(featureId) {
|
|
7
|
+
if (!featureId?.trim()) {
|
|
8
|
+
return { success: false, error: 'featureId is required' };
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const featureRepo = resolve('IFeatureRepository');
|
|
12
|
+
const feature = await featureRepo.findById(featureId);
|
|
13
|
+
if (!feature) {
|
|
14
|
+
return { success: false, error: `Feature not found: ${featureId}` };
|
|
15
|
+
}
|
|
16
|
+
const worktreePath = computeWorktreePath(feature.repositoryPath, feature.branch);
|
|
17
|
+
if (!existsSync(worktreePath)) {
|
|
18
|
+
return { success: false, error: `Worktree path does not exist: ${worktreePath}` };
|
|
19
|
+
}
|
|
20
|
+
const deploymentService = resolve('IDeploymentService');
|
|
21
|
+
deploymentService.start(featureId, worktreePath);
|
|
22
|
+
return { success: true, state: DeploymentState.Booting };
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const message = error instanceof Error ? error.message : 'Failed to deploy feature';
|
|
26
|
+
return { success: false, error: message };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
export declare function deployRepository(repositoryPath: string): Promise<{
|
|
3
|
+
success: boolean;
|
|
4
|
+
error?: string;
|
|
5
|
+
state?: DeploymentState;
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=deploy-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-repository.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAkBxE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve } from '../../lib/server-container.js';
|
|
4
|
+
import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
5
|
+
export async function deployRepository(repositoryPath) {
|
|
6
|
+
if (!repositoryPath?.startsWith('/')) {
|
|
7
|
+
return { success: false, error: 'repositoryPath must be an absolute path' };
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
if (!existsSync(repositoryPath)) {
|
|
11
|
+
return { success: false, error: `Directory does not exist: ${repositoryPath}` };
|
|
12
|
+
}
|
|
13
|
+
const deploymentService = resolve('IDeploymentService');
|
|
14
|
+
deploymentService.start(repositoryPath, repositoryPath);
|
|
15
|
+
return { success: true, state: DeploymentState.Booting };
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
const message = error instanceof Error ? error.message : 'Failed to deploy repository';
|
|
19
|
+
return { success: false, error: message };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DeploymentStatus } from '../../../../../packages/core/src/application/ports/output/services/deployment-service.interface.js';
|
|
2
|
+
export declare function getDeploymentStatus(targetId: string): Promise<DeploymentStatus | null>;
|
|
3
|
+
//# sourceMappingURL=get-deployment-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-deployment-status.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-deployment-status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,6EAA6E,CAAC;AAErF,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAO5F"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function getDeploymentStatus(targetId) {
|
|
4
|
+
if (!targetId?.trim()) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
const deploymentService = resolve('IDeploymentService');
|
|
8
|
+
return deploymentService.getStatus(targetId);
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-deployment.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/stop-deployment.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAc/C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function stopDeployment(targetId) {
|
|
4
|
+
if (!targetId?.trim()) {
|
|
5
|
+
return { success: false, error: 'targetId is required' };
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const deploymentService = resolve('IDeploymentService');
|
|
9
|
+
await deploymentService.stop(targetId);
|
|
10
|
+
return { success: true };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : 'Failed to stop deployment';
|
|
14
|
+
return { success: false, error: message };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Feature, Repository, AgentRun } from '../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
import type { CanvasNodeType } from '../components/features/features-canvas/index.js';
|
|
3
|
+
import type { Edge } from '@xyflow/react';
|
|
4
|
+
export interface FeatureWithRun {
|
|
5
|
+
feature: Feature;
|
|
6
|
+
run: AgentRun | null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Builds React Flow nodes and edges from persisted repositories and features.
|
|
10
|
+
*
|
|
11
|
+
* Features whose repositoryPath is not covered by any real repository row are
|
|
12
|
+
* grouped under a synthetic "virtual" repository node
|
|
13
|
+
* (id: `virtual-repo-${repositoryPath}`). This ensures the dashboard never
|
|
14
|
+
* renders empty when features exist but their repository rows are missing.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildGraphNodes(repositories: Repository[], featuresWithRuns: FeatureWithRun[]): {
|
|
17
|
+
nodes: CanvasNodeType[];
|
|
18
|
+
edges: Edge[];
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=build-graph-nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAK1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAuB1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,GACjC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAiE5C"}
|