@shepai/cli 1.114.0 → 1.116.0-pr362.c0ee15c
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/use-cases/features/cleanup-feature-worktree.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.js +5 -0
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +3 -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 +30 -2
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +6 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.js +6 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.js +6 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +17 -1
- package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +12 -0
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -0
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +6 -1
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +6 -1
- package/dist/src/presentation/web/app/actions/get-feature-drawer-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-feature-drawer-data.js +4 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts +4 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +5 -0
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts +7 -1
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +9 -12
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +17 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +69 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +14 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
- 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 +26 -26
- 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 +26 -26
- 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 +18 -18
- 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 +20 -20
- 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 +26 -26
- 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 +26 -26
- 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 +18 -18
- 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 +18 -18
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page_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_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +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_a1104008.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_10942246._.js → _37f9b23b._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_10942246._.js.map → _37f9b23b._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_f0432d1b._.js → _871373f7._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_f0432d1b._.js.map → _871373f7._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_7deb4af9._.js → _f7926f23._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_7deb4af9._.js.map → _f7926f23._.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__next-internal_server_app_(dashboard)_page_actions_888633e1.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_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_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_e2604413._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.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 +31 -31
- package/web/.next/static/chunks/{9fce0a460a0e89bc.js → 489412a4676a1d14.js} +1 -1
- package/web/.next/static/chunks/{6fbd2c45d85eba3a.js → 4e46e9e2ec8bcce2.js} +1 -1
- package/web/.next/static/chunks/{bcd3e54e075de2cb.js → 82cf0022cbfd40cb.js} +1 -1
- package/web/.next/static/chunks/{6b61a250047ee0b4.js → 8392a79c0bd9956b.js} +1 -1
- package/web/.next/static/chunks/{31b1f992247624f8.js → 84c9b04d5397cc46.js} +2 -2
- package/web/.next/static/chunks/{6cb5c415171426e8.js → 9f61c4cc4813cbc1.js} +1 -1
- package/web/.next/static/chunks/{8d067c0e7cabc222.js → a1cb1cf624ae4986.js} +1 -1
- package/web/.next/static/chunks/{fec29583d5cc1bed.js → df558fa5a59ef099.js} +1 -1
- package/web/.next/static/chunks/{e3d8ee066c7e996d.js → ee6d0ebf271c7b4c.js} +1 -1
- package/web/.next/static/chunks/{0c701494594b6134.js → f3ba96e4b2c8be37.js} +1 -1
- /package/web/.next/static/{oI7zSl_ThcdDPhNbok2i3 → d6lJHy_7WaSuAS7PMm2hW}/_buildManifest.js +0 -0
- /package/web/.next/static/{oI7zSl_ThcdDPhNbok2i3 → d6lJHy_7WaSuAS7PMm2hW}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{oI7zSl_ThcdDPhNbok2i3 → d6lJHy_7WaSuAS7PMm2hW}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup-feature-worktree.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"cleanup-feature-worktree.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,qBACa,6BAA6B;IAER,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EACpC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgDhD"}
|
package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.js
CHANGED
|
@@ -22,6 +22,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
22
22
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
23
23
|
};
|
|
24
24
|
import { injectable, inject } from 'tsyringe';
|
|
25
|
+
import { SdlcLifecycle } from '../../../domain/generated/output.js';
|
|
25
26
|
let CleanupFeatureWorktreeUseCase = class CleanupFeatureWorktreeUseCase {
|
|
26
27
|
featureRepo;
|
|
27
28
|
worktreeService;
|
|
@@ -35,6 +36,10 @@ let CleanupFeatureWorktreeUseCase = class CleanupFeatureWorktreeUseCase {
|
|
|
35
36
|
const feature = await this.featureRepo.findById(featureId);
|
|
36
37
|
if (!feature)
|
|
37
38
|
return;
|
|
39
|
+
// Idempotency guard: skip cleanup if already in Deleting lifecycle
|
|
40
|
+
// (another code path — e.g. DeleteFeatureUseCase — already handles cleanup)
|
|
41
|
+
if (feature.lifecycle === SdlcLifecycle.Deleting)
|
|
42
|
+
return;
|
|
38
43
|
// Step 1: Unlink the git worktree (directory contents are preserved on disk)
|
|
39
44
|
const worktreePath = feature.worktreePath ??
|
|
40
45
|
this.worktreeService.getWorktreePath(feature.repositoryPath, feature.branch);
|
package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ import type { IAgentRunRepository } from '../../../ports/output/agents/agent-run
|
|
|
23
23
|
import type { ISpecInitializerService } from '../../../ports/output/services/spec-initializer.interface.js';
|
|
24
24
|
import type { IRepositoryRepository } from '../../../ports/output/repositories/repository-repository.interface.js';
|
|
25
25
|
import type { IGitPrService } from '../../../ports/output/services/git-pr-service.interface.js';
|
|
26
|
+
import type { IAgentValidator } from '../../../ports/output/agents/agent-validator.interface.js';
|
|
26
27
|
import { AttachmentStorageService } from '../../../../infrastructure/services/attachment-storage.service.js';
|
|
27
28
|
import { MetadataGenerator } from './metadata-generator.js';
|
|
28
29
|
import { SlugResolver } from './slug-resolver.js';
|
|
@@ -38,7 +39,8 @@ export declare class CreateFeatureUseCase {
|
|
|
38
39
|
private readonly repositoryRepo;
|
|
39
40
|
private readonly gitPrService;
|
|
40
41
|
private readonly attachmentStorage;
|
|
41
|
-
|
|
42
|
+
private readonly agentValidator;
|
|
43
|
+
constructor(featureRepo: IFeatureRepository, worktreeService: IWorktreeService, agentProcess: IFeatureAgentProcessService, runRepository: IAgentRunRepository, specInitializer: ISpecInitializerService, metadataGenerator: MetadataGenerator, slugResolver: SlugResolver, repositoryRepo: IRepositoryRepository, gitPrService: IGitPrService, attachmentStorage: AttachmentStorageService, agentValidator: IAgentValidator);
|
|
42
44
|
/**
|
|
43
45
|
* Full synchronous execution: creates record, initializes worktree/spec, spawns agent.
|
|
44
46
|
* Used by the CLI which shows a spinner and needs everything done before returning.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;
|
|
1
|
+
{"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2DAA2D,CAAC;AAGjG,OAAO,EAAE,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBApBd,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa,EAE3B,iBAAiB,EAAE,wBAAwB,EAE3C,cAAc,EAAE,eAAe;IAGlD;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyH1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAgI1D"}
|
package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js
CHANGED
|
@@ -46,7 +46,8 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
|
|
|
46
46
|
repositoryRepo;
|
|
47
47
|
gitPrService;
|
|
48
48
|
attachmentStorage;
|
|
49
|
-
|
|
49
|
+
agentValidator;
|
|
50
|
+
constructor(featureRepo, worktreeService, agentProcess, runRepository, specInitializer, metadataGenerator, slugResolver, repositoryRepo, gitPrService, attachmentStorage, agentValidator) {
|
|
50
51
|
this.featureRepo = featureRepo;
|
|
51
52
|
this.worktreeService = worktreeService;
|
|
52
53
|
this.agentProcess = agentProcess;
|
|
@@ -57,6 +58,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
|
|
|
57
58
|
this.repositoryRepo = repositoryRepo;
|
|
58
59
|
this.gitPrService = gitPrService;
|
|
59
60
|
this.attachmentStorage = attachmentStorage;
|
|
61
|
+
this.agentValidator = agentValidator;
|
|
60
62
|
}
|
|
61
63
|
/**
|
|
62
64
|
* Full synchronous execution: creates record, initializes worktree/spec, spawns agent.
|
|
@@ -241,6 +243,31 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
|
|
|
241
243
|
await this.featureRepo.update(updatedFeature);
|
|
242
244
|
// Spawn agent if not blocked
|
|
243
245
|
if (shouldSpawn) {
|
|
246
|
+
// Validate that the configured agent is available before spawning
|
|
247
|
+
// a background worker — prevents the feature from getting stuck
|
|
248
|
+
// with a silent failure in the detached worker process.
|
|
249
|
+
// Skip validation when using mock executor (E2E tests, CI without real agents).
|
|
250
|
+
const settings = getSettings();
|
|
251
|
+
const effectiveAgentType = input.agentType ?? settings.agent.type;
|
|
252
|
+
const isMockExecutor = process.env.SHEP_MOCK_EXECUTOR === '1';
|
|
253
|
+
const validation = isMockExecutor
|
|
254
|
+
? { available: true }
|
|
255
|
+
: await this.agentValidator.isAvailable(effectiveAgentType);
|
|
256
|
+
if (!validation.available) {
|
|
257
|
+
// Mark the agent run as failed so the UI shows the error
|
|
258
|
+
await this.runRepository.updateStatus(feature.agentRunId, AgentRunStatus.failed, {
|
|
259
|
+
error: `Agent "${effectiveAgentType}" is not available: ${validation.error}`,
|
|
260
|
+
completedAt: new Date(),
|
|
261
|
+
updatedAt: new Date(),
|
|
262
|
+
});
|
|
263
|
+
// Update feature lifecycle to Started so it doesn't appear as actively running
|
|
264
|
+
await this.featureRepo.update({
|
|
265
|
+
...updatedFeature,
|
|
266
|
+
lifecycle: SdlcLifecycle.Started,
|
|
267
|
+
updatedAt: new Date(),
|
|
268
|
+
});
|
|
269
|
+
throw new Error(`Agent "${effectiveAgentType}" is not available. ${validation.error ?? 'Please install it and try again.'}`);
|
|
270
|
+
}
|
|
244
271
|
const agentRun = await this.runRepository.findById(feature.agentRunId);
|
|
245
272
|
this.agentProcess.spawn(feature.id, feature.agentRunId, effectiveRepoPath, specDir, worktreePath, {
|
|
246
273
|
...(input.approvalGates ? { approvalGates: input.approvalGates } : {}),
|
|
@@ -267,7 +294,8 @@ CreateFeatureUseCase = __decorate([
|
|
|
267
294
|
__param(7, inject('IRepositoryRepository')),
|
|
268
295
|
__param(8, inject('IGitPrService')),
|
|
269
296
|
__param(9, inject(AttachmentStorageService)),
|
|
297
|
+
__param(10, inject('IAgentValidator')),
|
|
270
298
|
__metadata("design:paramtypes", [Object, Object, Object, Object, Object, MetadataGenerator,
|
|
271
|
-
SlugResolver, Object, Object, AttachmentStorageService])
|
|
299
|
+
SlugResolver, Object, Object, AttachmentStorageService, Object])
|
|
272
300
|
], CreateFeatureUseCase);
|
|
273
301
|
export { CreateFeatureUseCase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2HtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
|
|
@@ -107,7 +107,12 @@ export class ClaudeCodeExecutorService {
|
|
|
107
107
|
this.log(`Process error event: ${error.message}`);
|
|
108
108
|
if (timeoutId)
|
|
109
109
|
clearTimeout(timeoutId);
|
|
110
|
-
|
|
110
|
+
if (error.code === 'ENOENT') {
|
|
111
|
+
reject(new Error('Claude Code CLI ("claude") not found. Please install it: https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview'));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
reject(error);
|
|
115
|
+
}
|
|
111
116
|
});
|
|
112
117
|
proc.on('close', (code) => {
|
|
113
118
|
// Flush remaining buffer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA8E3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;CAgDxB"}
|
|
@@ -123,7 +123,12 @@ export class CursorExecutorService {
|
|
|
123
123
|
this.log(`Process error event: ${error.message}`);
|
|
124
124
|
if (timeoutId)
|
|
125
125
|
clearTimeout(timeoutId);
|
|
126
|
-
|
|
126
|
+
if (error.code === 'ENOENT') {
|
|
127
|
+
reject(new Error('Cursor agent CLI not found. Please install Cursor and ensure the "cursor" command is available on PATH.'));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
reject(error);
|
|
131
|
+
}
|
|
127
132
|
});
|
|
128
133
|
proc.on('close', (code) => {
|
|
129
134
|
if (lineBuffer.trim())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-cli-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,cAAc;IAO3D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAP9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA6B;IAE1D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAGJ,KAAK,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,WAAW,YAAA;IAG3C,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini-cli-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,cAAc;IAO3D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAP9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA6B;IAE1D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAGJ,KAAK,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,WAAW,YAAA;IAG3C,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8FtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAsG3C;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAmDxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI3C;IAEF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,SAAS;IAsBjB,OAAO,CAAC,iBAAiB;CAiB1B"}
|
|
@@ -67,7 +67,12 @@ export class GeminiCliExecutorService {
|
|
|
67
67
|
this.log(`Process error event: ${error.message}`);
|
|
68
68
|
if (timeoutId)
|
|
69
69
|
clearTimeout(timeoutId);
|
|
70
|
-
|
|
70
|
+
if (error.code === 'ENOENT') {
|
|
71
|
+
reject(new Error('Gemini CLI ("gemini") not found. Please install it: https://github.com/google-gemini/gemini-cli'));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
reject(error);
|
|
75
|
+
}
|
|
71
76
|
});
|
|
72
77
|
proc.on('close', (code) => {
|
|
73
78
|
this.log(`Process closed with code ${code}, stdout=${stdout.length} chars`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAe1B,OAAO,
|
|
1
|
+
{"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAe1B,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAwE1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmR/D"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js
CHANGED
|
@@ -16,7 +16,7 @@ import { initializeContainer, container } from '../../../di/container.js';
|
|
|
16
16
|
import { createFeatureAgentGraph } from './feature-agent-graph.js';
|
|
17
17
|
import { createFastFeatureAgentGraph } from './fast-feature-agent-graph.js';
|
|
18
18
|
import { createCheckpointer } from '../common/checkpointer.js';
|
|
19
|
-
import { AgentRunStatus } from '../../../../domain/generated/output.js';
|
|
19
|
+
import { AgentRunStatus, SdlcLifecycle } from '../../../../domain/generated/output.js';
|
|
20
20
|
import { initializeSettings } from '../../../services/settings.service.js';
|
|
21
21
|
import { InitializeSettingsUseCase } from '../../../../application/use-cases/settings/initialize-settings.use-case.js';
|
|
22
22
|
import { setHeartbeatContext } from './heartbeat.js';
|
|
@@ -336,6 +336,22 @@ export async function runWorker(args) {
|
|
|
336
336
|
completedAt: failedAt,
|
|
337
337
|
updatedAt: failedAt,
|
|
338
338
|
});
|
|
339
|
+
// Reset the feature lifecycle to Started so it doesn't appear stuck
|
|
340
|
+
// in a running phase (e.g., Requirements, Implementation) when the agent has failed.
|
|
341
|
+
try {
|
|
342
|
+
const feature = await featureRepository.findById(args.featureId);
|
|
343
|
+
if (feature && feature.lifecycle !== SdlcLifecycle.Maintain) {
|
|
344
|
+
await featureRepository.update({
|
|
345
|
+
...feature,
|
|
346
|
+
lifecycle: SdlcLifecycle.Started,
|
|
347
|
+
updatedAt: failedAt,
|
|
348
|
+
});
|
|
349
|
+
log('Feature lifecycle reset to Started');
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch (resetErr) {
|
|
353
|
+
log(`Failed to reset feature lifecycle: ${resetErr instanceof Error ? resetErr.message : String(resetErr)}`);
|
|
354
|
+
}
|
|
339
355
|
await recordLifecycleEvent('run:failed');
|
|
340
356
|
log('Run marked as failed');
|
|
341
357
|
}
|
package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-sync-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AACzH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4EAA4E,CAAC;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAK5G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AACzH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAqB3C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAK;gBAGpB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,GAAE,MAAiC,EACjD,EAAE,GAAE,QAAQ,CAAC,QAAQ,GAAG,IAAW;IAWrC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,IAAI;IASZ,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAiBtB,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;YAUX,IAAI;IA6ClB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;YAYd,iBAAiB;YA+CjB,cAAc;
|
|
1
|
+
{"version":3,"file":"pr-sync-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AACzH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4EAA4E,CAAC;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAK5G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AACzH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAqB3C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAK;gBAGpB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,GAAE,MAAiC,EACjD,EAAE,GAAE,QAAQ,CAAC,QAAQ,GAAG,IAAW;IAWrC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,IAAI;IASZ,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAiBtB,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;YAUX,IAAI;IA6ClB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;YAYd,iBAAiB;YA+CjB,cAAc;IAkM5B,8EAA8E;YAChE,gBAAgB;IAW9B,OAAO,CAAC,gBAAgB;CAoBzB;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,GAC5B,IAAI,CAaN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,oBAAoB,CAQvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
|
|
@@ -250,6 +250,18 @@ export class PrSyncWatcherService {
|
|
|
250
250
|
console.log(`${TAG} PR #${pr.number} status changed: ${tracked.prStatus} -> ${newPrStatus} for "${feature.name}"`);
|
|
251
251
|
feature.pr = { ...pr, status: newPrStatus };
|
|
252
252
|
if (newPrStatus === PrStatus.Merged) {
|
|
253
|
+
// Re-fetch to avoid racing with the merge node which may have already
|
|
254
|
+
// transitioned this feature to Maintain and performed cleanup.
|
|
255
|
+
const freshFeature = await this.featureRepo.findById(feature.id);
|
|
256
|
+
if (freshFeature?.lifecycle === SdlcLifecycle.Maintain) {
|
|
257
|
+
// eslint-disable-next-line no-console
|
|
258
|
+
console.log(`${TAG} Feature "${feature.name}" already in Maintain — skipping duplicate transition`);
|
|
259
|
+
tracked.prStatus = newPrStatus;
|
|
260
|
+
// Still update the PR status on the record so it reflects Merged
|
|
261
|
+
feature.pr = { ...(freshFeature.pr ?? pr), status: PrStatus.Merged };
|
|
262
|
+
await this.featureRepo.update({ ...freshFeature, pr: feature.pr, updatedAt: new Date() });
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
253
265
|
feature.lifecycle = SdlcLifecycle.Maintain;
|
|
254
266
|
await this.completeAgentRun(feature);
|
|
255
267
|
this.emitNotification(NotificationEventType.PrMerged, feature.id, feature.agentRunId ?? '', feature.name, `PR #${pr.number} merged for ${feature.name}`, NotificationSeverity.Success);
|
package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"AAcA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,yBAAyB;IACjC,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,wBAA8B,oBAAoB,CAAC,EAAE,MAAM,EAAE,EAAE,yBAAyB,2DAiDvF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { resolve } from '../../../../../../lib/server-container.js';
|
|
3
3
|
import { buildFeatureNodeData } from '../../../../../build-feature-node-data.js';
|
|
4
|
+
import { getSettings } from '../../../../../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
4
5
|
import { computeDrawerView, parseTabKey, } from '../../../../../../components/common/control-center-drawer/drawer-view.js';
|
|
5
6
|
import { FeatureDrawerClient } from '../../../../../../components/common/control-center-drawer/feature-drawer-client.js';
|
|
6
7
|
/** Skip static pre-rendering since we need runtime DI container. */
|
|
@@ -24,11 +25,14 @@ export default async function FeatureDrawerTabPage({ params }) {
|
|
|
24
25
|
getArtifact.execute(featureId).catch(() => null),
|
|
25
26
|
gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
|
|
26
27
|
]);
|
|
28
|
+
const { workflow } = getSettings();
|
|
27
29
|
const nodeData = buildFeatureNodeData(feature, run, {
|
|
28
30
|
repositoryName: repo?.name,
|
|
29
31
|
baseBranch,
|
|
30
32
|
oneLiner: artifact?.oneLiner,
|
|
31
33
|
remoteUrl: remoteUrl ?? undefined,
|
|
34
|
+
enableEvidence: workflow.enableEvidence,
|
|
35
|
+
commitEvidence: workflow.commitEvidence,
|
|
32
36
|
});
|
|
33
37
|
const view = computeDrawerView({
|
|
34
38
|
selectedNode: nodeData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"AAQA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,wBAA8B,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,2DAuCjF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { resolve } from '../../../../../lib/server-container.js';
|
|
3
3
|
import { buildFeatureNodeData } from '../../../../build-feature-node-data.js';
|
|
4
|
+
import { getSettings } from '../../../../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
4
5
|
import { computeDrawerView } from '../../../../../components/common/control-center-drawer/drawer-view.js';
|
|
5
6
|
import { FeatureDrawerClient } from '../../../../../components/common/control-center-drawer/feature-drawer-client.js';
|
|
6
7
|
/** Skip static pre-rendering since we need runtime DI container. */
|
|
@@ -18,7 +19,11 @@ export default async function FeatureDrawerPage({ params }) {
|
|
|
18
19
|
if (!feature)
|
|
19
20
|
return null;
|
|
20
21
|
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
21
|
-
const
|
|
22
|
+
const { workflow } = getSettings();
|
|
23
|
+
const nodeData = buildFeatureNodeData(feature, run, {
|
|
24
|
+
enableEvidence: workflow.enableEvidence,
|
|
25
|
+
commitEvidence: workflow.commitEvidence,
|
|
26
|
+
});
|
|
22
27
|
const view = computeDrawerView({
|
|
23
28
|
selectedNode: nodeData,
|
|
24
29
|
isCreateDrawerOpen: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAQ1C,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CAsFxF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { resolve } from '../../lib/server-container.js';
|
|
2
2
|
import { CiStatus } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
3
|
+
import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
3
4
|
import { layoutWithDagre, CANVAS_LAYOUT_DEFAULTS } from '../../lib/layout-with-dagre.js';
|
|
4
5
|
import { buildGraphNodes } from '../build-graph-nodes.js';
|
|
5
6
|
const CI_STATUS_MAP = {
|
|
@@ -53,7 +54,11 @@ export async function getGraphData() {
|
|
|
53
54
|
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
54
55
|
return { feature, run };
|
|
55
56
|
}));
|
|
56
|
-
const {
|
|
57
|
+
const { workflow } = getSettings();
|
|
58
|
+
const { nodes, edges } = buildGraphNodes(repositories, featuresWithRuns, {
|
|
59
|
+
enableEvidence: workflow.enableEvidence,
|
|
60
|
+
commitEvidence: workflow.commitEvidence,
|
|
61
|
+
});
|
|
57
62
|
// Enrich feature nodes with deployment status
|
|
58
63
|
let deploymentService = null;
|
|
59
64
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feature-drawer-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-drawer-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-feature-drawer-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-drawer-data.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAoC7F"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use server';
|
|
2
2
|
import { resolve } from '../../lib/server-container.js';
|
|
3
3
|
import { buildFeatureNodeData } from '../build-feature-node-data.js';
|
|
4
|
+
import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
4
5
|
/**
|
|
5
6
|
* Fetches full FeatureNodeData for a given feature ID.
|
|
6
7
|
* Used by the drawer for targeted data syncing without triggering
|
|
@@ -29,11 +30,14 @@ export async function getFeatureDrawerData(featureId) {
|
|
|
29
30
|
getArtifact.execute(featureId).catch(() => null),
|
|
30
31
|
gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
|
|
31
32
|
]);
|
|
33
|
+
const { workflow } = getSettings();
|
|
32
34
|
return buildFeatureNodeData(feature, run, {
|
|
33
35
|
repositoryName: repo?.name,
|
|
34
36
|
baseBranch,
|
|
35
37
|
oneLiner: artifact?.oneLiner,
|
|
36
38
|
remoteUrl: remoteUrl ?? undefined,
|
|
39
|
+
enableEvidence: workflow.enableEvidence,
|
|
40
|
+
commitEvidence: workflow.commitEvidence,
|
|
37
41
|
});
|
|
38
42
|
}
|
|
39
43
|
catch {
|
|
@@ -7,6 +7,10 @@ export interface BuildFeatureNodeDataOptions {
|
|
|
7
7
|
oneLiner?: string;
|
|
8
8
|
/** Remote URL for the repository (HTTPS) */
|
|
9
9
|
remoteUrl?: string;
|
|
10
|
+
/** Whether evidence collection is enabled (global workflow setting) */
|
|
11
|
+
enableEvidence?: boolean;
|
|
12
|
+
/** Whether evidence is committed to the PR body (global workflow setting) */
|
|
13
|
+
commitEvidence?: boolean;
|
|
10
14
|
}
|
|
11
15
|
/**
|
|
12
16
|
* Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CA+CjB"}
|
|
@@ -23,6 +23,11 @@ export function buildFeatureNodeData(feature, run, options) {
|
|
|
23
23
|
userQuery: feature.userQuery,
|
|
24
24
|
createdAt: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
|
|
25
25
|
...(feature.fast && { fastMode: true }),
|
|
26
|
+
approvalGates: feature.approvalGates,
|
|
27
|
+
push: feature.push,
|
|
28
|
+
openPr: feature.openPr,
|
|
29
|
+
...(options?.enableEvidence != null && { enableEvidence: options.enableEvidence }),
|
|
30
|
+
...(options?.commitEvidence != null && { commitEvidence: options.commitEvidence }),
|
|
26
31
|
...(options?.repositoryName && { repositoryName: options.repositoryName }),
|
|
27
32
|
...(options?.baseBranch && { baseBranch: options.baseBranch }),
|
|
28
33
|
...(options?.oneLiner && { oneLiner: options.oneLiner }),
|
|
@@ -13,7 +13,13 @@ export interface FeatureWithRun {
|
|
|
13
13
|
* (id: `virtual-repo-${repositoryPath}`). This ensures the dashboard never
|
|
14
14
|
* renders empty when features exist but their repository rows are missing.
|
|
15
15
|
*/
|
|
16
|
-
export
|
|
16
|
+
export interface BuildGraphNodesOptions {
|
|
17
|
+
/** Whether evidence collection is enabled (global workflow setting) */
|
|
18
|
+
enableEvidence?: boolean;
|
|
19
|
+
/** Whether evidence is committed to the PR body (global workflow setting) */
|
|
20
|
+
commitEvidence?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function buildGraphNodes(repositories: Repository[], featuresWithRuns: FeatureWithRun[], options?: BuildGraphNodesOptions): {
|
|
17
23
|
nodes: CanvasNodeType[];
|
|
18
24
|
edges: Edge[];
|
|
19
25
|
};
|
|
@@ -1 +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;AAQ1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,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,
|
|
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;AAQ1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CA2F5C"}
|
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
|
|
2
2
|
import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
|
|
3
3
|
import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
|
|
4
|
-
|
|
5
|
-
* Builds React Flow nodes and edges from persisted repositories and features.
|
|
6
|
-
*
|
|
7
|
-
* Features whose repositoryPath is not covered by any real repository row are
|
|
8
|
-
* grouped under a synthetic "virtual" repository node
|
|
9
|
-
* (id: `virtual-repo-${repositoryPath}`). This ensures the dashboard never
|
|
10
|
-
* renders empty when features exist but their repository rows are missing.
|
|
11
|
-
*/
|
|
12
|
-
export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
4
|
+
export function buildGraphNodes(repositories, featuresWithRuns, options) {
|
|
13
5
|
// Normalize path separators so Windows backslash paths match forward-slash paths
|
|
14
6
|
const normalizePath = (p) => p.replace(/\\/g, '/');
|
|
15
7
|
// Group features by normalized repository path
|
|
@@ -42,7 +34,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
42
34
|
},
|
|
43
35
|
});
|
|
44
36
|
const repoFeatures = featuresByRepo[normalizedRepoPath] ?? [];
|
|
45
|
-
appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges, repo.name);
|
|
37
|
+
appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges, repo.name, options);
|
|
46
38
|
}
|
|
47
39
|
// Second pass: group orphaned features under virtual repository nodes
|
|
48
40
|
for (const [repoPath, orphanFeatures] of Object.entries(featuresByRepo)) {
|
|
@@ -56,7 +48,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
56
48
|
position: { x: 0, y: 0 },
|
|
57
49
|
data: { name: repoName, repositoryPath: repoPath },
|
|
58
50
|
});
|
|
59
|
-
appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges, repoName);
|
|
51
|
+
appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges, repoName, options);
|
|
60
52
|
}
|
|
61
53
|
// Add parent→child dependency edges
|
|
62
54
|
for (const { feature } of featuresWithRuns) {
|
|
@@ -75,7 +67,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
75
67
|
}
|
|
76
68
|
return { nodes, edges };
|
|
77
69
|
}
|
|
78
|
-
function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges, repoName) {
|
|
70
|
+
function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges, repoName, options) {
|
|
79
71
|
// Sort by createdAt so newest features appear last (bottom) in the layout
|
|
80
72
|
const sorted = [...repoFeatures].sort((a, b) => {
|
|
81
73
|
const aTime = a.feature.createdAt instanceof Date
|
|
@@ -112,6 +104,11 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
|
|
|
112
104
|
userQuery: feature.userQuery,
|
|
113
105
|
createdAt: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
|
|
114
106
|
...(feature.fast && { fastMode: true }),
|
|
107
|
+
approvalGates: feature.approvalGates,
|
|
108
|
+
push: feature.push,
|
|
109
|
+
openPr: feature.openPr,
|
|
110
|
+
...(options?.enableEvidence != null && { enableEvidence: options.enableEvidence }),
|
|
111
|
+
...(options?.commitEvidence != null && { commitEvidence: options.commitEvidence }),
|
|
115
112
|
...(repoName && { repositoryName: repoName }),
|
|
116
113
|
...(run?.agentType && { agentType: run.agentType }),
|
|
117
114
|
...(run?.modelId && { modelId: run.modelId }),
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAqDrD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect, useRef } from 'react';
|
|
4
|
-
import { AlertTriangle, ExternalLink, GitBranch, GitCommitHorizontal, RotateCcw, Zap, } from 'lucide-react';
|
|
4
|
+
import { AlertTriangle, Check, ExternalLink, FileSearch, GitBranch, GitCommitHorizontal, RotateCcw, ShieldCheck, X, Zap, } from 'lucide-react';
|
|
5
5
|
import { InlineAttachments } from '../../common/inline-attachments/index.js';
|
|
6
6
|
import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
7
7
|
import { cn } from '../../../lib/utils.js';
|
|
@@ -11,10 +11,11 @@ import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
|
|
|
11
11
|
import { CometSpinner } from '../../ui/comet-spinner.js';
|
|
12
12
|
import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
|
|
13
13
|
import { getAgentTypeIcon, agentTypeLabels, } from '../../common/feature-node/agent-type-icons.js';
|
|
14
|
+
import { getModelMeta } from '../../../lib/model-metadata.js';
|
|
14
15
|
import { formatDuration } from '../../../lib/format-duration.js';
|
|
15
16
|
export function OverviewTab({ data }) {
|
|
16
17
|
const isCompleted = data.lifecycle === 'maintain';
|
|
17
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data })] }));
|
|
18
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data }), _jsx(FeatureSettings, { data: data })] }));
|
|
18
19
|
}
|
|
19
20
|
function FeatureStateBadge({ data }) {
|
|
20
21
|
const config = featureNodeStateConfig[data.state];
|
|
@@ -108,6 +109,20 @@ function AgentDetailRow({ agentType }) {
|
|
|
108
109
|
const label = agentTypeLabels[agentType] ?? agentType;
|
|
109
110
|
return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Agent" }), _jsxs("span", { className: "flex items-center gap-2 text-sm", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), label] })] }));
|
|
110
111
|
}
|
|
112
|
+
// ── Settings section ─────────────────────────────────────────────────
|
|
113
|
+
function SettingBadge({ enabled, label }) {
|
|
114
|
+
return (_jsxs("span", { className: cn('inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium', enabled ? 'bg-emerald-50 text-emerald-700' : 'bg-muted text-muted-foreground'), children: [enabled ? _jsx(Check, { className: "h-3 w-3" }) : _jsx(X, { className: "h-3 w-3" }), label] }));
|
|
115
|
+
}
|
|
116
|
+
function FeatureSettings({ data }) {
|
|
117
|
+
const hasSettings = data.approvalGates != null ||
|
|
118
|
+
data.push != null ||
|
|
119
|
+
data.openPr != null ||
|
|
120
|
+
data.enableEvidence != null ||
|
|
121
|
+
data.modelId;
|
|
122
|
+
if (!hasSettings)
|
|
123
|
+
return null;
|
|
124
|
+
return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-settings", className: "flex flex-col gap-3 p-4", children: [_jsx("span", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "SETTINGS" }), data.modelId ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Model" }), _jsx("span", { className: "text-sm", children: getModelMeta(data.modelId).displayName || data.modelId })] })) : null, data.approvalGates ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(ShieldCheck, { className: "h-3 w-3" }), "Auto-Approve"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsx(SettingBadge, { enabled: data.approvalGates.allowPrd, label: "PRD" }), _jsx(SettingBadge, { enabled: data.approvalGates.allowPlan, label: "Plan" }), _jsx(SettingBadge, { enabled: data.approvalGates.allowMerge, label: "Merge" })] })] })) : null, data.enableEvidence != null ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(FileSearch, { className: "h-3 w-3" }), "Evidence"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsx(SettingBadge, { enabled: data.enableEvidence, label: "Collect" }), data.commitEvidence != null ? (_jsx(SettingBadge, { enabled: data.commitEvidence, label: "Add to PR" })) : null] })] })) : null, data.push != null || data.openPr != null ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(GitBranch, { className: "h-3 w-3" }), "Git"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [data.push != null ? _jsx(SettingBadge, { enabled: data.push, label: "Push" }) : null, data.openPr != null ? _jsx(SettingBadge, { enabled: data.openPr, label: "PR" }) : null] })] })) : null] })] }));
|
|
125
|
+
}
|
|
111
126
|
function DetailRow({ label, value }) {
|
|
112
127
|
return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-sm", children: value })] }));
|
|
113
128
|
}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts
CHANGED
|
@@ -37,4 +37,14 @@ export declare const DuplicateSummaryHidden: Story;
|
|
|
37
37
|
export declare const DifferentSummary: Story;
|
|
38
38
|
/** Completed feature with PR — progress hidden, PR shown in status section without borders. */
|
|
39
39
|
export declare const CompletedWithPr: Story;
|
|
40
|
+
/** Feature with all settings visible — approval gates, evidence, git, and model. */
|
|
41
|
+
export declare const WithAllSettings: Story;
|
|
42
|
+
/** Feature with no auto-approve gates enabled. */
|
|
43
|
+
export declare const WithSettingsAllDisabled: Story;
|
|
44
|
+
/** Feature with all auto-approve gates enabled. */
|
|
45
|
+
export declare const WithSettingsAllApproved: Story;
|
|
46
|
+
/** Feature with settings and fast mode. */
|
|
47
|
+
export declare const FastModeWithSettings: Story;
|
|
48
|
+
/** Feature with evidence enabled but commit to PR disabled. */
|
|
49
|
+
export declare const EvidenceCollectOnly: Story;
|
|
40
50
|
//# sourceMappingURL=overview-tab.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC"}
|
|
1
|
+
{"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC;AAMF,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,KAY7B,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,EAAE,KAQjC,CAAC"}
|