@haoyiyin/workflow 0.2.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/README.md +168 -0
- package/SETUP.md +71 -0
- package/SKILL.md +68 -0
- package/USAGE.md +152 -0
- package/dist/bin/yi-workflow.d.ts +3 -0
- package/dist/bin/yi-workflow.d.ts.map +1 -0
- package/dist/bin/yi-workflow.js +39 -0
- package/dist/bin/yi-workflow.js.map +1 -0
- package/dist/src/agents/contracts.d.ts +120 -0
- package/dist/src/agents/contracts.d.ts.map +1 -0
- package/dist/src/agents/contracts.js +431 -0
- package/dist/src/agents/contracts.js.map +1 -0
- package/dist/src/agents/dispatcher-enhanced.d.ts +68 -0
- package/dist/src/agents/dispatcher-enhanced.d.ts.map +1 -0
- package/dist/src/agents/dispatcher-enhanced.js +290 -0
- package/dist/src/agents/dispatcher-enhanced.js.map +1 -0
- package/dist/src/agents/dispatcher.d.ts +107 -0
- package/dist/src/agents/dispatcher.d.ts.map +1 -0
- package/dist/src/agents/dispatcher.js +454 -0
- package/dist/src/agents/dispatcher.js.map +1 -0
- package/dist/src/agents/index.d.ts +11 -0
- package/dist/src/agents/index.d.ts.map +1 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/index.js.map +1 -0
- package/dist/src/agents/resilience.d.ts +86 -0
- package/dist/src/agents/resilience.d.ts.map +1 -0
- package/dist/src/agents/resilience.js +183 -0
- package/dist/src/agents/resilience.js.map +1 -0
- package/dist/src/agents/token-budget.d.ts +47 -0
- package/dist/src/agents/token-budget.d.ts.map +1 -0
- package/dist/src/agents/token-budget.js +63 -0
- package/dist/src/agents/token-budget.js.map +1 -0
- package/dist/src/agents/types.d.ts +59 -0
- package/dist/src/agents/types.d.ts.map +1 -0
- package/dist/src/agents/types.js +5 -0
- package/dist/src/agents/types.js.map +1 -0
- package/dist/src/guard/main-agent.d.ts +72 -0
- package/dist/src/guard/main-agent.d.ts.map +1 -0
- package/dist/src/guard/main-agent.js +184 -0
- package/dist/src/guard/main-agent.js.map +1 -0
- package/dist/src/hooks/builtin/index.d.ts +9 -0
- package/dist/src/hooks/builtin/index.d.ts.map +1 -0
- package/dist/src/hooks/builtin/index.js +9 -0
- package/dist/src/hooks/builtin/index.js.map +1 -0
- package/dist/src/hooks/builtin/on-error.d.ts +7 -0
- package/dist/src/hooks/builtin/on-error.d.ts.map +1 -0
- package/dist/src/hooks/builtin/on-error.js +15 -0
- package/dist/src/hooks/builtin/on-error.js.map +1 -0
- package/dist/src/hooks/builtin/post-execute.d.ts +7 -0
- package/dist/src/hooks/builtin/post-execute.d.ts.map +1 -0
- package/dist/src/hooks/builtin/post-execute.js +30 -0
- package/dist/src/hooks/builtin/post-execute.js.map +1 -0
- package/dist/src/hooks/builtin/post-plan.d.ts +7 -0
- package/dist/src/hooks/builtin/post-plan.d.ts.map +1 -0
- package/dist/src/hooks/builtin/post-plan.js +15 -0
- package/dist/src/hooks/builtin/post-plan.js.map +1 -0
- package/dist/src/hooks/builtin/pre-execute.d.ts +7 -0
- package/dist/src/hooks/builtin/pre-execute.d.ts.map +1 -0
- package/dist/src/hooks/builtin/pre-execute.js +22 -0
- package/dist/src/hooks/builtin/pre-execute.js.map +1 -0
- package/dist/src/hooks/builtin/pre-plan.d.ts +7 -0
- package/dist/src/hooks/builtin/pre-plan.d.ts.map +1 -0
- package/dist/src/hooks/builtin/pre-plan.js +19 -0
- package/dist/src/hooks/builtin/pre-plan.js.map +1 -0
- package/dist/src/hooks/index.d.ts +8 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +4 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/loader.d.ts +16 -0
- package/dist/src/hooks/loader.d.ts.map +1 -0
- package/dist/src/hooks/loader.js +77 -0
- package/dist/src/hooks/loader.js.map +1 -0
- package/dist/src/hooks/manager.d.ts +20 -0
- package/dist/src/hooks/manager.d.ts.map +1 -0
- package/dist/src/hooks/manager.js +76 -0
- package/dist/src/hooks/manager.js.map +1 -0
- package/dist/src/hooks/types-enhanced.d.ts +30 -0
- package/dist/src/hooks/types-enhanced.d.ts.map +1 -0
- package/dist/src/hooks/types-enhanced.js +22 -0
- package/dist/src/hooks/types-enhanced.js.map +1 -0
- package/dist/src/hooks/types.d.ts +27 -0
- package/dist/src/hooks/types.d.ts.map +1 -0
- package/dist/src/hooks/types.js +2 -0
- package/dist/src/hooks/types.js.map +1 -0
- package/dist/src/index.d.ts +43 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +41 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/persistence/index.d.ts +7 -0
- package/dist/src/persistence/index.d.ts.map +1 -0
- package/dist/src/persistence/index.js +6 -0
- package/dist/src/persistence/index.js.map +1 -0
- package/dist/src/persistence/plan-md.d.ts +11 -0
- package/dist/src/persistence/plan-md.d.ts.map +1 -0
- package/dist/src/persistence/plan-md.js +125 -0
- package/dist/src/persistence/plan-md.js.map +1 -0
- package/dist/src/persistence/state-md.d.ts +17 -0
- package/dist/src/persistence/state-md.d.ts.map +1 -0
- package/dist/src/persistence/state-md.js +143 -0
- package/dist/src/persistence/state-md.js.map +1 -0
- package/dist/src/persistence/types.d.ts +85 -0
- package/dist/src/persistence/types.d.ts.map +1 -0
- package/dist/src/persistence/types.js +5 -0
- package/dist/src/persistence/types.js.map +1 -0
- package/dist/src/router/classifier.d.ts +108 -0
- package/dist/src/router/classifier.d.ts.map +1 -0
- package/dist/src/router/classifier.js +476 -0
- package/dist/src/router/classifier.js.map +1 -0
- package/dist/src/router/guard.d.ts +128 -0
- package/dist/src/router/guard.d.ts.map +1 -0
- package/dist/src/router/guard.js +370 -0
- package/dist/src/router/guard.js.map +1 -0
- package/dist/src/router/index.d.ts +10 -0
- package/dist/src/router/index.d.ts.map +1 -0
- package/dist/src/router/index.js +8 -0
- package/dist/src/router/index.js.map +1 -0
- package/dist/src/router/router.d.ts +58 -0
- package/dist/src/router/router.d.ts.map +1 -0
- package/dist/src/router/router.js +78 -0
- package/dist/src/router/router.js.map +1 -0
- package/dist/src/router/types.d.ts +100 -0
- package/dist/src/router/types.d.ts.map +1 -0
- package/dist/src/router/types.js +24 -0
- package/dist/src/router/types.js.map +1 -0
- package/dist/src/skills/agents-md/index.d.ts +9 -0
- package/dist/src/skills/agents-md/index.d.ts.map +1 -0
- package/dist/src/skills/agents-md/index.js +28 -0
- package/dist/src/skills/agents-md/index.js.map +1 -0
- package/dist/src/skills/execute-plan/index.d.ts +141 -0
- package/dist/src/skills/execute-plan/index.d.ts.map +1 -0
- package/dist/src/skills/execute-plan/index.js +784 -0
- package/dist/src/skills/execute-plan/index.js.map +1 -0
- package/dist/src/skills/index.d.ts +14 -0
- package/dist/src/skills/index.d.ts.map +1 -0
- package/dist/src/skills/index.js +10 -0
- package/dist/src/skills/index.js.map +1 -0
- package/dist/src/skills/quick-task/index.d.ts +75 -0
- package/dist/src/skills/quick-task/index.d.ts.map +1 -0
- package/dist/src/skills/quick-task/index.js +284 -0
- package/dist/src/skills/quick-task/index.js.map +1 -0
- package/dist/src/skills/registry.d.ts +15 -0
- package/dist/src/skills/registry.d.ts.map +1 -0
- package/dist/src/skills/registry.js +44 -0
- package/dist/src/skills/registry.js.map +1 -0
- package/dist/src/skills/review-diff/index.d.ts +96 -0
- package/dist/src/skills/review-diff/index.d.ts.map +1 -0
- package/dist/src/skills/review-diff/index.js +316 -0
- package/dist/src/skills/review-diff/index.js.map +1 -0
- package/dist/src/skills/skill.d.ts +24 -0
- package/dist/src/skills/skill.d.ts.map +1 -0
- package/dist/src/skills/skill.js +39 -0
- package/dist/src/skills/skill.js.map +1 -0
- package/dist/src/skills/systematic-debugging/index.d.ts +90 -0
- package/dist/src/skills/systematic-debugging/index.d.ts.map +1 -0
- package/dist/src/skills/systematic-debugging/index.js +305 -0
- package/dist/src/skills/systematic-debugging/index.js.map +1 -0
- package/dist/src/skills/tdd/index.d.ts +103 -0
- package/dist/src/skills/tdd/index.d.ts.map +1 -0
- package/dist/src/skills/tdd/index.js +338 -0
- package/dist/src/skills/tdd/index.js.map +1 -0
- package/dist/src/skills/to-plan/index-enhanced.d.ts +100 -0
- package/dist/src/skills/to-plan/index-enhanced.d.ts.map +1 -0
- package/dist/src/skills/to-plan/index-enhanced.js +452 -0
- package/dist/src/skills/to-plan/index-enhanced.js.map +1 -0
- package/dist/src/skills/to-plan/index.d.ts +131 -0
- package/dist/src/skills/to-plan/index.d.ts.map +1 -0
- package/dist/src/skills/to-plan/index.js +460 -0
- package/dist/src/skills/to-plan/index.js.map +1 -0
- package/dist/src/skills/types.d.ts +44 -0
- package/dist/src/skills/types.d.ts.map +1 -0
- package/dist/src/skills/types.js +2 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/state/cleanup.d.ts +22 -0
- package/dist/src/state/cleanup.d.ts.map +1 -0
- package/dist/src/state/cleanup.js +87 -0
- package/dist/src/state/cleanup.js.map +1 -0
- package/dist/src/state/index.d.ts +9 -0
- package/dist/src/state/index.d.ts.map +1 -0
- package/dist/src/state/index.js +5 -0
- package/dist/src/state/index.js.map +1 -0
- package/dist/src/state/manager.d.ts +15 -0
- package/dist/src/state/manager.d.ts.map +1 -0
- package/dist/src/state/manager.js +73 -0
- package/dist/src/state/manager.js.map +1 -0
- package/dist/src/state/persistence.d.ts +13 -0
- package/dist/src/state/persistence.d.ts.map +1 -0
- package/dist/src/state/persistence.js +68 -0
- package/dist/src/state/persistence.js.map +1 -0
- package/dist/src/state/types.d.ts +26 -0
- package/dist/src/state/types.d.ts.map +1 -0
- package/dist/src/state/types.js +2 -0
- package/dist/src/state/types.js.map +1 -0
- package/dist/src/state/validator.d.ts +12 -0
- package/dist/src/state/validator.d.ts.map +1 -0
- package/dist/src/state/validator.js +56 -0
- package/dist/src/state/validator.js.map +1 -0
- package/dist/src/types.d.ts +83 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/compress.d.ts +37 -0
- package/dist/src/utils/compress.d.ts.map +1 -0
- package/dist/src/utils/compress.js +298 -0
- package/dist/src/utils/compress.js.map +1 -0
- package/dist/src/utils/git.d.ts +9 -0
- package/dist/src/utils/git.d.ts.map +1 -0
- package/dist/src/utils/git.js +81 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/utils/index.d.ts +7 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +7 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +6 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +19 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/paths.d.ts +12 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +44 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/package.json +76 -0
- package/scripts/postinstall.js +69 -0
- package/yi-workflow.js +17 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced subagent dispatcher with resilience and token budget
|
|
3
|
+
*/
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
import { TokenBudget, BudgetExceededError } from './token-budget.js';
|
|
6
|
+
// Circuit breaker states
|
|
7
|
+
var CircuitState;
|
|
8
|
+
(function (CircuitState) {
|
|
9
|
+
CircuitState["CLOSED"] = "closed";
|
|
10
|
+
CircuitState["OPEN"] = "open";
|
|
11
|
+
CircuitState["HALF_OPEN"] = "half-open";
|
|
12
|
+
})(CircuitState || (CircuitState = {}));
|
|
13
|
+
// Circuit breaker implementation
|
|
14
|
+
class CircuitBreaker {
|
|
15
|
+
config;
|
|
16
|
+
state = CircuitState.CLOSED;
|
|
17
|
+
failureCount = 0;
|
|
18
|
+
successCount = 0;
|
|
19
|
+
nextAttempt = 0;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
}
|
|
23
|
+
async execute(operation, fallback) {
|
|
24
|
+
if (this.state === CircuitState.OPEN) {
|
|
25
|
+
if (Date.now() < this.nextAttempt) {
|
|
26
|
+
if (fallback) {
|
|
27
|
+
console.log('[CircuitBreaker] Using fallback');
|
|
28
|
+
const result = fallback();
|
|
29
|
+
if (result !== undefined)
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
throw new Error(`Circuit OPEN. Retry after ${new Date(this.nextAttempt).toISOString()}`);
|
|
33
|
+
}
|
|
34
|
+
this.state = CircuitState.HALF_OPEN;
|
|
35
|
+
console.log('[CircuitBreaker] Entering HALF_OPEN state');
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const result = await operation();
|
|
39
|
+
this.onSuccess();
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this.onFailure();
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
onSuccess() {
|
|
48
|
+
this.failureCount = 0;
|
|
49
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
50
|
+
this.successCount++;
|
|
51
|
+
if (this.successCount >= this.config.successThreshold) {
|
|
52
|
+
console.log('[CircuitBreaker] CLOSED - service recovered');
|
|
53
|
+
this.state = CircuitState.CLOSED;
|
|
54
|
+
this.successCount = 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
onFailure() {
|
|
59
|
+
this.failureCount++;
|
|
60
|
+
if (this.state === CircuitState.HALF_OPEN || this.failureCount >= this.config.failureThreshold) {
|
|
61
|
+
console.log(`[CircuitBreaker] OPEN - failures: ${this.failureCount}`);
|
|
62
|
+
this.state = CircuitState.OPEN;
|
|
63
|
+
this.nextAttempt = Date.now() + this.config.timeout;
|
|
64
|
+
this.successCount = 0;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
getState() {
|
|
68
|
+
return this.state;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Retry policy implementation
|
|
72
|
+
class RetryPolicy {
|
|
73
|
+
config;
|
|
74
|
+
constructor(config) {
|
|
75
|
+
this.config = config;
|
|
76
|
+
}
|
|
77
|
+
async execute(operation) {
|
|
78
|
+
let lastError;
|
|
79
|
+
for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {
|
|
80
|
+
try {
|
|
81
|
+
return await operation();
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
lastError = error;
|
|
85
|
+
if (!this.isRetryable(error))
|
|
86
|
+
throw error;
|
|
87
|
+
if (attempt < this.config.maxRetries) {
|
|
88
|
+
const delay = this.calculateDelay(attempt);
|
|
89
|
+
console.log(`[RetryPolicy] Attempt ${attempt + 1} failed, retrying in ${Math.round(delay)}ms`);
|
|
90
|
+
await this.sleep(delay);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`Failed after ${this.config.maxRetries} retries: ${lastError?.message}`);
|
|
95
|
+
}
|
|
96
|
+
isRetryable(error) {
|
|
97
|
+
if (!(error instanceof Error))
|
|
98
|
+
return false;
|
|
99
|
+
const errorName = error.constructor.name;
|
|
100
|
+
return this.config.retryableErrors.some(re => errorName.includes(re) || error.message.includes(re));
|
|
101
|
+
}
|
|
102
|
+
calculateDelay(attempt) {
|
|
103
|
+
const exponentialDelay = this.config.baseDelay * Math.pow(this.config.backoffMultiplier, attempt);
|
|
104
|
+
const jitter = exponentialDelay * 0.25 * (Math.random() * 2 - 1);
|
|
105
|
+
return Math.min(exponentialDelay + jitter, this.config.maxDelay);
|
|
106
|
+
}
|
|
107
|
+
sleep(ms) {
|
|
108
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Resilient dispatcher combining circuit breaker and retry
|
|
112
|
+
export class ResilientDispatcher {
|
|
113
|
+
circuitBreaker;
|
|
114
|
+
retryPolicy;
|
|
115
|
+
tokenBudget;
|
|
116
|
+
constructor(circuitConfig, retryConfig) {
|
|
117
|
+
this.circuitBreaker = new CircuitBreaker({
|
|
118
|
+
failureThreshold: 5,
|
|
119
|
+
successThreshold: 3,
|
|
120
|
+
timeout: 60000,
|
|
121
|
+
...circuitConfig
|
|
122
|
+
});
|
|
123
|
+
this.retryPolicy = new RetryPolicy({
|
|
124
|
+
maxRetries: 3,
|
|
125
|
+
baseDelay: 1000,
|
|
126
|
+
maxDelay: 30000,
|
|
127
|
+
backoffMultiplier: 2,
|
|
128
|
+
retryableErrors: ['RateLimitError', 'TimeoutError', 'NetworkError', 'ECONNREFUSED'],
|
|
129
|
+
...retryConfig
|
|
130
|
+
});
|
|
131
|
+
this.tokenBudget = new TokenBudget();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Dispatch a subagent with resilience
|
|
135
|
+
*/
|
|
136
|
+
async dispatch(config, contract, options) {
|
|
137
|
+
// Check token budget
|
|
138
|
+
const estimatedTokens = TokenBudget.estimateTokens(contract.prompt);
|
|
139
|
+
if (!this.tokenBudget.canAfford(estimatedTokens)) {
|
|
140
|
+
throw new BudgetExceededError();
|
|
141
|
+
}
|
|
142
|
+
return this.circuitBreaker.execute(async () => {
|
|
143
|
+
return await this.retryPolicy.execute(async () => {
|
|
144
|
+
const result = await this.spawnSubagent(config, contract);
|
|
145
|
+
this.tokenBudget.recordUsage(result.tokensUsed || estimatedTokens);
|
|
146
|
+
return this.parseResult(result, contract);
|
|
147
|
+
});
|
|
148
|
+
}, options?.fallback);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Dispatch multiple subagents in parallel with resilience
|
|
152
|
+
*/
|
|
153
|
+
async dispatchParallel(configs, contract) {
|
|
154
|
+
const promises = configs.map(async (config) => {
|
|
155
|
+
try {
|
|
156
|
+
return await this.dispatch(config, contract);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error(`[Dispatcher] Subagent failed:`, error);
|
|
160
|
+
return { success: false, error: error.message };
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
// Use allSettled to ensure one failure doesn't affect others
|
|
164
|
+
const results = await Promise.allSettled(promises);
|
|
165
|
+
return results.map(result => {
|
|
166
|
+
if (result.status === 'fulfilled') {
|
|
167
|
+
return result.value;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
return { success: false, error: result.reason?.message || 'Unknown error' };
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Build fresh prompt with minimal context
|
|
176
|
+
*/
|
|
177
|
+
buildFreshPrompt(contract) {
|
|
178
|
+
// Only include: task description + permissions + output format
|
|
179
|
+
// Exclude: previous subagent outputs, main agent thinking
|
|
180
|
+
return `${contract.prompt}\n\nPermissions: ${JSON.stringify(contract.permissions)}`;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Spawn subagent process
|
|
184
|
+
*/
|
|
185
|
+
async spawnSubagent(config, contract) {
|
|
186
|
+
const startTime = Date.now();
|
|
187
|
+
const freshPrompt = this.buildFreshPrompt(contract);
|
|
188
|
+
return new Promise((resolve, reject) => {
|
|
189
|
+
// Spawn subagent process
|
|
190
|
+
const subagent = spawn('node', ['-e', `
|
|
191
|
+
// Subagent runner - receives prompt via stdin, outputs result via stdout
|
|
192
|
+
const readline = require('readline');
|
|
193
|
+
const rl = readline.createInterface({ input: process.stdin });
|
|
194
|
+
|
|
195
|
+
let prompt = '';
|
|
196
|
+
rl.on('line', (line) => {
|
|
197
|
+
prompt += line + '\n';
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
rl.on('close', async () => {
|
|
201
|
+
// Simulate subagent execution (replace with actual AI call)
|
|
202
|
+
const result = {
|
|
203
|
+
id: '${this.generateId()}',
|
|
204
|
+
role: '${config.role}',
|
|
205
|
+
status: 'success',
|
|
206
|
+
output: JSON.stringify({ result: 'Task completed', prompt }),
|
|
207
|
+
artifacts: [],
|
|
208
|
+
tokensUsed: ${TokenBudget.estimateTokens(freshPrompt)},
|
|
209
|
+
duration: 0,
|
|
210
|
+
errors: []
|
|
211
|
+
};
|
|
212
|
+
console.log(JSON.stringify(result));
|
|
213
|
+
});
|
|
214
|
+
`], {
|
|
215
|
+
env: { ...process.env, CLAUDE_SUBAGENT: '1' },
|
|
216
|
+
timeout: config.timeout || 120000
|
|
217
|
+
});
|
|
218
|
+
let output = '';
|
|
219
|
+
let stderr = '';
|
|
220
|
+
subagent.stdout.on('data', (data) => {
|
|
221
|
+
output += data.toString();
|
|
222
|
+
});
|
|
223
|
+
subagent.stderr.on('data', (data) => {
|
|
224
|
+
stderr += data.toString();
|
|
225
|
+
});
|
|
226
|
+
subagent.on('error', (error) => {
|
|
227
|
+
reject(error);
|
|
228
|
+
});
|
|
229
|
+
subagent.on('close', (code) => {
|
|
230
|
+
const duration = Date.now() - startTime;
|
|
231
|
+
if (code === 0) {
|
|
232
|
+
try {
|
|
233
|
+
const result = JSON.parse(output);
|
|
234
|
+
resolve({
|
|
235
|
+
...result,
|
|
236
|
+
duration
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
resolve({
|
|
241
|
+
id: this.generateId(),
|
|
242
|
+
role: config.role,
|
|
243
|
+
status: 'success',
|
|
244
|
+
output,
|
|
245
|
+
artifacts: [],
|
|
246
|
+
tokensUsed: TokenBudget.estimateTokens(freshPrompt),
|
|
247
|
+
duration,
|
|
248
|
+
errors: []
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
reject(new Error(`Subagent exited with code ${code}: ${stderr}`));
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
// Send prompt
|
|
257
|
+
subagent.stdin.write(freshPrompt);
|
|
258
|
+
subagent.stdin.end();
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Parse subagent result
|
|
263
|
+
*/
|
|
264
|
+
parseResult(result, contract) {
|
|
265
|
+
try {
|
|
266
|
+
const parsed = JSON.parse(result.output);
|
|
267
|
+
return parsed;
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return result.output;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Generate unique ID
|
|
275
|
+
*/
|
|
276
|
+
generateId() {
|
|
277
|
+
return `sub_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get health status
|
|
281
|
+
*/
|
|
282
|
+
getHealth() {
|
|
283
|
+
return {
|
|
284
|
+
circuitState: this.circuitBreaker.getState(),
|
|
285
|
+
tokenUsage: this.tokenBudget.getUsage()
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
export { CircuitState };
|
|
290
|
+
//# sourceMappingURL=dispatcher-enhanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher-enhanced.js","sourceRoot":"","sources":["../../../src/agents/dispatcher-enhanced.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent Dispatcher - Spawns isolated subagents to do all real work
|
|
3
|
+
*
|
|
4
|
+
* Constructs prompts from contracts, manages timeouts, validates outputs,
|
|
5
|
+
* and collects results. Uses a pluggable executor backend so the dispatch
|
|
6
|
+
* mechanism can be swapped (process, HTTP, in-process) without changing
|
|
7
|
+
* the orchestration logic.
|
|
8
|
+
*/
|
|
9
|
+
import type { SubagentConfig, SubagentContract, SubagentResult } from './types.js';
|
|
10
|
+
import type { Logger } from '../types.js';
|
|
11
|
+
export interface ExecutorOptions {
|
|
12
|
+
id: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
timeout?: number;
|
|
15
|
+
workDir?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ExecutorResult {
|
|
18
|
+
output: string;
|
|
19
|
+
tokensUsed: number;
|
|
20
|
+
errors: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface SubagentExecutor {
|
|
23
|
+
execute(prompt: string, options: ExecutorOptions): Promise<ExecutorResult>;
|
|
24
|
+
abort(id: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export interface ProcessExecutorConfig {
|
|
27
|
+
/** CLI command to invoke (default: "claude") */
|
|
28
|
+
command: string;
|
|
29
|
+
/** CLI arguments appended after the prompt */
|
|
30
|
+
args: string[];
|
|
31
|
+
/** Environment variables to forward */
|
|
32
|
+
env: Record<string, string>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a SubagentExecutor that spawns a subprocess for each dispatch.
|
|
36
|
+
*
|
|
37
|
+
* The executor writes the prompt to a temp file, invokes the configured
|
|
38
|
+
* CLI command with `--input-file`, collects stdout/stderr, and cleans up.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createProcessExecutor(config?: Partial<ProcessExecutorConfig>): SubagentExecutor;
|
|
41
|
+
export declare class SubagentDispatcher {
|
|
42
|
+
private readonly executor;
|
|
43
|
+
private readonly logger;
|
|
44
|
+
private readonly activeIds;
|
|
45
|
+
constructor(executor: SubagentExecutor, logger: Logger);
|
|
46
|
+
/**
|
|
47
|
+
* Dispatch a single subagent with the given config and contract.
|
|
48
|
+
*
|
|
49
|
+
* Constructs a structured prompt from the contract, sends it to the
|
|
50
|
+
* executor, validates the output against the optional output schema,
|
|
51
|
+
* and returns a typed SubagentResult.
|
|
52
|
+
*/
|
|
53
|
+
dispatch(config: SubagentConfig, contract: SubagentContract): Promise<SubagentResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Dispatch multiple subagents in parallel.
|
|
56
|
+
*
|
|
57
|
+
* All subagents run concurrently. Use when tasks are independent
|
|
58
|
+
* of each other (e.g. exploring multiple directories at once).
|
|
59
|
+
*/
|
|
60
|
+
dispatchParallel(configs: readonly SubagentConfig[], contracts: readonly SubagentContract[]): Promise<SubagentResult[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Dispatch multiple subagents sequentially.
|
|
63
|
+
*
|
|
64
|
+
* Each subagent receives the output of all previous subagents as
|
|
65
|
+
* additional context. The pipeline stops early if a subagent fails
|
|
66
|
+
* or times out. Use when tasks form a pipeline (e.g. explore ->
|
|
67
|
+
* implement -> review -> verify).
|
|
68
|
+
*/
|
|
69
|
+
dispatchSequential(configs: readonly SubagentConfig[], contracts: readonly SubagentContract[]): Promise<SubagentResult[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Abort a running subagent by its ID.
|
|
72
|
+
*/
|
|
73
|
+
abort(id: string): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Build a structured subagent prompt from config and contract.
|
|
76
|
+
*
|
|
77
|
+
* The prompt follows the Claude Code agent tool pattern: explicit
|
|
78
|
+
* permissions, owned/read file scopes, isolation instructions,
|
|
79
|
+
* token budget, output format requirements, and the task itself.
|
|
80
|
+
*/
|
|
81
|
+
private buildPrompt;
|
|
82
|
+
/**
|
|
83
|
+
* Wraps a promise with a timeout. If the timeout fires first the
|
|
84
|
+
* subagent is aborted and the promise rejects.
|
|
85
|
+
*/
|
|
86
|
+
private withTimeout;
|
|
87
|
+
/**
|
|
88
|
+
* Validate subagent output against an optional schema.
|
|
89
|
+
* The schema is a Record<string, unknown> where values are type strings
|
|
90
|
+
* like "string", "number", "boolean", "object".
|
|
91
|
+
*
|
|
92
|
+
* Returns an array of validation error messages (empty = valid).
|
|
93
|
+
*/
|
|
94
|
+
private validateOutput;
|
|
95
|
+
}
|
|
96
|
+
export interface DispatcherOptions {
|
|
97
|
+
executor?: SubagentExecutor;
|
|
98
|
+
processConfig?: Partial<ProcessExecutorConfig>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create a SubagentDispatcher with sensible defaults.
|
|
102
|
+
*
|
|
103
|
+
* If no executor is provided, a process-based executor is created
|
|
104
|
+
* using `createProcessExecutor` which spawns a CLI command.
|
|
105
|
+
*/
|
|
106
|
+
export declare function createDispatcher(logger: Logger, options?: DispatcherOptions): SubagentDispatcher;
|
|
107
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/agents/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EAIf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAM1C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3E,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAMD,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAQD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM,GAC1C,gBAAgB,CAuFlB;AA2CD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAE5B,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM;IAUtD;;;;;;OAMG;IACG,QAAQ,CACZ,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,cAAc,CAAC;IAuE1B;;;;;OAKG;IACG,gBAAgB,CACpB,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,SAAS,EAAE,SAAS,gBAAgB,EAAE,GACrC,OAAO,CAAC,cAAc,EAAE,CAAC;IA6B5B;;;;;;;OAOG;IACG,kBAAkB,CACtB,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,SAAS,EAAE,SAAS,gBAAgB,EAAE,GACrC,OAAO,CAAC,cAAc,EAAE,CAAC;IAgC5B;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IActC;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAyBnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IA+BnB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;CAyCvB;AAyJD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,kBAAkB,CAIpB"}
|