slavedriver 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -0
- package/agents/executor.md +26 -0
- package/agents/planner.md +41 -0
- package/agents/researcher.md +28 -0
- package/agents/verifier.md +25 -0
- package/dist/agents/backends/claude-code.d.ts +2 -0
- package/dist/agents/backends/claude-code.js +215 -0
- package/dist/agents/backends/claude-code.js.map +1 -0
- package/dist/agents/backends/mock.d.ts +9 -0
- package/dist/agents/backends/mock.js +31 -0
- package/dist/agents/backends/mock.js.map +1 -0
- package/dist/agents/context-builder.d.ts +10 -0
- package/dist/agents/context-builder.js +61 -0
- package/dist/agents/context-builder.js.map +1 -0
- package/dist/agents/prompt-compiler.d.ts +27 -0
- package/dist/agents/prompt-compiler.js +549 -0
- package/dist/agents/prompt-compiler.js.map +1 -0
- package/dist/agents/runtime.d.ts +40 -0
- package/dist/agents/runtime.js +2 -0
- package/dist/agents/runtime.js.map +1 -0
- package/dist/cli/arg-parser.d.ts +6 -0
- package/dist/cli/arg-parser.js +59 -0
- package/dist/cli/arg-parser.js.map +1 -0
- package/dist/cli/commands/config.d.ts +9 -0
- package/dist/cli/commands/config.js +120 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +1 -0
- package/dist/cli/commands/dashboard.js +54 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/find-root.d.ts +14 -0
- package/dist/cli/commands/find-root.js +55 -0
- package/dist/cli/commands/find-root.js.map +1 -0
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.js +65 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/next.d.ts +1 -0
- package/dist/cli/commands/next.js +61 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +2 -0
- package/dist/cli/commands/plan.js +53 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/replan.d.ts +1 -0
- package/dist/cli/commands/replan.js +54 -0
- package/dist/cli/commands/replan.js.map +1 -0
- package/dist/cli/commands/run-pipeline.d.ts +2 -0
- package/dist/cli/commands/run-pipeline.js +74 -0
- package/dist/cli/commands/run-pipeline.js.map +1 -0
- package/dist/cli/commands/run.d.ts +2 -0
- package/dist/cli/commands/run.js +106 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +51 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +1 -0
- package/dist/cli/commands/verify.js +63 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/wizard.d.ts +8 -0
- package/dist/cli/commands/wizard.js +39 -0
- package/dist/cli/commands/wizard.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/wizard/index.d.ts +11 -0
- package/dist/cli/wizard/index.js +40 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/interview.d.ts +26 -0
- package/dist/cli/wizard/interview.js +284 -0
- package/dist/cli/wizard/interview.js.map +1 -0
- package/dist/cli/wizard/prompt.d.ts +18 -0
- package/dist/cli/wizard/prompt.js +72 -0
- package/dist/cli/wizard/prompt.js.map +1 -0
- package/dist/cli/wizard/template-generator.d.ts +8 -0
- package/dist/cli/wizard/template-generator.js +133 -0
- package/dist/cli/wizard/template-generator.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +68 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/protocol.d.ts +33 -0
- package/dist/mcp/protocol.js +82 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/resources.d.ts +20 -0
- package/dist/mcp/resources.js +101 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/run-manager.d.ts +36 -0
- package/dist/mcp/run-manager.js +179 -0
- package/dist/mcp/run-manager.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +99 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +32 -0
- package/dist/mcp/tools.js +259 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/orchestrator/alert-types.d.ts +16 -0
- package/dist/orchestrator/alert-types.js +2 -0
- package/dist/orchestrator/alert-types.js.map +1 -0
- package/dist/orchestrator/alerts.d.ts +20 -0
- package/dist/orchestrator/alerts.js +76 -0
- package/dist/orchestrator/alerts.js.map +1 -0
- package/dist/orchestrator/checkpoints.d.ts +8 -0
- package/dist/orchestrator/checkpoints.js +24 -0
- package/dist/orchestrator/checkpoints.js.map +1 -0
- package/dist/orchestrator/engine.d.ts +71 -0
- package/dist/orchestrator/engine.js +420 -0
- package/dist/orchestrator/engine.js.map +1 -0
- package/dist/orchestrator/phase-gates.d.ts +6 -0
- package/dist/orchestrator/phase-gates.js +127 -0
- package/dist/orchestrator/phase-gates.js.map +1 -0
- package/dist/orchestrator/plan-approval.d.ts +10 -0
- package/dist/orchestrator/plan-approval.js +51 -0
- package/dist/orchestrator/plan-approval.js.map +1 -0
- package/dist/orchestrator/safety.d.ts +22 -0
- package/dist/orchestrator/safety.js +126 -0
- package/dist/orchestrator/safety.js.map +1 -0
- package/dist/orchestrator/task-graph.d.ts +17 -0
- package/dist/orchestrator/task-graph.js +156 -0
- package/dist/orchestrator/task-graph.js.map +1 -0
- package/dist/orchestrator/wave-executor.d.ts +37 -0
- package/dist/orchestrator/wave-executor.js +237 -0
- package/dist/orchestrator/wave-executor.js.map +1 -0
- package/dist/session/in-process.d.ts +2 -0
- package/dist/session/in-process.js +149 -0
- package/dist/session/in-process.js.map +1 -0
- package/dist/session/log-capture.d.ts +7 -0
- package/dist/session/log-capture.js +56 -0
- package/dist/session/log-capture.js.map +1 -0
- package/dist/session/manager.d.ts +20 -0
- package/dist/session/manager.js +2 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/state/file-store.d.ts +3 -0
- package/dist/state/file-store.js +124 -0
- package/dist/state/file-store.js.map +1 -0
- package/dist/state/lock.d.ts +6 -0
- package/dist/state/lock.js +71 -0
- package/dist/state/lock.js.map +1 -0
- package/dist/state/plan-parser.d.ts +6 -0
- package/dist/state/plan-parser.js +54 -0
- package/dist/state/plan-parser.js.map +1 -0
- package/dist/state/store.d.ts +27 -0
- package/dist/state/store.js +2 -0
- package/dist/state/store.js.map +1 -0
- package/dist/steps/events.d.ts +49 -0
- package/dist/steps/events.js +2 -0
- package/dist/steps/events.js.map +1 -0
- package/dist/steps/pipeline.d.ts +14 -0
- package/dist/steps/pipeline.js +284 -0
- package/dist/steps/pipeline.js.map +1 -0
- package/dist/steps/plan-parser.d.ts +35 -0
- package/dist/steps/plan-parser.js +147 -0
- package/dist/steps/plan-parser.js.map +1 -0
- package/dist/steps/runner.d.ts +13 -0
- package/dist/steps/runner.js +155 -0
- package/dist/steps/runner.js.map +1 -0
- package/dist/steps/store.d.ts +26 -0
- package/dist/steps/store.js +164 -0
- package/dist/steps/store.js.map +1 -0
- package/dist/steps/types.d.ts +36 -0
- package/dist/steps/types.js +2 -0
- package/dist/steps/types.js.map +1 -0
- package/dist/tui/app.d.ts +15 -0
- package/dist/tui/app.js +297 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/banner.d.ts +1 -0
- package/dist/tui/banner.js +11 -0
- package/dist/tui/banner.js.map +1 -0
- package/dist/tui/colors.d.ts +22 -0
- package/dist/tui/colors.js +30 -0
- package/dist/tui/colors.js.map +1 -0
- package/dist/tui/components/agent-panel.d.ts +8 -0
- package/dist/tui/components/agent-panel.js +80 -0
- package/dist/tui/components/agent-panel.js.map +1 -0
- package/dist/tui/components/header.d.ts +15 -0
- package/dist/tui/components/header.js +69 -0
- package/dist/tui/components/header.js.map +1 -0
- package/dist/tui/components/status-bar.d.ts +2 -0
- package/dist/tui/components/status-bar.js +8 -0
- package/dist/tui/components/status-bar.js.map +1 -0
- package/dist/tui/components/task-board.d.ts +3 -0
- package/dist/tui/components/task-board.js +96 -0
- package/dist/tui/components/task-board.js.map +1 -0
- package/dist/tui/display.d.ts +23 -0
- package/dist/tui/display.js +125 -0
- package/dist/tui/display.js.map +1 -0
- package/dist/tui/input.d.ts +2 -0
- package/dist/tui/input.js +44 -0
- package/dist/tui/input.js.map +1 -0
- package/dist/tui/layout-master.d.ts +7 -0
- package/dist/tui/layout-master.js +31 -0
- package/dist/tui/layout-master.js.map +1 -0
- package/dist/tui/layout.d.ts +13 -0
- package/dist/tui/layout.js +37 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/pane-formatter.d.ts +27 -0
- package/dist/tui/pane-formatter.js +153 -0
- package/dist/tui/pane-formatter.js.map +1 -0
- package/dist/tui/renderer.d.ts +8 -0
- package/dist/tui/renderer.js +30 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/screen.d.ts +12 -0
- package/dist/tui/screen.js +32 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/structured-display.d.ts +5 -0
- package/dist/tui/structured-display.js +74 -0
- package/dist/tui/structured-display.js.map +1 -0
- package/dist/tui/tmux-display.d.ts +6 -0
- package/dist/tui/tmux-display.js +187 -0
- package/dist/tui/tmux-display.js.map +1 -0
- package/dist/tui/tmux.d.ts +26 -0
- package/dist/tui/tmux.js +265 -0
- package/dist/tui/tmux.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git.d.ts +6 -0
- package/dist/utils/git.js +35 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/hello.d.ts +1 -0
- package/dist/utils/hello.js +4 -0
- package/dist/utils/hello.js.map +1 -0
- package/dist/utils/id.d.ts +1 -0
- package/dist/utils/id.js +5 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/jsonl.d.ts +2 -0
- package/dist/utils/jsonl.js +18 -0
- package/dist/utils/jsonl.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pricing.d.ts +3 -0
- package/dist/utils/pricing.js +26 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/xml.d.ts +13 -0
- package/dist/utils/xml.js +67 -0
- package/dist/utils/xml.js.map +1 -0
- package/dist/utils/yaml.d.ts +5 -0
- package/dist/utils/yaml.js +126 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +45 -0
- package/templates/CONSTITUTION.md +10 -0
- package/templates/STATE.md +3 -0
- package/templates/config.json +11 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// ── Validation helpers ──────────────────────────────────────────────────────
|
|
2
|
+
function asRecord(params) {
|
|
3
|
+
if (typeof params === 'object' && params !== null && !Array.isArray(params)) {
|
|
4
|
+
return params;
|
|
5
|
+
}
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
function invalidParams(message) {
|
|
9
|
+
return { content: [{ type: 'text', text: `Invalid parameters: ${message}` }], isError: true };
|
|
10
|
+
}
|
|
11
|
+
function errorResult(message) {
|
|
12
|
+
return { content: [{ type: 'text', text: message }], isError: true };
|
|
13
|
+
}
|
|
14
|
+
function textResult(text) {
|
|
15
|
+
return { content: [{ type: 'text', text }] };
|
|
16
|
+
}
|
|
17
|
+
// ── Config validation ───────────────────────────────────────────────────────
|
|
18
|
+
const SETTABLE_CONFIG_KEYS = new Set([
|
|
19
|
+
'maxConcurrentAgents',
|
|
20
|
+
'maxTotalTokens',
|
|
21
|
+
'maxTokensPerStep',
|
|
22
|
+
'maxWallTimeSeconds',
|
|
23
|
+
'maxAgentInvocations',
|
|
24
|
+
]);
|
|
25
|
+
const NUMERIC_BOUNDS = {
|
|
26
|
+
maxConcurrentAgents: { min: 1, max: 24 },
|
|
27
|
+
maxTotalTokens: { min: 1000, max: 100_000_000 },
|
|
28
|
+
maxTokensPerStep: { min: 1000, max: 10_000_000 },
|
|
29
|
+
maxWallTimeSeconds: { min: 10, max: 86400 },
|
|
30
|
+
maxAgentInvocations: { min: 1, max: 1000 },
|
|
31
|
+
};
|
|
32
|
+
function validateConfigValue(key, value) {
|
|
33
|
+
const bounds = NUMERIC_BOUNDS[key];
|
|
34
|
+
if (bounds) {
|
|
35
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < bounds.min || value > bounds.max) {
|
|
36
|
+
return `${key} must be a number between ${bounds.min} and ${bounds.max}`;
|
|
37
|
+
}
|
|
38
|
+
if (Number.isInteger(bounds.min) && !Number.isInteger(value)) {
|
|
39
|
+
return `${key} must be an integer`;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return `${key} cannot be set via config tool`;
|
|
44
|
+
}
|
|
45
|
+
// ── Tool definitions ────────────────────────────────────────────────────────
|
|
46
|
+
const TOOL_DEFS = [
|
|
47
|
+
{
|
|
48
|
+
name: 'slavedriver_start',
|
|
49
|
+
description: 'Launch the slavedriver pipeline with a goal. By default blocks until the pipeline completes and returns a summary. Set wait=false to return immediately with a run ID for polling.',
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: {
|
|
53
|
+
goal: { type: 'string', description: 'The goal or task description for the pipeline' },
|
|
54
|
+
dryRun: { type: 'boolean', description: 'Stop after planning (do not execute)' },
|
|
55
|
+
wait: { type: 'boolean', description: 'Block until pipeline completes (default true). Set false to return immediately.' },
|
|
56
|
+
},
|
|
57
|
+
required: ['goal'],
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'slavedriver_status',
|
|
62
|
+
description: 'Get the current status of the slavedriver pipeline run.',
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
properties: {
|
|
66
|
+
includeEvents: { type: 'boolean', description: 'Include recent events in response' },
|
|
67
|
+
eventLimit: { type: 'number', description: 'Max events to return (default 20)' },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'slavedriver_abort',
|
|
73
|
+
description: 'Abort the current pipeline run.',
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: 'object',
|
|
76
|
+
properties: {},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'slavedriver_config',
|
|
81
|
+
description: 'Read or update project configuration.',
|
|
82
|
+
inputSchema: {
|
|
83
|
+
type: 'object',
|
|
84
|
+
properties: {
|
|
85
|
+
action: { type: 'string', enum: ['get', 'set'], description: 'Read or write config' },
|
|
86
|
+
key: { type: 'string', description: 'Config key to set (required for set)' },
|
|
87
|
+
value: { description: 'Config value to set (required for set)' },
|
|
88
|
+
},
|
|
89
|
+
required: ['action'],
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
export function createToolRegistry(params) {
|
|
94
|
+
const { runManager, store, sdRoot, workingDirectory, configPath } = params;
|
|
95
|
+
async function readConfig() {
|
|
96
|
+
const { readFile } = await import('node:fs/promises');
|
|
97
|
+
const content = await readFile(configPath, 'utf-8');
|
|
98
|
+
return JSON.parse(content);
|
|
99
|
+
}
|
|
100
|
+
async function writeConfig(config) {
|
|
101
|
+
const { writeFile } = await import('node:fs/promises');
|
|
102
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
103
|
+
}
|
|
104
|
+
const handlers = {
|
|
105
|
+
slavedriver_start: async (p) => {
|
|
106
|
+
let goal;
|
|
107
|
+
if (typeof p['goal'] === 'string' && p['goal'].trim().length > 0) {
|
|
108
|
+
goal = p['goal'].trim();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
return invalidParams('goal is required and must be a non-empty string');
|
|
112
|
+
}
|
|
113
|
+
if (goal.length > 10_000) {
|
|
114
|
+
return invalidParams('goal must be 10,000 characters or fewer');
|
|
115
|
+
}
|
|
116
|
+
const wait = p['wait'] !== false; // default true
|
|
117
|
+
try {
|
|
118
|
+
const runId = runManager.start(goal, {
|
|
119
|
+
dryRun: p['dryRun'] === true,
|
|
120
|
+
});
|
|
121
|
+
if (!wait) {
|
|
122
|
+
const state = runManager.getState();
|
|
123
|
+
return textResult(JSON.stringify({
|
|
124
|
+
runId,
|
|
125
|
+
status: 'started',
|
|
126
|
+
...(state?.dashboardSession ? { dashboard: `tmux attach-session -t ${state.dashboardSession}` } : {}),
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
// Block until pipeline completes
|
|
130
|
+
const finalState = await runManager.waitForCompletion();
|
|
131
|
+
if (!finalState) {
|
|
132
|
+
return textResult(JSON.stringify({ runId, status: 'completed' }));
|
|
133
|
+
}
|
|
134
|
+
const elapsedMs = Date.now() - new Date(finalState.startedAt).getTime();
|
|
135
|
+
const elapsedSec = Math.round(elapsedMs / 1000);
|
|
136
|
+
return textResult(JSON.stringify({
|
|
137
|
+
runId,
|
|
138
|
+
status: 'completed',
|
|
139
|
+
steps: {
|
|
140
|
+
total: finalState.totalSteps,
|
|
141
|
+
completed: finalState.completedSteps,
|
|
142
|
+
failed: finalState.failedSteps,
|
|
143
|
+
},
|
|
144
|
+
tokens: finalState.totalInputTokens + finalState.totalOutputTokens,
|
|
145
|
+
elapsedSeconds: elapsedSec,
|
|
146
|
+
...(finalState.error ? { error: finalState.error } : {}),
|
|
147
|
+
...(finalState.dashboardSession ? { dashboard: `tmux attach-session -t ${finalState.dashboardSession}` } : {}),
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
slavedriver_status: async (p) => {
|
|
155
|
+
const state = runManager.getState();
|
|
156
|
+
const includeEvents = p['includeEvents'] === true;
|
|
157
|
+
const eventLimit = typeof p['eventLimit'] === 'number' ? Math.min(Math.max(1, p['eventLimit']), 200) : 20;
|
|
158
|
+
if (!state) {
|
|
159
|
+
// No active run — read step store directly
|
|
160
|
+
try {
|
|
161
|
+
const steps = await store.listSteps();
|
|
162
|
+
if (steps.length === 0) {
|
|
163
|
+
return textResult(JSON.stringify({ status: 'no_steps' }));
|
|
164
|
+
}
|
|
165
|
+
const completed = steps.filter((s) => s.meta.status === 'completed').length;
|
|
166
|
+
const failed = steps.filter((s) => s.meta.status === 'failed').length;
|
|
167
|
+
const running = steps.filter((s) => s.meta.status === 'running').length;
|
|
168
|
+
const pending = steps.filter((s) => s.meta.status === 'pending').length;
|
|
169
|
+
const stepList = steps.map((s) => ({
|
|
170
|
+
number: s.number,
|
|
171
|
+
name: s.meta.name,
|
|
172
|
+
status: s.meta.status,
|
|
173
|
+
agent: s.meta.agent,
|
|
174
|
+
}));
|
|
175
|
+
return textResult(JSON.stringify({
|
|
176
|
+
status: 'idle',
|
|
177
|
+
steps: { total: steps.length, completed, failed, running, pending },
|
|
178
|
+
stepList,
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return textResult(JSON.stringify({ status: 'no_active_run' }));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const result = {
|
|
186
|
+
...state,
|
|
187
|
+
summary: `Steps: ${state.completedSteps}/${state.totalSteps} done${state.failedSteps > 0 ? `, ${state.failedSteps} failed` : ''} | Tokens: ${state.totalInputTokens + state.totalOutputTokens}`,
|
|
188
|
+
};
|
|
189
|
+
if (includeEvents) {
|
|
190
|
+
result['recentEvents'] = runManager.getRecentEvents(eventLimit);
|
|
191
|
+
}
|
|
192
|
+
return textResult(JSON.stringify(result));
|
|
193
|
+
},
|
|
194
|
+
slavedriver_abort: async () => {
|
|
195
|
+
const aborted = runManager.abort();
|
|
196
|
+
if (!aborted) {
|
|
197
|
+
return errorResult('No active run to abort');
|
|
198
|
+
}
|
|
199
|
+
return textResult(JSON.stringify({ status: 'aborted' }));
|
|
200
|
+
},
|
|
201
|
+
slavedriver_config: async (p) => {
|
|
202
|
+
const action = p['action'];
|
|
203
|
+
if (action === 'get') {
|
|
204
|
+
try {
|
|
205
|
+
const config = await readConfig();
|
|
206
|
+
return textResult(JSON.stringify(config));
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (action === 'set') {
|
|
213
|
+
const key = p['key'];
|
|
214
|
+
if (typeof key !== 'string' || key.trim().length === 0) {
|
|
215
|
+
return invalidParams('key is required for set action');
|
|
216
|
+
}
|
|
217
|
+
if (!SETTABLE_CONFIG_KEYS.has(key)) {
|
|
218
|
+
return invalidParams(`unknown or unsettable config key: ${key}`);
|
|
219
|
+
}
|
|
220
|
+
const value = p['value'];
|
|
221
|
+
if (value === undefined) {
|
|
222
|
+
return invalidParams('value is required for set action');
|
|
223
|
+
}
|
|
224
|
+
const validationError = validateConfigValue(key, value);
|
|
225
|
+
if (validationError) {
|
|
226
|
+
return invalidParams(validationError);
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
const current = await readConfig();
|
|
230
|
+
const updated = { ...current, [key]: value };
|
|
231
|
+
await writeConfig(updated);
|
|
232
|
+
return textResult(JSON.stringify({ status: 'updated', key, value }));
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return invalidParams('action must be one of: get, set');
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
return {
|
|
242
|
+
list() {
|
|
243
|
+
return [...TOOL_DEFS];
|
|
244
|
+
},
|
|
245
|
+
async call(name, params) {
|
|
246
|
+
const handler = handlers[name];
|
|
247
|
+
if (!handler) {
|
|
248
|
+
return errorResult(`Unknown tool: ${name}`);
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
return await handler(asRecord(params));
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
return errorResult(`Internal error: ${err instanceof Error ? err.message : String(err)}`);
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type AlertSeverity = 'question' | 'blocked' | 'warning' | 'error' | 'approval';
|
|
2
|
+
export interface AgentAlert {
|
|
3
|
+
readonly taskId: string;
|
|
4
|
+
readonly executionId: string;
|
|
5
|
+
readonly severity: AlertSeverity;
|
|
6
|
+
readonly message: string;
|
|
7
|
+
readonly context?: string;
|
|
8
|
+
readonly timestamp: number;
|
|
9
|
+
}
|
|
10
|
+
export type AlertAction = 'answer' | 'retry' | 'skip' | 'abort';
|
|
11
|
+
export interface AlertResponse {
|
|
12
|
+
readonly action: AlertAction;
|
|
13
|
+
readonly message?: string;
|
|
14
|
+
}
|
|
15
|
+
export type AlertCallback = (alert: AgentAlert) => Promise<AlertResponse>;
|
|
16
|
+
export type AlertPolicy = 'skip' | 'abort' | 'retry';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-types.js","sourceRoot":"","sources":["../../src/orchestrator/alert-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentAlert, AlertCallback, AlertPolicy, AlertResponse, AlertSeverity } from './alert-types.js';
|
|
2
|
+
export type { AgentAlert, AlertCallback, AlertPolicy, AlertResponse, AlertSeverity };
|
|
3
|
+
export { type AlertAction } from './alert-types.js';
|
|
4
|
+
export interface AlertHandlerParams {
|
|
5
|
+
readonly onAlert?: AlertCallback;
|
|
6
|
+
readonly alertPolicy: AlertPolicy;
|
|
7
|
+
readonly enableAlerts: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface AlertStats {
|
|
10
|
+
readonly total: number;
|
|
11
|
+
readonly answered: number;
|
|
12
|
+
readonly skipped: number;
|
|
13
|
+
readonly aborted: number;
|
|
14
|
+
readonly retried: number;
|
|
15
|
+
}
|
|
16
|
+
export interface AlertHandler {
|
|
17
|
+
handleAlert(alert: AgentAlert): Promise<AlertResponse>;
|
|
18
|
+
getStats(): AlertStats;
|
|
19
|
+
}
|
|
20
|
+
export declare function createAlertHandler(params: AlertHandlerParams): AlertHandler;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
const BLOCKING_SEVERITIES = new Set(['blocked', 'error']);
|
|
2
|
+
export function createAlertHandler(params) {
|
|
3
|
+
let total = 0;
|
|
4
|
+
let answered = 0;
|
|
5
|
+
let skipped = 0;
|
|
6
|
+
let aborted = 0;
|
|
7
|
+
let retried = 0;
|
|
8
|
+
function trackResponse(response) {
|
|
9
|
+
total++;
|
|
10
|
+
switch (response.action) {
|
|
11
|
+
case 'answer':
|
|
12
|
+
answered++;
|
|
13
|
+
break;
|
|
14
|
+
case 'skip':
|
|
15
|
+
skipped++;
|
|
16
|
+
break;
|
|
17
|
+
case 'abort':
|
|
18
|
+
aborted++;
|
|
19
|
+
break;
|
|
20
|
+
case 'retry':
|
|
21
|
+
retried++;
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function autoHandleDisabled(severity) {
|
|
26
|
+
if (BLOCKING_SEVERITIES.has(severity)) {
|
|
27
|
+
return { action: 'abort' };
|
|
28
|
+
}
|
|
29
|
+
return { action: 'skip' };
|
|
30
|
+
}
|
|
31
|
+
function autoHandleByPolicy(severity) {
|
|
32
|
+
switch (params.alertPolicy) {
|
|
33
|
+
case 'skip':
|
|
34
|
+
return { action: 'skip' };
|
|
35
|
+
case 'abort':
|
|
36
|
+
return BLOCKING_SEVERITIES.has(severity)
|
|
37
|
+
? { action: 'abort' }
|
|
38
|
+
: { action: 'skip' };
|
|
39
|
+
case 'retry':
|
|
40
|
+
return BLOCKING_SEVERITIES.has(severity)
|
|
41
|
+
? { action: 'retry' }
|
|
42
|
+
: { action: 'skip' };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function handleAlert(alert) {
|
|
46
|
+
// Alerts disabled — auto-respond based on severity
|
|
47
|
+
if (!params.enableAlerts) {
|
|
48
|
+
const response = autoHandleDisabled(alert.severity);
|
|
49
|
+
trackResponse(response);
|
|
50
|
+
return response;
|
|
51
|
+
}
|
|
52
|
+
// Interactive mode — callback provided
|
|
53
|
+
if (params.onAlert) {
|
|
54
|
+
try {
|
|
55
|
+
const response = await params.onAlert(alert);
|
|
56
|
+
trackResponse(response);
|
|
57
|
+
return response;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Callback failed — abort as safety measure
|
|
61
|
+
const response = { action: 'abort' };
|
|
62
|
+
trackResponse(response);
|
|
63
|
+
return response;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Non-interactive mode — auto-handle by policy
|
|
67
|
+
const response = autoHandleByPolicy(alert.severity);
|
|
68
|
+
trackResponse(response);
|
|
69
|
+
return response;
|
|
70
|
+
}
|
|
71
|
+
function getStats() {
|
|
72
|
+
return { total, answered, skipped, aborted, retried };
|
|
73
|
+
}
|
|
74
|
+
return { handleAlert, getStats };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=alerts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/orchestrator/alerts.ts"],"names":[],"mappings":"AAmBA,MAAM,mBAAmB,GAA+B,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAOtF,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,SAAS,aAAa,CAAC,QAAuB;QAC5C,KAAK,EAAE,CAAC;QACR,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;YACxB,KAAK,QAAQ;gBACX,QAAQ,EAAE,CAAC;gBACX,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,EAAE,CAAC;gBACV,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,EAAE,CAAC;gBACV,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,EAAE,CAAC;gBACV,MAAM;QACV,CAAC;IACH,CAAC;IAED,SAAS,kBAAkB,CAAC,QAAuB;QACjD,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,SAAS,kBAAkB,CAAC,QAAuB;QACjD,QAAQ,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3B,KAAK,MAAM;gBACT,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC5B,KAAK,OAAO;gBACV,OAAO,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACtC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE;oBACrB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACzB,KAAK,OAAO;gBACV,OAAO,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACtC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE;oBACrB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,KAAiB;QAC1C,mDAAmD;QACnD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpD,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC7C,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,4CAA4C;gBAC5C,MAAM,QAAQ,GAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpD,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpD,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,QAAQ;QACf,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CheckpointConfig } from '../types.js';
|
|
2
|
+
export type CheckpointAction = 'continue' | 'modify' | 'abort';
|
|
3
|
+
export type CheckpointCallback = (phase: string, summary: string) => Promise<CheckpointAction>;
|
|
4
|
+
export interface CheckpointHandler {
|
|
5
|
+
shouldPause(phase: string): boolean;
|
|
6
|
+
execute(phase: string, summary: string): Promise<CheckpointAction>;
|
|
7
|
+
}
|
|
8
|
+
export declare function createCheckpoint(config: CheckpointConfig, callback?: CheckpointCallback): CheckpointHandler;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const PHASE_TO_CONFIG_KEY = {
|
|
2
|
+
plan: 'afterPlan',
|
|
3
|
+
wave: 'afterEachWave',
|
|
4
|
+
execute: 'afterExecute',
|
|
5
|
+
security: 'afterSecurity',
|
|
6
|
+
qa: 'afterQA',
|
|
7
|
+
};
|
|
8
|
+
export function createCheckpoint(config, callback) {
|
|
9
|
+
return {
|
|
10
|
+
shouldPause(phase) {
|
|
11
|
+
const key = PHASE_TO_CONFIG_KEY[phase];
|
|
12
|
+
if (!key)
|
|
13
|
+
return false;
|
|
14
|
+
return config[key] === true;
|
|
15
|
+
},
|
|
16
|
+
async execute(phase, summary) {
|
|
17
|
+
if (!callback) {
|
|
18
|
+
return 'continue';
|
|
19
|
+
}
|
|
20
|
+
return callback(phase, summary);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=checkpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoints.js","sourceRoot":"","sources":["../../src/orchestrator/checkpoints.ts"],"names":[],"mappings":"AAWA,MAAM,mBAAmB,GAA2C;IAClE,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,eAAe;IACzB,EAAE,EAAE,SAAS;CACd,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,MAAwB,EACxB,QAA6B;IAE7B,OAAO;QACL,WAAW,CAAC,KAAa;YACvB,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAC;YACvB,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;QAC9B,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,OAAe;YAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,OAAO,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Phase, Task, TaskEvent, ProjectConfig } from '../types.js';
|
|
2
|
+
import type { AgentRuntime, AgentEvent } from '../agents/runtime.js';
|
|
3
|
+
import type { StateStore } from '../state/store.js';
|
|
4
|
+
import type { SessionManager } from '../session/manager.js';
|
|
5
|
+
import type { SafetyState } from './safety.js';
|
|
6
|
+
import type { WaveResult } from './wave-executor.js';
|
|
7
|
+
import type { CheckpointCallback } from './checkpoints.js';
|
|
8
|
+
import type { AlertCallback, AgentAlert, AlertResponse } from './alert-types.js';
|
|
9
|
+
export type EngineEvent = {
|
|
10
|
+
type: 'phase_changed';
|
|
11
|
+
from: Phase;
|
|
12
|
+
to: Phase;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'tasks_loaded';
|
|
15
|
+
tasks: readonly Task[];
|
|
16
|
+
totalWaves: number;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'wave_started';
|
|
19
|
+
wave: number;
|
|
20
|
+
taskCount: number;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'wave_completed';
|
|
23
|
+
wave: number;
|
|
24
|
+
results: WaveResult;
|
|
25
|
+
} | {
|
|
26
|
+
type: 'task_event';
|
|
27
|
+
event: TaskEvent;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'agent_event';
|
|
30
|
+
taskId: string;
|
|
31
|
+
event: AgentEvent;
|
|
32
|
+
} | {
|
|
33
|
+
type: 'error';
|
|
34
|
+
error: string;
|
|
35
|
+
phase: Phase;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'complete';
|
|
38
|
+
totalInputTokens: number;
|
|
39
|
+
totalOutputTokens: number;
|
|
40
|
+
totalAgentInvocations: number;
|
|
41
|
+
taskCount: number;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'approval_required';
|
|
44
|
+
plan: string;
|
|
45
|
+
} | {
|
|
46
|
+
type: 'alert';
|
|
47
|
+
alert: AgentAlert;
|
|
48
|
+
response: AlertResponse;
|
|
49
|
+
};
|
|
50
|
+
export interface EngineParams {
|
|
51
|
+
readonly runtime: AgentRuntime;
|
|
52
|
+
readonly store: StateStore;
|
|
53
|
+
readonly sessionManager: SessionManager;
|
|
54
|
+
readonly config: ProjectConfig;
|
|
55
|
+
readonly workingDirectory: string;
|
|
56
|
+
readonly onEvent: (event: EngineEvent) => void;
|
|
57
|
+
readonly onApproval?: (plan: string) => Promise<boolean>;
|
|
58
|
+
readonly onCheckpoint?: CheckpointCallback;
|
|
59
|
+
readonly onAlert?: AlertCallback;
|
|
60
|
+
readonly abortSignal?: AbortSignal;
|
|
61
|
+
readonly skipDiscovery?: boolean;
|
|
62
|
+
readonly skipVerification?: boolean;
|
|
63
|
+
readonly dryRun?: boolean;
|
|
64
|
+
readonly targetWave?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface Engine {
|
|
67
|
+
run(goal: string): Promise<void>;
|
|
68
|
+
readonly phase: Phase;
|
|
69
|
+
readonly safetyState: SafetyState;
|
|
70
|
+
}
|
|
71
|
+
export declare function createEngine(params: EngineParams): Engine;
|