surrogate-protocol-mcp 2.0.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 +30 -0
- package/README.md +198 -0
- package/dist/__tests__/gates.test.d.ts +2 -0
- package/dist/__tests__/gates.test.d.ts.map +1 -0
- package/dist/__tests__/gates.test.js +342 -0
- package/dist/__tests__/gates.test.js.map +1 -0
- package/dist/__tests__/observability.test.d.ts +2 -0
- package/dist/__tests__/observability.test.d.ts.map +1 -0
- package/dist/__tests__/observability.test.js +382 -0
- package/dist/__tests__/observability.test.js.map +1 -0
- package/dist/__tests__/state.test.d.ts +2 -0
- package/dist/__tests__/state.test.d.ts.map +1 -0
- package/dist/__tests__/state.test.js +415 -0
- package/dist/__tests__/state.test.js.map +1 -0
- package/dist/agent-runner.d.ts +3 -0
- package/dist/agent-runner.d.ts.map +1 -0
- package/dist/agent-runner.js +419 -0
- package/dist/agent-runner.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +763 -0
- package/dist/cli.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +1382 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/utils/agent.d.ts +42 -0
- package/dist/utils/agent.d.ts.map +1 -0
- package/dist/utils/agent.js +231 -0
- package/dist/utils/agent.js.map +1 -0
- package/dist/utils/artifacts.d.ts +92 -0
- package/dist/utils/artifacts.d.ts.map +1 -0
- package/dist/utils/artifacts.js +338 -0
- package/dist/utils/artifacts.js.map +1 -0
- package/dist/utils/capsule.d.ts +28 -0
- package/dist/utils/capsule.d.ts.map +1 -0
- package/dist/utils/capsule.js +462 -0
- package/dist/utils/capsule.js.map +1 -0
- package/dist/utils/diagnostics.d.ts +62 -0
- package/dist/utils/diagnostics.d.ts.map +1 -0
- package/dist/utils/diagnostics.js +404 -0
- package/dist/utils/diagnostics.js.map +1 -0
- package/dist/utils/gates.d.ts +78 -0
- package/dist/utils/gates.d.ts.map +1 -0
- package/dist/utils/gates.js +661 -0
- package/dist/utils/gates.js.map +1 -0
- package/dist/utils/logging.d.ts +53 -0
- package/dist/utils/logging.d.ts.map +1 -0
- package/dist/utils/logging.js +187 -0
- package/dist/utils/logging.js.map +1 -0
- package/dist/utils/project-gates.d.ts +73 -0
- package/dist/utils/project-gates.d.ts.map +1 -0
- package/dist/utils/project-gates.js +520 -0
- package/dist/utils/project-gates.js.map +1 -0
- package/dist/utils/reconcile.d.ts +50 -0
- package/dist/utils/reconcile.d.ts.map +1 -0
- package/dist/utils/reconcile.js +262 -0
- package/dist/utils/reconcile.js.map +1 -0
- package/dist/utils/state.d.ts +241 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +865 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/worktree.d.ts +27 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +275 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// surrogate-tools/src/utils/reconcile.ts
|
|
2
|
+
// Reconciler: Ensures state consistency after crashes, hangs, or partial completions (WS1-4)
|
|
3
|
+
// P2-2: Enhanced with comprehensive reconcileState that properly completes/fails surrogates
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import { loadState, updateState, PROJECT_ROOT, reconcileState, } from './state.js';
|
|
8
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
9
|
+
// PROCESS CHECKING
|
|
10
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
11
|
+
/**
|
|
12
|
+
* Check if a process with given PID is still running.
|
|
13
|
+
*/
|
|
14
|
+
function isProcessRunning(pid) {
|
|
15
|
+
try {
|
|
16
|
+
// Signal 0 doesn't kill, just checks if process exists
|
|
17
|
+
process.kill(pid, 0);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read the .surrogate-result.json marker from a worktree.
|
|
26
|
+
*/
|
|
27
|
+
function readLocalResultMarker(worktreePath) {
|
|
28
|
+
const markerPath = path.join(worktreePath, '.surrogate-result.json');
|
|
29
|
+
if (!fs.existsSync(markerPath)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const content = fs.readFileSync(markerPath, 'utf8');
|
|
34
|
+
return JSON.parse(content);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
console.error(`[Reconcile] Failed to parse marker at ${markerPath}`);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a worktree exists and is valid.
|
|
43
|
+
*/
|
|
44
|
+
function isWorktreeValid(worktreePath) {
|
|
45
|
+
if (!fs.existsSync(worktreePath)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
// Check if it's a valid git worktree
|
|
49
|
+
try {
|
|
50
|
+
execSync('git rev-parse --git-dir', {
|
|
51
|
+
cwd: worktreePath,
|
|
52
|
+
stdio: 'pipe',
|
|
53
|
+
encoding: 'utf8',
|
|
54
|
+
});
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Read the agent status file from .surrogate/status/<id>.json
|
|
63
|
+
*/
|
|
64
|
+
function readAgentStatusFile(id) {
|
|
65
|
+
const statusPath = path.resolve(PROJECT_ROOT, '.surrogate', 'status', `${id}.json`);
|
|
66
|
+
if (!fs.existsSync(statusPath)) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const content = fs.readFileSync(statusPath, 'utf8');
|
|
71
|
+
return JSON.parse(content);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
78
|
+
// P2-2: ENHANCED RECONCILIATION (USES STATE.TS reconcileState)
|
|
79
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
80
|
+
/**
|
|
81
|
+
* P2-2: Enhanced reconcile that properly completes/fails surrogates.
|
|
82
|
+
* This version:
|
|
83
|
+
* - Moves completed/failed surrogates to recent_completed
|
|
84
|
+
* - Cleans up orphaned status files
|
|
85
|
+
* - Cleans up orphaned locks
|
|
86
|
+
* - Uses typed failures with evidence
|
|
87
|
+
*
|
|
88
|
+
* @param dryRun - If true, only report what would be done
|
|
89
|
+
* @returns Comprehensive reconcile result
|
|
90
|
+
*/
|
|
91
|
+
export function reconcileAllEnhanced(dryRun = false) {
|
|
92
|
+
return reconcileState(dryRun);
|
|
93
|
+
}
|
|
94
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
95
|
+
// LEGACY RECONCILIATION (for backward compatibility)
|
|
96
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
97
|
+
/**
|
|
98
|
+
* Reconcile a single surrogate's state based on actual system state.
|
|
99
|
+
* @deprecated Use reconcileAllEnhanced instead
|
|
100
|
+
*/
|
|
101
|
+
function reconcileSurrogateLegacy(surrogate) {
|
|
102
|
+
const { id, status, worktree } = surrogate;
|
|
103
|
+
const agentPid = surrogate.agent_pid;
|
|
104
|
+
// Skip already terminal states
|
|
105
|
+
if (status === 'COMPLETE' || status === 'FAILED') {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// Check worktree validity
|
|
109
|
+
const worktreeValid = isWorktreeValid(worktree.path);
|
|
110
|
+
if (!worktreeValid) {
|
|
111
|
+
return {
|
|
112
|
+
surrogate_id: id,
|
|
113
|
+
previous_status: status,
|
|
114
|
+
new_status: 'FAILED',
|
|
115
|
+
reason: `Worktree missing or invalid: ${worktree.path}`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// Read result marker
|
|
119
|
+
const marker = readLocalResultMarker(worktree.path);
|
|
120
|
+
// Read agent status file (written by agent-runner)
|
|
121
|
+
const agentStatus = readAgentStatusFile(id);
|
|
122
|
+
// Check if process is still running
|
|
123
|
+
const processRunning = agentPid ? isProcessRunning(agentPid) : false;
|
|
124
|
+
// Decision tree for reconciliation
|
|
125
|
+
if (marker) {
|
|
126
|
+
// Marker exists - agent completed
|
|
127
|
+
if (marker.success) {
|
|
128
|
+
// Success marker - should be REVIEWING
|
|
129
|
+
if (status !== 'REVIEWING') {
|
|
130
|
+
return {
|
|
131
|
+
surrogate_id: id,
|
|
132
|
+
previous_status: status,
|
|
133
|
+
new_status: 'REVIEWING',
|
|
134
|
+
reason: `Agent completed successfully (marker found): ${marker.message || 'success'}`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Failure marker
|
|
140
|
+
return {
|
|
141
|
+
surrogate_id: id,
|
|
142
|
+
previous_status: status,
|
|
143
|
+
new_status: 'FAILED',
|
|
144
|
+
reason: `Agent reported failure: ${marker.message || 'unknown error'}`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (!processRunning && (status === 'CODING' || status === 'INITIALIZING')) {
|
|
149
|
+
// No marker and process not running - crashed
|
|
150
|
+
const agentStatusStr = agentStatus ? agentStatus.status : 'unknown';
|
|
151
|
+
return {
|
|
152
|
+
surrogate_id: id,
|
|
153
|
+
previous_status: status,
|
|
154
|
+
new_status: 'FAILED',
|
|
155
|
+
reason: `Agent process not running (PID: ${agentPid || 'unknown'}), no result marker. Last known status: ${agentStatusStr}`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
else if (agentStatus && agentStatus.status === 'TIMEOUT') {
|
|
159
|
+
return {
|
|
160
|
+
surrogate_id: id,
|
|
161
|
+
previous_status: status,
|
|
162
|
+
new_status: 'TIMEOUT',
|
|
163
|
+
reason: 'Agent timed out (per status file)',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
else if (agentStatus && agentStatus.status === 'CONFIG_ERROR') {
|
|
167
|
+
return {
|
|
168
|
+
surrogate_id: id,
|
|
169
|
+
previous_status: status,
|
|
170
|
+
new_status: 'CONFIG_ERROR',
|
|
171
|
+
reason: 'Agent configuration error (per status file)',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// No reconciliation needed
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Reconcile all active surrogates (legacy version - updates status in place).
|
|
179
|
+
* @deprecated Use reconcileAllEnhanced for full lifecycle management
|
|
180
|
+
*
|
|
181
|
+
* This version is kept for backward compatibility. It only updates
|
|
182
|
+
* the status field without moving surrogates to recent_completed.
|
|
183
|
+
*/
|
|
184
|
+
export function reconcileAll() {
|
|
185
|
+
const actions = [];
|
|
186
|
+
const errors = [];
|
|
187
|
+
const state = loadState();
|
|
188
|
+
for (const surrogate of state.active_surrogates) {
|
|
189
|
+
try {
|
|
190
|
+
const action = reconcileSurrogateLegacy(surrogate);
|
|
191
|
+
if (action) {
|
|
192
|
+
actions.push(action);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
197
|
+
errors.push(`Failed to reconcile ${surrogate.id}: ${message}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Apply actions to state (legacy: just updates status in place)
|
|
201
|
+
if (actions.length > 0) {
|
|
202
|
+
updateState((state) => {
|
|
203
|
+
for (const action of actions) {
|
|
204
|
+
const surrogate = state.active_surrogates.find((s) => s.id === action.surrogate_id);
|
|
205
|
+
if (surrogate) {
|
|
206
|
+
surrogate.status = action.new_status;
|
|
207
|
+
if (surrogate.error_details === undefined) {
|
|
208
|
+
surrogate.error_details = action.reason;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
reconciled: actions.length,
|
|
216
|
+
actions,
|
|
217
|
+
errors,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Check for drift without making changes.
|
|
222
|
+
* Returns list of surrogates that would be reconciled.
|
|
223
|
+
*/
|
|
224
|
+
export function driftCheck() {
|
|
225
|
+
const drifted = [];
|
|
226
|
+
const errors = [];
|
|
227
|
+
const state = loadState();
|
|
228
|
+
for (const surrogate of state.active_surrogates) {
|
|
229
|
+
try {
|
|
230
|
+
const action = reconcileSurrogateLegacy(surrogate);
|
|
231
|
+
if (action) {
|
|
232
|
+
drifted.push(action);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
237
|
+
errors.push(`Failed to check ${surrogate.id}: ${message}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return { drifted, errors };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Force-fail a specific surrogate and clean up its resources.
|
|
244
|
+
* @deprecated Use failSurrogateState with TypedFailure instead
|
|
245
|
+
*/
|
|
246
|
+
export function forceFailSurrogate(id, reason) {
|
|
247
|
+
try {
|
|
248
|
+
updateState((state) => {
|
|
249
|
+
const surrogate = state.active_surrogates.find((s) => s.id === id);
|
|
250
|
+
if (surrogate) {
|
|
251
|
+
surrogate.status = 'FAILED';
|
|
252
|
+
surrogate.error_details = `Force-failed: ${reason}`;
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
return { success: true };
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
259
|
+
return { success: false, error: message };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/utils/reconcile.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,6FAA6F;AAC7F,4FAA4F;AAE5F,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,SAAS,EACT,WAAW,EAGX,YAAY,EACZ,cAAc,GAGf,MAAM,YAAY,CAAC;AAsBpB,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,uDAAuD;QACvD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,YAAoB;IAOjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAErE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,YAAoB;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,EAAE;YAClC,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,EAAU;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAEpF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+DAA+D;AAC/D,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAkB,KAAK;IAC1D,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,wBAAwB,CAAC,SAAoB;IACpD,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAC3C,MAAM,QAAQ,GAAI,SAAiB,CAAC,SAA+B,CAAC;IAEpE,+BAA+B;IAC/B,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0BAA0B;IAC1B,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,MAAM;YACvB,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,gCAAgC,QAAQ,CAAC,IAAI,EAAE;SACxD,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEpD,mDAAmD;IACnD,MAAM,WAAW,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAE5C,oCAAoC;IACpC,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAErE,mCAAmC;IACnC,IAAI,MAAM,EAAE,CAAC;QACX,kCAAkC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,uCAAuC;YACvC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC3B,OAAO;oBACL,YAAY,EAAE,EAAE;oBAChB,eAAe,EAAE,MAAM;oBACvB,UAAU,EAAE,WAAW;oBACvB,MAAM,EAAE,gDAAgD,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE;iBACtF,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,iBAAiB;YACjB,OAAO;gBACL,YAAY,EAAE,EAAE;gBAChB,eAAe,EAAE,MAAM;gBACvB,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,2BAA2B,MAAM,CAAC,OAAO,IAAI,eAAe,EAAE;aACvE,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,cAAc,CAAC,EAAE,CAAC;QACjF,8CAA8C;QAC9C,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,OAAO;YACL,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,MAAM;YACvB,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,mCAAmC,QAAQ,IAAI,SAAS,2CAA2C,cAAc,EAAE;SAC5H,CAAC;IACJ,CAAC;SAAM,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO;YACL,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,MAAM;YACvB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,mCAAmC;SAC5C,CAAC;IACJ,CAAC;SAAM,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QAChE,OAAO;YACL,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,MAAM;YACvB,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,6CAA6C;SACtD,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,uBAAuB,SAAS,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,YAAY,CAAC,CAAC;gBACpF,IAAI,SAAS,EAAE,CAAC;oBACd,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;oBACrC,IAAI,SAAS,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;wBAC1C,SAAS,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,mBAAmB,SAAS,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,MAAc;IAC3D,IAAI,CAAC;QACH,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACnE,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAC5B,SAAS,CAAC,aAAa,GAAG,iBAAiB,MAAM,EAAE,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
export declare const PROJECT_ROOT: string;
|
|
2
|
+
export type SurrogateStatus = 'INITIALIZING' | 'CODING' | 'TESTING' | 'REVIEWING' | 'MERGE_CONFLICT' | 'SPAWN_FAILED' | 'CONFIG_ERROR' | 'TIMEOUT' | 'COMPLETE' | 'FAILED';
|
|
3
|
+
/**
|
|
4
|
+
* Error type enum - fail_surrogate MUST use one of these types.
|
|
5
|
+
* Free-form "reason-only" failures are not allowed.
|
|
6
|
+
*/
|
|
7
|
+
export type FailureErrorType = 'AUTH' | 'TIMEOUT' | 'TOOLING_MISSING' | 'GATE_FAILED' | 'POLICY_VIOLATION' | 'MERGE_CONFLICT' | 'DEPENDENCY_ERROR' | 'SYNTAX_ERROR' | 'RUNTIME_ERROR' | 'TASK_IMPOSSIBLE' | 'EXTERNAL_BLOCKER';
|
|
8
|
+
/**
|
|
9
|
+
* Evidence required for fail_surrogate.
|
|
10
|
+
* At least one of exit_code+stderr OR log_path must be provided.
|
|
11
|
+
*/
|
|
12
|
+
export interface FailureEvidence {
|
|
13
|
+
exit_code?: number;
|
|
14
|
+
stderr_tail?: string;
|
|
15
|
+
stdout_tail?: string;
|
|
16
|
+
log_path?: string;
|
|
17
|
+
command?: string;
|
|
18
|
+
gate_name?: string;
|
|
19
|
+
conflicting_files?: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Typed failure request - replaces free-form "reason" string.
|
|
23
|
+
*/
|
|
24
|
+
export interface TypedFailure {
|
|
25
|
+
error_type: FailureErrorType;
|
|
26
|
+
message: string;
|
|
27
|
+
evidence: FailureEvidence;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate that evidence is sufficient for the error type.
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateFailureEvidence(failure: TypedFailure): {
|
|
33
|
+
valid: boolean;
|
|
34
|
+
error?: string;
|
|
35
|
+
};
|
|
36
|
+
export interface Surrogate {
|
|
37
|
+
id: string;
|
|
38
|
+
role: string;
|
|
39
|
+
task_description: string;
|
|
40
|
+
status: SurrogateStatus;
|
|
41
|
+
worktree: {
|
|
42
|
+
path: string;
|
|
43
|
+
branch: string;
|
|
44
|
+
created: string;
|
|
45
|
+
};
|
|
46
|
+
file_locks: {
|
|
47
|
+
exclusive: string[];
|
|
48
|
+
read_only: string[];
|
|
49
|
+
};
|
|
50
|
+
dependencies: {
|
|
51
|
+
surrogate_id: string;
|
|
52
|
+
imports: string[];
|
|
53
|
+
}[];
|
|
54
|
+
test_gate: {
|
|
55
|
+
test_written: boolean;
|
|
56
|
+
test_failing: boolean;
|
|
57
|
+
test_path?: string;
|
|
58
|
+
};
|
|
59
|
+
started: string;
|
|
60
|
+
last_heartbeat: string;
|
|
61
|
+
error_details?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface CompletedSurrogate extends Surrogate {
|
|
64
|
+
completed_at: string;
|
|
65
|
+
pr_number?: number;
|
|
66
|
+
pr_url?: string;
|
|
67
|
+
artifacts: {
|
|
68
|
+
files_created: {
|
|
69
|
+
path: string;
|
|
70
|
+
exports?: string[];
|
|
71
|
+
}[];
|
|
72
|
+
files_modified: {
|
|
73
|
+
path: string;
|
|
74
|
+
changes: string;
|
|
75
|
+
}[];
|
|
76
|
+
tests_added: string[];
|
|
77
|
+
};
|
|
78
|
+
report_path: string;
|
|
79
|
+
}
|
|
80
|
+
export interface FlightRecorder {
|
|
81
|
+
meta: {
|
|
82
|
+
project: string;
|
|
83
|
+
initialized: string;
|
|
84
|
+
last_updated: string;
|
|
85
|
+
context_version: number;
|
|
86
|
+
archive_pointer?: string;
|
|
87
|
+
};
|
|
88
|
+
mission: {
|
|
89
|
+
objective: string | null;
|
|
90
|
+
decomposition: {
|
|
91
|
+
task_id: string;
|
|
92
|
+
description: string;
|
|
93
|
+
assigned_to: string | null;
|
|
94
|
+
status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETE' | 'FAILED';
|
|
95
|
+
}[];
|
|
96
|
+
};
|
|
97
|
+
active_surrogates: Surrogate[];
|
|
98
|
+
recent_completed: CompletedSurrogate[];
|
|
99
|
+
file_locks: Record<string, string>;
|
|
100
|
+
constraints: {
|
|
101
|
+
forbidden_paths: string[];
|
|
102
|
+
protected_paths: string[];
|
|
103
|
+
required_patterns: string[];
|
|
104
|
+
};
|
|
105
|
+
config: {
|
|
106
|
+
heartbeat_ttl_minutes: number;
|
|
107
|
+
scoped_tests: boolean;
|
|
108
|
+
cleanup_on_complete: boolean;
|
|
109
|
+
};
|
|
110
|
+
statistics: {
|
|
111
|
+
total_spawned: number;
|
|
112
|
+
total_completed: number;
|
|
113
|
+
total_failed: number;
|
|
114
|
+
total_merged: number;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export declare function ensureDirectories(): void;
|
|
118
|
+
export declare function loadState(): FlightRecorder;
|
|
119
|
+
export declare function saveState(state: FlightRecorder): void;
|
|
120
|
+
/**
|
|
121
|
+
* Thread-safe state update with advisory lock (WS1-3).
|
|
122
|
+
* Prevents race conditions when multiple processes update state concurrently.
|
|
123
|
+
*/
|
|
124
|
+
export declare function updateState(updater: (state: FlightRecorder) => void): FlightRecorder;
|
|
125
|
+
export declare function addSurrogate(id: string, role: string, task: string, worktreePath: string, branch: string, fileLocks: string[]): FlightRecorder;
|
|
126
|
+
export declare function updateSurrogateStatus(id: string, status: Surrogate['status']): FlightRecorder;
|
|
127
|
+
export declare function completeSurrogateState(id: string, artifacts: CompletedSurrogate['artifacts'], prUrl?: string): FlightRecorder;
|
|
128
|
+
/**
|
|
129
|
+
* P2-1: Typed fail_surrogate with evidence requirement.
|
|
130
|
+
* Rejects failures without proper evidence.
|
|
131
|
+
*
|
|
132
|
+
* @param id - Surrogate ID
|
|
133
|
+
* @param failure - Typed failure with error_type, message, and evidence
|
|
134
|
+
* @throws Error if evidence is insufficient
|
|
135
|
+
*/
|
|
136
|
+
export declare function failSurrogateState(id: string, failure: TypedFailure): FlightRecorder;
|
|
137
|
+
/**
|
|
138
|
+
* Legacy fail_surrogate for backward compatibility.
|
|
139
|
+
* Deprecated: Use failSurrogateState with TypedFailure instead.
|
|
140
|
+
*/
|
|
141
|
+
export declare function failSurrogateStateLegacy(id: string, reason: string): FlightRecorder;
|
|
142
|
+
/**
|
|
143
|
+
* Canonical lock path normalization (WS1-2).
|
|
144
|
+
* Ensures consistent path format regardless of input style:
|
|
145
|
+
* - Converts backslashes to forward slashes (Windows compatibility)
|
|
146
|
+
* - Removes leading ./ or .\
|
|
147
|
+
* - Removes trailing slashes
|
|
148
|
+
* - Normalizes to lowercase on Windows
|
|
149
|
+
*/
|
|
150
|
+
export declare function canonicalLockPath(filePath: string): string;
|
|
151
|
+
/**
|
|
152
|
+
* Normalize an array of file paths to canonical lock format.
|
|
153
|
+
*/
|
|
154
|
+
export declare function canonicalLockPaths(files: string[]): string[];
|
|
155
|
+
export declare function checkLockConflict(files: string[]): {
|
|
156
|
+
hasConflict: boolean;
|
|
157
|
+
conflicts: {
|
|
158
|
+
file: string;
|
|
159
|
+
owner: string;
|
|
160
|
+
}[];
|
|
161
|
+
};
|
|
162
|
+
export declare function getLockedFiles(): Record<string, string>;
|
|
163
|
+
/**
|
|
164
|
+
* Clean up status file when surrogate completes or fails
|
|
165
|
+
*/
|
|
166
|
+
export declare function cleanupAgentStatusFile(surrogateId: string): void;
|
|
167
|
+
export interface StatusSummary {
|
|
168
|
+
mission: string | null;
|
|
169
|
+
context_version: number;
|
|
170
|
+
active_count: number;
|
|
171
|
+
active_surrogates: {
|
|
172
|
+
id: string;
|
|
173
|
+
role: string;
|
|
174
|
+
status: string;
|
|
175
|
+
task: string;
|
|
176
|
+
locks: string[];
|
|
177
|
+
}[];
|
|
178
|
+
locked_files: string[];
|
|
179
|
+
recent_completed_count: number;
|
|
180
|
+
statistics: FlightRecorder['statistics'];
|
|
181
|
+
}
|
|
182
|
+
export declare function getStatusSummary(): StatusSummary & {
|
|
183
|
+
stale_surrogates: string[];
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Emergency force release locks for a surrogate (WS3-3).
|
|
187
|
+
* WARNING: This is a destructive operation - does not properly clean up state.
|
|
188
|
+
*/
|
|
189
|
+
export declare function forceReleaseLocks(surrogateId: string): {
|
|
190
|
+
released: string[];
|
|
191
|
+
errors: string[];
|
|
192
|
+
};
|
|
193
|
+
export declare function checkProtectedFiles(files: string[]): {
|
|
194
|
+
hasProtected: boolean;
|
|
195
|
+
protected: string[];
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Result of checking a single surrogate's actual state.
|
|
199
|
+
*/
|
|
200
|
+
export interface SurrogateReconcileCheck {
|
|
201
|
+
id: string;
|
|
202
|
+
status_in_yaml: string;
|
|
203
|
+
actual_status: 'RUNNING' | 'COMPLETED' | 'FAILED' | 'ORPHANED' | 'ZOMBIE' | 'STALE';
|
|
204
|
+
has_result_marker: boolean;
|
|
205
|
+
has_status_file: boolean;
|
|
206
|
+
process_alive: boolean;
|
|
207
|
+
worktree_exists: boolean;
|
|
208
|
+
issue?: string;
|
|
209
|
+
action_taken?: string;
|
|
210
|
+
marker_data?: {
|
|
211
|
+
success: boolean;
|
|
212
|
+
error_type?: string;
|
|
213
|
+
error_message?: string;
|
|
214
|
+
duration_ms?: number;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Result of the full reconcile operation.
|
|
219
|
+
*/
|
|
220
|
+
export interface ReconcileResult {
|
|
221
|
+
timestamp: string;
|
|
222
|
+
checks: SurrogateReconcileCheck[];
|
|
223
|
+
orphaned_status_files: string[];
|
|
224
|
+
orphaned_worktrees: string[];
|
|
225
|
+
orphaned_locks: {
|
|
226
|
+
file: string;
|
|
227
|
+
owner: string;
|
|
228
|
+
}[];
|
|
229
|
+
actions_taken: string[];
|
|
230
|
+
state_was_corrected: boolean;
|
|
231
|
+
summary: string;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* P2-2: Main reconcile function.
|
|
235
|
+
* Scans all surrogates and corrects state based on evidence from markers and reports.
|
|
236
|
+
*
|
|
237
|
+
* @param dryRun - If true, don't modify state, just report what would be done
|
|
238
|
+
* @returns ReconcileResult with all findings and actions taken
|
|
239
|
+
*/
|
|
240
|
+
export declare function reconcileState(dryRun?: boolean): ReconcileResult;
|
|
241
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"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"}
|