agent-pipeline 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +134 -0
- package/README.md +209 -0
- package/dist/analytics/pipeline-analytics.d.ts +19 -0
- package/dist/analytics/pipeline-analytics.d.ts.map +1 -0
- package/dist/analytics/pipeline-analytics.js +155 -0
- package/dist/analytics/pipeline-analytics.js.map +1 -0
- package/dist/analytics/types.d.ts +31 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +2 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/cli/commands/agent/info.d.ts +2 -0
- package/dist/cli/commands/agent/info.d.ts.map +1 -0
- package/dist/cli/commands/agent/info.js +62 -0
- package/dist/cli/commands/agent/info.js.map +1 -0
- package/dist/cli/commands/agent/list.d.ts +2 -0
- package/dist/cli/commands/agent/list.d.ts.map +1 -0
- package/dist/cli/commands/agent/list.js +57 -0
- package/dist/cli/commands/agent/list.js.map +1 -0
- package/dist/cli/commands/agent/pull.d.ts +5 -0
- package/dist/cli/commands/agent/pull.d.ts.map +1 -0
- package/dist/cli/commands/agent/pull.js +71 -0
- package/dist/cli/commands/agent/pull.js.map +1 -0
- package/dist/cli/commands/analytics.d.ts +6 -0
- package/dist/cli/commands/analytics.d.ts.map +1 -0
- package/dist/cli/commands/analytics.js +101 -0
- package/dist/cli/commands/analytics.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +7 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/cleanup.js +76 -0
- package/dist/cli/commands/cleanup.js.map +1 -0
- package/dist/cli/commands/history.d.ts +7 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +173 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +158 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +2 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +15 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +13 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/pipeline/clone.d.ts +2 -0
- package/dist/cli/commands/pipeline/clone.d.ts.map +1 -0
- package/dist/cli/commands/pipeline/clone.js +42 -0
- package/dist/cli/commands/pipeline/clone.js.map +1 -0
- package/dist/cli/commands/pipeline/config.d.ts +2 -0
- package/dist/cli/commands/pipeline/config.d.ts.map +1 -0
- package/dist/cli/commands/pipeline/config.js +23 -0
- package/dist/cli/commands/pipeline/config.js.map +1 -0
- package/dist/cli/commands/pipeline/create.d.ts +2 -0
- package/dist/cli/commands/pipeline/create.d.ts.map +1 -0
- package/dist/cli/commands/pipeline/create.js +86 -0
- package/dist/cli/commands/pipeline/create.js.map +1 -0
- package/dist/cli/commands/pipeline/delete.d.ts +6 -0
- package/dist/cli/commands/pipeline/delete.d.ts.map +1 -0
- package/dist/cli/commands/pipeline/delete.js +60 -0
- package/dist/cli/commands/pipeline/delete.js.map +1 -0
- package/dist/cli/commands/pipeline/edit.d.ts +2 -0
- package/dist/cli/commands/pipeline/edit.d.ts.map +1 -0
- package/dist/cli/commands/pipeline/edit.js +50 -0
- package/dist/cli/commands/pipeline/edit.js.map +1 -0
- package/dist/cli/commands/pipeline/export.d.ts +6 -0
- package/dist/cli/commands/pipeline/export.d.ts.map +1 -0
- package/dist/cli/commands/pipeline/export.js +48 -0
- package/dist/cli/commands/pipeline/export.js.map +1 -0
- package/dist/cli/commands/pipeline/import.d.ts +2 -0
- package/dist/cli/commands/pipeline/import.d.ts.map +1 -0
- package/dist/cli/commands/pipeline/import.js +59 -0
- package/dist/cli/commands/pipeline/import.js.map +1 -0
- package/dist/cli/commands/pipeline/validate.d.ts +2 -0
- package/dist/cli/commands/pipeline/validate.d.ts.map +1 -0
- package/dist/cli/commands/pipeline/validate.js +28 -0
- package/dist/cli/commands/pipeline/validate.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +6 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js +49 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/run.d.ts +15 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +61 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +52 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/test.d.ts +5 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +18 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +2 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +6 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/hooks.d.ts +8 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +98 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/templates/agents/cleanup-reporter.md +107 -0
- package/dist/cli/templates/agents/code-reducer.md +51 -0
- package/dist/cli/templates/agents/code-reviewer.md +34 -0
- package/dist/cli/templates/agents/context-reducer.md +94 -0
- package/dist/cli/templates/agents/dependency-auditor.md +127 -0
- package/dist/cli/templates/agents/detective-empath.md +26 -0
- package/dist/cli/templates/agents/detective-linguist.md +26 -0
- package/dist/cli/templates/agents/detective-logician.md +26 -0
- package/dist/cli/templates/agents/detective-skeptic.md +26 -0
- package/dist/cli/templates/agents/detective-statistician.md +26 -0
- package/dist/cli/templates/agents/doc-updater.md +30 -0
- package/dist/cli/templates/agents/judge.md +27 -0
- package/dist/cli/templates/agents/memory-updater.md +72 -0
- package/dist/cli/templates/agents/quality-checker.md +32 -0
- package/dist/cli/templates/agents/security-auditor.md +32 -0
- package/dist/cli/templates/agents/storyteller.md +26 -0
- package/dist/cli/templates/agents/summary.md +32 -0
- package/dist/cli/templates/agents/synthesizer.md +26 -0
- package/dist/cli/templates/pipelines/large-pipeline-example.yml +178 -0
- package/dist/cli/templates/pipelines/post-commit-example.yml +67 -0
- package/dist/cli/templates/pipelines/post-merge-example.yml +78 -0
- package/dist/cli/templates/pipelines/pre-commit-example.yml +41 -0
- package/dist/cli/templates/pipelines/pre-push-example.yml +51 -0
- package/dist/cli/templates/pipelines/test-pipeline.yml +90 -0
- package/dist/cli/utils/agent-importer.d.ts +21 -0
- package/dist/cli/utils/agent-importer.d.ts.map +1 -0
- package/dist/cli/utils/agent-importer.js +150 -0
- package/dist/cli/utils/agent-importer.js.map +1 -0
- package/dist/cli/utils/interactive-prompts.d.ts +10 -0
- package/dist/cli/utils/interactive-prompts.d.ts.map +1 -0
- package/dist/cli/utils/interactive-prompts.js +75 -0
- package/dist/cli/utils/interactive-prompts.js.map +1 -0
- package/dist/config/pipeline-loader.d.ts +14 -0
- package/dist/config/pipeline-loader.d.ts.map +1 -0
- package/dist/config/pipeline-loader.js +71 -0
- package/dist/config/pipeline-loader.js.map +1 -0
- package/dist/config/project-config-loader.d.ts +11 -0
- package/dist/config/project-config-loader.d.ts.map +1 -0
- package/dist/config/project-config-loader.js +100 -0
- package/dist/config/project-config-loader.js.map +1 -0
- package/dist/config/schema.d.ts +165 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +2 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/agent-query-runner.d.ts +25 -0
- package/dist/core/agent-query-runner.d.ts.map +1 -0
- package/dist/core/agent-query-runner.js +76 -0
- package/dist/core/agent-query-runner.js.map +1 -0
- package/dist/core/agent-runtime-registry.d.ts +11 -0
- package/dist/core/agent-runtime-registry.d.ts.map +1 -0
- package/dist/core/agent-runtime-registry.js +32 -0
- package/dist/core/agent-runtime-registry.js.map +1 -0
- package/dist/core/agent-runtimes/claude-code-headless-runtime.d.ts +16 -0
- package/dist/core/agent-runtimes/claude-code-headless-runtime.d.ts.map +1 -0
- package/dist/core/agent-runtimes/claude-code-headless-runtime.js +301 -0
- package/dist/core/agent-runtimes/claude-code-headless-runtime.js.map +1 -0
- package/dist/core/agent-runtimes/claude-sdk-runtime.d.ts +15 -0
- package/dist/core/agent-runtimes/claude-sdk-runtime.d.ts.map +1 -0
- package/dist/core/agent-runtimes/claude-sdk-runtime.js +92 -0
- package/dist/core/agent-runtimes/claude-sdk-runtime.js.map +1 -0
- package/dist/core/branch-manager.d.ts +15 -0
- package/dist/core/branch-manager.d.ts.map +1 -0
- package/dist/core/branch-manager.js +90 -0
- package/dist/core/branch-manager.js.map +1 -0
- package/dist/core/condition-evaluator.d.ts +16 -0
- package/dist/core/condition-evaluator.d.ts.map +1 -0
- package/dist/core/condition-evaluator.js +121 -0
- package/dist/core/condition-evaluator.js.map +1 -0
- package/dist/core/context-reducer.d.ts +15 -0
- package/dist/core/context-reducer.d.ts.map +1 -0
- package/dist/core/context-reducer.js +224 -0
- package/dist/core/context-reducer.js.map +1 -0
- package/dist/core/dag-planner.d.ts +13 -0
- package/dist/core/dag-planner.d.ts.map +1 -0
- package/dist/core/dag-planner.js +233 -0
- package/dist/core/dag-planner.js.map +1 -0
- package/dist/core/git-manager.d.ts +14 -0
- package/dist/core/git-manager.d.ts.map +1 -0
- package/dist/core/git-manager.js +70 -0
- package/dist/core/git-manager.js.map +1 -0
- package/dist/core/group-execution-orchestrator.d.ts +34 -0
- package/dist/core/group-execution-orchestrator.d.ts.map +1 -0
- package/dist/core/group-execution-orchestrator.js +238 -0
- package/dist/core/group-execution-orchestrator.js.map +1 -0
- package/dist/core/loop-state-manager.d.ts +29 -0
- package/dist/core/loop-state-manager.d.ts.map +1 -0
- package/dist/core/loop-state-manager.js +78 -0
- package/dist/core/loop-state-manager.js.map +1 -0
- package/dist/core/output-storage-manager.d.ts +14 -0
- package/dist/core/output-storage-manager.d.ts.map +1 -0
- package/dist/core/output-storage-manager.js +68 -0
- package/dist/core/output-storage-manager.js.map +1 -0
- package/dist/core/output-tool-builder.d.ts +6 -0
- package/dist/core/output-tool-builder.d.ts.map +1 -0
- package/dist/core/output-tool-builder.js +50 -0
- package/dist/core/output-tool-builder.js.map +1 -0
- package/dist/core/parallel-executor.d.ts +21 -0
- package/dist/core/parallel-executor.d.ts.map +1 -0
- package/dist/core/parallel-executor.js +93 -0
- package/dist/core/parallel-executor.js.map +1 -0
- package/dist/core/pipeline-finalizer.d.ts +24 -0
- package/dist/core/pipeline-finalizer.d.ts.map +1 -0
- package/dist/core/pipeline-finalizer.js +103 -0
- package/dist/core/pipeline-finalizer.js.map +1 -0
- package/dist/core/pipeline-initializer.d.ts +36 -0
- package/dist/core/pipeline-initializer.d.ts.map +1 -0
- package/dist/core/pipeline-initializer.js +105 -0
- package/dist/core/pipeline-initializer.js.map +1 -0
- package/dist/core/pipeline-runner.d.ts +36 -0
- package/dist/core/pipeline-runner.d.ts.map +1 -0
- package/dist/core/pipeline-runner.js +326 -0
- package/dist/core/pipeline-runner.js.map +1 -0
- package/dist/core/pr-creator.d.ts +23 -0
- package/dist/core/pr-creator.d.ts.map +1 -0
- package/dist/core/pr-creator.js +138 -0
- package/dist/core/pr-creator.js.map +1 -0
- package/dist/core/retry-handler.d.ts +15 -0
- package/dist/core/retry-handler.d.ts.map +1 -0
- package/dist/core/retry-handler.js +95 -0
- package/dist/core/retry-handler.js.map +1 -0
- package/dist/core/stage-executor.d.ts +27 -0
- package/dist/core/stage-executor.d.ts.map +1 -0
- package/dist/core/stage-executor.js +365 -0
- package/dist/core/stage-executor.js.map +1 -0
- package/dist/core/state-manager.d.ts +10 -0
- package/dist/core/state-manager.d.ts.map +1 -0
- package/dist/core/state-manager.js +61 -0
- package/dist/core/state-manager.js.map +1 -0
- package/dist/core/types/agent-runtime.d.ts +51 -0
- package/dist/core/types/agent-runtime.d.ts.map +1 -0
- package/dist/core/types/agent-runtime.js +2 -0
- package/dist/core/types/agent-runtime.js.map +1 -0
- package/dist/core/types/execution-graph.d.ts +29 -0
- package/dist/core/types/execution-graph.d.ts.map +1 -0
- package/dist/core/types/execution-graph.js +2 -0
- package/dist/core/types/execution-graph.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +400 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/notification-manager.d.ts +12 -0
- package/dist/notifications/notification-manager.d.ts.map +1 -0
- package/dist/notifications/notification-manager.js +74 -0
- package/dist/notifications/notification-manager.js.map +1 -0
- package/dist/notifications/notifiers/base-notifier.d.ts +9 -0
- package/dist/notifications/notifiers/base-notifier.d.ts.map +1 -0
- package/dist/notifications/notifiers/base-notifier.js +27 -0
- package/dist/notifications/notifiers/base-notifier.js.map +1 -0
- package/dist/notifications/notifiers/local-notifier.d.ts +11 -0
- package/dist/notifications/notifiers/local-notifier.d.ts.map +1 -0
- package/dist/notifications/notifiers/local-notifier.js +91 -0
- package/dist/notifications/notifiers/local-notifier.js.map +1 -0
- package/dist/notifications/notifiers/slack-notifier.d.ts +13 -0
- package/dist/notifications/notifiers/slack-notifier.d.ts.map +1 -0
- package/dist/notifications/notifiers/slack-notifier.js +209 -0
- package/dist/notifications/notifiers/slack-notifier.js.map +1 -0
- package/dist/notifications/types.d.ts +34 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +2 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/ui/components/execution-group.d.ts +10 -0
- package/dist/ui/components/execution-group.d.ts.map +1 -0
- package/dist/ui/components/execution-group.js +19 -0
- package/dist/ui/components/execution-group.js.map +1 -0
- package/dist/ui/components/stage-row.d.ts +10 -0
- package/dist/ui/components/stage-row.d.ts.map +1 -0
- package/dist/ui/components/stage-row.js +69 -0
- package/dist/ui/components/stage-row.js.map +1 -0
- package/dist/ui/components/status-badge.d.ts +7 -0
- package/dist/ui/components/status-badge.d.ts.map +1 -0
- package/dist/ui/components/status-badge.js +18 -0
- package/dist/ui/components/status-badge.js.map +1 -0
- package/dist/ui/components/summary-line.d.ts +9 -0
- package/dist/ui/components/summary-line.d.ts.map +1 -0
- package/dist/ui/components/summary-line.js +13 -0
- package/dist/ui/components/summary-line.js.map +1 -0
- package/dist/ui/pipeline-ui.d.ts +8 -0
- package/dist/ui/pipeline-ui.d.ts.map +1 -0
- package/dist/ui/pipeline-ui.js +82 -0
- package/dist/ui/pipeline-ui.js.map +1 -0
- package/dist/utils/error-factory.d.ts +21 -0
- package/dist/utils/error-factory.d.ts.map +1 -0
- package/dist/utils/error-factory.js +74 -0
- package/dist/utils/error-factory.js.map +1 -0
- package/dist/utils/errors.d.ts +11 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +21 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gh-cli-checker.d.ts +6 -0
- package/dist/utils/gh-cli-checker.d.ts.map +1 -0
- package/dist/utils/gh-cli-checker.js +42 -0
- package/dist/utils/gh-cli-checker.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +39 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pipeline-formatter.d.ts +10 -0
- package/dist/utils/pipeline-formatter.d.ts.map +1 -0
- package/dist/utils/pipeline-formatter.js +92 -0
- package/dist/utils/pipeline-formatter.js.map +1 -0
- package/dist/utils/token-estimator.d.ts +15 -0
- package/dist/utils/token-estimator.d.ts.map +1 -0
- package/dist/utils/token-estimator.js +46 -0
- package/dist/utils/token-estimator.js.map +1 -0
- package/dist/validators/pipeline-validator.d.ts +31 -0
- package/dist/validators/pipeline-validator.d.ts.map +1 -0
- package/dist/validators/pipeline-validator.js +540 -0
- package/dist/validators/pipeline-validator.js.map +1 -0
- package/license +21 -0
- package/package.json +90 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
export class DAGPlanner {
|
|
2
|
+
buildExecutionPlan(config) {
|
|
3
|
+
const validation = this.validateDAG(config);
|
|
4
|
+
if (!validation.valid) {
|
|
5
|
+
throw new Error(`Invalid pipeline DAG:\n${validation.errors.join('\n')}`);
|
|
6
|
+
}
|
|
7
|
+
const nodes = this.buildNodes(config);
|
|
8
|
+
const adjacencyList = this.buildAdjacencyList(nodes);
|
|
9
|
+
const sortedStages = this.topologicalSort(nodes);
|
|
10
|
+
const groups = this.groupByLevel(sortedStages, nodes);
|
|
11
|
+
const plan = {
|
|
12
|
+
groups,
|
|
13
|
+
totalStages: config.agents.length,
|
|
14
|
+
maxParallelism: Math.max(...groups.map(g => g.stages.length)),
|
|
15
|
+
isSequential: groups.every(g => g.stages.length === 1)
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
nodes,
|
|
19
|
+
adjacencyList,
|
|
20
|
+
plan,
|
|
21
|
+
validation
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
validateDAG(config) {
|
|
25
|
+
const errors = [];
|
|
26
|
+
const warnings = [];
|
|
27
|
+
const stageNames = new Set(config.agents.map(a => a.name));
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
const duplicates = new Set();
|
|
30
|
+
for (const agent of config.agents) {
|
|
31
|
+
if (seen.has(agent.name)) {
|
|
32
|
+
duplicates.add(agent.name);
|
|
33
|
+
}
|
|
34
|
+
seen.add(agent.name);
|
|
35
|
+
}
|
|
36
|
+
if (duplicates.size > 0) {
|
|
37
|
+
errors.push(`Duplicate stage names: ${Array.from(duplicates).join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
for (const agent of config.agents) {
|
|
40
|
+
if (agent.dependsOn) {
|
|
41
|
+
for (const dependency of agent.dependsOn) {
|
|
42
|
+
if (!stageNames.has(dependency)) {
|
|
43
|
+
errors.push(`Stage "${agent.name}" depends on unknown stage "${dependency}"`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const visited = new Set();
|
|
49
|
+
const recursionStack = new Set();
|
|
50
|
+
const cycleReported = new Set();
|
|
51
|
+
const hasCycle = (stageName) => {
|
|
52
|
+
visited.add(stageName);
|
|
53
|
+
recursionStack.add(stageName);
|
|
54
|
+
const stage = config.agents.find(a => a.name === stageName);
|
|
55
|
+
if (stage?.dependsOn) {
|
|
56
|
+
for (const dependency of stage.dependsOn) {
|
|
57
|
+
if (!visited.has(dependency)) {
|
|
58
|
+
if (hasCycle(dependency))
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
else if (recursionStack.has(dependency)) {
|
|
62
|
+
const cycleKey = `${stageName}->${dependency}`;
|
|
63
|
+
if (!cycleReported.has(cycleKey)) {
|
|
64
|
+
errors.push(`Circular dependency detected involving "${stageName}" -> "${dependency}"`);
|
|
65
|
+
cycleReported.add(cycleKey);
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
recursionStack.delete(stageName);
|
|
72
|
+
return false;
|
|
73
|
+
};
|
|
74
|
+
for (const agent of config.agents) {
|
|
75
|
+
if (!visited.has(agent.name)) {
|
|
76
|
+
hasCycle(agent.name);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
for (const agent of config.agents) {
|
|
80
|
+
if (agent.dependsOn?.includes(agent.name)) {
|
|
81
|
+
errors.push(`Stage "${agent.name}" cannot depend on itself`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (errors.length === 0) {
|
|
85
|
+
const maxDepth = this.calculateMaxDepth(config);
|
|
86
|
+
if (maxDepth > 5) {
|
|
87
|
+
warnings.push(`Deep dependency chain detected (${maxDepth} levels). Consider optimizing.`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
valid: errors.length === 0,
|
|
92
|
+
errors,
|
|
93
|
+
warnings
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
buildNodes(config) {
|
|
97
|
+
const nodes = new Map();
|
|
98
|
+
for (const stage of config.agents) {
|
|
99
|
+
nodes.set(stage.name, {
|
|
100
|
+
stage,
|
|
101
|
+
dependencies: stage.dependsOn || [],
|
|
102
|
+
dependents: [],
|
|
103
|
+
level: 0
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
for (const [name, node] of nodes) {
|
|
107
|
+
for (const dependency of node.dependencies) {
|
|
108
|
+
const dependencyNode = nodes.get(dependency);
|
|
109
|
+
if (dependencyNode) {
|
|
110
|
+
dependencyNode.dependents.push(name);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
this.calculateLevels(nodes);
|
|
115
|
+
return nodes;
|
|
116
|
+
}
|
|
117
|
+
calculateLevels(nodes) {
|
|
118
|
+
const visited = new Set();
|
|
119
|
+
const calculateLevel = (name) => {
|
|
120
|
+
const existingNode = nodes.get(name);
|
|
121
|
+
if (!existingNode) {
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
if (visited.has(name)) {
|
|
125
|
+
return existingNode.level;
|
|
126
|
+
}
|
|
127
|
+
visited.add(name);
|
|
128
|
+
if (existingNode.dependencies.length === 0) {
|
|
129
|
+
existingNode.level = 0;
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
const dependencyLevels = existingNode.dependencies.map(dependency => calculateLevel(dependency));
|
|
133
|
+
existingNode.level = Math.max(...dependencyLevels) + 1;
|
|
134
|
+
return existingNode.level;
|
|
135
|
+
};
|
|
136
|
+
for (const name of nodes.keys()) {
|
|
137
|
+
calculateLevel(name);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
buildAdjacencyList(nodes) {
|
|
141
|
+
const adjacencyList = new Map();
|
|
142
|
+
for (const [name, node] of nodes) {
|
|
143
|
+
adjacencyList.set(name, node.dependencies);
|
|
144
|
+
}
|
|
145
|
+
return adjacencyList;
|
|
146
|
+
}
|
|
147
|
+
topologicalSort(nodes) {
|
|
148
|
+
const inDegree = new Map();
|
|
149
|
+
const sorted = [];
|
|
150
|
+
for (const [name, node] of nodes) {
|
|
151
|
+
inDegree.set(name, node.dependencies.length);
|
|
152
|
+
}
|
|
153
|
+
const nodesWithNoDependencies = [];
|
|
154
|
+
for (const [name, degree] of inDegree) {
|
|
155
|
+
if (degree === 0) {
|
|
156
|
+
nodesWithNoDependencies.push(name);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const queue = nodesWithNoDependencies;
|
|
160
|
+
while (queue.length > 0) {
|
|
161
|
+
const current = queue.shift();
|
|
162
|
+
if (!current)
|
|
163
|
+
continue;
|
|
164
|
+
sorted.push(current);
|
|
165
|
+
const node = nodes.get(current);
|
|
166
|
+
if (!node)
|
|
167
|
+
continue;
|
|
168
|
+
for (const dependent of node.dependents) {
|
|
169
|
+
const newDegree = (inDegree.get(dependent) || 0) - 1;
|
|
170
|
+
inDegree.set(dependent, newDegree);
|
|
171
|
+
if (newDegree === 0) {
|
|
172
|
+
queue.push(dependent);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (sorted.length !== nodes.size) {
|
|
177
|
+
throw new Error('Invalid pipeline DAG: Cycle detected or incomplete DAG');
|
|
178
|
+
}
|
|
179
|
+
return sorted;
|
|
180
|
+
}
|
|
181
|
+
groupByLevel(sortedStages, nodes) {
|
|
182
|
+
const levelMap = new Map();
|
|
183
|
+
for (const stageName of sortedStages) {
|
|
184
|
+
const node = nodes.get(stageName);
|
|
185
|
+
if (!node)
|
|
186
|
+
continue;
|
|
187
|
+
const level = node.level;
|
|
188
|
+
if (!levelMap.has(level)) {
|
|
189
|
+
levelMap.set(level, []);
|
|
190
|
+
}
|
|
191
|
+
const levelStages = levelMap.get(level);
|
|
192
|
+
if (levelStages) {
|
|
193
|
+
levelStages.push(node.stage);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const groups = [];
|
|
197
|
+
const sortedLevels = Array.from(levelMap.keys()).sort((a, b) => a - b);
|
|
198
|
+
for (const level of sortedLevels) {
|
|
199
|
+
const stages = levelMap.get(level);
|
|
200
|
+
if (stages && stages.length > 0) {
|
|
201
|
+
groups.push({
|
|
202
|
+
level,
|
|
203
|
+
stages
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return groups;
|
|
208
|
+
}
|
|
209
|
+
calculateMaxDepth(config) {
|
|
210
|
+
const depthMap = new Map();
|
|
211
|
+
const getDepth = (stageName) => {
|
|
212
|
+
const cachedDepth = depthMap.get(stageName);
|
|
213
|
+
if (cachedDepth !== undefined) {
|
|
214
|
+
return cachedDepth;
|
|
215
|
+
}
|
|
216
|
+
const stage = config.agents.find(a => a.name === stageName);
|
|
217
|
+
if (!stage || !stage.dependsOn || stage.dependsOn.length === 0) {
|
|
218
|
+
depthMap.set(stageName, 0);
|
|
219
|
+
return 0;
|
|
220
|
+
}
|
|
221
|
+
const dependencyDepths = stage.dependsOn.map(dependency => getDepth(dependency));
|
|
222
|
+
const depth = Math.max(...dependencyDepths) + 1;
|
|
223
|
+
depthMap.set(stageName, depth);
|
|
224
|
+
return depth;
|
|
225
|
+
};
|
|
226
|
+
let maxDepth = 0;
|
|
227
|
+
for (const agent of config.agents) {
|
|
228
|
+
maxDepth = Math.max(maxDepth, getDepth(agent.name));
|
|
229
|
+
}
|
|
230
|
+
return maxDepth;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=dag-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag-planner.js","sourceRoot":"","sources":["../../src/core/dag-planner.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,UAAU;IAIrB,kBAAkB,CAAC,MAAsB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAEtD,MAAM,IAAI,GAAkB;YAC1B,MAAM;YACN,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YACjC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7D,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;SACvD,CAAC;QAEF,OAAO;YACL,KAAK;YACL,aAAa;YACb,IAAI;YACJ,UAAU;SACX,CAAC;IACJ,CAAC;IAKD,WAAW,CAAC,MAAsB;QAChC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAG3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAGD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAChC,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,+BAA+B,UAAU,GAAG,CAAC,CAAC;oBAChF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAGD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAExC,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAW,EAAE;YAC9C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAC5D,IAAI,KAAK,EAAE,SAAS,EAAE,CAAC;gBACrB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC7B,IAAI,QAAQ,CAAC,UAAU,CAAC;4BAAE,OAAO,IAAI,CAAC;oBACxC,CAAC;yBAAM,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC1C,MAAM,QAAQ,GAAG,GAAG,SAAS,KAAK,UAAU,EAAE,CAAC;wBAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACjC,MAAM,CAAC,IAAI,CAAC,2CAA2C,SAAS,SAAS,UAAU,GAAG,CAAC,CAAC;4BACxF,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBAC9B,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YAED,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAGD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,2BAA2B,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAID,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,mCAAmC,QAAQ,gCAAgC,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAKO,UAAU,CAAC,MAAsB;QACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;QAG/C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;gBACpB,KAAK;gBACL,YAAY,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;gBACnC,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;QACL,CAAC;QAGD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3C,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC7C,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAGD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE5B,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,eAAe,CAAC,KAAiC;QACvD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;YAC9C,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,CAAC;YACX,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,YAAY,CAAC,KAAK,CAAC;YAC5B,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAElB,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3C,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC;gBACvB,OAAO,CAAC,CAAC;YACX,CAAC;YAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;YACjG,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvD,OAAO,YAAY,CAAC,KAAK,CAAC;QAC5B,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAChC,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAKO,kBAAkB,CAAC,KAAiC;QAC1D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;QAElD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAKO,eAAe,CACrB,KAAiC;QAEjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;QAG5B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAGD,MAAM,uBAAuB,GAAa,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACtC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAGD,MAAM,KAAK,GAAG,uBAAuB,CAAC;QACtC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACrD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAEnC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBACpB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAKO,YAAY,CAClB,YAAsB,EACtB,KAAiC;QAEjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;QAEvD,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAEzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1B,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAGD,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK;oBACL,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAKO,iBAAiB,CAAC,MAAsB;QAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE3C,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAU,EAAE;YAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/D,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC;YACX,CAAC;YAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YACjF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAChD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SimpleGit } from 'simple-git';
|
|
2
|
+
export declare class GitManager {
|
|
3
|
+
protected git: SimpleGit;
|
|
4
|
+
constructor(repoPath: string);
|
|
5
|
+
getCurrentCommit(): Promise<string>;
|
|
6
|
+
getChangedFiles(commitSha: string): Promise<string[]>;
|
|
7
|
+
hasUncommittedChanges(): Promise<boolean>;
|
|
8
|
+
stageAllChanges(): Promise<void>;
|
|
9
|
+
commitWithMetadata(message: string, metadata: Record<string, string>): Promise<string>;
|
|
10
|
+
createPipelineCommit(stageName: string, runId: string, customMessage?: string): Promise<string>;
|
|
11
|
+
revertToCommit(commitSha: string): Promise<void>;
|
|
12
|
+
getCommitMessage(commitSha: string): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=git-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-manager.d.ts","sourceRoot":"","sources":["../../src/core/git-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,SAAS,EAAE,MAAM,YAAY,CAAC;AAOlD,qBAAa,UAAU;IACrB,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC;gBAEb,QAAQ,EAAE,MAAM;IAItB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBrD,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAKzC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC;IAoBZ,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;IAgBZ,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAI3D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { simpleGit } from 'simple-git';
|
|
2
|
+
import { ErrorFactory } from '../utils/error-factory.js';
|
|
3
|
+
export class GitManager {
|
|
4
|
+
git;
|
|
5
|
+
constructor(repoPath) {
|
|
6
|
+
this.git = simpleGit(repoPath);
|
|
7
|
+
}
|
|
8
|
+
async getCurrentCommit() {
|
|
9
|
+
const log = await this.git.log(['-1']);
|
|
10
|
+
return log.latest?.hash || '';
|
|
11
|
+
}
|
|
12
|
+
async getChangedFiles(commitSha) {
|
|
13
|
+
try {
|
|
14
|
+
const diff = await this.git.diff([
|
|
15
|
+
'--name-only',
|
|
16
|
+
`${commitSha}^`,
|
|
17
|
+
commitSha
|
|
18
|
+
]);
|
|
19
|
+
return diff.split('\n').filter(Boolean);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const gitError = ErrorFactory.createGitError(error, 'diff');
|
|
23
|
+
if (gitError.message.includes('ambiguous argument') ||
|
|
24
|
+
gitError.message.includes('unknown revision')) {
|
|
25
|
+
const allFiles = await this.git.raw(['ls-tree', '--name-only', '-r', commitSha]);
|
|
26
|
+
return allFiles.split('\n').filter(Boolean);
|
|
27
|
+
}
|
|
28
|
+
throw new Error(gitError.suggestion || gitError.message);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async hasUncommittedChanges() {
|
|
32
|
+
const status = await this.git.status();
|
|
33
|
+
return !status.isClean();
|
|
34
|
+
}
|
|
35
|
+
async stageAllChanges() {
|
|
36
|
+
await this.git.add('.');
|
|
37
|
+
}
|
|
38
|
+
async commitWithMetadata(message, metadata) {
|
|
39
|
+
const status = await this.git.status();
|
|
40
|
+
if (status.staged.length === 0) {
|
|
41
|
+
throw new Error('No staged changes to commit. Stage changes with git.add() first.');
|
|
42
|
+
}
|
|
43
|
+
const trailers = Object.entries(metadata)
|
|
44
|
+
.map(([key, value]) => `${key}: ${value}`)
|
|
45
|
+
.join('\n');
|
|
46
|
+
const fullMessage = `${message}\n\n${trailers}`;
|
|
47
|
+
await this.git.commit(fullMessage);
|
|
48
|
+
return this.getCurrentCommit();
|
|
49
|
+
}
|
|
50
|
+
async createPipelineCommit(stageName, runId, customMessage) {
|
|
51
|
+
if (!(await this.hasUncommittedChanges())) {
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
await this.stageAllChanges();
|
|
55
|
+
const message = customMessage || `Apply ${stageName} changes`;
|
|
56
|
+
const commitMessage = `[pipeline:${stageName}] ${message}`;
|
|
57
|
+
return this.commitWithMetadata(commitMessage, {
|
|
58
|
+
'Pipeline-Run-ID': runId,
|
|
59
|
+
'Pipeline-Stage': stageName
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async revertToCommit(commitSha) {
|
|
63
|
+
await this.git.reset(['--hard', commitSha]);
|
|
64
|
+
}
|
|
65
|
+
async getCommitMessage(commitSha) {
|
|
66
|
+
const log = await this.git.log(['-1', commitSha]);
|
|
67
|
+
return log.latest?.message || '';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=git-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-manager.js","sourceRoot":"","sources":["../../src/core/git-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { GitManager } from './git-manager.js';
|
|
2
|
+
import { ParallelExecutor } from './parallel-executor.js';
|
|
3
|
+
import { StateManager } from './state-manager.js';
|
|
4
|
+
import { AgentRuntime } from './types/agent-runtime.js';
|
|
5
|
+
import { PipelineConfig, PipelineState, StageExecution } from '../config/schema.js';
|
|
6
|
+
import { ExecutionGraph, ExecutionGroup } from './types/execution-graph.js';
|
|
7
|
+
export interface GroupProcessingResult {
|
|
8
|
+
state: PipelineState;
|
|
9
|
+
shouldStopPipeline: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class GroupExecutionOrchestrator {
|
|
12
|
+
private gitManager;
|
|
13
|
+
private stateManager;
|
|
14
|
+
private repoPath;
|
|
15
|
+
private dryRun;
|
|
16
|
+
private runtime;
|
|
17
|
+
private shouldLog;
|
|
18
|
+
private stateChangeCallback;
|
|
19
|
+
private notifyStageResultsCallback;
|
|
20
|
+
private conditionEvaluator;
|
|
21
|
+
constructor(gitManager: GitManager, stateManager: StateManager, repoPath: string, dryRun: boolean, runtime: AgentRuntime, shouldLog: (interactive: boolean) => boolean, stateChangeCallback: (state: PipelineState) => void, notifyStageResultsCallback: (executions: StageExecution[], state: PipelineState) => Promise<void>);
|
|
22
|
+
processGroup(group: ExecutionGroup, state: PipelineState, config: PipelineConfig, executionGraph: ExecutionGraph, parallelExecutor: ParallelExecutor, interactive: boolean): Promise<GroupProcessingResult>;
|
|
23
|
+
private filterDisabledStages;
|
|
24
|
+
private evaluateConditions;
|
|
25
|
+
private executeGroup;
|
|
26
|
+
private handleContextReduction;
|
|
27
|
+
private handleGroupFailures;
|
|
28
|
+
private getNextStageToExecute;
|
|
29
|
+
private estimateNextContext;
|
|
30
|
+
private logSkippedStage;
|
|
31
|
+
private logGroupStart;
|
|
32
|
+
private logGroupResult;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=group-execution-orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-execution-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/group-execution-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,EACL,cAAc,EACd,aAAa,EAEb,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5E,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,aAAa,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,0BAA0B;IAInC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,0BAA0B;IAVpC,OAAO,CAAC,kBAAkB,CAAqB;gBAGrC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,EAC5C,mBAAmB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EACnD,0BAA0B,EAAE,CAClC,UAAU,EAAE,cAAc,EAAE,EAC5B,KAAK,EAAE,aAAa,KACjB,OAAO,CAAC,IAAI,CAAC;IAQd,YAAY,CAChB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,qBAAqB,CAAC;IAsEjC,OAAO,CAAC,oBAAoB;YA2Bd,kBAAkB;YA4ClB,YAAY;YA4CZ,sBAAsB;IA8FpC,OAAO,CAAC,mBAAmB;IAsE3B,OAAO,CAAC,qBAAqB;YAiBf,mBAAmB;IA6BjC,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,cAAc;CAcvB"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { StageExecutor } from './stage-executor.js';
|
|
2
|
+
import { ConditionEvaluator } from './condition-evaluator.js';
|
|
3
|
+
import { ContextReducer } from './context-reducer.js';
|
|
4
|
+
import { TokenEstimator } from '../utils/token-estimator.js';
|
|
5
|
+
import { PipelineFormatter } from '../utils/pipeline-formatter.js';
|
|
6
|
+
export class GroupExecutionOrchestrator {
|
|
7
|
+
gitManager;
|
|
8
|
+
stateManager;
|
|
9
|
+
repoPath;
|
|
10
|
+
dryRun;
|
|
11
|
+
runtime;
|
|
12
|
+
shouldLog;
|
|
13
|
+
stateChangeCallback;
|
|
14
|
+
notifyStageResultsCallback;
|
|
15
|
+
conditionEvaluator;
|
|
16
|
+
constructor(gitManager, stateManager, repoPath, dryRun, runtime, shouldLog, stateChangeCallback, notifyStageResultsCallback) {
|
|
17
|
+
this.gitManager = gitManager;
|
|
18
|
+
this.stateManager = stateManager;
|
|
19
|
+
this.repoPath = repoPath;
|
|
20
|
+
this.dryRun = dryRun;
|
|
21
|
+
this.runtime = runtime;
|
|
22
|
+
this.shouldLog = shouldLog;
|
|
23
|
+
this.stateChangeCallback = stateChangeCallback;
|
|
24
|
+
this.notifyStageResultsCallback = notifyStageResultsCallback;
|
|
25
|
+
this.conditionEvaluator = new ConditionEvaluator();
|
|
26
|
+
}
|
|
27
|
+
async processGroup(group, state, config, executionGraph, parallelExecutor, interactive) {
|
|
28
|
+
const { enabledStages } = this.filterDisabledStages(group, state, interactive);
|
|
29
|
+
const stagesToRun = await this.evaluateConditions(enabledStages, state, interactive);
|
|
30
|
+
if (stagesToRun.length === 0) {
|
|
31
|
+
return { state, shouldStopPipeline: false };
|
|
32
|
+
}
|
|
33
|
+
this.logGroupStart(stagesToRun, group, interactive);
|
|
34
|
+
const executionMode = config.settings?.executionMode || 'parallel';
|
|
35
|
+
const groupResult = await this.executeGroup(stagesToRun, state, executionMode, parallelExecutor, interactive);
|
|
36
|
+
state.stages.push(...groupResult.executions);
|
|
37
|
+
await this.notifyStageResultsCallback(groupResult.executions, state);
|
|
38
|
+
await this.stateManager.saveState(state);
|
|
39
|
+
this.stateChangeCallback(state);
|
|
40
|
+
await this.handleContextReduction(state, config, executionGraph, executionGraph.plan.groups.indexOf(group), interactive);
|
|
41
|
+
this.logGroupResult(groupResult, executionMode, stagesToRun, parallelExecutor, interactive);
|
|
42
|
+
const shouldStopPipeline = this.handleGroupFailures(groupResult, stagesToRun, state, config, interactive);
|
|
43
|
+
return { state, shouldStopPipeline };
|
|
44
|
+
}
|
|
45
|
+
filterDisabledStages(group, state, interactive) {
|
|
46
|
+
const enabledStages = group.stages.filter((s) => s.enabled !== false);
|
|
47
|
+
const disabledStages = group.stages.filter((s) => s.enabled === false);
|
|
48
|
+
for (const disabledStage of disabledStages) {
|
|
49
|
+
if (this.shouldLog(interactive)) {
|
|
50
|
+
this.logSkippedStage(disabledStage.name, 'disabled');
|
|
51
|
+
}
|
|
52
|
+
state.stages.push({
|
|
53
|
+
stageName: disabledStage.name,
|
|
54
|
+
status: 'skipped',
|
|
55
|
+
startTime: new Date().toISOString()
|
|
56
|
+
});
|
|
57
|
+
this.stateChangeCallback(state);
|
|
58
|
+
}
|
|
59
|
+
return { enabledStages, disabledStages };
|
|
60
|
+
}
|
|
61
|
+
async evaluateConditions(enabledStages, state, interactive) {
|
|
62
|
+
const stagesToRun = [];
|
|
63
|
+
for (const stage of enabledStages) {
|
|
64
|
+
if (stage.condition) {
|
|
65
|
+
const conditionMet = this.conditionEvaluator.evaluate(stage.condition, state);
|
|
66
|
+
if (!conditionMet) {
|
|
67
|
+
if (this.shouldLog(interactive)) {
|
|
68
|
+
this.logSkippedStage(stage.name, 'condition', stage.condition);
|
|
69
|
+
}
|
|
70
|
+
state.stages.push({
|
|
71
|
+
stageName: stage.name,
|
|
72
|
+
status: 'skipped',
|
|
73
|
+
startTime: new Date().toISOString(),
|
|
74
|
+
conditionEvaluated: true,
|
|
75
|
+
conditionResult: false
|
|
76
|
+
});
|
|
77
|
+
this.stateChangeCallback(state);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
if (this.shouldLog(interactive)) {
|
|
82
|
+
console.log(`✅ Condition met for stage "${stage.name}": ${stage.condition}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
stagesToRun.push(stage);
|
|
87
|
+
}
|
|
88
|
+
return stagesToRun;
|
|
89
|
+
}
|
|
90
|
+
async executeGroup(stagesToRun, state, executionMode, parallelExecutor, _interactive) {
|
|
91
|
+
const shouldRunParallel = executionMode === 'parallel' && stagesToRun.length > 1;
|
|
92
|
+
if (shouldRunParallel) {
|
|
93
|
+
return await parallelExecutor.executeParallelGroup(stagesToRun, state, (stageName, output) => {
|
|
94
|
+
const stageIndex = state.stages.findIndex((s) => s.stageName === stageName);
|
|
95
|
+
if (stageIndex >= 0) {
|
|
96
|
+
state.stages[stageIndex].agentOutput = output;
|
|
97
|
+
this.stateChangeCallback(state);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
return await parallelExecutor.executeSequentialGroup(stagesToRun, state, (stageName, output) => {
|
|
103
|
+
const currentStage = state.stages[state.stages.length - 1];
|
|
104
|
+
if (currentStage && currentStage.stageName === stageName) {
|
|
105
|
+
currentStage.agentOutput = output;
|
|
106
|
+
this.stateChangeCallback(state);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async handleContextReduction(state, config, executionGraph, currentGroupIndex, interactive) {
|
|
112
|
+
const contextReductionConfig = config.settings?.contextReduction;
|
|
113
|
+
if (!contextReductionConfig?.enabled ||
|
|
114
|
+
contextReductionConfig.strategy !== 'agent-based' ||
|
|
115
|
+
!contextReductionConfig.agentPath) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const nextStage = this.getNextStageToExecute(executionGraph, currentGroupIndex);
|
|
119
|
+
if (!nextStage) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const contextEstimate = await this.estimateNextContext(state, nextStage);
|
|
123
|
+
const contextReducer = new ContextReducer(this.gitManager, this.repoPath, state.runId, this.runtime);
|
|
124
|
+
if (contextReducer.shouldReduce(contextEstimate, contextReductionConfig)) {
|
|
125
|
+
if (this.shouldLog(interactive)) {
|
|
126
|
+
console.log(`⚠️ Context approaching limit (${PipelineFormatter.formatTokenCount(contextEstimate)} tokens). ` +
|
|
127
|
+
`Running context reducer...\n`);
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const reducerOutput = await contextReducer.runReduction(state, nextStage, contextReductionConfig.agentPath);
|
|
131
|
+
if (reducerOutput.status === 'success') {
|
|
132
|
+
const reducedState = contextReducer.applyReduction(state, reducerOutput);
|
|
133
|
+
state.stages = reducedState.stages;
|
|
134
|
+
await this.stateManager.saveState(state);
|
|
135
|
+
this.stateChangeCallback(state);
|
|
136
|
+
if (this.shouldLog(interactive)) {
|
|
137
|
+
console.log(`✅ Context reduced successfully\n`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
if (this.shouldLog(interactive)) {
|
|
142
|
+
console.log(`⚠️ Context reduction failed. Continuing with full context.\n`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (this.shouldLog(interactive)) {
|
|
148
|
+
console.warn(`⚠️ Context reduction error: ${error}. Continuing with full context.\n`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
handleGroupFailures(groupResult, stagesToRun, state, config, interactive) {
|
|
154
|
+
if (!groupResult.anyFailed) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const failedStages = groupResult.executions.filter((e) => e.status === 'failed');
|
|
158
|
+
for (const failedStage of failedStages) {
|
|
159
|
+
const stageConfig = stagesToRun.find((s) => s.name === failedStage.stageName);
|
|
160
|
+
const failureStrategy = stageConfig?.onFail || config.settings?.failureStrategy || 'stop';
|
|
161
|
+
switch (failureStrategy) {
|
|
162
|
+
case 'stop': {
|
|
163
|
+
if (this.shouldLog(interactive)) {
|
|
164
|
+
console.log(`🛑 Pipeline stopped due to stage failure: ${failedStage.stageName}\n`);
|
|
165
|
+
}
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
case 'continue': {
|
|
169
|
+
if (this.shouldLog(interactive)) {
|
|
170
|
+
console.log(`⚠️ Stage ${failedStage.stageName} failed but continuing (continue mode)\n`);
|
|
171
|
+
}
|
|
172
|
+
if (state.status === 'running') {
|
|
173
|
+
state.status = 'partial';
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
case 'warn': {
|
|
178
|
+
if (this.shouldLog(interactive)) {
|
|
179
|
+
console.log(`⚠️ Stage ${failedStage.stageName} failed (warn mode) - continuing pipeline\n`);
|
|
180
|
+
}
|
|
181
|
+
if (state.status === 'running') {
|
|
182
|
+
state.status = 'partial';
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
default: {
|
|
187
|
+
if (this.shouldLog(interactive)) {
|
|
188
|
+
console.log(`🛑 Pipeline stopped due to stage failure: ${failedStage.stageName} (unrecognized failure strategy "${failureStrategy}")\n`);
|
|
189
|
+
}
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
getNextStageToExecute(executionGraph, currentGroupIndex) {
|
|
197
|
+
const nextGroupIndex = currentGroupIndex + 1;
|
|
198
|
+
if (nextGroupIndex >= executionGraph.plan.groups.length) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
const nextGroup = executionGraph.plan.groups[nextGroupIndex];
|
|
202
|
+
const enabledStage = nextGroup.stages.find((s) => s.enabled !== false);
|
|
203
|
+
return enabledStage || null;
|
|
204
|
+
}
|
|
205
|
+
async estimateNextContext(state, nextStage) {
|
|
206
|
+
const stageExecutor = new StageExecutor(this.gitManager, this.dryRun, state.runId, this.repoPath, this.runtime);
|
|
207
|
+
try {
|
|
208
|
+
const context = await stageExecutor.buildAgentContext(nextStage, state);
|
|
209
|
+
const tokenEstimator = new TokenEstimator();
|
|
210
|
+
const estimate = tokenEstimator.estimateTokens(context);
|
|
211
|
+
tokenEstimator.dispose();
|
|
212
|
+
return estimate;
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
logSkippedStage(stageName, reason, conditionText) {
|
|
219
|
+
if (reason === 'disabled') {
|
|
220
|
+
console.log(`⏭️ Skipping disabled stage: ${stageName}\n`);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
console.log(`⏭️ Skipping stage "${stageName}" (condition not met): ${conditionText}\n`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
logGroupStart(stagesToRun, group, interactive) {
|
|
227
|
+
if (this.shouldLog(interactive) && stagesToRun.length > 1) {
|
|
228
|
+
console.log(`🔀 Running ${stagesToRun.length} stages in parallel (group ${group.level})...`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
logGroupResult(groupResult, executionMode, stagesToRun, parallelExecutor, interactive) {
|
|
232
|
+
const shouldRunParallel = executionMode === 'parallel' && stagesToRun.length > 1;
|
|
233
|
+
if (this.shouldLog(interactive) && shouldRunParallel) {
|
|
234
|
+
console.log(`📊 ${parallelExecutor.aggregateResults(groupResult)}\n`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=group-execution-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-execution-orchestrator.js","sourceRoot":"","sources":["../../src/core/group-execution-orchestrator.ts"],"names":[],"mappings":"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"}
|