@shepai/cli 1.120.0-pr384.fdb89bb → 1.120.0-pr385.7a4c87f
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/services/deployment-service.interface.d.ts +1 -9
- package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +0 -19
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +2 -6
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +13 -30
- package/dist/src/presentation/web/app/actions/deploy-feature.d.ts +1 -2
- package/dist/src/presentation/web/app/actions/deploy-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-feature.js +6 -9
- package/dist/src/presentation/web/app/actions/deploy-repository.d.ts +1 -2
- package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-repository.js +6 -9
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.js +8 -0
- package/dist/src/presentation/web/components/common/feature-status-badges/feature-status-badges.stories.js +6 -6
- package/dist/src/presentation/web/components/common/feature-status-config.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-status-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-status-config.js +8 -1
- package/dist/src/presentation/web/components/common/feature-status-group/feature-status-group.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-status-group/feature-status-group.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-status-group/feature-status-group.stories.js +7 -0
- package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js +2 -1
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js +2 -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/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3b14e5a0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3b14e5a0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -1
- 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]__6bb00d90._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
- 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]__8b59c03e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b59c03e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__994ad9fe._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__994ad9fe._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c9c1cfee._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c9c1cfee._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0dc2cfd3._.js +3 -0
- package/web/.next/server/chunks/ssr/_0dc2cfd3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_3b5f25fa._.js → _1f64ecc6._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_3b5f25fa._.js.map → _1f64ecc6._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_83b11c33._.js → _d118fdcf._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_83b11c33._.js.map → _d118fdcf._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_f605354c._.js → _f1a649e3._.js} +3 -3
- package/web/.next/server/chunks/ssr/_f1a649e3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_3c9e300b._.js → _fbd1fb49._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_3c9e300b._.js.map → _fbd1fb49._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.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 +33 -33
- package/web/.next/static/chunks/0d2af96e64960ef5.css +1 -0
- package/web/.next/static/chunks/1985c707cfaf0ed0.js +1 -0
- package/web/.next/static/chunks/{2f9dcf87c0a9c513.js → 28703fd18babc4d2.js} +1 -1
- package/web/.next/static/chunks/{7da5a2bd92f03feb.js → 2bae334afb7e4944.js} +1 -1
- package/web/.next/static/chunks/{83e2aac7e244633a.js → 5b2882de7e56895e.js} +1 -1
- package/web/.next/static/chunks/6573b8e9cd86c17f.js +11 -0
- package/web/.next/static/chunks/{f81995913dac5269.js → 6ad0261fb70e3133.js} +1 -1
- package/web/.next/static/chunks/{720858e147830a1b.js → 7c7e3e95c5e9dc43.js} +1 -1
- package/web/.next/static/chunks/{6e9701fc52697f2b.js → 9316d62aeece18d3.js} +2 -2
- package/web/.next/static/chunks/{71161130b2462279.js → 96eeeb28e06de78c.js} +1 -1
- package/web/.next/static/chunks/d3eceb717f407d90.js +1 -0
- package/web/.next/static/chunks/efd33d3c499aed2f.js +2 -0
- package/dist/packages/core/src/application/ports/output/services/agent-deployment-service.interface.d.ts +0 -46
- package/dist/packages/core/src/application/ports/output/services/agent-deployment-service.interface.d.ts.map +0 -1
- package/dist/packages/core/src/application/ports/output/services/agent-deployment-service.interface.js +0 -13
- package/dist/packages/core/src/application/ports/output/services/dev-environment-agent.interface.d.ts +0 -65
- package/dist/packages/core/src/application/ports/output/services/dev-environment-agent.interface.d.ts.map +0 -1
- package/dist/packages/core/src/application/ports/output/services/dev-environment-agent.interface.js +0 -14
- package/dist/packages/core/src/infrastructure/services/deployment/agent-deployment.service.d.ts +0 -30
- package/dist/packages/core/src/infrastructure/services/deployment/agent-deployment.service.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/deployment/agent-deployment.service.js +0 -110
- package/dist/packages/core/src/infrastructure/services/deployment/dev-environment-agent.service.d.ts +0 -35
- package/dist/packages/core/src/infrastructure/services/deployment/dev-environment-agent.service.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/deployment/dev-environment-agent.service.js +0 -210
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0534f358._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0534f358._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__997ccfcc._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__997ccfcc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a6c615b8._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a6c615b8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_ab069e13._.js +0 -3
- package/web/.next/server/chunks/ssr/_ab069e13._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f605354c._.js.map +0 -1
- package/web/.next/static/chunks/06702284aedb4e13.js +0 -1
- package/web/.next/static/chunks/57063722dbce9768.js +0 -2
- package/web/.next/static/chunks/652d07e1b3da6fd3.js +0 -11
- package/web/.next/static/chunks/9e8ebcb706d0ca6f.js +0 -1
- package/web/.next/static/chunks/d2739454715e5ef2.css +0 -1
- /package/web/.next/static/{yAqHoeHdmindXxK6kOd6a → 1MKiYJvfeyDdsVU2k3Kde}/_buildManifest.js +0 -0
- /package/web/.next/static/{yAqHoeHdmindXxK6kOd6a → 1MKiYJvfeyDdsVU2k3Kde}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{yAqHoeHdmindXxK6kOd6a → 1MKiYJvfeyDdsVU2k3Kde}/_ssgManifest.js +0 -0
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Deployment Service Interface
|
|
3
|
-
*
|
|
4
|
-
* Higher-level deployment service that uses the DevEnvironmentAgent
|
|
5
|
-
* to analyze repos before starting deployments. Wraps the low-level
|
|
6
|
-
* IDeploymentService with AI-driven analysis.
|
|
7
|
-
*
|
|
8
|
-
* Flow:
|
|
9
|
-
* 1. Analyze repo via DevEnvironmentAgent (cached per-repo)
|
|
10
|
-
* 2. If not deployable → return "not deployable" result
|
|
11
|
-
* 3. If deployable → run setup commands → start dev server
|
|
12
|
-
*/
|
|
13
|
-
import type { DeploymentState } from '../../../../domain/generated/output.js';
|
|
14
|
-
import type { DevEnvironmentAnalysis } from './dev-environment-agent.interface.js';
|
|
15
|
-
/** Result of an agent-driven deployment attempt. */
|
|
16
|
-
export interface AgentDeployResult {
|
|
17
|
-
/** Whether the deployment was started successfully. */
|
|
18
|
-
success: boolean;
|
|
19
|
-
/** Error message if the deployment failed. */
|
|
20
|
-
error?: string;
|
|
21
|
-
/** Current deployment state (Booting on success). */
|
|
22
|
-
state?: DeploymentState;
|
|
23
|
-
/** The analysis result from the dev environment agent. */
|
|
24
|
-
analysis?: DevEnvironmentAnalysis;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Port interface for agent-driven deployments.
|
|
28
|
-
*
|
|
29
|
-
* Uses DevEnvironmentAgent to analyze the repo, then starts the
|
|
30
|
-
* deployment using the detected command. Handles repos that have
|
|
31
|
-
* nothing to deploy by returning a descriptive result.
|
|
32
|
-
*/
|
|
33
|
-
export interface IAgentDeploymentService {
|
|
34
|
-
/**
|
|
35
|
-
* Analyze a repository and start its dev environment if possible.
|
|
36
|
-
*
|
|
37
|
-
* @param targetId - Unique identifier for the deployment (featureId or repositoryPath)
|
|
38
|
-
* @param targetPath - Absolute filesystem path to the directory to deploy from
|
|
39
|
-
* @param options - Optional: force re-analysis by skipping cache
|
|
40
|
-
* @returns Result with success/error and the analysis
|
|
41
|
-
*/
|
|
42
|
-
deploy(targetId: string, targetPath: string, options?: {
|
|
43
|
-
skipCache?: boolean;
|
|
44
|
-
}): Promise<AgentDeployResult>;
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=agent-deployment-service.interface.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-deployment-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/agent-deployment-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAEnF,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IAEjB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,qDAAqD;IACrD,KAAK,CAAC,EAAE,eAAe,CAAC;IAExB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;;;OAOG;IACH,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Deployment Service Interface
|
|
3
|
-
*
|
|
4
|
-
* Higher-level deployment service that uses the DevEnvironmentAgent
|
|
5
|
-
* to analyze repos before starting deployments. Wraps the low-level
|
|
6
|
-
* IDeploymentService with AI-driven analysis.
|
|
7
|
-
*
|
|
8
|
-
* Flow:
|
|
9
|
-
* 1. Analyze repo via DevEnvironmentAgent (cached per-repo)
|
|
10
|
-
* 2. If not deployable → return "not deployable" result
|
|
11
|
-
* 3. If deployable → run setup commands → start dev server
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dev Environment Agent Interface
|
|
3
|
-
*
|
|
4
|
-
* Output port for agent-based dev environment analysis.
|
|
5
|
-
* Uses an AI agent to analyze any repository (language-agnostic) and determine
|
|
6
|
-
* how to start a local development server. Supports per-repo caching for fast
|
|
7
|
-
* repeated invocations.
|
|
8
|
-
*
|
|
9
|
-
* Key behaviors:
|
|
10
|
-
* - Analyzes repo structure to detect dev server commands across all languages
|
|
11
|
-
* - Returns a "not deployable" result for repos with no server/UI to start
|
|
12
|
-
* - Caches analysis results per-repo for fast subsequent calls
|
|
13
|
-
*/
|
|
14
|
-
/** Result of analyzing a repository for dev environment setup. */
|
|
15
|
-
export interface DevEnvironmentAnalysis {
|
|
16
|
-
/** Whether this repo has a startable dev environment. */
|
|
17
|
-
deployable: boolean;
|
|
18
|
-
/** Human-readable explanation of what was detected or why it's not deployable. */
|
|
19
|
-
reason: string;
|
|
20
|
-
/** The shell command to start the dev server (null if not deployable). */
|
|
21
|
-
command: string | null;
|
|
22
|
-
/** Working directory relative to repo root (defaults to "."). */
|
|
23
|
-
cwd: string;
|
|
24
|
-
/** Expected port the dev server will listen on (null if unknown). */
|
|
25
|
-
expectedPort: number | null;
|
|
26
|
-
/** Detected language/framework (e.g., "node", "python", "go", "rust"). */
|
|
27
|
-
language: string | null;
|
|
28
|
-
/** Detected framework if any (e.g., "next.js", "django", "flask", "gin"). */
|
|
29
|
-
framework: string | null;
|
|
30
|
-
/** Setup commands to run before the dev command (e.g., "npm install"). */
|
|
31
|
-
setupCommands: string[];
|
|
32
|
-
}
|
|
33
|
-
/** Options for the analyze method. */
|
|
34
|
-
export interface DevEnvironmentAnalyzeOptions {
|
|
35
|
-
/** Skip the cache and force a fresh analysis. */
|
|
36
|
-
skipCache?: boolean;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Port interface for AI-driven dev environment analysis.
|
|
40
|
-
*
|
|
41
|
-
* Implementations use a structured agent caller to analyze repositories
|
|
42
|
-
* and determine how to start a local dev server. Results are cached
|
|
43
|
-
* per-repo (keyed by absolute path) for fast repeated calls.
|
|
44
|
-
*/
|
|
45
|
-
export interface IDevEnvironmentAgent {
|
|
46
|
-
/**
|
|
47
|
-
* Analyze a repository to determine how to start its dev environment.
|
|
48
|
-
*
|
|
49
|
-
* @param repositoryPath - Absolute filesystem path to the repository
|
|
50
|
-
* @param options - Optional configuration (e.g., skip cache)
|
|
51
|
-
* @returns Analysis result with command, language, and deployability info
|
|
52
|
-
*/
|
|
53
|
-
analyze(repositoryPath: string, options?: DevEnvironmentAnalyzeOptions): Promise<DevEnvironmentAnalysis>;
|
|
54
|
-
/**
|
|
55
|
-
* Clear the cached analysis for a specific repository.
|
|
56
|
-
*
|
|
57
|
-
* @param repositoryPath - Absolute filesystem path to the repository
|
|
58
|
-
*/
|
|
59
|
-
clearCache(repositoryPath: string): void;
|
|
60
|
-
/**
|
|
61
|
-
* Clear all cached analyses.
|
|
62
|
-
*/
|
|
63
|
-
clearAllCaches(): void;
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=dev-environment-agent.interface.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-environment-agent.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/dev-environment-agent.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;IAEpB,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IAEf,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IAEZ,qEAAqE;IACrE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,0EAA0E;IAC1E,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,4BAA4B;IAC3C,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;OAMG;IACH,OAAO,CACL,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEnC;;;;OAIG;IACH,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzC;;OAEG;IACH,cAAc,IAAI,IAAI,CAAC;CACxB"}
|
package/dist/packages/core/src/application/ports/output/services/dev-environment-agent.interface.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dev Environment Agent Interface
|
|
3
|
-
*
|
|
4
|
-
* Output port for agent-based dev environment analysis.
|
|
5
|
-
* Uses an AI agent to analyze any repository (language-agnostic) and determine
|
|
6
|
-
* how to start a local development server. Supports per-repo caching for fast
|
|
7
|
-
* repeated invocations.
|
|
8
|
-
*
|
|
9
|
-
* Key behaviors:
|
|
10
|
-
* - Analyzes repo structure to detect dev server commands across all languages
|
|
11
|
-
* - Returns a "not deployable" result for repos with no server/UI to start
|
|
12
|
-
* - Caches analysis results per-repo for fast subsequent calls
|
|
13
|
-
*/
|
|
14
|
-
export {};
|
package/dist/packages/core/src/infrastructure/services/deployment/agent-deployment.service.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Deployment Service
|
|
3
|
-
*
|
|
4
|
-
* Higher-level deployment orchestrator that uses the DevEnvironmentAgent
|
|
5
|
-
* to analyze repos before starting deployments. Replaces the simple
|
|
6
|
-
* "detect package.json scripts" approach with AI-driven analysis that
|
|
7
|
-
* supports any language/framework.
|
|
8
|
-
*
|
|
9
|
-
* Flow:
|
|
10
|
-
* 1. Analyze repo via DevEnvironmentAgent (cached per-repo for speed)
|
|
11
|
-
* 2. If not deployable → return descriptive reason
|
|
12
|
-
* 3. If deployable → run setup commands → start dev server via DeploymentService
|
|
13
|
-
*/
|
|
14
|
-
import type { IAgentDeploymentService, AgentDeployResult } from '../../../application/ports/output/services/agent-deployment-service.interface.js';
|
|
15
|
-
import type { IDevEnvironmentAgent } from '../../../application/ports/output/services/dev-environment-agent.interface.js';
|
|
16
|
-
import type { IDeploymentService } from '../../../application/ports/output/services/deployment-service.interface.js';
|
|
17
|
-
/** Dependencies injectable for testing. */
|
|
18
|
-
export interface AgentDeploymentServiceDeps {
|
|
19
|
-
devEnvironmentAgent: IDevEnvironmentAgent;
|
|
20
|
-
deploymentService: IDeploymentService;
|
|
21
|
-
execCommand?: (command: string, cwd: string) => Promise<void>;
|
|
22
|
-
}
|
|
23
|
-
export declare class AgentDeploymentService implements IAgentDeploymentService {
|
|
24
|
-
private readonly deps;
|
|
25
|
-
constructor(deps: AgentDeploymentServiceDeps);
|
|
26
|
-
deploy(targetId: string, targetPath: string, options?: {
|
|
27
|
-
skipCache?: boolean;
|
|
28
|
-
}): Promise<AgentDeployResult>;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=agent-deployment.service.d.ts.map
|
package/dist/packages/core/src/infrastructure/services/deployment/agent-deployment.service.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-deployment.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/agent-deployment.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,2EAA2E,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wEAAwE,CAAC;AACnH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qEAAqE,CAAC;AAM9G,2CAA2C;AAC3C,MAAM,WAAW,0BAA0B;IACzC,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAaD,qBAAa,sBAAuB,YAAW,uBAAuB;IACpE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;gBAExB,IAAI,EAAE,0BAA0B;IAOtC,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAChC,OAAO,CAAC,iBAAiB,CAAC;CA+E9B"}
|
package/dist/packages/core/src/infrastructure/services/deployment/agent-deployment.service.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Deployment Service
|
|
3
|
-
*
|
|
4
|
-
* Higher-level deployment orchestrator that uses the DevEnvironmentAgent
|
|
5
|
-
* to analyze repos before starting deployments. Replaces the simple
|
|
6
|
-
* "detect package.json scripts" approach with AI-driven analysis that
|
|
7
|
-
* supports any language/framework.
|
|
8
|
-
*
|
|
9
|
-
* Flow:
|
|
10
|
-
* 1. Analyze repo via DevEnvironmentAgent (cached per-repo for speed)
|
|
11
|
-
* 2. If not deployable → return descriptive reason
|
|
12
|
-
* 3. If deployable → run setup commands → start dev server via DeploymentService
|
|
13
|
-
*/
|
|
14
|
-
import { exec } from 'node:child_process';
|
|
15
|
-
import { join } from 'node:path';
|
|
16
|
-
import { DeploymentState } from '../../../domain/generated/output.js';
|
|
17
|
-
import { createDeploymentLogger } from './deployment-logger.js';
|
|
18
|
-
const log = createDeploymentLogger('[AgentDeploymentService]');
|
|
19
|
-
function defaultExecCommand(command, cwd) {
|
|
20
|
-
return new Promise((resolve, reject) => {
|
|
21
|
-
exec(command, { cwd }, (error) => {
|
|
22
|
-
if (error)
|
|
23
|
-
reject(error);
|
|
24
|
-
else
|
|
25
|
-
resolve();
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
export class AgentDeploymentService {
|
|
30
|
-
deps;
|
|
31
|
-
constructor(deps) {
|
|
32
|
-
this.deps = {
|
|
33
|
-
execCommand: defaultExecCommand,
|
|
34
|
-
...deps,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
async deploy(targetId, targetPath, options) {
|
|
38
|
-
log.info(`deploy() called — targetId="${targetId}", targetPath="${targetPath}"`);
|
|
39
|
-
// Step 1: Analyze via agent
|
|
40
|
-
let analysis;
|
|
41
|
-
try {
|
|
42
|
-
analysis = await this.deps.devEnvironmentAgent.analyze(targetPath, {
|
|
43
|
-
skipCache: options?.skipCache,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
const message = error instanceof Error ? error.message : 'Analysis failed';
|
|
48
|
-
log.error(`agent analysis failed: ${message}`);
|
|
49
|
-
return { success: false, error: message };
|
|
50
|
-
}
|
|
51
|
-
log.info(`analysis result — deployable=${analysis.deployable}, command=${analysis.command}`);
|
|
52
|
-
// Step 2: Handle not-deployable repos
|
|
53
|
-
if (!analysis.deployable) {
|
|
54
|
-
log.info(`repo is not deployable: ${analysis.reason}`);
|
|
55
|
-
return {
|
|
56
|
-
success: false,
|
|
57
|
-
error: analysis.reason,
|
|
58
|
-
analysis,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
// Validate: deployable but no command is an error
|
|
62
|
-
if (!analysis.command) {
|
|
63
|
-
log.error('analysis marked repo as deployable but provided no command');
|
|
64
|
-
return {
|
|
65
|
-
success: false,
|
|
66
|
-
error: 'Analysis marked repo as deployable but provided no command',
|
|
67
|
-
analysis,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
// Step 3: Run setup commands
|
|
71
|
-
const resolvedCwd = analysis.cwd && analysis.cwd !== '.' ? join(targetPath, analysis.cwd) : targetPath;
|
|
72
|
-
for (const setupCmd of analysis.setupCommands) {
|
|
73
|
-
log.info(`running setup command: "${setupCmd}" in "${resolvedCwd}"`);
|
|
74
|
-
try {
|
|
75
|
-
await this.deps.execCommand(setupCmd, resolvedCwd);
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
const message = error instanceof Error ? error.message : 'Setup failed';
|
|
79
|
-
log.error(`setup command failed: ${message}`);
|
|
80
|
-
return {
|
|
81
|
-
success: false,
|
|
82
|
-
error: `Setup command failed: ${message}`,
|
|
83
|
-
analysis,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Step 4: Start the dev server
|
|
88
|
-
try {
|
|
89
|
-
this.deps.deploymentService.start(targetId, targetPath, {
|
|
90
|
-
command: analysis.command,
|
|
91
|
-
cwd: analysis.cwd,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
catch (error) {
|
|
95
|
-
const message = error instanceof Error ? error.message : 'Failed to start deployment';
|
|
96
|
-
log.error(`deployment start failed: ${message}`);
|
|
97
|
-
return {
|
|
98
|
-
success: false,
|
|
99
|
-
error: message,
|
|
100
|
-
analysis,
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
log.info('deployment started successfully');
|
|
104
|
-
return {
|
|
105
|
-
success: true,
|
|
106
|
-
state: DeploymentState.Booting,
|
|
107
|
-
analysis,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
}
|
package/dist/packages/core/src/infrastructure/services/deployment/dev-environment-agent.service.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dev Environment Agent Service
|
|
3
|
-
*
|
|
4
|
-
* AI-driven service that analyzes any repository to determine how to start
|
|
5
|
-
* a local dev environment. Language-agnostic — supports Node.js, Python,
|
|
6
|
-
* Go, Rust, Java, Ruby, and more. Uses structured agent calls to get
|
|
7
|
-
* typed analysis results.
|
|
8
|
-
*
|
|
9
|
-
* Features:
|
|
10
|
-
* - In-memory per-repo caching for fast repeated calls
|
|
11
|
-
* - Reads key config files (package.json, Cargo.toml, etc.) for context
|
|
12
|
-
* - Handles "not deployable" repos gracefully
|
|
13
|
-
* - Truncates large files to prevent prompt overflow
|
|
14
|
-
*/
|
|
15
|
-
import type { IDevEnvironmentAgent, DevEnvironmentAnalysis, DevEnvironmentAnalyzeOptions } from '../../../application/ports/output/services/dev-environment-agent.interface.js';
|
|
16
|
-
import type { IStructuredAgentCaller } from '../../../application/ports/output/agents/structured-agent-caller.interface.js';
|
|
17
|
-
/** Dependencies injectable for testing. */
|
|
18
|
-
export interface DevEnvironmentAgentDeps {
|
|
19
|
-
structuredAgentCaller: Pick<IStructuredAgentCaller, 'call'>;
|
|
20
|
-
readdir: (path: string) => string[];
|
|
21
|
-
readFile: (path: string) => string;
|
|
22
|
-
existsSync: (path: string) => boolean;
|
|
23
|
-
}
|
|
24
|
-
export declare class DevEnvironmentAgentService implements IDevEnvironmentAgent {
|
|
25
|
-
private readonly cache;
|
|
26
|
-
private readonly deps;
|
|
27
|
-
constructor(deps: Partial<DevEnvironmentAgentDeps> & Pick<DevEnvironmentAgentDeps, 'structuredAgentCaller'>);
|
|
28
|
-
analyze(repositoryPath: string, options?: DevEnvironmentAnalyzeOptions): Promise<DevEnvironmentAnalysis>;
|
|
29
|
-
clearCache(repositoryPath: string): void;
|
|
30
|
-
clearAllCaches(): void;
|
|
31
|
-
private buildPrompt;
|
|
32
|
-
private getDirListing;
|
|
33
|
-
private readConfigFiles;
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=dev-environment-agent.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-environment-agent.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/dev-environment-agent.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,4BAA4B,EAC7B,MAAM,wEAAwE,CAAC;AAChF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AAqFrH,2CAA2C;AAC3C,MAAM,WAAW,uBAAuB;IACtC,qBAAqB,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC;AASD,qBAAa,0BAA2B,YAAW,oBAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IACnE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;gBAG7C,IAAI,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;IAK3F,OAAO,CACX,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,sBAAsB,CAAC;IAyClC,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAKxC,cAAc,IAAI,IAAI;IAKtB,OAAO,CAAC,WAAW;IA2CnB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,eAAe;CA2BxB"}
|
package/dist/packages/core/src/infrastructure/services/deployment/dev-environment-agent.service.js
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dev Environment Agent Service
|
|
3
|
-
*
|
|
4
|
-
* AI-driven service that analyzes any repository to determine how to start
|
|
5
|
-
* a local dev environment. Language-agnostic — supports Node.js, Python,
|
|
6
|
-
* Go, Rust, Java, Ruby, and more. Uses structured agent calls to get
|
|
7
|
-
* typed analysis results.
|
|
8
|
-
*
|
|
9
|
-
* Features:
|
|
10
|
-
* - In-memory per-repo caching for fast repeated calls
|
|
11
|
-
* - Reads key config files (package.json, Cargo.toml, etc.) for context
|
|
12
|
-
* - Handles "not deployable" repos gracefully
|
|
13
|
-
* - Truncates large files to prevent prompt overflow
|
|
14
|
-
*/
|
|
15
|
-
import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
16
|
-
import { join } from 'node:path';
|
|
17
|
-
import { createDeploymentLogger } from './deployment-logger.js';
|
|
18
|
-
const log = createDeploymentLogger('[DevEnvironmentAgent]');
|
|
19
|
-
/** Max characters to include from any single config file. */
|
|
20
|
-
const MAX_FILE_CONTENT_LENGTH = 4000;
|
|
21
|
-
/** Config files to read and include in the prompt, in priority order. */
|
|
22
|
-
const CONFIG_FILES = [
|
|
23
|
-
'package.json',
|
|
24
|
-
'docker-compose.yml',
|
|
25
|
-
'docker-compose.yaml',
|
|
26
|
-
'Dockerfile',
|
|
27
|
-
'Makefile',
|
|
28
|
-
'Cargo.toml',
|
|
29
|
-
'go.mod',
|
|
30
|
-
'requirements.txt',
|
|
31
|
-
'Pipfile',
|
|
32
|
-
'pyproject.toml',
|
|
33
|
-
'setup.py',
|
|
34
|
-
'Gemfile',
|
|
35
|
-
'build.gradle',
|
|
36
|
-
'pom.xml',
|
|
37
|
-
'mix.exs',
|
|
38
|
-
'deno.json',
|
|
39
|
-
'bun.lockb',
|
|
40
|
-
];
|
|
41
|
-
/** JSON schema for the structured agent response. */
|
|
42
|
-
const ANALYSIS_SCHEMA = {
|
|
43
|
-
type: 'object',
|
|
44
|
-
properties: {
|
|
45
|
-
deployable: {
|
|
46
|
-
type: 'boolean',
|
|
47
|
-
description: 'Whether this repository has a startable dev server or UI. False for libraries, scripts, data repos, etc.',
|
|
48
|
-
},
|
|
49
|
-
reason: {
|
|
50
|
-
type: 'string',
|
|
51
|
-
description: 'Brief explanation of what was detected or why the repo is not deployable.',
|
|
52
|
-
},
|
|
53
|
-
command: {
|
|
54
|
-
type: ['string', 'null'],
|
|
55
|
-
description: 'The shell command to start the dev server. Null if not deployable.',
|
|
56
|
-
},
|
|
57
|
-
cwd: {
|
|
58
|
-
type: 'string',
|
|
59
|
-
description: 'Working directory relative to repo root where the command should run. Use "." for repo root.',
|
|
60
|
-
},
|
|
61
|
-
expectedPort: {
|
|
62
|
-
type: ['integer', 'null'],
|
|
63
|
-
description: 'Expected port the dev server will listen on. Null if unknown.',
|
|
64
|
-
},
|
|
65
|
-
language: {
|
|
66
|
-
type: ['string', 'null'],
|
|
67
|
-
description: 'Primary language/runtime (e.g., "node", "python", "go", "rust", "ruby", "java").',
|
|
68
|
-
},
|
|
69
|
-
framework: {
|
|
70
|
-
type: ['string', 'null'],
|
|
71
|
-
description: 'Detected framework if any (e.g., "next.js", "django", "flask", "gin", "rails").',
|
|
72
|
-
},
|
|
73
|
-
setupCommands: {
|
|
74
|
-
type: 'array',
|
|
75
|
-
items: { type: 'string' },
|
|
76
|
-
description: 'Setup commands to run before the dev command (e.g., "npm install", "pip install -r requirements.txt").',
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
required: [
|
|
80
|
-
'deployable',
|
|
81
|
-
'reason',
|
|
82
|
-
'command',
|
|
83
|
-
'cwd',
|
|
84
|
-
'expectedPort',
|
|
85
|
-
'language',
|
|
86
|
-
'framework',
|
|
87
|
-
'setupCommands',
|
|
88
|
-
],
|
|
89
|
-
additionalProperties: false,
|
|
90
|
-
};
|
|
91
|
-
const defaultDeps = {
|
|
92
|
-
structuredAgentCaller: null,
|
|
93
|
-
readdir: (path) => readdirSync(path, { encoding: 'utf-8' }),
|
|
94
|
-
readFile: (path) => readFileSync(path, 'utf-8'),
|
|
95
|
-
existsSync,
|
|
96
|
-
};
|
|
97
|
-
export class DevEnvironmentAgentService {
|
|
98
|
-
cache = new Map();
|
|
99
|
-
deps;
|
|
100
|
-
constructor(deps) {
|
|
101
|
-
this.deps = { ...defaultDeps, ...deps };
|
|
102
|
-
}
|
|
103
|
-
async analyze(repositoryPath, options) {
|
|
104
|
-
log.info(`analyze() called — repositoryPath="${repositoryPath}", skipCache=${options?.skipCache ?? false}`);
|
|
105
|
-
if (!this.deps.existsSync(repositoryPath)) {
|
|
106
|
-
throw new Error(`Repository path does not exist: ${repositoryPath}`);
|
|
107
|
-
}
|
|
108
|
-
// Check cache
|
|
109
|
-
if (!options?.skipCache) {
|
|
110
|
-
const cached = this.cache.get(repositoryPath);
|
|
111
|
-
if (cached) {
|
|
112
|
-
log.info(`cache hit for "${repositoryPath}"`);
|
|
113
|
-
return cached;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// Build prompt with repo context
|
|
117
|
-
const prompt = this.buildPrompt(repositoryPath);
|
|
118
|
-
log.info(`calling structured agent for "${repositoryPath}"`);
|
|
119
|
-
const result = await this.deps.structuredAgentCaller.call(prompt, ANALYSIS_SCHEMA, {
|
|
120
|
-
silent: true,
|
|
121
|
-
maxTurns: 3,
|
|
122
|
-
cwd: repositoryPath,
|
|
123
|
-
});
|
|
124
|
-
// Cache successful result
|
|
125
|
-
this.cache.set(repositoryPath, result);
|
|
126
|
-
log.info(`analysis complete — deployable=${result.deployable}, command=${result.command}, language=${result.language}`);
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
clearCache(repositoryPath) {
|
|
130
|
-
log.info(`clearCache() — repositoryPath="${repositoryPath}"`);
|
|
131
|
-
this.cache.delete(repositoryPath);
|
|
132
|
-
}
|
|
133
|
-
clearAllCaches() {
|
|
134
|
-
log.info(`clearAllCaches() — clearing ${this.cache.size} entries`);
|
|
135
|
-
this.cache.clear();
|
|
136
|
-
}
|
|
137
|
-
buildPrompt(repositoryPath) {
|
|
138
|
-
const dirListing = this.getDirListing(repositoryPath);
|
|
139
|
-
const configContents = this.readConfigFiles(repositoryPath, dirListing);
|
|
140
|
-
return `You are a dev environment analysis agent. Analyze this repository and determine how to start a local development server.
|
|
141
|
-
|
|
142
|
-
## Repository Directory Listing (root level)
|
|
143
|
-
|
|
144
|
-
${dirListing.join('\n')}
|
|
145
|
-
|
|
146
|
-
## Config File Contents
|
|
147
|
-
|
|
148
|
-
${configContents}
|
|
149
|
-
|
|
150
|
-
## Instructions
|
|
151
|
-
|
|
152
|
-
Analyze the repository structure and config files above to determine:
|
|
153
|
-
|
|
154
|
-
1. **Is this repo deployable?** Does it have a web server, API server, or UI that can be started locally?
|
|
155
|
-
- Libraries (npm packages, Python packages, Go modules meant only for import) are NOT deployable
|
|
156
|
-
- CLI tools that don't serve HTTP are NOT deployable
|
|
157
|
-
- Data repositories, documentation-only repos are NOT deployable
|
|
158
|
-
- Scripts that run once and exit are NOT deployable
|
|
159
|
-
|
|
160
|
-
2. **What command starts the dev server?** Consider:
|
|
161
|
-
- Node.js: \`npm run dev\`, \`pnpm dev\`, \`yarn dev\`, \`npm start\`
|
|
162
|
-
- Python: \`python manage.py runserver\`, \`flask run\`, \`uvicorn main:app --reload\`
|
|
163
|
-
- Go: \`go run .\`, \`air\` (hot reload)
|
|
164
|
-
- Rust: \`cargo run\`, \`cargo watch -x run\`
|
|
165
|
-
- Ruby: \`rails server\`, \`bundle exec rails s\`
|
|
166
|
-
- Java: \`./gradlew bootRun\`, \`mvn spring-boot:run\`
|
|
167
|
-
- Docker: \`docker-compose up\`
|
|
168
|
-
- Generic: \`make dev\`, \`make run\`
|
|
169
|
-
|
|
170
|
-
3. **What port will it listen on?** Check config files for port definitions.
|
|
171
|
-
|
|
172
|
-
4. **What setup is needed first?** (e.g., install dependencies)
|
|
173
|
-
|
|
174
|
-
If the repo has NO server or UI to start, set deployable=false and explain why.
|
|
175
|
-
|
|
176
|
-
Respond with ONLY the JSON object matching the schema.`;
|
|
177
|
-
}
|
|
178
|
-
getDirListing(repositoryPath) {
|
|
179
|
-
try {
|
|
180
|
-
return this.deps.readdir(repositoryPath);
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
log.warn(`Failed to read directory listing for "${repositoryPath}"`);
|
|
184
|
-
return [];
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
readConfigFiles(repositoryPath, dirListing) {
|
|
188
|
-
const sections = [];
|
|
189
|
-
for (const configFile of CONFIG_FILES) {
|
|
190
|
-
if (!dirListing.includes(configFile))
|
|
191
|
-
continue;
|
|
192
|
-
try {
|
|
193
|
-
const filePath = join(repositoryPath, configFile);
|
|
194
|
-
let content = this.deps.readFile(filePath);
|
|
195
|
-
// Truncate large files
|
|
196
|
-
if (content.length > MAX_FILE_CONTENT_LENGTH) {
|
|
197
|
-
content = `${content.slice(0, MAX_FILE_CONTENT_LENGTH)}\n... (truncated)`;
|
|
198
|
-
}
|
|
199
|
-
sections.push(`### ${configFile}\n\`\`\`\n${content}\n\`\`\``);
|
|
200
|
-
}
|
|
201
|
-
catch {
|
|
202
|
-
log.warn(`Failed to read config file "${configFile}" in "${repositoryPath}"`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
if (sections.length === 0) {
|
|
206
|
-
return 'No recognized config files found.';
|
|
207
|
-
}
|
|
208
|
-
return sections.join('\n\n');
|
|
209
|
-
}
|
|
210
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
module.exports=[74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},92658,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(28478)},12581,(a,b,c)=>{"use strict";function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},12513,a=>{"use strict";var b=a.i(92658),c=a.i(74533);let d={platform:process.platform,exec:(a,b)=>(0,c.execSync)(a,b)},e={darwin:"osascript -e 'POSIX path of (choose folder with prompt \"Select a repository folder\")'",linux:'zenity --file-selection --directory --title="Select a repository folder" 2>/dev/null',win32:"powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $f = New-Object System.Windows.Forms.FolderBrowserDialog; $f.Description = 'Select a repository folder'; if ($f.ShowDialog() -eq 'OK') { $f.SelectedPath } else { exit 1 }\""};class f{deps;constructor(a={}){this.deps={...d,...a}}getCommand(){return e[this.deps.platform]??null}pickFolder(){let a=this.getCommand();if(!a)throw Error(`Unsupported platform: ${this.deps.platform}`);try{let b=this.deps.exec(a,{encoding:"utf-8",timeout:6e4}).trim();return b.length>0?b:null}catch(a){var b;if("object"==typeof(b=a)&&null!==b&&"status"in b&&1===a.status)return null;throw a}}}async function g(){let a=new f;try{return{path:a.pickFolder()}}catch(a){return{path:null,error:a instanceof Error?a.message:"Failed to open folder dialog"}}}(0,a.i(12581).ensureServerEntryExports)([g]),(0,b.registerServerReference)(g,"00f2a80e98ccea49289178a0b2a8e041f1f5fb2eda",null),a.s(["pickFolder",()=>g],12513)},96380,a=>{"use strict";function b(a){let b=globalThis.__shepContainer;if(!b)throw Error("DI container not available. Ensure the CLI bootstrap or dev-server has initialized it.");return b.resolve(a)}a.s(["resolve",()=>b])},2157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},12714,(a,b,c)=>{b.exports=a.x("node:fs/promises",()=>require("node:fs/promises"))},50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},32278,a=>{"use strict";a.i(12714);var b=a.i(60526),c=a.i(50227);function d(){return process.env.SHEP_HOME??(0,c.join)((0,b.homedir)(),".shep")}a.i(2157),a.s(["getShepHomeDir",()=>d])},66680,(a,b,c)=>{b.exports=a.x("node:crypto",()=>require("node:crypto"))},94691,29918,33841,46646,68670,85321,a=>{"use strict";var b=a.i(92658),c=a.i(96380),d=a.i(12581);async function e(a){return a?.trim()?(0,c.resolve)("IDeploymentService").getLogs(a):null}(0,d.ensureServerEntryExports)([e]),(0,b.registerServerReference)(e,"40cac3df4e85e3632bd5763a86ee786747135dc5de",null),a.s(["getDeploymentLogs",()=>e],94691);var f=a.i(2157);let g=()=>void 0;function h(a){let b=!!process.env.DEBUG;return{info:b?(...b)=>console.info(a,...b):g,debug:b?(...b)=>console.debug(a,...b):g,warn:(...b)=>console.warn(a,...b),error:(...b)=>console.error(a,...b)}}var i=a.i(66680),j=a.i(50227),k=a.i(32278);function l(a,b){let c=a.replace(/\\/g,"/"),d=(0,i.createHash)("sha256").update(c).digest("hex").slice(0,16),e=b.replace(/\//g,"-");return(0,j.join)((0,k.getShepHomeDir)(),"repos",d,"wt",e).replace(/\\/g,"/")}a.s(["computeWorktreePath",()=>l],29918);let m=h("[deployFeature]");async function n(a){if(m.info(`called — featureId="${a}"`),!a?.trim())return m.warn("rejected — featureId is empty"),{success:!1,error:"featureId is required"};try{let b=(0,c.resolve)("IFeatureRepository"),d=await b.findById(a);if(!d)return m.warn(`feature not found in repository: "${a}"`),{success:!1,error:`Feature not found: ${a}`};m.info(`feature found — repositoryPath="${d.repositoryPath}", branch="${d.branch}"`);let e=l(d.repositoryPath,d.branch);if(m.info(`computed worktreePath="${e}"`),!(0,f.existsSync)(e))return m.warn(`worktree path does not exist on disk: "${e}"`),{success:!1,error:`Worktree path does not exist: ${e}`};m.info("worktree path exists, calling agentDeploymentService.deploy()");let g=(0,c.resolve)("IAgentDeploymentService"),h=await g.deploy(a,e);if(!h.success)return m.warn(`agent deployment returned not-deployable: ${h.error}`),{success:!1,error:h.error,reason:h.analysis?.reason};return m.info("deploy() returned successfully — state=Booting"),{success:!0,state:h.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy feature";return m.error(`error: ${a}`,b),{success:!1,error:a}}}(0,d.ensureServerEntryExports)([n]),(0,b.registerServerReference)(n,"401d5db9bd7e00fc6d79b90b02d50afb4cc3ce46c5",null),a.s(["deployFeature",()=>n],33841);let o=h("[deployRepository]");async function p(a){if(o.info(`called — repositoryPath="${a}"`),!a||!(0,j.isAbsolute)(a))return o.warn("rejected — not an absolute path"),{success:!1,error:"repositoryPath must be an absolute path"};try{if(!(0,f.existsSync)(a))return o.warn(`directory does not exist: "${a}"`),{success:!1,error:`Directory does not exist: ${a}`};o.info("directory exists, calling agentDeploymentService.deploy()");let b=(0,c.resolve)("IAgentDeploymentService"),d=await b.deploy(a,a);if(!d.success)return o.warn(`agent deployment returned not-deployable: ${d.error}`),{success:!1,error:d.error,reason:d.analysis?.reason};return o.info("deploy() returned successfully — state=Booting"),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy repository";return o.error(`error: ${a}`,b),{success:!1,error:a}}}async function q(a){if(!a?.trim())return{success:!1,error:"targetId is required"};try{let b=(0,c.resolve)("IDeploymentService");return await b.stop(a),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to stop deployment"}}}async function r(a){return a?.trim()?(0,c.resolve)("IDeploymentService").getStatus(a):null}(0,d.ensureServerEntryExports)([p]),(0,b.registerServerReference)(p,"40233b80cbd11e675eed016c8ab30f846ca80e5504",null),a.s(["deployRepository",()=>p],46646),(0,d.ensureServerEntryExports)([q]),(0,b.registerServerReference)(q,"409f1b66b364cc5ea274b85ec39a7db3b55f53281c",null),a.s(["stopDeployment",()=>q],68670),(0,d.ensureServerEntryExports)([r]),(0,b.registerServerReference)(r,"400f382e754893ef7f625a7bb96d1d3da8bba0b052",null),a.s(["getDeploymentStatus",()=>r],85321)},87596,a=>{"use strict";var b=a.i(12513),c=a.i(94691),d=a.i(33841),e=a.i(46646),f=a.i(68670),g=a.i(85321);a.s([],78455),a.i(78455),a.s(["00f2a80e98ccea49289178a0b2a8e041f1f5fb2eda",()=>b.pickFolder,"400f382e754893ef7f625a7bb96d1d3da8bba0b052",()=>g.getDeploymentStatus,"401d5db9bd7e00fc6d79b90b02d50afb4cc3ce46c5",()=>d.deployFeature,"40233b80cbd11e675eed016c8ab30f846ca80e5504",()=>e.deployRepository,"409f1b66b364cc5ea274b85ec39a7db3b55f53281c",()=>f.stopDeployment,"40cac3df4e85e3632bd5763a86ee786747135dc5de",()=>c.getDeploymentLogs],87596)}];
|
|
3
|
-
|
|
4
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__0534f358._.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../node_modules/.pnpm/next%4016.1.6_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/src/build/webpack/loaders/next-flight-loader/server-reference.ts","../../../../../../../node_modules/.pnpm/next%4016.1.6_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/src/build/webpack/loaders/next-flight-loader/action-validate.ts","../../../../../../../packages/core/src/infrastructure/services/folder-dialog.service.ts","../../../../../../../src/presentation/web/app/actions/pick-folder.ts","../../../../../../../src/presentation/web/lib/server-container.ts","../../../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.ts","../../../../../../../src/presentation/web/app/actions/get-deployment-logs.ts","../../../../../../../src/presentation/web/app/actions/deploy-feature.ts","../../../../../../../packages/core/src/infrastructure/services/deployment/deployment-logger.ts","../../../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.ts","../../../../../../../src/presentation/web/app/actions/deploy-repository.ts","../../../../../../../src/presentation/web/app/actions/stop-deployment.ts","../../../../../../../src/presentation/web/app/actions/get-deployment-status.ts","../../../../../../../src/presentation/web/.next-internal/server/app/skills/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nexport { registerServerReference } from 'react-server-dom-webpack/server'\n","// This function ensures that all the exported values are valid server actions,\n// during the runtime. By definition all actions are required to be async\n// functions, but here we can only check that they are functions.\nexport function ensureServerEntryExports(actions: any[]) {\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n if (typeof action !== 'function') {\n throw new Error(\n `A \"use server\" file can only export async functions, found ${typeof action}.\\nRead more: https://nextjs.org/docs/messages/invalid-use-server-value`\n )\n }\n }\n}\n","import { execSync } from 'node:child_process';\n\nexport interface FolderDialogDeps {\n platform: NodeJS.Platform;\n exec: (cmd: string, opts?: { encoding: BufferEncoding; timeout?: number }) => string;\n}\n\nconst defaultDeps: FolderDialogDeps = {\n platform: process.platform,\n exec: (cmd, opts) => execSync(cmd, opts) as unknown as string,\n};\n\n/**\n * Platform-specific commands that open a native OS folder picker dialog.\n * Each returns the chosen absolute folder path on stdout, or exits non-zero / returns empty on cancel.\n */\nconst PLATFORM_COMMANDS: Record<string, string> = {\n darwin: `osascript -e 'POSIX path of (choose folder with prompt \"Select a repository folder\")'`,\n linux: `zenity --file-selection --directory --title=\"Select a repository folder\" 2>/dev/null`,\n win32: `powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $f = New-Object System.Windows.Forms.FolderBrowserDialog; $f.Description = 'Select a repository folder'; if ($f.ShowDialog() -eq 'OK') { $f.SelectedPath } else { exit 1 }\"`,\n};\n\nexport class FolderDialogService {\n private deps: FolderDialogDeps;\n\n constructor(deps: Partial<FolderDialogDeps> = {}) {\n this.deps = { ...defaultDeps, ...deps };\n }\n\n /** Returns the OS-specific command string, or null if the platform is unsupported. */\n getCommand(): string | null {\n return PLATFORM_COMMANDS[this.deps.platform] ?? null;\n }\n\n /**\n * Opens a native folder picker dialog and returns the selected absolute path.\n * Returns `null` if the user cancels the dialog.\n * Throws if the platform is unsupported or the command fails unexpectedly.\n */\n pickFolder(): string | null {\n const command = this.getCommand();\n if (!command) {\n throw new Error(`Unsupported platform: ${this.deps.platform}`);\n }\n\n try {\n const result = this.deps.exec(command, { encoding: 'utf-8', timeout: 60_000 });\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : null;\n } catch (error: unknown) {\n // User cancelled the dialog — exit code 1 from osascript/zenity/powershell\n if (isExecError(error) && error.status === 1) {\n return null;\n }\n throw error;\n }\n }\n}\n\nfunction isExecError(error: unknown): error is { status: number } {\n return typeof error === 'object' && error !== null && 'status' in error;\n}\n","'use server';\n\nimport { FolderDialogService } from '@shepai/core/infrastructure/services/folder-dialog.service';\n\nexport async function pickFolder(): Promise<{ path: string | null; error?: string }> {\n const service = new FolderDialogService();\n\n try {\n const path = service.pickFolder();\n return { path };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder dialog';\n return { path: null, error: message };\n }\n}\n","/**\n * Server Container Accessor\n *\n * Provides a `resolve()` helper for server components and API routes to\n * obtain DI-managed instances. The tsyringe container is placed on globalThis\n * by the CLI bootstrap (`shep ui`) or the dev-server (`pnpm dev:web`).\n */\n\nimport type { DependencyContainer, InjectionToken } from 'tsyringe';\n\nconst CONTAINER_KEY = '__shepContainer';\n\n/**\n * Resolve a dependency from the DI container.\n *\n * Usage in server components / API routes:\n * ```ts\n * import { resolve } from '@/lib/server-container';\n * import { ListFeaturesUseCase } from '@shepai/core/application/use-cases/features/list-features.use-case';\n *\n * const features = await resolve(ListFeaturesUseCase).execute();\n * ```\n */\nexport function resolve<T>(token: InjectionToken<T>): T {\n const container = (globalThis as Record<string, unknown>)[CONTAINER_KEY] as\n | DependencyContainer\n | undefined;\n\n if (!container) {\n throw new Error(\n 'DI container not available. Ensure the CLI bootstrap or dev-server has initialized it.'\n );\n }\n\n return container.resolve(token);\n}\n","/**\n * Shep Directory Service\n *\n * Manages the ~/.shep/ directory for global settings and data storage.\n * Ensures directory exists with correct permissions before database operations.\n *\n * Supports SHEP_HOME env var for test isolation (overrides default ~/.shep/).\n */\n\nimport { mkdir } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\n\n/**\n * Resolves the Shep home directory.\n * Respects SHEP_HOME env var for test isolation, falls back to ~/.shep/\n */\nfunction resolveShepHomeDir(): string {\n return process.env.SHEP_HOME ?? join(homedir(), '.shep');\n}\n\n/**\n * Gets the path to the Shep home directory.\n * Uses SHEP_HOME env var if set, otherwise ~/.shep/\n *\n * @returns Path to shep home directory\n */\nexport function getShepHomeDir(): string {\n return resolveShepHomeDir();\n}\n\n/**\n * Gets the path to the SQLite database file.\n *\n * @returns Path to the database file\n */\nexport function getShepDbPath(): string {\n return join(resolveShepHomeDir(), 'data');\n}\n\n/**\n * Gets the path to the daemon state file.\n * Uses SHEP_HOME env var if set (for test isolation), otherwise ~/.shep/daemon.json\n *\n * @returns Path to daemon.json\n */\nexport function getDaemonStatePath(): string {\n return join(resolveShepHomeDir(), 'daemon.json');\n}\n\n/**\n * Gets the path to the daemon log file.\n * Uses SHEP_HOME env var if set (for test isolation), otherwise ~/.shep/daemon.log\n *\n * @returns Path to daemon.log\n */\nexport function getDaemonLogPath(): string {\n return join(resolveShepHomeDir(), 'daemon.log');\n}\n\n/**\n * Ensures the shep home directory exists with correct permissions.\n * Creates the directory if it doesn't exist.\n * Safe to call multiple times (idempotent).\n *\n * Permissions: 700 (rwx------) - only owner can read/write/execute\n *\n * @throws Error if directory cannot be created (permissions, disk space, etc.)\n */\nexport async function ensureShepDirectory(): Promise<void> {\n const shepDir = resolveShepHomeDir();\n\n if (existsSync(shepDir)) {\n return;\n }\n\n try {\n await mkdir(shepDir, {\n recursive: true,\n mode: 0o700,\n });\n } catch (error) {\n throw new Error(\n `Failed to create Shep directory at ${shepDir}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type {\n IDeploymentService,\n LogEntry,\n} from '@shepai/core/application/ports/output/services/deployment-service.interface';\n\nexport async function getDeploymentLogs(targetId: string): Promise<LogEntry[] | null> {\n if (!targetId?.trim()) {\n return null;\n }\n\n const deploymentService = resolve<IDeploymentService>('IDeploymentService');\n return deploymentService.getLogs(targetId);\n}\n","'use server';\n\nimport { existsSync } from 'node:fs';\nimport { resolve } from '@/lib/server-container';\nimport { createDeploymentLogger } from '@shepai/core/infrastructure/services/deployment/deployment-logger';\nimport { computeWorktreePath } from '@shepai/core/infrastructure/services/ide-launchers/compute-worktree-path';\nimport type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';\nimport type { IAgentDeploymentService } from '@shepai/core/application/ports/output/services/agent-deployment-service.interface';\nimport type { DeploymentState } from '@shepai/core/domain/generated/output';\n\nconst log = createDeploymentLogger('[deployFeature]');\n\nexport async function deployFeature(\n featureId: string\n): Promise<{ success: boolean; error?: string; state?: DeploymentState; reason?: string }> {\n log.info(`called — featureId=\"${featureId}\"`);\n\n if (!featureId?.trim()) {\n log.warn('rejected — featureId is empty');\n return { success: false, error: 'featureId is required' };\n }\n\n try {\n const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');\n const feature = await featureRepo.findById(featureId);\n\n if (!feature) {\n log.warn(`feature not found in repository: \"${featureId}\"`);\n return { success: false, error: `Feature not found: ${featureId}` };\n }\n\n log.info(\n `feature found — repositoryPath=\"${feature.repositoryPath}\", branch=\"${feature.branch}\"`\n );\n\n const worktreePath = computeWorktreePath(feature.repositoryPath, feature.branch);\n log.info(`computed worktreePath=\"${worktreePath}\"`);\n\n if (!existsSync(worktreePath)) {\n log.warn(`worktree path does not exist on disk: \"${worktreePath}\"`);\n return { success: false, error: `Worktree path does not exist: ${worktreePath}` };\n }\n\n log.info('worktree path exists, calling agentDeploymentService.deploy()');\n const agentDeploymentService = resolve<IAgentDeploymentService>('IAgentDeploymentService');\n const result = await agentDeploymentService.deploy(featureId, worktreePath);\n\n if (!result.success) {\n log.warn(`agent deployment returned not-deployable: ${result.error}`);\n return { success: false, error: result.error, reason: result.analysis?.reason };\n }\n\n log.info('deploy() returned successfully — state=Booting');\n return { success: true, state: result.state };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to deploy feature';\n log.error(`error: ${message}`, error);\n return { success: false, error: message };\n }\n}\n","/* eslint-disable no-console */\n\n/**\n * Debug-gated logger for deployment services.\n *\n * - `info` and `debug` only emit when `process.env.DEBUG` is set.\n * - `warn` and `error` always emit (they indicate real problems).\n */\n\nconst noop = () => undefined;\n\nexport function createDeploymentLogger(prefix: string) {\n const isDebug = !!process.env.DEBUG;\n\n return {\n info: isDebug ? (...args: unknown[]) => console.info(prefix, ...args) : noop,\n debug: isDebug ? (...args: unknown[]) => console.debug(prefix, ...args) : noop,\n warn: (...args: unknown[]) => console.warn(prefix, ...args),\n error: (...args: unknown[]) => console.error(prefix, ...args),\n };\n}\n","/**\n * Compute Worktree Path\n *\n * Pure utility that computes the filesystem path for a feature's git worktree\n * given a repository path and branch name.\n *\n * Path format: ~/.shep/repos/<sha256-hash-prefix>/wt/<branch-slug>\n */\n\nimport { createHash } from 'node:crypto';\nimport { join } from 'node:path';\nimport { getShepHomeDir } from '../filesystem/shep-directory.service';\n\n/**\n * Compute the worktree path for a given repository and branch.\n *\n * @param repoPath - Absolute path to the repository\n * @param branch - Git branch name (slashes are replaced with hyphens)\n * @returns Absolute path to the worktree directory under ~/.shep/repos/\n */\nexport function computeWorktreePath(repoPath: string, branch: string): string {\n // Normalize separators before hashing so C:\\foo and C:/foo produce the same hash\n const normalizedRepoPath = repoPath.replace(/\\\\/g, '/');\n const repoHash = createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);\n const slug = branch.replace(/\\//g, '-');\n return join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\\\/g, '/');\n}\n","'use server';\n\nimport { existsSync } from 'node:fs';\nimport { isAbsolute } from 'node:path';\nimport { resolve } from '@/lib/server-container';\nimport { createDeploymentLogger } from '@shepai/core/infrastructure/services/deployment/deployment-logger';\nimport type { IAgentDeploymentService } from '@shepai/core/application/ports/output/services/agent-deployment-service.interface';\nimport type { DeploymentState } from '@shepai/core/domain/generated/output';\n\nconst log = createDeploymentLogger('[deployRepository]');\n\nexport async function deployRepository(\n repositoryPath: string\n): Promise<{ success: boolean; error?: string; state?: DeploymentState; reason?: string }> {\n log.info(`called — repositoryPath=\"${repositoryPath}\"`);\n\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n log.warn('rejected — not an absolute path');\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n if (!existsSync(repositoryPath)) {\n log.warn(`directory does not exist: \"${repositoryPath}\"`);\n return { success: false, error: `Directory does not exist: ${repositoryPath}` };\n }\n\n log.info('directory exists, calling agentDeploymentService.deploy()');\n const agentDeploymentService = resolve<IAgentDeploymentService>('IAgentDeploymentService');\n const result = await agentDeploymentService.deploy(repositoryPath, repositoryPath);\n\n if (!result.success) {\n log.warn(`agent deployment returned not-deployable: ${result.error}`);\n return { success: false, error: result.error, reason: result.analysis?.reason };\n }\n\n log.info('deploy() returned successfully — state=Booting');\n return { success: true, state: result.state };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to deploy repository';\n log.error(`error: ${message}`, error);\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { IDeploymentService } from '@shepai/core/application/ports/output/services/deployment-service.interface';\n\nexport async function stopDeployment(\n targetId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!targetId?.trim()) {\n return { success: false, error: 'targetId is required' };\n }\n\n try {\n const deploymentService = resolve<IDeploymentService>('IDeploymentService');\n await deploymentService.stop(targetId);\n\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to stop deployment';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type {\n IDeploymentService,\n DeploymentStatus,\n} from '@shepai/core/application/ports/output/services/deployment-service.interface';\n\nexport async function getDeploymentStatus(targetId: string): Promise<DeploymentStatus | null> {\n if (!targetId?.trim()) {\n return null;\n }\n\n const deploymentService = resolve<IDeploymentService>('IDeploymentService');\n return deploymentService.getStatus(targetId);\n}\n","export {pickFolder as '00f2a80e98ccea49289178a0b2a8e041f1f5fb2eda'} from 'ACTIONS_MODULE0'\nexport {getDeploymentLogs as '40cac3df4e85e3632bd5763a86ee786747135dc5de'} from 'ACTIONS_MODULE1'\nexport {deployFeature as '401d5db9bd7e00fc6d79b90b02d50afb4cc3ce46c5'} from 'ACTIONS_MODULE2'\nexport {deployRepository as '40233b80cbd11e675eed016c8ab30f846ca80e5504'} from 'ACTIONS_MODULE3'\nexport {stopDeployment as '409f1b66b364cc5ea274b85ec39a7db3b55f53281c'} from 'ACTIONS_MODULE4'\nexport {getDeploymentStatus as '400f382e754893ef7f625a7bb96d1d3da8bba0b052'} from 'ACTIONS_MODULE5'\n"],"names":["registerServerReference","ensureServerEntryExports","actions","i","length","action","Error"],"mappings":"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","ignoreList":[0,1]}
|