@backendkit-labs/orchestrator-agent 0.1.1
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/AGENT.md +69 -0
- package/dist/config.d.ts +342 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +88 -0
- package/dist/config.js.map +1 -0
- package/dist/executor.d.ts +99 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +274 -0
- package/dist/executor.js.map +1 -0
- package/dist/planner.d.ts +21 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +78 -0
- package/dist/planner.js.map +1 -0
- package/dist/profile.d.ts +4 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +36 -0
- package/dist/profile.js.map +1 -0
- package/dist/provider.d.ts +13 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +116 -0
- package/dist/provider.js.map +1 -0
- package/dist/run-store.d.ts +47 -0
- package/dist/run-store.d.ts.map +1 -0
- package/dist/run-store.js +28 -0
- package/dist/run-store.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +466 -0
- package/dist/server.js.map +1 -0
- package/dist/static-flow.d.ts +110 -0
- package/dist/static-flow.d.ts.map +1 -0
- package/dist/static-flow.js +82 -0
- package/dist/static-flow.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
// ── RunStore ──────────────────────────────────────────────────────────────────
|
|
5
|
+
const DEFAULT_DIR = path.join(os.homedir(), '.bk-agent', 'orchestrator', 'runs');
|
|
6
|
+
export class RunStore {
|
|
7
|
+
dir;
|
|
8
|
+
constructor(dir = DEFAULT_DIR) {
|
|
9
|
+
this.dir = dir;
|
|
10
|
+
fs.mkdirSync(this.dir, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
newRunId() {
|
|
13
|
+
return `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
14
|
+
}
|
|
15
|
+
save(state) {
|
|
16
|
+
const updated = { ...state, updatedAt: new Date().toISOString() };
|
|
17
|
+
fs.writeFileSync(path.join(this.dir, `${state.runId}.json`), JSON.stringify(updated, null, 2), 'utf-8');
|
|
18
|
+
}
|
|
19
|
+
load(runId) {
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(fs.readFileSync(path.join(this.dir, `${runId}.json`), 'utf-8'));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=run-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-store.js","sourceRoot":"","sources":["../src/run-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAQ,SAAS,CAAC;AAChC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAQ,SAAS,CAAC;AA2ChC,iFAAiF;AAEjF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AAEjF,MAAM,OAAO,QAAQ;IACA,GAAG,CAAS;IAE7B,YAAY,GAAG,GAAG,WAAW;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,QAAQ;QACJ,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,KAAe;QAChB,MAAM,OAAO,GAAa,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5E,EAAE,CAAC,aAAa,CACZ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,OAAO,CAAC,EAC1C,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAChC,OAAO,CACV,CAAC;IACN,CAAC;IAED,IAAI,CAAC,KAAa;QACd,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CACb,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,EAAE,OAAO,CAAC,CACrD,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;CACJ"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Load .env without external deps — only sets vars not already in process.env
|
|
3
|
+
import * as fsSync from 'node:fs';
|
|
4
|
+
import * as pathSync from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
(function loadDotEnv() {
|
|
7
|
+
// dist/server.js → ../../.env (package root)
|
|
8
|
+
const pkgRoot = pathSync.resolve(fileURLToPath(import.meta.url), '..', '..');
|
|
9
|
+
const candidates = [pathSync.join(process.cwd(), '.env'), pathSync.join(pkgRoot, '.env')];
|
|
10
|
+
for (const f of candidates) {
|
|
11
|
+
if (!fsSync.existsSync(f))
|
|
12
|
+
continue;
|
|
13
|
+
for (const line of fsSync.readFileSync(f, 'utf-8').split('\n')) {
|
|
14
|
+
const m = line.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*?)\s*$/);
|
|
15
|
+
if (m && m[2] && !(m[1] in process.env))
|
|
16
|
+
process.env[m[1]] = m[2].replace(/^["']|["']$/g, '');
|
|
17
|
+
}
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
})();
|
|
21
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
22
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
23
|
+
import { z } from 'zod';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import * as os from 'node:os';
|
|
26
|
+
import * as fs from 'node:fs';
|
|
27
|
+
import { ObsidianRAGProvider, SimpleEmbedder, OllamaEmbedder, } from '@backendkit-labs/agent-enterprise';
|
|
28
|
+
import { loadConfig } from './config.js';
|
|
29
|
+
import { TaskPlanner } from './planner.js';
|
|
30
|
+
import { PlanExecutor } from './executor.js';
|
|
31
|
+
import { OpenAICompatibleProvider, callLLM } from './provider.js';
|
|
32
|
+
import { RunStore } from './run-store.js';
|
|
33
|
+
import { matchFlow, flowToTaskPlan } from './static-flow.js';
|
|
34
|
+
import { VaultWriter } from '@backendkit-labs/agent-enterprise';
|
|
35
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
36
|
+
const ok = (text) => ({ content: [{ type: 'text', text }] });
|
|
37
|
+
const ts = () => new Date().toISOString();
|
|
38
|
+
// ── Shared state ──────────────────────────────────────────────────────────────
|
|
39
|
+
const store = new RunStore();
|
|
40
|
+
// ── Enterprise reflection (Cable 1 + 2) ──────────────────────────────────────
|
|
41
|
+
// Lazy-initialized per vault path. Uses EnterpriseReflection from
|
|
42
|
+
// @backendkit-labs/agent-enterprise when available (>= 0.4.0).
|
|
43
|
+
// No-op (undefined) with the current published version — both cables degrade
|
|
44
|
+
// gracefully: Cable 1 skips recording, Cable 2 applies no extra gates.
|
|
45
|
+
const reflectionCache = new Map();
|
|
46
|
+
async function getReflection(vaultPath) {
|
|
47
|
+
if (reflectionCache.has(vaultPath))
|
|
48
|
+
return reflectionCache.get(vaultPath);
|
|
49
|
+
try {
|
|
50
|
+
// Dynamic import so missing export in old package versions doesn't throw
|
|
51
|
+
const lib = await import('@backendkit-labs/agent-enterprise');
|
|
52
|
+
const EnterpriseReflection = lib['EnterpriseReflection'];
|
|
53
|
+
if (!EnterpriseReflection)
|
|
54
|
+
return undefined;
|
|
55
|
+
const r = new EnterpriseReflection({ vaultPath });
|
|
56
|
+
await r.initialize();
|
|
57
|
+
reflectionCache.set(vaultPath, r);
|
|
58
|
+
return r;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// ── RAG setup ─────────────────────────────────────────────────────────────────
|
|
65
|
+
async function buildRAG(config) {
|
|
66
|
+
const vaultCfg = config.orchestrator.vault;
|
|
67
|
+
if (!vaultCfg)
|
|
68
|
+
return null;
|
|
69
|
+
const indexDir = path.join(os.homedir(), '.bk-agent', 'rag', 'orchestrator');
|
|
70
|
+
fs.mkdirSync(indexDir, { recursive: true });
|
|
71
|
+
const embedder = vaultCfg.embedder === 'ollama'
|
|
72
|
+
? new OllamaEmbedder({ host: vaultCfg.ollama_host, model: vaultCfg.ollama_model })
|
|
73
|
+
: new SimpleEmbedder();
|
|
74
|
+
const rag = new ObsidianRAGProvider({
|
|
75
|
+
vaultPath: vaultCfg.path,
|
|
76
|
+
indexPath: path.join(indexDir, 'vault.json'),
|
|
77
|
+
embedder,
|
|
78
|
+
topK: 5,
|
|
79
|
+
minScore: 0.1,
|
|
80
|
+
});
|
|
81
|
+
await rag.index({ verbose: false });
|
|
82
|
+
return {
|
|
83
|
+
search: (query) => rag.search(query),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// ── Planning helpers ──────────────────────────────────────────────────────────
|
|
87
|
+
async function planDynamic(config, rag, task) {
|
|
88
|
+
const orchProvCfg = config.providers[config.orchestrator.provider];
|
|
89
|
+
if (!orchProvCfg) {
|
|
90
|
+
return { summary: '', subtasks: [], error: `Provider "${config.orchestrator.provider}" not configured` };
|
|
91
|
+
}
|
|
92
|
+
const orchProvider = new OpenAICompatibleProvider(orchProvCfg);
|
|
93
|
+
const planner = new TaskPlanner((sys, usr) => callLLM(orchProvider, sys, usr));
|
|
94
|
+
const vaultContext = rag ? await rag.search(task).catch(() => '') : undefined;
|
|
95
|
+
try {
|
|
96
|
+
return await planner.plan(task, config.agents, vaultContext);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
return { summary: '', subtasks: [], error: `Planning error: ${err instanceof Error ? err.message : String(err)}` };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ── Background execution ──────────────────────────────────────────────────────
|
|
103
|
+
/**
|
|
104
|
+
* Run plan segments in the background (after orchestrator_run already returned
|
|
105
|
+
* the runId). Updates the RunStore as steps complete or gates are hit.
|
|
106
|
+
*
|
|
107
|
+
* @param priorResults Steps already completed — used when resuming after a gate.
|
|
108
|
+
*/
|
|
109
|
+
async function executeInBackground(runId, config, plan, rag, priorResults = []) {
|
|
110
|
+
const state = store.load(runId);
|
|
111
|
+
if (!state)
|
|
112
|
+
return;
|
|
113
|
+
// Cable 1 + 2: wire reflection adapter when vault is configured
|
|
114
|
+
const reflection = config.orchestrator.vault
|
|
115
|
+
? await getReflection(config.orchestrator.vault.path).catch(() => undefined)
|
|
116
|
+
: undefined;
|
|
117
|
+
const executor = new PlanExecutor({
|
|
118
|
+
config,
|
|
119
|
+
ragSearchFn: rag?.search,
|
|
120
|
+
reflection,
|
|
121
|
+
// Mark each step as "in progress" in the RunStore before running it
|
|
122
|
+
onProgress: (msg) => {
|
|
123
|
+
const match = msg.match(/\[([^\]]+)\]/);
|
|
124
|
+
if (match) {
|
|
125
|
+
const current = store.load(runId);
|
|
126
|
+
if (current && current.status === 'running') {
|
|
127
|
+
store.save({ ...current, currentStep: { stepId: match[1], agentId: match[1], startedAt: ts() } });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
try {
|
|
133
|
+
const result = await executor.execute(plan, priorResults);
|
|
134
|
+
if ('gateRequired' in result) {
|
|
135
|
+
store.save({
|
|
136
|
+
...state,
|
|
137
|
+
status: 'waiting_gate',
|
|
138
|
+
currentStep: undefined,
|
|
139
|
+
completedSteps: result.completedSoFar.map(toStepResult),
|
|
140
|
+
waitingGate: {
|
|
141
|
+
gateId: result.stepId,
|
|
142
|
+
stepId: result.stepId,
|
|
143
|
+
agentId: result.agentId,
|
|
144
|
+
output: result.output,
|
|
145
|
+
criteria: result.criteria,
|
|
146
|
+
requestedAt: ts(),
|
|
147
|
+
appliedRuleIds: result.appliedRuleIds.length ? result.appliedRuleIds : undefined,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Write final report to vault if vault is configured
|
|
153
|
+
let vaultNotePath;
|
|
154
|
+
if (config.orchestrator.vault) {
|
|
155
|
+
try {
|
|
156
|
+
const writer = new VaultWriter({ vaultPath: config.orchestrator.vault.path });
|
|
157
|
+
vaultNotePath = await writer.writeNote({
|
|
158
|
+
title: `Run ${runId} — ${state.task.slice(0, 60)}`,
|
|
159
|
+
content: result.summary,
|
|
160
|
+
agentId: 'orchestrator',
|
|
161
|
+
tags: ['área/orquestador', 'función/resultado'],
|
|
162
|
+
description: state.task.slice(0, 120),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch { /* vault write is best-effort */ }
|
|
166
|
+
}
|
|
167
|
+
store.save({
|
|
168
|
+
...state,
|
|
169
|
+
status: 'complete',
|
|
170
|
+
completedAt: ts(),
|
|
171
|
+
currentStep: undefined,
|
|
172
|
+
completedSteps: result.results.map(toStepResult),
|
|
173
|
+
finalReport: result.summary,
|
|
174
|
+
vaultNotePath,
|
|
175
|
+
waitingGate: undefined,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
store.save({
|
|
181
|
+
...state,
|
|
182
|
+
status: 'failed',
|
|
183
|
+
currentStep: undefined,
|
|
184
|
+
error: err instanceof Error ? err.message : String(err),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function toStepResult(r) {
|
|
189
|
+
return {
|
|
190
|
+
stepId: r.subtask_id,
|
|
191
|
+
agentId: r.agent_id,
|
|
192
|
+
task: r.task,
|
|
193
|
+
output: r.result,
|
|
194
|
+
success: r.success,
|
|
195
|
+
durationMs: r.duration_ms,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// ── MCP Server ────────────────────────────────────────────────────────────────
|
|
199
|
+
const srv = new McpServer({
|
|
200
|
+
name: '@backendkit-labs/orchestrator-agent',
|
|
201
|
+
version: '0.1.0',
|
|
202
|
+
});
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
// orchestrator_run — plan synchronously, execute in background, return runId
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// @ts-ignore
|
|
207
|
+
srv.tool('orchestrator_run', 'Start a coordinated multi-agent task. Automatically uses a pre-defined static flow if the task matches one; otherwise the LLM plans dynamically. Returns a runId immediately — poll with orchestrator_status. Use orchestrator_approve when a gate is reached.', {
|
|
208
|
+
config_path: z.string().describe('Absolute path to orchestrator.yaml'),
|
|
209
|
+
task: z.string().describe('Task description in natural language'),
|
|
210
|
+
flow_id: z.string().optional().describe('Force a specific static flow ID instead of auto-detection'),
|
|
211
|
+
payload: z.record(z.string()).optional().describe('Key-value pairs for {{payload.key}} interpolation in static flow templates ' +
|
|
212
|
+
'(e.g. {"nombre": "Juan", "puesto": "Developer", "fecha_ingreso": "2026-07-01"})'),
|
|
213
|
+
}, async ({ config_path, task, flow_id, payload = {} }) => {
|
|
214
|
+
let config;
|
|
215
|
+
try {
|
|
216
|
+
config = loadConfig(config_path);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
return ok(`Config error: ${err instanceof Error ? err.message : String(err)}`);
|
|
220
|
+
}
|
|
221
|
+
const rag = await buildRAG(config).catch(() => null);
|
|
222
|
+
const configDir = path.dirname(path.resolve(config_path));
|
|
223
|
+
// ── Resolve plan: static flow or dynamic TaskPlanner ─────────────────
|
|
224
|
+
let plan;
|
|
225
|
+
let planSource;
|
|
226
|
+
// Explicit flow_id → load directly
|
|
227
|
+
if (flow_id) {
|
|
228
|
+
const entry = config.flows?.find(f => f.id === flow_id);
|
|
229
|
+
if (!entry)
|
|
230
|
+
return ok(`Flow "${flow_id}" not declared in orchestrator.yaml`);
|
|
231
|
+
const flowPath = path.resolve(configDir, entry.file);
|
|
232
|
+
try {
|
|
233
|
+
const { loadFlow } = await import('./static-flow.js');
|
|
234
|
+
const flow = loadFlow(flowPath);
|
|
235
|
+
plan = flowToTaskPlan(flow, payload);
|
|
236
|
+
planSource = 'static';
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
return ok(`Flow load error: ${err instanceof Error ? err.message : String(err)}`);
|
|
240
|
+
}
|
|
241
|
+
// Auto-detect via trigger matching
|
|
242
|
+
}
|
|
243
|
+
else if (config.flows?.length) {
|
|
244
|
+
const matched = matchFlow(config.flows, configDir, task);
|
|
245
|
+
if (matched) {
|
|
246
|
+
plan = flowToTaskPlan(matched.flow, payload);
|
|
247
|
+
planSource = 'static';
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
plan = await planDynamic(config, rag, task);
|
|
251
|
+
planSource = 'dynamic';
|
|
252
|
+
}
|
|
253
|
+
// No flows declared → always dynamic
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
plan = await planDynamic(config, rag, task);
|
|
257
|
+
planSource = 'dynamic';
|
|
258
|
+
}
|
|
259
|
+
if ('error' in plan)
|
|
260
|
+
return ok(plan.error);
|
|
261
|
+
// ── Create run and fire background execution ──────────────────────────
|
|
262
|
+
const runId = store.newRunId();
|
|
263
|
+
const state = {
|
|
264
|
+
runId,
|
|
265
|
+
task,
|
|
266
|
+
configPath: config_path,
|
|
267
|
+
status: 'running',
|
|
268
|
+
startedAt: ts(),
|
|
269
|
+
updatedAt: ts(),
|
|
270
|
+
plan,
|
|
271
|
+
completedSteps: [],
|
|
272
|
+
};
|
|
273
|
+
store.save(state);
|
|
274
|
+
setImmediate(() => {
|
|
275
|
+
executeInBackground(runId, config, plan, rag).catch((err) => {
|
|
276
|
+
const s = store.load(runId);
|
|
277
|
+
if (s)
|
|
278
|
+
store.save({ ...s, status: 'failed', error: String(err) });
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
const planLines = plan.subtasks.map(st => {
|
|
282
|
+
const agentCfg = config.agents.find(a => a.id === st.agent_id);
|
|
283
|
+
const gateLabel = (st.gate ?? agentCfg?.gate) ? ' [GATE]' : '';
|
|
284
|
+
return ` • [${st.agent_id}]${gateLabel} ${st.task.slice(0, 90)}`;
|
|
285
|
+
});
|
|
286
|
+
return ok([
|
|
287
|
+
`## Run iniciado (${planSource === 'static' ? 'flow estático' : 'plan dinámico'})`,
|
|
288
|
+
`runId: \`${runId}\``,
|
|
289
|
+
`status: running`,
|
|
290
|
+
'',
|
|
291
|
+
`### Plan: ${plan.summary}`,
|
|
292
|
+
planLines.join('\n'),
|
|
293
|
+
'',
|
|
294
|
+
`Poll con \`orchestrator_status\` para ver el progreso.`,
|
|
295
|
+
`Si aparece un gate, usá \`orchestrator_approve\` para continuar o rechazar.`,
|
|
296
|
+
].join('\n'));
|
|
297
|
+
});
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
// orchestrator_approve — approve or reject a waiting gate
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
// @ts-ignore
|
|
302
|
+
srv.tool('orchestrator_approve', 'Approve or reject a gate that paused a running orchestration. If approved, execution resumes automatically.', {
|
|
303
|
+
run_id: z.string().describe('Run ID returned by orchestrator_run'),
|
|
304
|
+
approved: z.boolean().describe('true to approve and continue, false to reject and stop'),
|
|
305
|
+
notes: z.string().optional().describe('Optional notes from the approver (required when rejecting)'),
|
|
306
|
+
}, async ({ run_id, approved, notes }) => {
|
|
307
|
+
const state = store.load(run_id);
|
|
308
|
+
if (!state)
|
|
309
|
+
return ok(`Run not found: ${run_id}`);
|
|
310
|
+
if (state.status !== 'waiting_gate') {
|
|
311
|
+
return ok(`Run \`${run_id}\` is not waiting for a gate (current status: ${state.status})`);
|
|
312
|
+
}
|
|
313
|
+
const gate = state.waitingGate;
|
|
314
|
+
// Reload config early — needed for reflection in both approve and reject paths
|
|
315
|
+
let config;
|
|
316
|
+
try {
|
|
317
|
+
config = loadConfig(state.configPath);
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
return ok(`Config error on resume: ${err instanceof Error ? err.message : String(err)}`);
|
|
321
|
+
}
|
|
322
|
+
// Cable 2: record rule outcomes so the reflection engine tracks effectiveness
|
|
323
|
+
const reflection = config.orchestrator.vault
|
|
324
|
+
? await getReflection(config.orchestrator.vault.path).catch(() => undefined)
|
|
325
|
+
: undefined;
|
|
326
|
+
if (reflection && gate.appliedRuleIds?.length) {
|
|
327
|
+
const outcome = approved ? 'success' : 'failure';
|
|
328
|
+
for (const ruleId of gate.appliedRuleIds) {
|
|
329
|
+
reflection.recordRuleOutcome(ruleId, outcome).catch(() => { });
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (!approved) {
|
|
333
|
+
store.save({
|
|
334
|
+
...state,
|
|
335
|
+
status: 'failed',
|
|
336
|
+
completedAt: ts(),
|
|
337
|
+
error: `Gate rejected by approver. Step: ${gate.stepId}. Notes: ${notes ?? '(none)'}`,
|
|
338
|
+
waitingGate: undefined,
|
|
339
|
+
});
|
|
340
|
+
return ok([
|
|
341
|
+
`Gate rejected — run \`${run_id}\` stopped.`,
|
|
342
|
+
`Step: ${gate.stepId} (${gate.agentId})`,
|
|
343
|
+
notes ? `Notes: ${notes}` : '',
|
|
344
|
+
].filter(Boolean).join('\n'));
|
|
345
|
+
}
|
|
346
|
+
const rag = await buildRAG(config).catch(() => null);
|
|
347
|
+
// Mark gate as cleared, resume in background
|
|
348
|
+
const resumeState = {
|
|
349
|
+
...state,
|
|
350
|
+
status: 'running',
|
|
351
|
+
waitingGate: undefined,
|
|
352
|
+
};
|
|
353
|
+
store.save(resumeState);
|
|
354
|
+
const priorResults = state.completedSteps.map(s => ({
|
|
355
|
+
subtask_id: s.stepId,
|
|
356
|
+
agent_id: s.agentId,
|
|
357
|
+
task: s.task,
|
|
358
|
+
result: s.output,
|
|
359
|
+
success: s.success,
|
|
360
|
+
duration_ms: s.durationMs,
|
|
361
|
+
}));
|
|
362
|
+
setImmediate(() => {
|
|
363
|
+
executeInBackground(run_id, config, state.plan, rag, priorResults).catch((err) => {
|
|
364
|
+
const s = store.load(run_id);
|
|
365
|
+
if (s)
|
|
366
|
+
store.save({ ...s, status: 'failed', error: String(err) });
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
return ok([
|
|
370
|
+
`Gate approved — run \`${run_id}\` resuming.`,
|
|
371
|
+
`Step: ${gate.stepId} (${gate.agentId})`,
|
|
372
|
+
notes ? `Notes: ${notes}` : '',
|
|
373
|
+
'',
|
|
374
|
+
`Poll with \`orchestrator_status\` to see progress.`,
|
|
375
|
+
].filter(Boolean).join('\n'));
|
|
376
|
+
});
|
|
377
|
+
// ---------------------------------------------------------------------------
|
|
378
|
+
// orchestrator_list_agents — show configured agents
|
|
379
|
+
// ---------------------------------------------------------------------------
|
|
380
|
+
// @ts-ignore
|
|
381
|
+
srv.tool('orchestrator_list_agents', 'List all specialist agents configured in orchestrator.yaml with their capabilities.', {
|
|
382
|
+
config_path: z.string().describe('Absolute path to orchestrator.yaml'),
|
|
383
|
+
}, async ({ config_path }) => {
|
|
384
|
+
let config;
|
|
385
|
+
try {
|
|
386
|
+
config = loadConfig(config_path);
|
|
387
|
+
}
|
|
388
|
+
catch (err) {
|
|
389
|
+
return ok(`Config error: ${err instanceof Error ? err.message : String(err)}`);
|
|
390
|
+
}
|
|
391
|
+
const lines = [
|
|
392
|
+
`## ${config.orchestrator.name}`,
|
|
393
|
+
`Orchestrator provider: ${config.orchestrator.provider}`,
|
|
394
|
+
config.orchestrator.vault ? `Vault: ${config.orchestrator.vault.path}` : 'Vault: not configured',
|
|
395
|
+
'',
|
|
396
|
+
`### Configured agents (${config.agents.length})`,
|
|
397
|
+
];
|
|
398
|
+
for (const a of config.agents) {
|
|
399
|
+
const gateLabel = a.gate ? ' [GATE]' : '';
|
|
400
|
+
lines.push(`\n**${a.name}** (\`${a.id}\`)${gateLabel} provider: ${a.provider}`);
|
|
401
|
+
lines.push(` ${a.description}`);
|
|
402
|
+
lines.push(` capabilities: ${a.capabilities.join(', ')}`);
|
|
403
|
+
if (a.gate_criteria?.length) {
|
|
404
|
+
lines.push(` gate criteria: ${a.gate_criteria.join(' | ')}`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return ok(lines.join('\n'));
|
|
408
|
+
});
|
|
409
|
+
// ---------------------------------------------------------------------------
|
|
410
|
+
// orchestrator_status — get run status
|
|
411
|
+
// ---------------------------------------------------------------------------
|
|
412
|
+
// @ts-ignore
|
|
413
|
+
srv.tool('orchestrator_status', 'Get the status of a running or completed orchestration by runId.', {
|
|
414
|
+
run_id: z.string().describe('Run ID returned by orchestrator_run'),
|
|
415
|
+
}, async ({ run_id }) => {
|
|
416
|
+
const state = store.load(run_id);
|
|
417
|
+
if (!state)
|
|
418
|
+
return ok(`Run not found: ${run_id}`);
|
|
419
|
+
const lines = [
|
|
420
|
+
`## Run \`${state.runId}\``,
|
|
421
|
+
`status: **${state.status}**`,
|
|
422
|
+
`task: ${state.task}`,
|
|
423
|
+
`started: ${state.startedAt}`,
|
|
424
|
+
state.completedAt ? `completed: ${state.completedAt}` : '',
|
|
425
|
+
'',
|
|
426
|
+
`### Pasos completados (${state.completedSteps.length})`,
|
|
427
|
+
...state.completedSteps.map(s => `${s.success ? '✓' : '✗'} [${s.agentId}] ${s.task.slice(0, 80)}`),
|
|
428
|
+
];
|
|
429
|
+
if (state.status === 'running' && state.currentStep) {
|
|
430
|
+
lines.push('', `⏳ En progreso: [${state.currentStep.agentId}] desde ${state.currentStep.startedAt}`);
|
|
431
|
+
}
|
|
432
|
+
if (state.status === 'waiting_gate' && state.waitingGate) {
|
|
433
|
+
const g = state.waitingGate;
|
|
434
|
+
lines.push('', `### ⏸ Gate waiting for approval`);
|
|
435
|
+
lines.push(`Step: \`${g.stepId}\` Agent: ${g.agentId}`);
|
|
436
|
+
lines.push(`Requested: ${g.requestedAt}`);
|
|
437
|
+
if (g.criteria.length) {
|
|
438
|
+
lines.push('', 'Criteria to evaluate:');
|
|
439
|
+
g.criteria.forEach(c => lines.push(` - ${c}`));
|
|
440
|
+
}
|
|
441
|
+
lines.push('', '**Agent output:**');
|
|
442
|
+
lines.push(g.output.slice(0, 800));
|
|
443
|
+
lines.push('', `Use \`orchestrator_approve\` with run_id: "${state.runId}" to continue or reject.`);
|
|
444
|
+
}
|
|
445
|
+
if (state.status === 'complete' && state.finalReport) {
|
|
446
|
+
if (state.vaultNotePath) {
|
|
447
|
+
lines.push('', `📝 Guardado en vault: \`${path.basename(state.vaultNotePath)}\``);
|
|
448
|
+
}
|
|
449
|
+
lines.push('', '### Reporte final', state.finalReport);
|
|
450
|
+
}
|
|
451
|
+
if (state.status === 'failed' && state.error) {
|
|
452
|
+
lines.push('', `### Error`, state.error);
|
|
453
|
+
}
|
|
454
|
+
return ok(lines.filter(l => l !== undefined).join('\n'));
|
|
455
|
+
});
|
|
456
|
+
// ── Start ─────────────────────────────────────────────────────────────────────
|
|
457
|
+
async function main() {
|
|
458
|
+
const transport = new StdioServerTransport();
|
|
459
|
+
await srv.connect(transport);
|
|
460
|
+
process.stderr.write('[orchestrator-agent] Running\n');
|
|
461
|
+
}
|
|
462
|
+
main().catch(e => {
|
|
463
|
+
process.stderr.write(`[orchestrator-agent] Fatal: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
464
|
+
process.exit(1);
|
|
465
|
+
});
|
|
466
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { TaskPlan } from './planner.js';
|
|
3
|
+
declare const FlowStepSchema: z.ZodObject<{
|
|
4
|
+
id: z.ZodString;
|
|
5
|
+
agent: z.ZodString;
|
|
6
|
+
task: z.ZodString;
|
|
7
|
+
depends_on: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
8
|
+
gate: z.ZodOptional<z.ZodBoolean>;
|
|
9
|
+
gate_criteria: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
id: string;
|
|
12
|
+
agent: string;
|
|
13
|
+
task: string;
|
|
14
|
+
depends_on: string[];
|
|
15
|
+
gate?: boolean | undefined;
|
|
16
|
+
gate_criteria?: string[] | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
id: string;
|
|
19
|
+
agent: string;
|
|
20
|
+
task: string;
|
|
21
|
+
gate?: boolean | undefined;
|
|
22
|
+
gate_criteria?: string[] | undefined;
|
|
23
|
+
depends_on?: string[] | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
declare const StaticFlowSchema: z.ZodObject<{
|
|
26
|
+
version: z.ZodDefault<z.ZodNumber>;
|
|
27
|
+
id: z.ZodString;
|
|
28
|
+
name: z.ZodString;
|
|
29
|
+
description: z.ZodOptional<z.ZodString>;
|
|
30
|
+
steps: z.ZodArray<z.ZodObject<{
|
|
31
|
+
id: z.ZodString;
|
|
32
|
+
agent: z.ZodString;
|
|
33
|
+
task: z.ZodString;
|
|
34
|
+
depends_on: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
35
|
+
gate: z.ZodOptional<z.ZodBoolean>;
|
|
36
|
+
gate_criteria: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
id: string;
|
|
39
|
+
agent: string;
|
|
40
|
+
task: string;
|
|
41
|
+
depends_on: string[];
|
|
42
|
+
gate?: boolean | undefined;
|
|
43
|
+
gate_criteria?: string[] | undefined;
|
|
44
|
+
}, {
|
|
45
|
+
id: string;
|
|
46
|
+
agent: string;
|
|
47
|
+
task: string;
|
|
48
|
+
gate?: boolean | undefined;
|
|
49
|
+
gate_criteria?: string[] | undefined;
|
|
50
|
+
depends_on?: string[] | undefined;
|
|
51
|
+
}>, "many">;
|
|
52
|
+
}, "strip", z.ZodTypeAny, {
|
|
53
|
+
version: number;
|
|
54
|
+
name: string;
|
|
55
|
+
id: string;
|
|
56
|
+
steps: {
|
|
57
|
+
id: string;
|
|
58
|
+
agent: string;
|
|
59
|
+
task: string;
|
|
60
|
+
depends_on: string[];
|
|
61
|
+
gate?: boolean | undefined;
|
|
62
|
+
gate_criteria?: string[] | undefined;
|
|
63
|
+
}[];
|
|
64
|
+
description?: string | undefined;
|
|
65
|
+
}, {
|
|
66
|
+
name: string;
|
|
67
|
+
id: string;
|
|
68
|
+
steps: {
|
|
69
|
+
id: string;
|
|
70
|
+
agent: string;
|
|
71
|
+
task: string;
|
|
72
|
+
gate?: boolean | undefined;
|
|
73
|
+
gate_criteria?: string[] | undefined;
|
|
74
|
+
depends_on?: string[] | undefined;
|
|
75
|
+
}[];
|
|
76
|
+
version?: number | undefined;
|
|
77
|
+
description?: string | undefined;
|
|
78
|
+
}>;
|
|
79
|
+
export type StaticFlow = z.infer<typeof StaticFlowSchema>;
|
|
80
|
+
export type FlowStep = z.infer<typeof FlowStepSchema>;
|
|
81
|
+
export declare const FlowEntrySchema: z.ZodObject<{
|
|
82
|
+
id: z.ZodString;
|
|
83
|
+
file: z.ZodString;
|
|
84
|
+
trigger: z.ZodOptional<z.ZodString>;
|
|
85
|
+
}, "strip", z.ZodTypeAny, {
|
|
86
|
+
id: string;
|
|
87
|
+
file: string;
|
|
88
|
+
trigger?: string | undefined;
|
|
89
|
+
}, {
|
|
90
|
+
id: string;
|
|
91
|
+
file: string;
|
|
92
|
+
trigger?: string | undefined;
|
|
93
|
+
}>;
|
|
94
|
+
export type FlowEntry = z.infer<typeof FlowEntrySchema>;
|
|
95
|
+
export declare function loadFlow(flowPath: string): StaticFlow;
|
|
96
|
+
/**
|
|
97
|
+
* Find the first flow whose trigger regex matches the task description.
|
|
98
|
+
* Returns null if no flow matches → fall back to TaskPlanner.
|
|
99
|
+
*/
|
|
100
|
+
export declare function matchFlow(entries: FlowEntry[], configDir: string, task: string): {
|
|
101
|
+
entry: FlowEntry;
|
|
102
|
+
flow: StaticFlow;
|
|
103
|
+
} | null;
|
|
104
|
+
/**
|
|
105
|
+
* Convert a static flow definition to a TaskPlan, interpolating
|
|
106
|
+
* {{payload.key}} placeholders with values from the provided payload.
|
|
107
|
+
*/
|
|
108
|
+
export declare function flowToTaskPlan(flow: StaticFlow, payload?: Record<string, string>): TaskPlan;
|
|
109
|
+
export {};
|
|
110
|
+
//# sourceMappingURL=static-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-flow.d.ts","sourceRoot":"","sources":["../src/static-flow.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAU,KAAK,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,cAAc,CAAC;AAItD,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAOlB,CAAC;AAEH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMpB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,QAAQ,GAAK,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAIxD,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAYrD;AAID;;;GAGG;AACH,wBAAgB,SAAS,CACrB,OAAO,EAAE,SAAS,EAAE,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAW/C;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,QAAQ,CAc/F"}
|