@viberlabs/orchestrator 2.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.md +25 -0
- package/README.md +170 -0
- package/dist/core/src/db/index.d.ts +295 -0
- package/dist/core/src/db/index.d.ts.map +1 -0
- package/dist/core/src/db/index.js +1114 -0
- package/dist/core/src/db/index.js.map +1 -0
- package/dist/core/src/engine/index.d.ts +38 -0
- package/dist/core/src/engine/index.d.ts.map +1 -0
- package/dist/core/src/engine/index.js +117 -0
- package/dist/core/src/engine/index.js.map +1 -0
- package/dist/core/src/engine/sentry.d.ts +36 -0
- package/dist/core/src/engine/sentry.d.ts.map +1 -0
- package/dist/core/src/engine/sentry.js +131 -0
- package/dist/core/src/engine/sentry.js.map +1 -0
- package/dist/core/src/protocol/index.d.ts +140 -0
- package/dist/core/src/protocol/index.d.ts.map +1 -0
- package/dist/core/src/protocol/index.js +7 -0
- package/dist/core/src/protocol/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/opencode/src/index.d.ts +56 -0
- package/dist/opencode/src/index.d.ts.map +1 -0
- package/dist/opencode/src/index.js +322 -0
- package/dist/opencode/src/index.js.map +1 -0
- package/dist/orca/index.d.ts +137 -0
- package/dist/orca/index.d.ts.map +1 -0
- package/dist/orca/index.js +215 -0
- package/dist/orca/index.js.map +1 -0
- package/dist/orchestrator/src/daemon.d.ts +66 -0
- package/dist/orchestrator/src/daemon.d.ts.map +1 -0
- package/dist/orchestrator/src/daemon.js +523 -0
- package/dist/orchestrator/src/daemon.js.map +1 -0
- package/dist/orchestrator/src/index.d.ts +8 -0
- package/dist/orchestrator/src/index.d.ts.map +1 -0
- package/dist/orchestrator/src/index.js +15 -0
- package/dist/orchestrator/src/index.js.map +1 -0
- package/dist/orchestrator/src/orca/index.d.ts +137 -0
- package/dist/orchestrator/src/orca/index.d.ts.map +1 -0
- package/dist/orchestrator/src/orca/index.js +215 -0
- package/dist/orchestrator/src/orca/index.js.map +1 -0
- package/dist/orchestrator/src/pool/index.d.ts +51 -0
- package/dist/orchestrator/src/pool/index.d.ts.map +1 -0
- package/dist/orchestrator/src/pool/index.js +152 -0
- package/dist/orchestrator/src/pool/index.js.map +1 -0
- package/dist/orchestrator/src/workflow/index.d.ts +65 -0
- package/dist/orchestrator/src/workflow/index.d.ts.map +1 -0
- package/dist/orchestrator/src/workflow/index.js +148 -0
- package/dist/orchestrator/src/workflow/index.js.map +1 -0
- package/dist/pool/index.d.ts +51 -0
- package/dist/pool/index.d.ts.map +1 -0
- package/dist/pool/index.js +152 -0
- package/dist/pool/index.js.map +1 -0
- package/dist/workflow/index.d.ts +65 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +148 -0
- package/dist/workflow/index.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DOCUMENT: WORKFLOW PATTERNS
|
|
4
|
+
* PROJECT: VIBER Universal v2
|
|
5
|
+
* PURPOSE: Multi-agent workflow orchestration
|
|
6
|
+
* UPDATE PATTERN: Update when workflow patterns change
|
|
7
|
+
* LOCATION: packages/orchestrator/src/workflow/index.ts
|
|
8
|
+
* RELATED: orca, pool
|
|
9
|
+
* LAST UPDATED: 2026-03-06
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.WorkflowExecutor = void 0;
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Workflow Executor
|
|
15
|
+
// ============================================================================
|
|
16
|
+
class WorkflowExecutor {
|
|
17
|
+
pool;
|
|
18
|
+
constructor(pool) {
|
|
19
|
+
this.pool = pool;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Execute sequential workflow:
|
|
23
|
+
* Agent A → Agent B → Agent C
|
|
24
|
+
*/
|
|
25
|
+
async sequential(task, roles) {
|
|
26
|
+
const startTime = Date.now();
|
|
27
|
+
const steps = [];
|
|
28
|
+
const agentIds = [];
|
|
29
|
+
let totalCost = 0;
|
|
30
|
+
for (const role of roles) {
|
|
31
|
+
const agentId = await this.pool.spawn(task, role, agentIds.length > 0 ? [agentIds[agentIds.length - 1]] : []);
|
|
32
|
+
agentIds.push(agentId);
|
|
33
|
+
// Wait for completion (this would be handled by pool)
|
|
34
|
+
// For now, we track completion
|
|
35
|
+
}
|
|
36
|
+
// Wait for all agents to complete
|
|
37
|
+
// Wait for all agents to complete
|
|
38
|
+
const completedAgents = await this.pool.drain();
|
|
39
|
+
void completedAgents; // Suppress unused variable warning
|
|
40
|
+
const totalDuration = Date.now() - startTime;
|
|
41
|
+
return {
|
|
42
|
+
workflowId: `workflow-${task.id}-${Date.now()}`,
|
|
43
|
+
success: steps.every((s) => s.success),
|
|
44
|
+
steps,
|
|
45
|
+
totalDuration,
|
|
46
|
+
totalCost,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Execute parallel workflow:
|
|
51
|
+
* Agents A, B, C all run simultaneously
|
|
52
|
+
*/
|
|
53
|
+
async parallel(task, roles) {
|
|
54
|
+
const startTime = Date.now();
|
|
55
|
+
const agentIds = [];
|
|
56
|
+
// Spawn all agents simultaneously
|
|
57
|
+
const spawnPromises = roles.map((role) => this.pool.spawn(task, role, []));
|
|
58
|
+
const ids = await Promise.all(spawnPromises);
|
|
59
|
+
agentIds.push(...ids);
|
|
60
|
+
// Wait for all to complete
|
|
61
|
+
const completedAgents = await this.pool.drain();
|
|
62
|
+
void completedAgents; // Used for tracking
|
|
63
|
+
const totalDuration = Date.now() - startTime;
|
|
64
|
+
return {
|
|
65
|
+
workflowId: `workflow-${task.id}-${Date.now()}`,
|
|
66
|
+
success: true,
|
|
67
|
+
steps: [],
|
|
68
|
+
totalDuration,
|
|
69
|
+
totalCost: 0,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Execute pipeline workflow:
|
|
74
|
+
* Output of A feeds input of B
|
|
75
|
+
*/
|
|
76
|
+
async pipeline(task, roles) {
|
|
77
|
+
const startTime = Date.now();
|
|
78
|
+
const agentIds = [];
|
|
79
|
+
let previousOutput = task.description;
|
|
80
|
+
for (let i = 0; i < roles.length; i++) {
|
|
81
|
+
const role = roles[i];
|
|
82
|
+
// Create modified task with previous output
|
|
83
|
+
const modifiedTask = {
|
|
84
|
+
...task,
|
|
85
|
+
id: `${task.id}-step-${i}`,
|
|
86
|
+
description: previousOutput ?? task.description,
|
|
87
|
+
};
|
|
88
|
+
const agentId = await this.pool.spawn(modifiedTask, role, agentIds.length > 0 ? [agentIds[agentIds.length - 1]] : []);
|
|
89
|
+
agentIds.push(agentId);
|
|
90
|
+
// Wait for this agent to complete before spawning next
|
|
91
|
+
// This would be handled by pool with result capture
|
|
92
|
+
// previousOutput = result.summary;
|
|
93
|
+
}
|
|
94
|
+
// Wait for all agents to complete
|
|
95
|
+
// Wait for all agents to complete
|
|
96
|
+
const completedAgents = await this.pool.drain();
|
|
97
|
+
void completedAgents; // Suppress unused variable warning
|
|
98
|
+
const totalDuration = Date.now() - startTime;
|
|
99
|
+
return {
|
|
100
|
+
workflowId: `workflow-${task.id}-${Date.now()}`,
|
|
101
|
+
success: true,
|
|
102
|
+
steps: [],
|
|
103
|
+
totalDuration,
|
|
104
|
+
totalCost: 0,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Execute implement-review workflow:
|
|
109
|
+
* Coder implements → Reviewer reviews
|
|
110
|
+
*/
|
|
111
|
+
async implementReview(task, _model = "qwen/qwen3-coder:480b") {
|
|
112
|
+
return this.sequential(task, ["coder", "reviewer"]);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Execute plan-implement-test workflow:
|
|
116
|
+
* Planner plans → Coder implements → Tester tests
|
|
117
|
+
*/
|
|
118
|
+
async planImplementTest(task, _model = "qwen/qwen3-coder:480b") {
|
|
119
|
+
return this.sequential(task, ["planner", "coder", "tester"]);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Execute dual-review workflow:
|
|
123
|
+
* Coder implements → Two reviewers review in parallel
|
|
124
|
+
*/
|
|
125
|
+
async dualReview(task, _model = "qwen/qwen3-coder:480b") {
|
|
126
|
+
const startTime = Date.now();
|
|
127
|
+
// Spawn coder
|
|
128
|
+
const coderId = await this.pool.spawn(task, "coder", []);
|
|
129
|
+
// Wait for coder to complete
|
|
130
|
+
const completed = await this.pool.drain();
|
|
131
|
+
void completed; // Suppress unused variable warning
|
|
132
|
+
// Spawn two reviewers in parallel
|
|
133
|
+
await this.pool.spawn(task, "reviewer", [coderId]);
|
|
134
|
+
await this.pool.spawn(task, "reviewer", [coderId]);
|
|
135
|
+
// Wait for both reviewers
|
|
136
|
+
await this.pool.drain();
|
|
137
|
+
const totalDuration = Date.now() - startTime;
|
|
138
|
+
return {
|
|
139
|
+
workflowId: `workflow-${task.id}-${Date.now()}`,
|
|
140
|
+
success: true,
|
|
141
|
+
steps: [],
|
|
142
|
+
totalDuration,
|
|
143
|
+
totalCost: 0,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.WorkflowExecutor = WorkflowExecutor;
|
|
148
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/workflow/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOCUMENT: AGENT POOL
|
|
3
|
+
* PROJECT: VIBER Universal v2
|
|
4
|
+
* PURPOSE: Agent lifecycle management with concurrency limits
|
|
5
|
+
* UPDATE PATTERN: Update when agent management changes
|
|
6
|
+
* LOCATION: packages/orchestrator/src/pool/index.ts
|
|
7
|
+
* RELATED: orca, opencode integration
|
|
8
|
+
* LAST UPDATED: 2026-03-06
|
|
9
|
+
*/
|
|
10
|
+
import type { OpenCodeClient } from "@viber/opencode";
|
|
11
|
+
import type { Agent, Task } from "@viber/core/db";
|
|
12
|
+
export interface PoolConfig {
|
|
13
|
+
maxConcurrent: number;
|
|
14
|
+
client: OpenCodeClient;
|
|
15
|
+
}
|
|
16
|
+
export declare class AgentPool {
|
|
17
|
+
private maxConcurrent;
|
|
18
|
+
private client;
|
|
19
|
+
private active;
|
|
20
|
+
private queue;
|
|
21
|
+
private completed;
|
|
22
|
+
constructor(config: PoolConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Spawn an agent to work on a task
|
|
25
|
+
*/
|
|
26
|
+
spawn(task: Task, role: Agent["role"], dependsOn?: string[]): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Get status of all agents
|
|
29
|
+
*/
|
|
30
|
+
getStatus(): {
|
|
31
|
+
active: number;
|
|
32
|
+
queued: number;
|
|
33
|
+
completed: number;
|
|
34
|
+
maxConcurrent: number;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Complete an agent
|
|
38
|
+
*/
|
|
39
|
+
complete(agentId: string, result: unknown): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Mark an agent as failed
|
|
42
|
+
*/
|
|
43
|
+
fail(agentId: string, _error: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Wait for all active agents to complete
|
|
46
|
+
*/
|
|
47
|
+
drain(): Promise<Agent[]>;
|
|
48
|
+
private spawnAgent;
|
|
49
|
+
private processQueue;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pool/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAMlD,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;CACxB;AAyBD,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,SAAS,CAAe;gBAEpB,MAAM,EAAE,UAAU;IAK9B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BvF;;OAEG;IACH,SAAS,IAAI;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB;IASD;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/D;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAejB,UAAU;IA+BxB,OAAO,CAAC,YAAY;CAYrB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DOCUMENT: AGENT POOL
|
|
4
|
+
* PROJECT: VIBER Universal v2
|
|
5
|
+
* PURPOSE: Agent lifecycle management with concurrency limits
|
|
6
|
+
* UPDATE PATTERN: Update when agent management changes
|
|
7
|
+
* LOCATION: packages/orchestrator/src/pool/index.ts
|
|
8
|
+
* RELATED: orca, opencode integration
|
|
9
|
+
* LAST UPDATED: 2026-03-06
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AgentPool = void 0;
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Agent Pool
|
|
15
|
+
// ============================================================================
|
|
16
|
+
class AgentPool {
|
|
17
|
+
maxConcurrent;
|
|
18
|
+
client;
|
|
19
|
+
active = new Map();
|
|
20
|
+
queue = [];
|
|
21
|
+
completed = [];
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.maxConcurrent = config.maxConcurrent;
|
|
24
|
+
this.client = config.client;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Spawn an agent to work on a task
|
|
28
|
+
*/
|
|
29
|
+
async spawn(task, role, dependsOn = []) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const agent = {
|
|
32
|
+
id: `agent-${task.id}-${Date.now()}`,
|
|
33
|
+
taskId: task.id,
|
|
34
|
+
role,
|
|
35
|
+
status: "spawned",
|
|
36
|
+
startedAt: new Date().toISOString(),
|
|
37
|
+
inputTokens: 0,
|
|
38
|
+
outputTokens: 0,
|
|
39
|
+
costUsd: 0,
|
|
40
|
+
durationMs: null,
|
|
41
|
+
result: null,
|
|
42
|
+
opencodeSessionId: null,
|
|
43
|
+
model: null,
|
|
44
|
+
completedAt: null,
|
|
45
|
+
dependsOn: dependsOn.length > 0 ? dependsOn.join(",") : null,
|
|
46
|
+
};
|
|
47
|
+
// Check if we can spawn immediately
|
|
48
|
+
if (this.active.size < this.maxConcurrent) {
|
|
49
|
+
void this.spawnAgent(agent).then(resolve).catch(reject);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Queue for later
|
|
53
|
+
this.queue.push({ agent, resolve, reject });
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get status of all agents
|
|
59
|
+
*/
|
|
60
|
+
getStatus() {
|
|
61
|
+
return {
|
|
62
|
+
active: this.active.size,
|
|
63
|
+
queued: this.queue.length,
|
|
64
|
+
completed: this.completed.length,
|
|
65
|
+
maxConcurrent: this.maxConcurrent,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Complete an agent
|
|
70
|
+
*/
|
|
71
|
+
async complete(agentId, result) {
|
|
72
|
+
const wrapper = this.active.get(agentId);
|
|
73
|
+
if (!wrapper) {
|
|
74
|
+
throw new Error(`Agent ${agentId} not found in active pool`);
|
|
75
|
+
}
|
|
76
|
+
wrapper.status = "completed";
|
|
77
|
+
wrapper.endTime = Date.now();
|
|
78
|
+
wrapper.result = result;
|
|
79
|
+
this.completed.push(wrapper.agent);
|
|
80
|
+
this.active.delete(agentId);
|
|
81
|
+
// Process queue
|
|
82
|
+
this.processQueue();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Mark an agent as failed
|
|
86
|
+
*/
|
|
87
|
+
async fail(agentId, _error) {
|
|
88
|
+
const wrapper = this.active.get(agentId);
|
|
89
|
+
if (!wrapper) {
|
|
90
|
+
throw new Error(`Agent ${agentId} not found in active pool`);
|
|
91
|
+
}
|
|
92
|
+
wrapper.status = "failed";
|
|
93
|
+
wrapper.endTime = Date.now();
|
|
94
|
+
this.active.delete(agentId);
|
|
95
|
+
// Process queue
|
|
96
|
+
this.processQueue();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Wait for all active agents to complete
|
|
100
|
+
*/
|
|
101
|
+
async drain() {
|
|
102
|
+
return new Promise((resolve) => {
|
|
103
|
+
const checkInterval = setInterval(() => {
|
|
104
|
+
if (this.active.size === 0 && this.queue.length === 0) {
|
|
105
|
+
clearInterval(checkInterval);
|
|
106
|
+
resolve([...this.completed]);
|
|
107
|
+
}
|
|
108
|
+
}, 100);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// ============================================================================
|
|
112
|
+
// Private Methods
|
|
113
|
+
// ============================================================================
|
|
114
|
+
async spawnAgent(agent) {
|
|
115
|
+
const wrapper = {
|
|
116
|
+
agent,
|
|
117
|
+
sessionId: null,
|
|
118
|
+
status: "spawning",
|
|
119
|
+
startTime: Date.now(),
|
|
120
|
+
endTime: null,
|
|
121
|
+
};
|
|
122
|
+
this.active.set(agent.id, wrapper);
|
|
123
|
+
try {
|
|
124
|
+
// Create OpenCode session
|
|
125
|
+
const sessionId = await this.client.createSession(`VIBER: ${agent.role} - ${agent.taskId}`);
|
|
126
|
+
wrapper.sessionId = sessionId;
|
|
127
|
+
wrapper.status = "working";
|
|
128
|
+
// Mark agent as working
|
|
129
|
+
// This would update database via ViberDatabase
|
|
130
|
+
return agent.id;
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
wrapper.status = "failed";
|
|
134
|
+
this.active.delete(agent.id);
|
|
135
|
+
throw err;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
processQueue() {
|
|
139
|
+
while (this.queue.length > 0 && this.active.size < this.maxConcurrent) {
|
|
140
|
+
const item = this.queue.shift();
|
|
141
|
+
void this.spawnAgent(item.agent)
|
|
142
|
+
.then((id) => {
|
|
143
|
+
item.resolve(id);
|
|
144
|
+
})
|
|
145
|
+
.catch((err) => {
|
|
146
|
+
item.reject(err);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.AgentPool = AgentPool;
|
|
152
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pool/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOCUMENT: WORKFLOW PATTERNS
|
|
3
|
+
* PROJECT: VIBER Universal v2
|
|
4
|
+
* PURPOSE: Multi-agent workflow orchestration
|
|
5
|
+
* UPDATE PATTERN: Update when workflow patterns change
|
|
6
|
+
* LOCATION: packages/orchestrator/src/workflow/index.ts
|
|
7
|
+
* RELATED: orca, pool
|
|
8
|
+
* LAST UPDATED: 2026-03-06
|
|
9
|
+
*/
|
|
10
|
+
import type { Task, Agent } from "@viber/core/db";
|
|
11
|
+
import type { AgentPool } from "../pool";
|
|
12
|
+
export interface WorkflowStep {
|
|
13
|
+
agent: Agent;
|
|
14
|
+
dependsOn: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface WorkflowResult {
|
|
17
|
+
workflowId: string;
|
|
18
|
+
success: boolean;
|
|
19
|
+
steps: WorkflowStepResult[];
|
|
20
|
+
totalDuration: number;
|
|
21
|
+
totalCost: number;
|
|
22
|
+
}
|
|
23
|
+
export interface WorkflowStepResult {
|
|
24
|
+
agentId: string;
|
|
25
|
+
success: boolean;
|
|
26
|
+
duration: number;
|
|
27
|
+
cost: number;
|
|
28
|
+
artifacts: string[];
|
|
29
|
+
summary: string;
|
|
30
|
+
}
|
|
31
|
+
export declare class WorkflowExecutor {
|
|
32
|
+
private pool;
|
|
33
|
+
constructor(pool: AgentPool);
|
|
34
|
+
/**
|
|
35
|
+
* Execute sequential workflow:
|
|
36
|
+
* Agent A → Agent B → Agent C
|
|
37
|
+
*/
|
|
38
|
+
sequential(task: Task, roles: Agent["role"][]): Promise<WorkflowResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Execute parallel workflow:
|
|
41
|
+
* Agents A, B, C all run simultaneously
|
|
42
|
+
*/
|
|
43
|
+
parallel(task: Task, roles: Agent["role"][]): Promise<WorkflowResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Execute pipeline workflow:
|
|
46
|
+
* Output of A feeds input of B
|
|
47
|
+
*/
|
|
48
|
+
pipeline(task: Task, roles: Agent["role"][]): Promise<WorkflowResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Execute implement-review workflow:
|
|
51
|
+
* Coder implements → Reviewer reviews
|
|
52
|
+
*/
|
|
53
|
+
implementReview(task: Task, _model?: string): Promise<WorkflowResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Execute plan-implement-test workflow:
|
|
56
|
+
* Planner plans → Coder implements → Tester tests
|
|
57
|
+
*/
|
|
58
|
+
planImplementTest(task: Task, _model?: string): Promise<WorkflowResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Execute dual-review workflow:
|
|
61
|
+
* Coder implements → Two reviewers review in parallel
|
|
62
|
+
*/
|
|
63
|
+
dualReview(task: Task, _model?: string): Promise<WorkflowResult>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMzC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAY;gBAEZ,IAAI,EAAE,SAAS;IAI3B;;;OAGG;IACG,UAAU,CACd,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,GACrB,OAAO,CAAC,cAAc,CAAC;IAmC1B;;;OAGG;IACG,QAAQ,CACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,GACrB,OAAO,CAAC,cAAc,CAAC;IA2B1B;;;OAGG;IACG,QAAQ,CACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,GACrB,OAAO,CAAC,cAAc,CAAC;IA4C1B;;;OAGG;IACG,eAAe,CACnB,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,MAAgC,GACvC,OAAO,CAAC,cAAc,CAAC;IAI1B;;;OAGG;IACG,iBAAiB,CACrB,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,MAAgC,GACvC,OAAO,CAAC,cAAc,CAAC;IAI1B;;;OAGG;IACG,UAAU,CACd,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,MAAgC,GACvC,OAAO,CAAC,cAAc,CAAC;CA2B3B"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DOCUMENT: WORKFLOW PATTERNS
|
|
4
|
+
* PROJECT: VIBER Universal v2
|
|
5
|
+
* PURPOSE: Multi-agent workflow orchestration
|
|
6
|
+
* UPDATE PATTERN: Update when workflow patterns change
|
|
7
|
+
* LOCATION: packages/orchestrator/src/workflow/index.ts
|
|
8
|
+
* RELATED: orca, pool
|
|
9
|
+
* LAST UPDATED: 2026-03-06
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.WorkflowExecutor = void 0;
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Workflow Executor
|
|
15
|
+
// ============================================================================
|
|
16
|
+
class WorkflowExecutor {
|
|
17
|
+
pool;
|
|
18
|
+
constructor(pool) {
|
|
19
|
+
this.pool = pool;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Execute sequential workflow:
|
|
23
|
+
* Agent A → Agent B → Agent C
|
|
24
|
+
*/
|
|
25
|
+
async sequential(task, roles) {
|
|
26
|
+
const startTime = Date.now();
|
|
27
|
+
const steps = [];
|
|
28
|
+
const agentIds = [];
|
|
29
|
+
let totalCost = 0;
|
|
30
|
+
for (const role of roles) {
|
|
31
|
+
const agentId = await this.pool.spawn(task, role, agentIds.length > 0 ? [agentIds[agentIds.length - 1]] : []);
|
|
32
|
+
agentIds.push(agentId);
|
|
33
|
+
// Wait for completion (this would be handled by pool)
|
|
34
|
+
// For now, we track completion
|
|
35
|
+
}
|
|
36
|
+
// Wait for all agents to complete
|
|
37
|
+
// Wait for all agents to complete
|
|
38
|
+
const completedAgents = await this.pool.drain();
|
|
39
|
+
void completedAgents; // Suppress unused variable warning
|
|
40
|
+
const totalDuration = Date.now() - startTime;
|
|
41
|
+
return {
|
|
42
|
+
workflowId: `workflow-${task.id}-${Date.now()}`,
|
|
43
|
+
success: steps.every((s) => s.success),
|
|
44
|
+
steps,
|
|
45
|
+
totalDuration,
|
|
46
|
+
totalCost,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Execute parallel workflow:
|
|
51
|
+
* Agents A, B, C all run simultaneously
|
|
52
|
+
*/
|
|
53
|
+
async parallel(task, roles) {
|
|
54
|
+
const startTime = Date.now();
|
|
55
|
+
const agentIds = [];
|
|
56
|
+
// Spawn all agents simultaneously
|
|
57
|
+
const spawnPromises = roles.map((role) => this.pool.spawn(task, role, []));
|
|
58
|
+
const ids = await Promise.all(spawnPromises);
|
|
59
|
+
agentIds.push(...ids);
|
|
60
|
+
// Wait for all to complete
|
|
61
|
+
const completedAgents = await this.pool.drain();
|
|
62
|
+
void completedAgents; // Used for tracking
|
|
63
|
+
const totalDuration = Date.now() - startTime;
|
|
64
|
+
return {
|
|
65
|
+
workflowId: `workflow-${task.id}-${Date.now()}`,
|
|
66
|
+
success: true,
|
|
67
|
+
steps: [],
|
|
68
|
+
totalDuration,
|
|
69
|
+
totalCost: 0,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Execute pipeline workflow:
|
|
74
|
+
* Output of A feeds input of B
|
|
75
|
+
*/
|
|
76
|
+
async pipeline(task, roles) {
|
|
77
|
+
const startTime = Date.now();
|
|
78
|
+
const agentIds = [];
|
|
79
|
+
let previousOutput = task.description;
|
|
80
|
+
for (let i = 0; i < roles.length; i++) {
|
|
81
|
+
const role = roles[i];
|
|
82
|
+
// Create modified task with previous output
|
|
83
|
+
const modifiedTask = {
|
|
84
|
+
...task,
|
|
85
|
+
id: `${task.id}-step-${i}`,
|
|
86
|
+
description: previousOutput ?? task.description,
|
|
87
|
+
};
|
|
88
|
+
const agentId = await this.pool.spawn(modifiedTask, role, agentIds.length > 0 ? [agentIds[agentIds.length - 1]] : []);
|
|
89
|
+
agentIds.push(agentId);
|
|
90
|
+
// Wait for this agent to complete before spawning next
|
|
91
|
+
// This would be handled by pool with result capture
|
|
92
|
+
// previousOutput = result.summary;
|
|
93
|
+
}
|
|
94
|
+
// Wait for all agents to complete
|
|
95
|
+
// Wait for all agents to complete
|
|
96
|
+
const completedAgents = await this.pool.drain();
|
|
97
|
+
void completedAgents; // Suppress unused variable warning
|
|
98
|
+
const totalDuration = Date.now() - startTime;
|
|
99
|
+
return {
|
|
100
|
+
workflowId: `workflow-${task.id}-${Date.now()}`,
|
|
101
|
+
success: true,
|
|
102
|
+
steps: [],
|
|
103
|
+
totalDuration,
|
|
104
|
+
totalCost: 0,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Execute implement-review workflow:
|
|
109
|
+
* Coder implements → Reviewer reviews
|
|
110
|
+
*/
|
|
111
|
+
async implementReview(task, _model = "qwen/qwen3-coder:480b") {
|
|
112
|
+
return this.sequential(task, ["coder", "reviewer"]);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Execute plan-implement-test workflow:
|
|
116
|
+
* Planner plans → Coder implements → Tester tests
|
|
117
|
+
*/
|
|
118
|
+
async planImplementTest(task, _model = "qwen/qwen3-coder:480b") {
|
|
119
|
+
return this.sequential(task, ["planner", "coder", "tester"]);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Execute dual-review workflow:
|
|
123
|
+
* Coder implements → Two reviewers review in parallel
|
|
124
|
+
*/
|
|
125
|
+
async dualReview(task, _model = "qwen/qwen3-coder:480b") {
|
|
126
|
+
const startTime = Date.now();
|
|
127
|
+
// Spawn coder
|
|
128
|
+
const coderId = await this.pool.spawn(task, "coder", []);
|
|
129
|
+
// Wait for coder to complete
|
|
130
|
+
const completed = await this.pool.drain();
|
|
131
|
+
void completed; // Suppress unused variable warning
|
|
132
|
+
// Spawn two reviewers in parallel
|
|
133
|
+
await this.pool.spawn(task, "reviewer", [coderId]);
|
|
134
|
+
await this.pool.spawn(task, "reviewer", [coderId]);
|
|
135
|
+
// Wait for both reviewers
|
|
136
|
+
await this.pool.drain();
|
|
137
|
+
const totalDuration = Date.now() - startTime;
|
|
138
|
+
return {
|
|
139
|
+
workflowId: `workflow-${task.id}-${Date.now()}`,
|
|
140
|
+
success: true,
|
|
141
|
+
steps: [],
|
|
142
|
+
totalDuration,
|
|
143
|
+
totalCost: 0,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.WorkflowExecutor = WorkflowExecutor;
|
|
148
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@viberlabs/orchestrator",
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "Agent orchestration layer for VIBER Universal - ORCA State Machine, Agent Pool, and Workflows",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.js",
|
|
9
|
+
"./orca": {
|
|
10
|
+
"import": "./dist/orca/index.js",
|
|
11
|
+
"types": "./dist/orca/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./pool": {
|
|
14
|
+
"import": "./dist/pool/index.js",
|
|
15
|
+
"types": "./dist/pool/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./workflow": {
|
|
18
|
+
"import": "./dist/workflow/index.js",
|
|
19
|
+
"types": "./dist/workflow/index.d.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"README.md"
|
|
25
|
+
],
|
|
26
|
+
"keywords": [
|
|
27
|
+
"viber",
|
|
28
|
+
"orchestration",
|
|
29
|
+
"agents",
|
|
30
|
+
"xstate",
|
|
31
|
+
"state-machine",
|
|
32
|
+
"workflow"
|
|
33
|
+
],
|
|
34
|
+
"author": "VIBER Universal",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/viber-universal/viber-v2.git",
|
|
39
|
+
"directory": "packages/orchestrator"
|
|
40
|
+
},
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/viber-universal/viber-v2/issues"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/viber-universal/viber-v2#readme",
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"xstate": "^5.28.0",
|
|
47
|
+
"@viberlabs/viber-core": "2.0.1",
|
|
48
|
+
"@viberlabs/opencode": "1.1.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.13.0",
|
|
52
|
+
"typescript": "^5.9.3",
|
|
53
|
+
"vitest": "^3.0.7"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=20.0.0"
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsc",
|
|
60
|
+
"dev": "tsc --watch",
|
|
61
|
+
"clean": "rm -rf dist",
|
|
62
|
+
"typecheck": "tsc --noEmit",
|
|
63
|
+
"test": "vitest run"
|
|
64
|
+
}
|
|
65
|
+
}
|