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.
Files changed (67) hide show
  1. package/LICENSE.md +30 -0
  2. package/README.md +198 -0
  3. package/dist/__tests__/gates.test.d.ts +2 -0
  4. package/dist/__tests__/gates.test.d.ts.map +1 -0
  5. package/dist/__tests__/gates.test.js +342 -0
  6. package/dist/__tests__/gates.test.js.map +1 -0
  7. package/dist/__tests__/observability.test.d.ts +2 -0
  8. package/dist/__tests__/observability.test.d.ts.map +1 -0
  9. package/dist/__tests__/observability.test.js +382 -0
  10. package/dist/__tests__/observability.test.js.map +1 -0
  11. package/dist/__tests__/state.test.d.ts +2 -0
  12. package/dist/__tests__/state.test.d.ts.map +1 -0
  13. package/dist/__tests__/state.test.js +415 -0
  14. package/dist/__tests__/state.test.js.map +1 -0
  15. package/dist/agent-runner.d.ts +3 -0
  16. package/dist/agent-runner.d.ts.map +1 -0
  17. package/dist/agent-runner.js +419 -0
  18. package/dist/agent-runner.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +763 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/mcp-server.d.ts +3 -0
  24. package/dist/mcp-server.d.ts.map +1 -0
  25. package/dist/mcp-server.js +1382 -0
  26. package/dist/mcp-server.js.map +1 -0
  27. package/dist/utils/agent.d.ts +42 -0
  28. package/dist/utils/agent.d.ts.map +1 -0
  29. package/dist/utils/agent.js +231 -0
  30. package/dist/utils/agent.js.map +1 -0
  31. package/dist/utils/artifacts.d.ts +92 -0
  32. package/dist/utils/artifacts.d.ts.map +1 -0
  33. package/dist/utils/artifacts.js +338 -0
  34. package/dist/utils/artifacts.js.map +1 -0
  35. package/dist/utils/capsule.d.ts +28 -0
  36. package/dist/utils/capsule.d.ts.map +1 -0
  37. package/dist/utils/capsule.js +462 -0
  38. package/dist/utils/capsule.js.map +1 -0
  39. package/dist/utils/diagnostics.d.ts +62 -0
  40. package/dist/utils/diagnostics.d.ts.map +1 -0
  41. package/dist/utils/diagnostics.js +404 -0
  42. package/dist/utils/diagnostics.js.map +1 -0
  43. package/dist/utils/gates.d.ts +78 -0
  44. package/dist/utils/gates.d.ts.map +1 -0
  45. package/dist/utils/gates.js +661 -0
  46. package/dist/utils/gates.js.map +1 -0
  47. package/dist/utils/logging.d.ts +53 -0
  48. package/dist/utils/logging.d.ts.map +1 -0
  49. package/dist/utils/logging.js +187 -0
  50. package/dist/utils/logging.js.map +1 -0
  51. package/dist/utils/project-gates.d.ts +73 -0
  52. package/dist/utils/project-gates.d.ts.map +1 -0
  53. package/dist/utils/project-gates.js +520 -0
  54. package/dist/utils/project-gates.js.map +1 -0
  55. package/dist/utils/reconcile.d.ts +50 -0
  56. package/dist/utils/reconcile.d.ts.map +1 -0
  57. package/dist/utils/reconcile.js +262 -0
  58. package/dist/utils/reconcile.js.map +1 -0
  59. package/dist/utils/state.d.ts +241 -0
  60. package/dist/utils/state.d.ts.map +1 -0
  61. package/dist/utils/state.js +865 -0
  62. package/dist/utils/state.js.map +1 -0
  63. package/dist/utils/worktree.d.ts +27 -0
  64. package/dist/utils/worktree.d.ts.map +1 -0
  65. package/dist/utils/worktree.js +275 -0
  66. package/dist/utils/worktree.js.map +1 -0
  67. 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":"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"}
@@ -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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"}