@yuaone/core 0.9.8 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/context-manager.test.js +5 -9
- package/dist/__tests__/context-manager.test.js.map +1 -1
- package/dist/agent-coordinator.d.ts +172 -0
- package/dist/agent-coordinator.d.ts.map +1 -0
- package/dist/agent-coordinator.js +390 -0
- package/dist/agent-coordinator.js.map +1 -0
- package/dist/agent-loop.d.ts +83 -39
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +694 -471
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent-reputation.d.ts +72 -0
- package/dist/agent-reputation.d.ts.map +1 -0
- package/dist/agent-reputation.js +222 -0
- package/dist/agent-reputation.js.map +1 -0
- package/dist/arch-summarizer.d.ts +48 -0
- package/dist/arch-summarizer.d.ts.map +1 -0
- package/dist/arch-summarizer.js +239 -0
- package/dist/arch-summarizer.js.map +1 -0
- package/dist/autonomous/explicit-planner.d.ts +45 -0
- package/dist/autonomous/explicit-planner.d.ts.map +1 -0
- package/dist/autonomous/explicit-planner.js +99 -0
- package/dist/autonomous/explicit-planner.js.map +1 -0
- package/dist/autonomous/incident-debugger.d.ts +78 -0
- package/dist/autonomous/incident-debugger.d.ts.map +1 -0
- package/dist/autonomous/incident-debugger.js +324 -0
- package/dist/autonomous/incident-debugger.js.map +1 -0
- package/dist/autonomous/index.d.ts +15 -0
- package/dist/autonomous/index.d.ts.map +1 -0
- package/dist/autonomous/index.js +10 -0
- package/dist/autonomous/index.js.map +1 -0
- package/dist/autonomous/patch-tournament.d.ts +82 -0
- package/dist/autonomous/patch-tournament.d.ts.map +1 -0
- package/dist/autonomous/patch-tournament.js +150 -0
- package/dist/autonomous/patch-tournament.js.map +1 -0
- package/dist/autonomous/research-agent.d.ts +66 -0
- package/dist/autonomous/research-agent.d.ts.map +1 -0
- package/dist/autonomous/research-agent.js +210 -0
- package/dist/autonomous/research-agent.js.map +1 -0
- package/dist/autonomous/task-memory.d.ts +63 -0
- package/dist/autonomous/task-memory.d.ts.map +1 -0
- package/dist/autonomous/task-memory.js +143 -0
- package/dist/autonomous/task-memory.js.map +1 -0
- package/dist/budget-governor-v2.d.ts +93 -0
- package/dist/budget-governor-v2.d.ts.map +1 -0
- package/dist/budget-governor-v2.js +345 -0
- package/dist/budget-governor-v2.js.map +1 -0
- package/dist/capability-graph.d.ts +102 -0
- package/dist/capability-graph.d.ts.map +1 -0
- package/dist/capability-graph.js +397 -0
- package/dist/capability-graph.js.map +1 -0
- package/dist/capability-self-model.d.ts +144 -0
- package/dist/capability-self-model.d.ts.map +1 -0
- package/dist/capability-self-model.js +312 -0
- package/dist/capability-self-model.js.map +1 -0
- package/dist/checkpoint-manager.d.ts +94 -0
- package/dist/checkpoint-manager.d.ts.map +1 -0
- package/dist/checkpoint-manager.js +225 -0
- package/dist/checkpoint-manager.js.map +1 -0
- package/dist/continuation-engine.js +1 -1
- package/dist/continuation-engine.js.map +1 -1
- package/dist/dag-orchestrator.d.ts +0 -3
- package/dist/dag-orchestrator.d.ts.map +1 -1
- package/dist/dag-orchestrator.js +0 -1
- package/dist/dag-orchestrator.js.map +1 -1
- package/dist/evidence-chain.d.ts +99 -0
- package/dist/evidence-chain.d.ts.map +1 -0
- package/dist/evidence-chain.js +200 -0
- package/dist/evidence-chain.js.map +1 -0
- package/dist/execution-engine.d.ts.map +1 -1
- package/dist/execution-engine.js +0 -1
- package/dist/execution-engine.js.map +1 -1
- package/dist/failure-signature-memory.d.ts +61 -0
- package/dist/failure-signature-memory.d.ts.map +1 -0
- package/dist/failure-signature-memory.js +278 -0
- package/dist/failure-signature-memory.js.map +1 -0
- package/dist/index.d.ts +52 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -7
- package/dist/index.js.map +1 -1
- package/dist/language-detector.d.ts.map +1 -1
- package/dist/language-detector.js +122 -43
- package/dist/language-detector.js.map +1 -1
- package/dist/llm-client.d.ts +0 -7
- package/dist/llm-client.d.ts.map +1 -1
- package/dist/llm-client.js +15 -122
- package/dist/llm-client.js.map +1 -1
- package/dist/mcp-client.js +1 -1
- package/dist/mcp-client.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +0 -15
- package/dist/memory.js.map +1 -1
- package/dist/meta-learning-collector.d.ts +64 -0
- package/dist/meta-learning-collector.d.ts.map +1 -0
- package/dist/meta-learning-collector.js +169 -0
- package/dist/meta-learning-collector.js.map +1 -0
- package/dist/meta-learning-engine.d.ts +61 -0
- package/dist/meta-learning-engine.d.ts.map +1 -0
- package/dist/meta-learning-engine.js +250 -0
- package/dist/meta-learning-engine.js.map +1 -0
- package/dist/overhead-governor.d.ts +105 -0
- package/dist/overhead-governor.d.ts.map +1 -0
- package/dist/overhead-governor.js +239 -0
- package/dist/overhead-governor.js.map +1 -0
- package/dist/playbook-library.d.ts +75 -0
- package/dist/playbook-library.d.ts.map +1 -0
- package/dist/playbook-library.js +241 -0
- package/dist/playbook-library.js.map +1 -0
- package/dist/project-executive.d.ts +97 -0
- package/dist/project-executive.d.ts.map +1 -0
- package/dist/project-executive.js +223 -0
- package/dist/project-executive.js.map +1 -0
- package/dist/reasoning-adapter.d.ts.map +1 -1
- package/dist/reasoning-adapter.js +11 -36
- package/dist/reasoning-adapter.js.map +1 -1
- package/dist/research-loop.d.ts +79 -0
- package/dist/research-loop.d.ts.map +1 -0
- package/dist/research-loop.js +363 -0
- package/dist/research-loop.js.map +1 -0
- package/dist/resolve-memory-path.d.ts +32 -0
- package/dist/resolve-memory-path.d.ts.map +1 -0
- package/dist/resolve-memory-path.js +97 -0
- package/dist/resolve-memory-path.js.map +1 -0
- package/dist/safe-bounds.d.ts +101 -0
- package/dist/safe-bounds.d.ts.map +1 -0
- package/dist/safe-bounds.js +140 -0
- package/dist/safe-bounds.js.map +1 -0
- package/dist/sandbox-tiers.d.ts +5 -0
- package/dist/sandbox-tiers.d.ts.map +1 -1
- package/dist/sandbox-tiers.js +14 -6
- package/dist/sandbox-tiers.js.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +3 -0
- package/dist/security.js.map +1 -1
- package/dist/self-improvement-loop.d.ts +64 -0
- package/dist/self-improvement-loop.d.ts.map +1 -0
- package/dist/self-improvement-loop.js +156 -0
- package/dist/self-improvement-loop.js.map +1 -0
- package/dist/session-persistence.d.ts +5 -0
- package/dist/session-persistence.d.ts.map +1 -1
- package/dist/session-persistence.js +19 -3
- package/dist/session-persistence.js.map +1 -1
- package/dist/skill-loader.d.ts +16 -9
- package/dist/skill-loader.d.ts.map +1 -1
- package/dist/skill-loader.js +52 -116
- package/dist/skill-loader.js.map +1 -1
- package/dist/skill-registry.d.ts +60 -0
- package/dist/skill-registry.d.ts.map +1 -0
- package/dist/skill-registry.js +162 -0
- package/dist/skill-registry.js.map +1 -0
- package/dist/stall-detector.d.ts +56 -0
- package/dist/stall-detector.d.ts.map +1 -0
- package/dist/stall-detector.js +142 -0
- package/dist/stall-detector.js.map +1 -0
- package/dist/strategy-learner.d.ts +57 -0
- package/dist/strategy-learner.d.ts.map +1 -0
- package/dist/strategy-learner.js +160 -0
- package/dist/strategy-learner.js.map +1 -0
- package/dist/strategy-market.d.ts +73 -0
- package/dist/strategy-market.d.ts.map +1 -0
- package/dist/strategy-market.js +200 -0
- package/dist/strategy-market.js.map +1 -0
- package/dist/sub-agent.d.ts +0 -3
- package/dist/sub-agent.d.ts.map +1 -1
- package/dist/sub-agent.js +0 -10
- package/dist/sub-agent.js.map +1 -1
- package/dist/system-prompt.d.ts +0 -2
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +97 -490
- package/dist/system-prompt.js.map +1 -1
- package/dist/task-classifier.d.ts.map +1 -1
- package/dist/task-classifier.js +2 -54
- package/dist/task-classifier.js.map +1 -1
- package/dist/tool-synthesizer.d.ts +149 -0
- package/dist/tool-synthesizer.d.ts.map +1 -0
- package/dist/tool-synthesizer.js +455 -0
- package/dist/tool-synthesizer.js.map +1 -0
- package/dist/trace-pattern-extractor.d.ts +76 -0
- package/dist/trace-pattern-extractor.d.ts.map +1 -0
- package/dist/trace-pattern-extractor.js +321 -0
- package/dist/trace-pattern-extractor.js.map +1 -0
- package/dist/trace-recorder.d.ts +38 -0
- package/dist/trace-recorder.d.ts.map +1 -0
- package/dist/trace-recorder.js +94 -0
- package/dist/trace-recorder.js.map +1 -0
- package/dist/trust-economics.d.ts +50 -0
- package/dist/trust-economics.d.ts.map +1 -0
- package/dist/trust-economics.js +148 -0
- package/dist/trust-economics.js.map +1 -0
- package/dist/types.d.ts +273 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/yuan-md-loader.d.ts +22 -0
- package/dist/yuan-md-loader.d.ts.map +1 -0
- package/dist/yuan-md-loader.js +75 -0
- package/dist/yuan-md-loader.js.map +1 -0
- package/package.json +1 -1
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
import { describe, it } from "node:test";
|
|
6
6
|
import assert from "node:assert/strict";
|
|
7
7
|
import { ContextManager } from "../context-manager.js";
|
|
8
|
-
import { ContextOverflowError } from "../errors.js";
|
|
9
8
|
// ─── Helpers ───
|
|
10
9
|
function makeManager(overrides = {}) {
|
|
11
10
|
return new ContextManager({
|
|
@@ -190,8 +189,8 @@ describe("ContextManager", () => {
|
|
|
190
189
|
const tokensWith = cm.estimateTokens(withTools);
|
|
191
190
|
assert.ok(tokensWith > tokensWithout, "Messages with tool calls should have higher token count");
|
|
192
191
|
});
|
|
193
|
-
// === 13.
|
|
194
|
-
it("
|
|
192
|
+
// === 13. Emergency trim when compaction is insufficient ===
|
|
193
|
+
it("returns trimmed messages when even compaction cannot fit", () => {
|
|
195
194
|
// Extremely small limit
|
|
196
195
|
const cm = makeManager({
|
|
197
196
|
maxContextTokens: 20,
|
|
@@ -201,12 +200,9 @@ describe("ContextManager", () => {
|
|
|
201
200
|
// Add a system message and a very long user message
|
|
202
201
|
cm.addMessage(makeSystemMessage("System prompt that is fairly long to exceed the tiny limit we set."));
|
|
203
202
|
cm.addMessage(makeUserMessage("x".repeat(500)));
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
assert.ok(err.maxTokens > 0);
|
|
208
|
-
return true;
|
|
209
|
-
});
|
|
203
|
+
// prepareForLLM no longer throws — it emergency-trims instead
|
|
204
|
+
const result = cm.prepareForLLM();
|
|
205
|
+
assert.ok(Array.isArray(result), "should return an array");
|
|
210
206
|
});
|
|
211
207
|
// === 14. Compression preserves head and tail ===
|
|
212
208
|
it("compression keeps head and tail of long tool results", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/context-manager.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAc,MAAM,WAAW,CAAC;AACrD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,cAAc,EAA6B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/context-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module agent-coordinator
|
|
3
|
+
* @description Role-aware multi-agent coordinator.
|
|
4
|
+
*
|
|
5
|
+
* Sits above individual agent loops. Routes tasks to appropriate role agents,
|
|
6
|
+
* prevents resource conflicts, collects/merges results, enforces budget and
|
|
7
|
+
* approval constraints.
|
|
8
|
+
*
|
|
9
|
+
* Relationship to DAGOrchestrator:
|
|
10
|
+
* - DAGOrchestrator: raw DAG execution, parallel task scheduling, retry logic
|
|
11
|
+
* - AgentCoordinator: role routing, resource conflict prevention, budget
|
|
12
|
+
* enforcement, task history persistence — the orchestration layer
|
|
13
|
+
*/
|
|
14
|
+
import { EventEmitter } from "node:events";
|
|
15
|
+
import type { RoleAgentType } from "./agent-reputation.js";
|
|
16
|
+
export type { RoleAgentType } from "./agent-reputation.js";
|
|
17
|
+
export interface CoordinatorTask {
|
|
18
|
+
/** Unique task ID */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Human-readable goal for the agent */
|
|
21
|
+
goal: string;
|
|
22
|
+
/** Classifier-style task type (e.g. "feature", "security", "test") */
|
|
23
|
+
taskType: string;
|
|
24
|
+
/** Optional execution environment hint */
|
|
25
|
+
environment?: string;
|
|
26
|
+
/** Which role agent should handle this task */
|
|
27
|
+
requiredRole: RoleAgentType;
|
|
28
|
+
/** Execution priority */
|
|
29
|
+
priority: "high" | "normal" | "low";
|
|
30
|
+
/** Per-task wall-time limit in ms (default: no limit) */
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
/** Max tokens this task is allowed to consume */
|
|
33
|
+
budgetTokens?: number;
|
|
34
|
+
/** Task IDs that must complete successfully before this task can run */
|
|
35
|
+
dependencies?: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface CoordinatorResult {
|
|
38
|
+
taskId: string;
|
|
39
|
+
role: RoleAgentType;
|
|
40
|
+
outcome: "success" | "failure" | "skipped" | "timeout";
|
|
41
|
+
output: string;
|
|
42
|
+
tokenUsed: number;
|
|
43
|
+
latencyMs: number;
|
|
44
|
+
/** Resource IDs that were in conflict when this task started */
|
|
45
|
+
conflicts: string[];
|
|
46
|
+
}
|
|
47
|
+
export interface CoordinatorConfig {
|
|
48
|
+
/** Max concurrent tasks. Default: 1 (sequential — prevents conflicts) */
|
|
49
|
+
maxConcurrent?: number;
|
|
50
|
+
/** How long a resource lock stays active in ms. Default: 30000 */
|
|
51
|
+
conflictWindowMs?: number;
|
|
52
|
+
/** Directory for task history storage. Default: ~/.yuan/coordinator */
|
|
53
|
+
storageDir?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Routes tasks to specialized role agents, prevents resource conflicts,
|
|
57
|
+
* and persists task history for audit and analysis.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const coordinator = new AgentCoordinator();
|
|
62
|
+
*
|
|
63
|
+
* const result = await coordinator.dispatch(
|
|
64
|
+
* {
|
|
65
|
+
* id: "task-1",
|
|
66
|
+
* goal: "Implement user authentication",
|
|
67
|
+
* taskType: "feature",
|
|
68
|
+
* requiredRole: "coder",
|
|
69
|
+
* priority: "high",
|
|
70
|
+
* timeoutMs: 120_000,
|
|
71
|
+
* },
|
|
72
|
+
* async (goal, role) => {
|
|
73
|
+
* // Call your actual agent loop here
|
|
74
|
+
* return agentLoop.run(goal, role);
|
|
75
|
+
* }
|
|
76
|
+
* );
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare class AgentCoordinator extends EventEmitter {
|
|
80
|
+
private readonly maxConcurrent;
|
|
81
|
+
private readonly conflictWindowMs;
|
|
82
|
+
private readonly storageFile;
|
|
83
|
+
/** resource ID → lock info */
|
|
84
|
+
private readonly locks;
|
|
85
|
+
/** Currently executing task IDs */
|
|
86
|
+
private readonly activeTasks;
|
|
87
|
+
/** Completed task IDs in this session (used for dependency checks) */
|
|
88
|
+
private readonly completedIds;
|
|
89
|
+
/** Failed task IDs in this session (used to skip dependents) */
|
|
90
|
+
private readonly failedIds;
|
|
91
|
+
constructor(config?: CoordinatorConfig);
|
|
92
|
+
/**
|
|
93
|
+
* Dispatch a single task to the appropriate role agent.
|
|
94
|
+
*
|
|
95
|
+
* Steps:
|
|
96
|
+
* 1. Verify dependencies are complete
|
|
97
|
+
* 2. Check for resource conflicts (goal keywords as resource IDs)
|
|
98
|
+
* 3. Lock resources
|
|
99
|
+
* 4. Execute runAgent with optional timeout
|
|
100
|
+
* 5. Release locks
|
|
101
|
+
* 6. Persist to history
|
|
102
|
+
* 7. Emit events and return result
|
|
103
|
+
*
|
|
104
|
+
* @param task - Task to execute
|
|
105
|
+
* @param runAgent - Caller-provided execution function
|
|
106
|
+
*/
|
|
107
|
+
dispatch(task: CoordinatorTask, runAgent: (goal: string, role: RoleAgentType) => Promise<string>): Promise<CoordinatorResult>;
|
|
108
|
+
/**
|
|
109
|
+
* Dispatch multiple tasks in dependency order (topological sort).
|
|
110
|
+
*
|
|
111
|
+
* Respects maxConcurrent (default 1 = sequential). Skips tasks whose
|
|
112
|
+
* dependencies have failed.
|
|
113
|
+
*
|
|
114
|
+
* @param tasks - List of tasks; may include cross-task dependencies
|
|
115
|
+
* @param runAgent - Caller-provided execution function
|
|
116
|
+
*/
|
|
117
|
+
dispatchBatch(tasks: CoordinatorTask[], runAgent: (goal: string, role: RoleAgentType) => Promise<string>): Promise<CoordinatorResult[]>;
|
|
118
|
+
/**
|
|
119
|
+
* Check whether a resource is currently locked by another task.
|
|
120
|
+
*
|
|
121
|
+
* A lock is considered active if it exists and has not expired.
|
|
122
|
+
*
|
|
123
|
+
* @param resourceId - Resource identifier to check
|
|
124
|
+
*/
|
|
125
|
+
isConflict(resourceId: string): boolean;
|
|
126
|
+
/**
|
|
127
|
+
* Acquire an exclusive lock on a resource for the given task.
|
|
128
|
+
* Overwrites any existing (possibly expired) lock.
|
|
129
|
+
*
|
|
130
|
+
* @param resourceId - Resource to lock
|
|
131
|
+
* @param taskId - Task acquiring the lock
|
|
132
|
+
*/
|
|
133
|
+
lockResource(resourceId: string, taskId: string): void;
|
|
134
|
+
/**
|
|
135
|
+
* Release a resource lock.
|
|
136
|
+
*
|
|
137
|
+
* @param resourceId - Resource to unlock
|
|
138
|
+
*/
|
|
139
|
+
releaseResource(resourceId: string): void;
|
|
140
|
+
/**
|
|
141
|
+
* Get all currently executing tasks.
|
|
142
|
+
*/
|
|
143
|
+
getActiveTasks(): CoordinatorTask[];
|
|
144
|
+
/**
|
|
145
|
+
* Return dependency task IDs that have not yet completed.
|
|
146
|
+
*/
|
|
147
|
+
private getUnmetDependencies;
|
|
148
|
+
/**
|
|
149
|
+
* Extract resource IDs from a goal string.
|
|
150
|
+
* Uses significant words (>3 chars, non-common) as resource keys.
|
|
151
|
+
* This is a lightweight heuristic — callers can pre-lock specific resources
|
|
152
|
+
* with lockResource() for precise control.
|
|
153
|
+
*/
|
|
154
|
+
private extractResourceIds;
|
|
155
|
+
/**
|
|
156
|
+
* Topological sort of tasks by their dependency graph.
|
|
157
|
+
* Tasks with no dependencies come first; tasks with satisfied dependencies
|
|
158
|
+
* come after their prerequisites.
|
|
159
|
+
* Ties broken by priority (high > normal > low) then by original order.
|
|
160
|
+
*/
|
|
161
|
+
private topoSort;
|
|
162
|
+
/**
|
|
163
|
+
* Append a result to the persistent task history file (last HISTORY_MAX entries).
|
|
164
|
+
* Uses atomic rename to prevent partial writes.
|
|
165
|
+
*/
|
|
166
|
+
private appendHistory;
|
|
167
|
+
/**
|
|
168
|
+
* Ensure the storage directory exists.
|
|
169
|
+
*/
|
|
170
|
+
private ensureStorageDir;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=agent-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-coordinator.d.ts","sourceRoot":"","sources":["../src/agent-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module agent-coordinator
|
|
3
|
+
* @description Role-aware multi-agent coordinator.
|
|
4
|
+
*
|
|
5
|
+
* Sits above individual agent loops. Routes tasks to appropriate role agents,
|
|
6
|
+
* prevents resource conflicts, collects/merges results, enforces budget and
|
|
7
|
+
* approval constraints.
|
|
8
|
+
*
|
|
9
|
+
* Relationship to DAGOrchestrator:
|
|
10
|
+
* - DAGOrchestrator: raw DAG execution, parallel task scheduling, retry logic
|
|
11
|
+
* - AgentCoordinator: role routing, resource conflict prevention, budget
|
|
12
|
+
* enforcement, task history persistence — the orchestration layer
|
|
13
|
+
*/
|
|
14
|
+
import { EventEmitter } from "node:events";
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
// ─── Constants ───
|
|
19
|
+
const HISTORY_MAX = 500;
|
|
20
|
+
const DEFAULT_MAX_CONCURRENT = 1;
|
|
21
|
+
const DEFAULT_CONFLICT_WINDOW_MS = 30_000;
|
|
22
|
+
// ─── AgentCoordinator ───
|
|
23
|
+
/**
|
|
24
|
+
* Routes tasks to specialized role agents, prevents resource conflicts,
|
|
25
|
+
* and persists task history for audit and analysis.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const coordinator = new AgentCoordinator();
|
|
30
|
+
*
|
|
31
|
+
* const result = await coordinator.dispatch(
|
|
32
|
+
* {
|
|
33
|
+
* id: "task-1",
|
|
34
|
+
* goal: "Implement user authentication",
|
|
35
|
+
* taskType: "feature",
|
|
36
|
+
* requiredRole: "coder",
|
|
37
|
+
* priority: "high",
|
|
38
|
+
* timeoutMs: 120_000,
|
|
39
|
+
* },
|
|
40
|
+
* async (goal, role) => {
|
|
41
|
+
* // Call your actual agent loop here
|
|
42
|
+
* return agentLoop.run(goal, role);
|
|
43
|
+
* }
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export class AgentCoordinator extends EventEmitter {
|
|
48
|
+
maxConcurrent;
|
|
49
|
+
conflictWindowMs;
|
|
50
|
+
storageFile;
|
|
51
|
+
/** resource ID → lock info */
|
|
52
|
+
locks = new Map();
|
|
53
|
+
/** Currently executing task IDs */
|
|
54
|
+
activeTasks = new Map();
|
|
55
|
+
/** Completed task IDs in this session (used for dependency checks) */
|
|
56
|
+
completedIds = new Set();
|
|
57
|
+
/** Failed task IDs in this session (used to skip dependents) */
|
|
58
|
+
failedIds = new Set();
|
|
59
|
+
constructor(config) {
|
|
60
|
+
super();
|
|
61
|
+
this.maxConcurrent = config?.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;
|
|
62
|
+
this.conflictWindowMs = config?.conflictWindowMs ?? DEFAULT_CONFLICT_WINDOW_MS;
|
|
63
|
+
const storageDir = config?.storageDir ?? join(homedir(), ".yuan", "coordinator");
|
|
64
|
+
this.storageFile = join(storageDir, "task-history.json");
|
|
65
|
+
this.ensureStorageDir(storageDir);
|
|
66
|
+
}
|
|
67
|
+
// ─── Public API ───
|
|
68
|
+
/**
|
|
69
|
+
* Dispatch a single task to the appropriate role agent.
|
|
70
|
+
*
|
|
71
|
+
* Steps:
|
|
72
|
+
* 1. Verify dependencies are complete
|
|
73
|
+
* 2. Check for resource conflicts (goal keywords as resource IDs)
|
|
74
|
+
* 3. Lock resources
|
|
75
|
+
* 4. Execute runAgent with optional timeout
|
|
76
|
+
* 5. Release locks
|
|
77
|
+
* 6. Persist to history
|
|
78
|
+
* 7. Emit events and return result
|
|
79
|
+
*
|
|
80
|
+
* @param task - Task to execute
|
|
81
|
+
* @param runAgent - Caller-provided execution function
|
|
82
|
+
*/
|
|
83
|
+
async dispatch(task, runAgent) {
|
|
84
|
+
// 1. Dependency check
|
|
85
|
+
const unmet = this.getUnmetDependencies(task);
|
|
86
|
+
if (unmet.length > 0) {
|
|
87
|
+
const result = {
|
|
88
|
+
taskId: task.id,
|
|
89
|
+
role: task.requiredRole,
|
|
90
|
+
outcome: "skipped",
|
|
91
|
+
output: `Skipped: unmet dependencies [${unmet.join(", ")}]`,
|
|
92
|
+
tokenUsed: 0,
|
|
93
|
+
latencyMs: 0,
|
|
94
|
+
conflicts: [],
|
|
95
|
+
};
|
|
96
|
+
this.appendHistory(task, result);
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
// 2. Check for resource conflicts
|
|
100
|
+
const resourceIds = this.extractResourceIds(task.goal);
|
|
101
|
+
const conflicts = resourceIds.filter((r) => this.isConflict(r));
|
|
102
|
+
if (conflicts.length > 0) {
|
|
103
|
+
this.emit("agent:coordinator_conflict", {
|
|
104
|
+
kind: "agent:coordinator_conflict",
|
|
105
|
+
taskId: task.id,
|
|
106
|
+
conflictedWith: conflicts,
|
|
107
|
+
resourceId: conflicts[0],
|
|
108
|
+
timestamp: new Date().toISOString(),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// 3. Lock resources and mark as active
|
|
112
|
+
for (const resourceId of resourceIds) {
|
|
113
|
+
this.lockResource(resourceId, task.id);
|
|
114
|
+
}
|
|
115
|
+
this.activeTasks.set(task.id, task);
|
|
116
|
+
this.emit("agent:coordinator_task_started", {
|
|
117
|
+
kind: "agent:coordinator_task_started",
|
|
118
|
+
taskId: task.id,
|
|
119
|
+
role: task.requiredRole,
|
|
120
|
+
goal: task.goal,
|
|
121
|
+
timestamp: new Date().toISOString(),
|
|
122
|
+
});
|
|
123
|
+
// 4. Execute with optional timeout
|
|
124
|
+
const startTime = Date.now();
|
|
125
|
+
let outcome = "success";
|
|
126
|
+
let output = "";
|
|
127
|
+
let tokenUsed = 0;
|
|
128
|
+
try {
|
|
129
|
+
const agentPromise = runAgent(task.goal, task.requiredRole);
|
|
130
|
+
if (task.timeoutMs != null) {
|
|
131
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`Task timed out after ${task.timeoutMs}ms`)), task.timeoutMs));
|
|
132
|
+
output = await Promise.race([agentPromise, timeoutPromise]);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
output = await agentPromise;
|
|
136
|
+
}
|
|
137
|
+
this.completedIds.add(task.id);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
141
|
+
outcome = errMsg.includes("timed out") ? "timeout" : "failure";
|
|
142
|
+
output = errMsg;
|
|
143
|
+
this.failedIds.add(task.id);
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
// 5. Release locks
|
|
147
|
+
for (const resourceId of resourceIds) {
|
|
148
|
+
this.releaseResource(resourceId);
|
|
149
|
+
}
|
|
150
|
+
this.activeTasks.delete(task.id);
|
|
151
|
+
}
|
|
152
|
+
const latencyMs = Date.now() - startTime;
|
|
153
|
+
const result = {
|
|
154
|
+
taskId: task.id,
|
|
155
|
+
role: task.requiredRole,
|
|
156
|
+
outcome,
|
|
157
|
+
output,
|
|
158
|
+
tokenUsed,
|
|
159
|
+
latencyMs,
|
|
160
|
+
conflicts,
|
|
161
|
+
};
|
|
162
|
+
// 6. Persist history
|
|
163
|
+
this.appendHistory(task, result);
|
|
164
|
+
// 7. Emit completion event
|
|
165
|
+
this.emit("agent:coordinator_task_complete", {
|
|
166
|
+
kind: "agent:coordinator_task_complete",
|
|
167
|
+
taskId: task.id,
|
|
168
|
+
role: task.requiredRole,
|
|
169
|
+
outcome,
|
|
170
|
+
tokenUsed,
|
|
171
|
+
latencyMs,
|
|
172
|
+
timestamp: new Date().toISOString(),
|
|
173
|
+
});
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Dispatch multiple tasks in dependency order (topological sort).
|
|
178
|
+
*
|
|
179
|
+
* Respects maxConcurrent (default 1 = sequential). Skips tasks whose
|
|
180
|
+
* dependencies have failed.
|
|
181
|
+
*
|
|
182
|
+
* @param tasks - List of tasks; may include cross-task dependencies
|
|
183
|
+
* @param runAgent - Caller-provided execution function
|
|
184
|
+
*/
|
|
185
|
+
async dispatchBatch(tasks, runAgent) {
|
|
186
|
+
const sorted = this.topoSort(tasks);
|
|
187
|
+
const results = [];
|
|
188
|
+
// Sequential execution (maxConcurrent=1 is default and the safe path)
|
|
189
|
+
// Future: implement concurrent slot tracking when maxConcurrent > 1
|
|
190
|
+
for (const task of sorted) {
|
|
191
|
+
// Skip if a dependency failed
|
|
192
|
+
const hasFailed = (task.dependencies ?? []).some((dep) => this.failedIds.has(dep));
|
|
193
|
+
if (hasFailed) {
|
|
194
|
+
const skipped = {
|
|
195
|
+
taskId: task.id,
|
|
196
|
+
role: task.requiredRole,
|
|
197
|
+
outcome: "skipped",
|
|
198
|
+
output: `Skipped: dependency failed`,
|
|
199
|
+
tokenUsed: 0,
|
|
200
|
+
latencyMs: 0,
|
|
201
|
+
conflicts: [],
|
|
202
|
+
};
|
|
203
|
+
this.failedIds.add(task.id); // propagate skip as failure for downstream
|
|
204
|
+
this.appendHistory(task, skipped);
|
|
205
|
+
results.push(skipped);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const result = await this.dispatch(task, runAgent);
|
|
209
|
+
results.push(result);
|
|
210
|
+
}
|
|
211
|
+
return results;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check whether a resource is currently locked by another task.
|
|
215
|
+
*
|
|
216
|
+
* A lock is considered active if it exists and has not expired.
|
|
217
|
+
*
|
|
218
|
+
* @param resourceId - Resource identifier to check
|
|
219
|
+
*/
|
|
220
|
+
isConflict(resourceId) {
|
|
221
|
+
const lock = this.locks.get(resourceId);
|
|
222
|
+
if (!lock)
|
|
223
|
+
return false;
|
|
224
|
+
if (Date.now() > lock.expiresAt) {
|
|
225
|
+
this.locks.delete(resourceId);
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Acquire an exclusive lock on a resource for the given task.
|
|
232
|
+
* Overwrites any existing (possibly expired) lock.
|
|
233
|
+
*
|
|
234
|
+
* @param resourceId - Resource to lock
|
|
235
|
+
* @param taskId - Task acquiring the lock
|
|
236
|
+
*/
|
|
237
|
+
lockResource(resourceId, taskId) {
|
|
238
|
+
this.locks.set(resourceId, {
|
|
239
|
+
taskId,
|
|
240
|
+
expiresAt: Date.now() + this.conflictWindowMs,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Release a resource lock.
|
|
245
|
+
*
|
|
246
|
+
* @param resourceId - Resource to unlock
|
|
247
|
+
*/
|
|
248
|
+
releaseResource(resourceId) {
|
|
249
|
+
this.locks.delete(resourceId);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get all currently executing tasks.
|
|
253
|
+
*/
|
|
254
|
+
getActiveTasks() {
|
|
255
|
+
return Array.from(this.activeTasks.values());
|
|
256
|
+
}
|
|
257
|
+
// ─── Private helpers ───
|
|
258
|
+
/**
|
|
259
|
+
* Return dependency task IDs that have not yet completed.
|
|
260
|
+
*/
|
|
261
|
+
getUnmetDependencies(task) {
|
|
262
|
+
if (!task.dependencies || task.dependencies.length === 0)
|
|
263
|
+
return [];
|
|
264
|
+
return task.dependencies.filter((dep) => !this.completedIds.has(dep));
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Extract resource IDs from a goal string.
|
|
268
|
+
* Uses significant words (>3 chars, non-common) as resource keys.
|
|
269
|
+
* This is a lightweight heuristic — callers can pre-lock specific resources
|
|
270
|
+
* with lockResource() for precise control.
|
|
271
|
+
*/
|
|
272
|
+
extractResourceIds(goal) {
|
|
273
|
+
const stopWords = new Set([
|
|
274
|
+
"the", "and", "for", "with", "that", "this", "from", "into",
|
|
275
|
+
"have", "will", "should", "must", "also", "only", "then",
|
|
276
|
+
]);
|
|
277
|
+
return goal
|
|
278
|
+
.toLowerCase()
|
|
279
|
+
.replace(/[^a-z0-9\s_/-]/g, " ")
|
|
280
|
+
.split(/\s+/)
|
|
281
|
+
.filter((w) => w.length > 3 && !stopWords.has(w))
|
|
282
|
+
.slice(0, 5); // cap to 5 resource IDs per task
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Topological sort of tasks by their dependency graph.
|
|
286
|
+
* Tasks with no dependencies come first; tasks with satisfied dependencies
|
|
287
|
+
* come after their prerequisites.
|
|
288
|
+
* Ties broken by priority (high > normal > low) then by original order.
|
|
289
|
+
*/
|
|
290
|
+
topoSort(tasks) {
|
|
291
|
+
const PRIORITY_WEIGHT = {
|
|
292
|
+
high: 3,
|
|
293
|
+
normal: 2,
|
|
294
|
+
low: 1,
|
|
295
|
+
};
|
|
296
|
+
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
297
|
+
const inDegree = new Map(tasks.map((t) => [t.id, 0]));
|
|
298
|
+
const reverseDeps = new Map(tasks.map((t) => [t.id, []]));
|
|
299
|
+
for (const task of tasks) {
|
|
300
|
+
for (const dep of task.dependencies ?? []) {
|
|
301
|
+
inDegree.set(task.id, (inDegree.get(task.id) ?? 0) + 1);
|
|
302
|
+
if (taskMap.has(dep)) {
|
|
303
|
+
reverseDeps.get(dep).push(task.id);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
// External dependency — treat as already satisfied
|
|
307
|
+
inDegree.set(task.id, Math.max(0, (inDegree.get(task.id) ?? 0) - 1));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
const queue = tasks
|
|
312
|
+
.filter((t) => (inDegree.get(t.id) ?? 0) === 0)
|
|
313
|
+
.sort((a, b) => PRIORITY_WEIGHT[b.priority] - PRIORITY_WEIGHT[a.priority]);
|
|
314
|
+
const sorted = [];
|
|
315
|
+
while (queue.length > 0) {
|
|
316
|
+
const task = queue.shift();
|
|
317
|
+
sorted.push(task);
|
|
318
|
+
const dependents = reverseDeps.get(task.id) ?? [];
|
|
319
|
+
const unblocked = [];
|
|
320
|
+
for (const depId of dependents) {
|
|
321
|
+
const newDeg = (inDegree.get(depId) ?? 0) - 1;
|
|
322
|
+
inDegree.set(depId, newDeg);
|
|
323
|
+
if (newDeg === 0) {
|
|
324
|
+
const depTask = taskMap.get(depId);
|
|
325
|
+
if (depTask)
|
|
326
|
+
unblocked.push(depTask);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// Insert unblocked tasks in priority order
|
|
330
|
+
unblocked.sort((a, b) => PRIORITY_WEIGHT[b.priority] - PRIORITY_WEIGHT[a.priority]);
|
|
331
|
+
queue.push(...unblocked);
|
|
332
|
+
}
|
|
333
|
+
// Any tasks not in sorted (circular deps) go at the end in original order
|
|
334
|
+
const sortedIds = new Set(sorted.map((t) => t.id));
|
|
335
|
+
for (const task of tasks) {
|
|
336
|
+
if (!sortedIds.has(task.id))
|
|
337
|
+
sorted.push(task);
|
|
338
|
+
}
|
|
339
|
+
return sorted;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Append a result to the persistent task history file (last HISTORY_MAX entries).
|
|
343
|
+
* Uses atomic rename to prevent partial writes.
|
|
344
|
+
*/
|
|
345
|
+
appendHistory(task, result) {
|
|
346
|
+
try {
|
|
347
|
+
let history = [];
|
|
348
|
+
if (existsSync(this.storageFile)) {
|
|
349
|
+
const raw = readFileSync(this.storageFile, "utf-8");
|
|
350
|
+
const parsed = JSON.parse(raw);
|
|
351
|
+
if (Array.isArray(parsed))
|
|
352
|
+
history = parsed;
|
|
353
|
+
}
|
|
354
|
+
history.push({
|
|
355
|
+
taskId: task.id,
|
|
356
|
+
role: task.requiredRole,
|
|
357
|
+
goal: task.goal,
|
|
358
|
+
taskType: task.taskType,
|
|
359
|
+
outcome: result.outcome,
|
|
360
|
+
tokenUsed: result.tokenUsed,
|
|
361
|
+
latencyMs: result.latencyMs,
|
|
362
|
+
timestamp: new Date().toISOString(),
|
|
363
|
+
});
|
|
364
|
+
// Keep only the last HISTORY_MAX entries
|
|
365
|
+
if (history.length > HISTORY_MAX) {
|
|
366
|
+
history = history.slice(history.length - HISTORY_MAX);
|
|
367
|
+
}
|
|
368
|
+
const tmpFile = `${this.storageFile}.tmp`;
|
|
369
|
+
writeFileSync(tmpFile, JSON.stringify(history, null, 2), "utf-8");
|
|
370
|
+
renameSync(tmpFile, this.storageFile);
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
// Non-fatal: storage failures must not crash the agent loop
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Ensure the storage directory exists.
|
|
378
|
+
*/
|
|
379
|
+
ensureStorageDir(dir) {
|
|
380
|
+
try {
|
|
381
|
+
if (!existsSync(dir)) {
|
|
382
|
+
mkdirSync(dir, { recursive: true });
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
// Non-fatal
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=agent-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-coordinator.js","sourceRoot":"","sources":["../src/agent-coordinator.ts"],"names":[],"mappings":"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"}
|