@yuaone/core 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/LICENSE +663 -0
- package/README.md +15 -0
- package/dist/__tests__/context-manager.test.d.ts +6 -0
- package/dist/__tests__/context-manager.test.d.ts.map +1 -0
- package/dist/__tests__/context-manager.test.js +220 -0
- package/dist/__tests__/context-manager.test.js.map +1 -0
- package/dist/__tests__/governor.test.d.ts +6 -0
- package/dist/__tests__/governor.test.d.ts.map +1 -0
- package/dist/__tests__/governor.test.js +210 -0
- package/dist/__tests__/governor.test.js.map +1 -0
- package/dist/__tests__/model-router.test.d.ts +6 -0
- package/dist/__tests__/model-router.test.d.ts.map +1 -0
- package/dist/__tests__/model-router.test.js +329 -0
- package/dist/__tests__/model-router.test.js.map +1 -0
- package/dist/agent-logger.d.ts +384 -0
- package/dist/agent-logger.d.ts.map +1 -0
- package/dist/agent-logger.js +820 -0
- package/dist/agent-logger.js.map +1 -0
- package/dist/agent-loop.d.ts +163 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +609 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent-modes.d.ts +85 -0
- package/dist/agent-modes.d.ts.map +1 -0
- package/dist/agent-modes.js +418 -0
- package/dist/agent-modes.js.map +1 -0
- package/dist/approval.d.ts +137 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +299 -0
- package/dist/approval.js.map +1 -0
- package/dist/async-completion-queue.d.ts +56 -0
- package/dist/async-completion-queue.d.ts.map +1 -0
- package/dist/async-completion-queue.js +77 -0
- package/dist/async-completion-queue.js.map +1 -0
- package/dist/auto-fix.d.ts +174 -0
- package/dist/auto-fix.d.ts.map +1 -0
- package/dist/auto-fix.js +319 -0
- package/dist/auto-fix.js.map +1 -0
- package/dist/codebase-context.d.ts +396 -0
- package/dist/codebase-context.d.ts.map +1 -0
- package/dist/codebase-context.js +1260 -0
- package/dist/codebase-context.js.map +1 -0
- package/dist/conflict-resolver.d.ts +191 -0
- package/dist/conflict-resolver.d.ts.map +1 -0
- package/dist/conflict-resolver.js +524 -0
- package/dist/conflict-resolver.js.map +1 -0
- package/dist/constants.d.ts +52 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +141 -0
- package/dist/constants.js.map +1 -0
- package/dist/context-budget.d.ts +435 -0
- package/dist/context-budget.d.ts.map +1 -0
- package/dist/context-budget.js +903 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/context-compressor.d.ts +143 -0
- package/dist/context-compressor.d.ts.map +1 -0
- package/dist/context-compressor.js +511 -0
- package/dist/context-compressor.js.map +1 -0
- package/dist/context-manager.d.ts +112 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +247 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/continuous-reflection.d.ts +267 -0
- package/dist/continuous-reflection.d.ts.map +1 -0
- package/dist/continuous-reflection.js +338 -0
- package/dist/continuous-reflection.js.map +1 -0
- package/dist/cross-file-refactor.d.ts +352 -0
- package/dist/cross-file-refactor.d.ts.map +1 -0
- package/dist/cross-file-refactor.js +1544 -0
- package/dist/cross-file-refactor.js.map +1 -0
- package/dist/dag-orchestrator.d.ts +138 -0
- package/dist/dag-orchestrator.d.ts.map +1 -0
- package/dist/dag-orchestrator.js +379 -0
- package/dist/dag-orchestrator.js.map +1 -0
- package/dist/debate-orchestrator.d.ts +301 -0
- package/dist/debate-orchestrator.d.ts.map +1 -0
- package/dist/debate-orchestrator.js +719 -0
- package/dist/debate-orchestrator.js.map +1 -0
- package/dist/dependency-analyzer.d.ts +113 -0
- package/dist/dependency-analyzer.d.ts.map +1 -0
- package/dist/dependency-analyzer.js +444 -0
- package/dist/dependency-analyzer.js.map +1 -0
- package/dist/design-loop.d.ts +59 -0
- package/dist/design-loop.d.ts.map +1 -0
- package/dist/design-loop.js +344 -0
- package/dist/design-loop.js.map +1 -0
- package/dist/doc-intelligence.d.ts +383 -0
- package/dist/doc-intelligence.d.ts.map +1 -0
- package/dist/doc-intelligence.js +1307 -0
- package/dist/doc-intelligence.js.map +1 -0
- package/dist/dynamic-role-generator.d.ts +76 -0
- package/dist/dynamic-role-generator.d.ts.map +1 -0
- package/dist/dynamic-role-generator.js +194 -0
- package/dist/dynamic-role-generator.js.map +1 -0
- package/dist/errors.d.ts +69 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +102 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-bus.d.ts +159 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +305 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/execution-engine.d.ts +425 -0
- package/dist/execution-engine.d.ts.map +1 -0
- package/dist/execution-engine.js +1555 -0
- package/dist/execution-engine.js.map +1 -0
- package/dist/git-intelligence.d.ts +306 -0
- package/dist/git-intelligence.d.ts.map +1 -0
- package/dist/git-intelligence.js +1099 -0
- package/dist/git-intelligence.js.map +1 -0
- package/dist/governor.d.ts +77 -0
- package/dist/governor.d.ts.map +1 -0
- package/dist/governor.js +161 -0
- package/dist/governor.js.map +1 -0
- package/dist/hierarchical-planner.d.ts +313 -0
- package/dist/hierarchical-planner.d.ts.map +1 -0
- package/dist/hierarchical-planner.js +981 -0
- package/dist/hierarchical-planner.js.map +1 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-inference.d.ts +103 -0
- package/dist/intent-inference.d.ts.map +1 -0
- package/dist/intent-inference.js +605 -0
- package/dist/intent-inference.js.map +1 -0
- package/dist/interrupt-manager.d.ts +143 -0
- package/dist/interrupt-manager.d.ts.map +1 -0
- package/dist/interrupt-manager.js +196 -0
- package/dist/interrupt-manager.js.map +1 -0
- package/dist/kernel.d.ts +564 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +1419 -0
- package/dist/kernel.js.map +1 -0
- package/dist/language-support.d.ts +232 -0
- package/dist/language-support.d.ts.map +1 -0
- package/dist/language-support.js +1134 -0
- package/dist/language-support.js.map +1 -0
- package/dist/llm-client.d.ts +82 -0
- package/dist/llm-client.d.ts.map +1 -0
- package/dist/llm-client.js +475 -0
- package/dist/llm-client.js.map +1 -0
- package/dist/mcp-client.d.ts +232 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +718 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/memory-manager.d.ts +200 -0
- package/dist/memory-manager.d.ts.map +1 -0
- package/dist/memory-manager.js +568 -0
- package/dist/memory-manager.js.map +1 -0
- package/dist/memory.d.ts +87 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +341 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +245 -0
- package/dist/model-router.d.ts.map +1 -0
- package/dist/model-router.js +632 -0
- package/dist/model-router.js.map +1 -0
- package/dist/parallel-executor.d.ts +125 -0
- package/dist/parallel-executor.d.ts.map +1 -0
- package/dist/parallel-executor.js +201 -0
- package/dist/parallel-executor.js.map +1 -0
- package/dist/perf-optimizer.d.ts +212 -0
- package/dist/perf-optimizer.d.ts.map +1 -0
- package/dist/perf-optimizer.js +721 -0
- package/dist/perf-optimizer.js.map +1 -0
- package/dist/persona.d.ts +305 -0
- package/dist/persona.d.ts.map +1 -0
- package/dist/persona.js +887 -0
- package/dist/persona.js.map +1 -0
- package/dist/planner.d.ts +70 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +264 -0
- package/dist/planner.js.map +1 -0
- package/dist/qa-pipeline.d.ts +365 -0
- package/dist/qa-pipeline.d.ts.map +1 -0
- package/dist/qa-pipeline.js +1352 -0
- package/dist/qa-pipeline.js.map +1 -0
- package/dist/reasoning-adapter.d.ts +116 -0
- package/dist/reasoning-adapter.d.ts.map +1 -0
- package/dist/reasoning-adapter.js +187 -0
- package/dist/reasoning-adapter.js.map +1 -0
- package/dist/role-registry.d.ts +55 -0
- package/dist/role-registry.d.ts.map +1 -0
- package/dist/role-registry.js +192 -0
- package/dist/role-registry.js.map +1 -0
- package/dist/sandbox-tiers.d.ts +327 -0
- package/dist/sandbox-tiers.d.ts.map +1 -0
- package/dist/sandbox-tiers.js +928 -0
- package/dist/sandbox-tiers.js.map +1 -0
- package/dist/security-scanner.d.ts +222 -0
- package/dist/security-scanner.d.ts.map +1 -0
- package/dist/security-scanner.js +1129 -0
- package/dist/security-scanner.js.map +1 -0
- package/dist/security.d.ts +93 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +393 -0
- package/dist/security.js.map +1 -0
- package/dist/self-reflection.d.ts +397 -0
- package/dist/self-reflection.d.ts.map +1 -0
- package/dist/self-reflection.js +908 -0
- package/dist/self-reflection.js.map +1 -0
- package/dist/session-persistence.d.ts +191 -0
- package/dist/session-persistence.d.ts.map +1 -0
- package/dist/session-persistence.js +395 -0
- package/dist/session-persistence.js.map +1 -0
- package/dist/speculative-executor.d.ts +210 -0
- package/dist/speculative-executor.d.ts.map +1 -0
- package/dist/speculative-executor.js +618 -0
- package/dist/speculative-executor.js.map +1 -0
- package/dist/state-machine.d.ts +289 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +695 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/sub-agent.d.ts +177 -0
- package/dist/sub-agent.d.ts.map +1 -0
- package/dist/sub-agent.js +303 -0
- package/dist/sub-agent.js.map +1 -0
- package/dist/system-prompt.d.ts +26 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +84 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/test-intelligence.d.ts +439 -0
- package/dist/test-intelligence.d.ts.map +1 -0
- package/dist/test-intelligence.js +1165 -0
- package/dist/test-intelligence.js.map +1 -0
- package/dist/types.d.ts +632 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/vector-index.d.ts +314 -0
- package/dist/vector-index.d.ts.map +1 -0
- package/dist/vector-index.js +618 -0
- package/dist/vector-index.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module parallel-executor
|
|
3
|
+
* @description 병렬 실행 관리자 — 다수의 서브 에이전트를 동시성 제한 내에서 병렬 실행.
|
|
4
|
+
*
|
|
5
|
+
* DAGOrchestrator가 의존성 순서를 결정하고, ParallelExecutor는
|
|
6
|
+
* 독립적인 태스크 배치를 maxParallel 제한 내에서 동시에 실행한다.
|
|
7
|
+
*
|
|
8
|
+
* 각 태스크는 격리된 SubAgent로 실행되며,
|
|
9
|
+
* 하나가 실패해도 나머지는 계속 진행한다 (fault isolation).
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from "node:events";
|
|
12
|
+
import type { BYOKConfig, ToolExecutor } from "./types.js";
|
|
13
|
+
import { type SubAgentResult, type DAGContextLike } from "./sub-agent.js";
|
|
14
|
+
/** Configuration for the ParallelExecutor */
|
|
15
|
+
export interface ParallelExecutorConfig {
|
|
16
|
+
/** Maximum number of sub-agents running concurrently */
|
|
17
|
+
maxParallel: number;
|
|
18
|
+
/** Default BYOK configuration for LLM calls (used when no per-task override) */
|
|
19
|
+
byokConfig: BYOKConfig;
|
|
20
|
+
/** Absolute path to the project root */
|
|
21
|
+
projectPath: string;
|
|
22
|
+
/** Factory to create a ToolExecutor scoped to a working directory */
|
|
23
|
+
createToolExecutor: (workDir: string, enabledTools?: string[]) => ToolExecutor;
|
|
24
|
+
/**
|
|
25
|
+
* Optional callback to resolve a per-task BYOK configuration.
|
|
26
|
+
* Called for each task before execution. If it returns a config, that config
|
|
27
|
+
* is used instead of the default `byokConfig`. If not provided or returns
|
|
28
|
+
* undefined, the task's `byokOverride` or the default config is used.
|
|
29
|
+
*
|
|
30
|
+
* Resolution order: task.byokOverride > modelResolver(task) > byokConfig
|
|
31
|
+
*/
|
|
32
|
+
modelResolver?: (task: PlannedTaskLike) => BYOKConfig | undefined;
|
|
33
|
+
}
|
|
34
|
+
/** Task input compatible with PlannedTask from types.ts */
|
|
35
|
+
export interface PlannedTaskLike {
|
|
36
|
+
/** Unique task identifier */
|
|
37
|
+
id: string;
|
|
38
|
+
/** Task goal description */
|
|
39
|
+
goal: string;
|
|
40
|
+
/** Files this task is allowed to write */
|
|
41
|
+
targetFiles: string[];
|
|
42
|
+
/** Files this task may read (read-only) */
|
|
43
|
+
readFiles: string[];
|
|
44
|
+
/** Tool names to enable */
|
|
45
|
+
tools: string[];
|
|
46
|
+
/** Estimated number of iterations */
|
|
47
|
+
estimatedIterations: number;
|
|
48
|
+
/** Priority (0–10, higher = more urgent) */
|
|
49
|
+
priority: number;
|
|
50
|
+
/** Optional per-task BYOK config override */
|
|
51
|
+
byokOverride?: BYOKConfig;
|
|
52
|
+
}
|
|
53
|
+
export interface ParallelExecutorEvents {
|
|
54
|
+
"parallel:start": (taskIds: string[], maxParallel: number) => void;
|
|
55
|
+
"parallel:task_start": (taskId: string) => void;
|
|
56
|
+
"parallel:task_complete": (result: SubAgentResult) => void;
|
|
57
|
+
"parallel:all_complete": (results: SubAgentResult[]) => void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* ParallelExecutor — coordinates multiple sub-agents with concurrency control.
|
|
61
|
+
*
|
|
62
|
+
* Uses a semaphore pattern: maintains a count of running tasks and spawns
|
|
63
|
+
* new ones as slots become available. Tasks within a batch are independent
|
|
64
|
+
* (dependency ordering is handled by the DAGOrchestrator layer above).
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const executor = new ParallelExecutor({
|
|
69
|
+
* maxParallel: 3,
|
|
70
|
+
* byokConfig: { provider: "anthropic", apiKey: "..." },
|
|
71
|
+
* projectPath: "/project",
|
|
72
|
+
* createToolExecutor: (dir, tools) => createExecutor(dir, tools),
|
|
73
|
+
* });
|
|
74
|
+
*
|
|
75
|
+
* executor.on("parallel:task_complete", (result) => {
|
|
76
|
+
* console.log(`${result.taskId}: ${result.success ? "OK" : "FAIL"}`);
|
|
77
|
+
* });
|
|
78
|
+
*
|
|
79
|
+
* const results = await executor.executeBatch(tasks, dagContext);
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare class ParallelExecutor extends EventEmitter {
|
|
83
|
+
private readonly config;
|
|
84
|
+
private readonly runningAgents;
|
|
85
|
+
private abortedAll;
|
|
86
|
+
constructor(config: ParallelExecutorConfig);
|
|
87
|
+
/**
|
|
88
|
+
* Execute multiple tasks in parallel, respecting the max concurrency limit.
|
|
89
|
+
*
|
|
90
|
+
* Tasks are independent — no dependency ordering is performed here
|
|
91
|
+
* (that is the DAGOrchestrator's responsibility). Tasks are sorted by
|
|
92
|
+
* priority (highest first) and launched as concurrency slots open.
|
|
93
|
+
*
|
|
94
|
+
* If one task fails, others continue to completion (fault isolation).
|
|
95
|
+
*
|
|
96
|
+
* @param tasks Array of planned tasks to execute
|
|
97
|
+
* @param dagContext DAG-level context passed to each sub-agent
|
|
98
|
+
* @returns Array of results, one per task, in completion order
|
|
99
|
+
*/
|
|
100
|
+
executeBatch(tasks: PlannedTaskLike[], dagContext: DAGContextLike): Promise<SubAgentResult[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Get the task IDs of currently running sub-agents.
|
|
103
|
+
* @returns Array of task ID strings
|
|
104
|
+
*/
|
|
105
|
+
getRunningTasks(): string[];
|
|
106
|
+
/**
|
|
107
|
+
* Abort all running sub-agents.
|
|
108
|
+
* Each sub-agent will finish its current iteration and then stop.
|
|
109
|
+
*/
|
|
110
|
+
abortAll(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Run a single task as a SubAgent and return the result.
|
|
113
|
+
*/
|
|
114
|
+
/**
|
|
115
|
+
* Resolve the BYOK configuration for a specific task.
|
|
116
|
+
*
|
|
117
|
+
* Resolution order (first non-undefined wins):
|
|
118
|
+
* 1. task.byokOverride — explicit per-task override
|
|
119
|
+
* 2. config.modelResolver(task) — dynamic callback resolution
|
|
120
|
+
* 3. config.byokConfig — batch-level default
|
|
121
|
+
*/
|
|
122
|
+
private resolveByokConfig;
|
|
123
|
+
private runTask;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=parallel-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-executor.d.ts","sourceRoot":"","sources":["../src/parallel-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EAEb,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAIxB,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,UAAU,EAAE,UAAU,CAAC;IACvB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,kBAAkB,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EAAE,KACpB,YAAY,CAAC;IAClB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,UAAU,GAAG,SAAS,CAAC;CACnE;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qCAAqC;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B;AAID,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,wBAAwB,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3D,uBAAuB,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAC9D;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;IAClE,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,sBAAsB;IAK1C;;;;;;;;;;;;OAYG;IACG,YAAY,CAChB,KAAK,EAAE,eAAe,EAAE,EACxB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,cAAc,EAAE,CAAC;IAsF5B;;;OAGG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;;OAGG;IACH,QAAQ,IAAI,IAAI;IAShB;;OAEG;IACH;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;YAMX,OAAO;CAiDtB"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module parallel-executor
|
|
3
|
+
* @description 병렬 실행 관리자 — 다수의 서브 에이전트를 동시성 제한 내에서 병렬 실행.
|
|
4
|
+
*
|
|
5
|
+
* DAGOrchestrator가 의존성 순서를 결정하고, ParallelExecutor는
|
|
6
|
+
* 독립적인 태스크 배치를 maxParallel 제한 내에서 동시에 실행한다.
|
|
7
|
+
*
|
|
8
|
+
* 각 태스크는 격리된 SubAgent로 실행되며,
|
|
9
|
+
* 하나가 실패해도 나머지는 계속 진행한다 (fault isolation).
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from "node:events";
|
|
12
|
+
import { SubAgent, } from "./sub-agent.js";
|
|
13
|
+
// ─── ParallelExecutor Class ───
|
|
14
|
+
/**
|
|
15
|
+
* ParallelExecutor — coordinates multiple sub-agents with concurrency control.
|
|
16
|
+
*
|
|
17
|
+
* Uses a semaphore pattern: maintains a count of running tasks and spawns
|
|
18
|
+
* new ones as slots become available. Tasks within a batch are independent
|
|
19
|
+
* (dependency ordering is handled by the DAGOrchestrator layer above).
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const executor = new ParallelExecutor({
|
|
24
|
+
* maxParallel: 3,
|
|
25
|
+
* byokConfig: { provider: "anthropic", apiKey: "..." },
|
|
26
|
+
* projectPath: "/project",
|
|
27
|
+
* createToolExecutor: (dir, tools) => createExecutor(dir, tools),
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* executor.on("parallel:task_complete", (result) => {
|
|
31
|
+
* console.log(`${result.taskId}: ${result.success ? "OK" : "FAIL"}`);
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* const results = await executor.executeBatch(tasks, dagContext);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export class ParallelExecutor extends EventEmitter {
|
|
38
|
+
config;
|
|
39
|
+
runningAgents = new Map();
|
|
40
|
+
abortedAll = false;
|
|
41
|
+
constructor(config) {
|
|
42
|
+
super();
|
|
43
|
+
this.config = config;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Execute multiple tasks in parallel, respecting the max concurrency limit.
|
|
47
|
+
*
|
|
48
|
+
* Tasks are independent — no dependency ordering is performed here
|
|
49
|
+
* (that is the DAGOrchestrator's responsibility). Tasks are sorted by
|
|
50
|
+
* priority (highest first) and launched as concurrency slots open.
|
|
51
|
+
*
|
|
52
|
+
* If one task fails, others continue to completion (fault isolation).
|
|
53
|
+
*
|
|
54
|
+
* @param tasks Array of planned tasks to execute
|
|
55
|
+
* @param dagContext DAG-level context passed to each sub-agent
|
|
56
|
+
* @returns Array of results, one per task, in completion order
|
|
57
|
+
*/
|
|
58
|
+
async executeBatch(tasks, dagContext) {
|
|
59
|
+
if (tasks.length === 0)
|
|
60
|
+
return [];
|
|
61
|
+
this.abortedAll = false;
|
|
62
|
+
const taskIds = tasks.map((t) => t.id);
|
|
63
|
+
this.emit("parallel:start", taskIds, this.config.maxParallel);
|
|
64
|
+
// Sort by priority descending (higher priority first)
|
|
65
|
+
const sortedTasks = [...tasks].sort((a, b) => b.priority - a.priority);
|
|
66
|
+
const results = [];
|
|
67
|
+
const pending = [...sortedTasks];
|
|
68
|
+
// Use a promise-based semaphore pattern
|
|
69
|
+
const inFlight = new Set();
|
|
70
|
+
while (pending.length > 0 || inFlight.size > 0) {
|
|
71
|
+
if (this.abortedAll) {
|
|
72
|
+
// Drain pending without executing
|
|
73
|
+
for (const task of pending) {
|
|
74
|
+
results.push({
|
|
75
|
+
taskId: task.id,
|
|
76
|
+
success: false,
|
|
77
|
+
summary: "Aborted: parallel executor was cancelled",
|
|
78
|
+
changedFiles: [],
|
|
79
|
+
tokensUsed: { input: 0, output: 0 },
|
|
80
|
+
iterations: 0,
|
|
81
|
+
phase: "cleanup",
|
|
82
|
+
error: "Aborted by orchestrator",
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
pending.length = 0;
|
|
86
|
+
// Wait for in-flight to finish (they were already aborted)
|
|
87
|
+
if (inFlight.size > 0) {
|
|
88
|
+
const remaining = await Promise.allSettled([...inFlight]);
|
|
89
|
+
for (const settled of remaining) {
|
|
90
|
+
if (settled.status === "fulfilled") {
|
|
91
|
+
results.push(settled.value);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
inFlight.clear();
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
// Fill up to maxParallel slots
|
|
99
|
+
while (pending.length > 0 &&
|
|
100
|
+
inFlight.size < this.config.maxParallel &&
|
|
101
|
+
!this.abortedAll) {
|
|
102
|
+
const task = pending.shift();
|
|
103
|
+
const promise = this.runTask(task, dagContext);
|
|
104
|
+
inFlight.add(promise);
|
|
105
|
+
// When this task completes, remove from in-flight and collect result
|
|
106
|
+
promise.then((result) => {
|
|
107
|
+
inFlight.delete(promise);
|
|
108
|
+
results.push(result);
|
|
109
|
+
this.runningAgents.delete(task.id);
|
|
110
|
+
this.emit("parallel:task_complete", result);
|
|
111
|
+
}).catch((err) => {
|
|
112
|
+
inFlight.delete(promise);
|
|
113
|
+
this.runningAgents.delete(task.id);
|
|
114
|
+
this.emit("parallel:task_error", { taskId: task.id, error: err });
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Wait for at least one task to complete before continuing
|
|
118
|
+
if (inFlight.size > 0) {
|
|
119
|
+
await Promise.race([...inFlight]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
this.emit("parallel:all_complete", results);
|
|
123
|
+
return results;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the task IDs of currently running sub-agents.
|
|
127
|
+
* @returns Array of task ID strings
|
|
128
|
+
*/
|
|
129
|
+
getRunningTasks() {
|
|
130
|
+
return [...this.runningAgents.keys()];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Abort all running sub-agents.
|
|
134
|
+
* Each sub-agent will finish its current iteration and then stop.
|
|
135
|
+
*/
|
|
136
|
+
abortAll() {
|
|
137
|
+
this.abortedAll = true;
|
|
138
|
+
for (const [, agent] of this.runningAgents) {
|
|
139
|
+
agent.abort();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// ─── Private ───
|
|
143
|
+
/**
|
|
144
|
+
* Run a single task as a SubAgent and return the result.
|
|
145
|
+
*/
|
|
146
|
+
/**
|
|
147
|
+
* Resolve the BYOK configuration for a specific task.
|
|
148
|
+
*
|
|
149
|
+
* Resolution order (first non-undefined wins):
|
|
150
|
+
* 1. task.byokOverride — explicit per-task override
|
|
151
|
+
* 2. config.modelResolver(task) — dynamic callback resolution
|
|
152
|
+
* 3. config.byokConfig — batch-level default
|
|
153
|
+
*/
|
|
154
|
+
resolveByokConfig(task) {
|
|
155
|
+
return task.byokOverride
|
|
156
|
+
?? this.config.modelResolver?.(task)
|
|
157
|
+
?? this.config.byokConfig;
|
|
158
|
+
}
|
|
159
|
+
async runTask(task, dagContext) {
|
|
160
|
+
const taskByokConfig = this.resolveByokConfig(task);
|
|
161
|
+
const subAgentConfig = {
|
|
162
|
+
taskId: task.id,
|
|
163
|
+
goal: task.goal,
|
|
164
|
+
targetFiles: task.targetFiles,
|
|
165
|
+
readFiles: task.readFiles,
|
|
166
|
+
maxIterations: task.estimatedIterations,
|
|
167
|
+
projectPath: this.config.projectPath,
|
|
168
|
+
byokConfig: taskByokConfig,
|
|
169
|
+
tools: task.tools,
|
|
170
|
+
createToolExecutor: this.config.createToolExecutor,
|
|
171
|
+
priority: task.priority,
|
|
172
|
+
};
|
|
173
|
+
const agent = new SubAgent(subAgentConfig);
|
|
174
|
+
this.runningAgents.set(task.id, agent);
|
|
175
|
+
// Forward sub-agent events
|
|
176
|
+
agent.on("subagent:phase", (taskId, phase) => {
|
|
177
|
+
this.emit("subagent:phase", taskId, phase);
|
|
178
|
+
});
|
|
179
|
+
agent.on("subagent:iteration", (taskId, index, tokens) => {
|
|
180
|
+
this.emit("subagent:iteration", taskId, index, tokens);
|
|
181
|
+
});
|
|
182
|
+
this.emit("parallel:task_start", task.id);
|
|
183
|
+
try {
|
|
184
|
+
return await agent.run(dagContext);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
188
|
+
return {
|
|
189
|
+
taskId: task.id,
|
|
190
|
+
success: false,
|
|
191
|
+
summary: `Unexpected error: ${errorMessage}`,
|
|
192
|
+
changedFiles: [],
|
|
193
|
+
tokensUsed: { input: 0, output: 0 },
|
|
194
|
+
iterations: 0,
|
|
195
|
+
phase: "cleanup",
|
|
196
|
+
error: errorMessage,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=parallel-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-executor.js","sourceRoot":"","sources":["../src/parallel-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module perf-optimizer
|
|
3
|
+
* @description YUAN Performance Optimizer — monitors and optimizes agent execution performance.
|
|
4
|
+
*
|
|
5
|
+
* Provides:
|
|
6
|
+
* - Execution timing per phase and tool call
|
|
7
|
+
* - Token budget tracking and waste detection
|
|
8
|
+
* - Parallelization hint generation from task dependency graphs
|
|
9
|
+
* - Content-addressable caching for tool calls and LLM responses
|
|
10
|
+
* - Human-readable performance reports with efficiency scoring
|
|
11
|
+
*
|
|
12
|
+
* Only depends on Node builtins (crypto for cache keys).
|
|
13
|
+
*/
|
|
14
|
+
/** A single performance metric sample */
|
|
15
|
+
export interface PerfMetric {
|
|
16
|
+
name: string;
|
|
17
|
+
category: "timing" | "tokens" | "cache" | "parallel";
|
|
18
|
+
value: number;
|
|
19
|
+
unit: string;
|
|
20
|
+
timestamp: number;
|
|
21
|
+
}
|
|
22
|
+
/** Aggregated metrics for a single execution phase */
|
|
23
|
+
export interface PhaseMetrics {
|
|
24
|
+
phase: string;
|
|
25
|
+
startTime: number;
|
|
26
|
+
endTime: number;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
tokensUsed: {
|
|
29
|
+
input: number;
|
|
30
|
+
output: number;
|
|
31
|
+
};
|
|
32
|
+
toolCalls: number;
|
|
33
|
+
cacheHits: number;
|
|
34
|
+
cacheMisses: number;
|
|
35
|
+
}
|
|
36
|
+
/** Identified performance bottleneck with actionable suggestion */
|
|
37
|
+
export interface BottleneckInfo {
|
|
38
|
+
phase: string;
|
|
39
|
+
issue: string;
|
|
40
|
+
impact: "high" | "medium" | "low";
|
|
41
|
+
suggestion: string;
|
|
42
|
+
estimatedSavingMs?: number;
|
|
43
|
+
}
|
|
44
|
+
/** A single entry in the tool/response cache */
|
|
45
|
+
export interface CacheEntry {
|
|
46
|
+
key: string;
|
|
47
|
+
value: unknown;
|
|
48
|
+
hits: number;
|
|
49
|
+
createdAt: number;
|
|
50
|
+
lastAccessedAt: number;
|
|
51
|
+
sizeBytes: number;
|
|
52
|
+
}
|
|
53
|
+
/** Suggestion for tasks that could benefit from parallel execution */
|
|
54
|
+
export interface ParallelHint {
|
|
55
|
+
taskIds: string[];
|
|
56
|
+
currentSequentialMs: number;
|
|
57
|
+
estimatedParallelMs: number;
|
|
58
|
+
speedupFactor: number;
|
|
59
|
+
}
|
|
60
|
+
/** Complete performance report for a session */
|
|
61
|
+
export interface PerfReport {
|
|
62
|
+
sessionId: string;
|
|
63
|
+
totalDurationMs: number;
|
|
64
|
+
phases: PhaseMetrics[];
|
|
65
|
+
bottlenecks: BottleneckInfo[];
|
|
66
|
+
cacheStats: {
|
|
67
|
+
hits: number;
|
|
68
|
+
misses: number;
|
|
69
|
+
hitRate: number;
|
|
70
|
+
savedMs: number;
|
|
71
|
+
};
|
|
72
|
+
parallelHints: ParallelHint[];
|
|
73
|
+
tokenSummary: {
|
|
74
|
+
total: number;
|
|
75
|
+
byPhase: Record<string, number>;
|
|
76
|
+
wasteEstimate: number;
|
|
77
|
+
};
|
|
78
|
+
efficiencyScore: number;
|
|
79
|
+
suggestions: string[];
|
|
80
|
+
}
|
|
81
|
+
/** Configuration for PerfOptimizer */
|
|
82
|
+
export interface PerfOptimizerConfig {
|
|
83
|
+
/** Enable tool call caching (default: true) */
|
|
84
|
+
enableCaching?: boolean;
|
|
85
|
+
/** Maximum number of cache entries (default: 500) */
|
|
86
|
+
maxCacheSize?: number;
|
|
87
|
+
/** Maximum cache memory in bytes (default: 50MB) */
|
|
88
|
+
maxCacheMemory?: number;
|
|
89
|
+
/** Track parallelization opportunities (default: true) */
|
|
90
|
+
trackParallelHints?: boolean;
|
|
91
|
+
/** Phase is a bottleneck if it takes > X% of total time (default: 40) */
|
|
92
|
+
bottleneckThresholdPercent?: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Monitors and optimizes agent execution performance.
|
|
96
|
+
*
|
|
97
|
+
* Tracks phase timing, token usage, tool call durations, and caching.
|
|
98
|
+
* Generates actionable performance reports with bottleneck identification,
|
|
99
|
+
* parallelization hints, and an overall efficiency score.
|
|
100
|
+
*/
|
|
101
|
+
export declare class PerfOptimizer {
|
|
102
|
+
private readonly config;
|
|
103
|
+
private activePhases;
|
|
104
|
+
private completedPhases;
|
|
105
|
+
private toolCallRecords;
|
|
106
|
+
private metrics;
|
|
107
|
+
private cache;
|
|
108
|
+
private totalCacheMemory;
|
|
109
|
+
private globalCacheHits;
|
|
110
|
+
private globalCacheMisses;
|
|
111
|
+
private previousRunDurations;
|
|
112
|
+
constructor(config?: PerfOptimizerConfig);
|
|
113
|
+
/**
|
|
114
|
+
* Mark the start of an execution phase.
|
|
115
|
+
* @param phase - Phase name (e.g. "analyze", "plan", "implement", "verify", "fix")
|
|
116
|
+
*/
|
|
117
|
+
startPhase(phase: string): void;
|
|
118
|
+
/**
|
|
119
|
+
* Mark the end of an execution phase.
|
|
120
|
+
* @param phase - Phase name that was previously started
|
|
121
|
+
* @param tokens - Optional token usage for this phase
|
|
122
|
+
*/
|
|
123
|
+
endPhase(phase: string, tokens?: {
|
|
124
|
+
input: number;
|
|
125
|
+
output: number;
|
|
126
|
+
}): void;
|
|
127
|
+
/**
|
|
128
|
+
* Record a tool call with its duration.
|
|
129
|
+
* Automatically tracks cache hits/misses for the active phase.
|
|
130
|
+
* @param tool - Tool name
|
|
131
|
+
* @param input - Tool input (used for cache key generation)
|
|
132
|
+
* @param durationMs - How long the tool call took
|
|
133
|
+
*/
|
|
134
|
+
recordToolCall(tool: string, input: unknown, durationMs: number): void;
|
|
135
|
+
/**
|
|
136
|
+
* Record token usage for a specific phase.
|
|
137
|
+
* @param phase - Phase name
|
|
138
|
+
* @param input - Input tokens consumed
|
|
139
|
+
* @param output - Output tokens generated
|
|
140
|
+
*/
|
|
141
|
+
recordTokenUsage(phase: string, input: number, output: number): void;
|
|
142
|
+
/**
|
|
143
|
+
* Retrieve a cached tool call result.
|
|
144
|
+
* @param tool - Tool name
|
|
145
|
+
* @param input - Tool input
|
|
146
|
+
* @returns Cached result or undefined if not found
|
|
147
|
+
*/
|
|
148
|
+
getCached(tool: string, input: unknown): unknown | undefined;
|
|
149
|
+
/**
|
|
150
|
+
* Store a tool call result in the cache.
|
|
151
|
+
* Automatically evicts LRU entries when limits are exceeded.
|
|
152
|
+
* @param tool - Tool name
|
|
153
|
+
* @param input - Tool input
|
|
154
|
+
* @param result - Result to cache
|
|
155
|
+
*/
|
|
156
|
+
setCached(tool: string, input: unknown, result: unknown): void;
|
|
157
|
+
/**
|
|
158
|
+
* Clear all cached entries.
|
|
159
|
+
*/
|
|
160
|
+
clearCache(): void;
|
|
161
|
+
/**
|
|
162
|
+
* Identify execution bottlenecks based on phase timing and token usage.
|
|
163
|
+
* @returns Array of bottleneck descriptions with suggestions
|
|
164
|
+
*/
|
|
165
|
+
getBottlenecks(): BottleneckInfo[];
|
|
166
|
+
/**
|
|
167
|
+
* Analyze a task dependency graph and identify parallelization opportunities.
|
|
168
|
+
* @param taskDeps - Map of taskId → array of dependency taskIds
|
|
169
|
+
* @returns Array of parallelization hints with estimated speedup
|
|
170
|
+
*/
|
|
171
|
+
getParallelHints(taskDeps: Map<string, string[]>): ParallelHint[];
|
|
172
|
+
/**
|
|
173
|
+
* Calculate an overall efficiency score (0-100) based on multiple factors.
|
|
174
|
+
* @returns Efficiency score where 100 is optimal
|
|
175
|
+
*/
|
|
176
|
+
getEfficiencyScore(): number;
|
|
177
|
+
/**
|
|
178
|
+
* Generate a complete performance report for the session.
|
|
179
|
+
* @param sessionId - Session identifier
|
|
180
|
+
* @returns Structured performance report
|
|
181
|
+
*/
|
|
182
|
+
generateReport(sessionId: string): PerfReport;
|
|
183
|
+
/**
|
|
184
|
+
* Format a performance report as a human-readable string.
|
|
185
|
+
* @param report - Report to format
|
|
186
|
+
* @returns Multi-line formatted string
|
|
187
|
+
*/
|
|
188
|
+
formatReport(report: PerfReport): string;
|
|
189
|
+
/**
|
|
190
|
+
* Store current run duration for future historical comparison, then reset all state.
|
|
191
|
+
*/
|
|
192
|
+
reset(): void;
|
|
193
|
+
/** Add a metric, bounded by MAX_METRICS */
|
|
194
|
+
private addMetric;
|
|
195
|
+
/** Compute total duration from completed phases */
|
|
196
|
+
private getTotalDuration;
|
|
197
|
+
/** Generate a content-addressable hash for tool+input */
|
|
198
|
+
private hashInput;
|
|
199
|
+
/** Evict LRU cache entries until there's room */
|
|
200
|
+
private evictIfNeeded;
|
|
201
|
+
/** Remove the least recently used cache entry */
|
|
202
|
+
private evictLRU;
|
|
203
|
+
/** Count tool calls with duplicate inputs */
|
|
204
|
+
private countDuplicateToolCalls;
|
|
205
|
+
/** Estimate wasted tokens from redundant tool calls */
|
|
206
|
+
private estimateTokenWaste;
|
|
207
|
+
/** Generate actionable suggestions from bottleneck analysis */
|
|
208
|
+
private generateSuggestions;
|
|
209
|
+
/** Format milliseconds as human-readable string */
|
|
210
|
+
private formatMs;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=perf-optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-optimizer.d.ts","sourceRoot":"","sources":["../src/perf-optimizer.ts"],"names":[],"mappings":"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"}
|