@vibecheckai/cli 3.2.6 → 3.3.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/bin/registry.js +192 -5
- package/bin/runners/lib/agent-firewall/change-packet/builder.js +280 -6
- package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
- package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
- package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
- package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
- package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
- package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
- package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
- package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
- package/bin/runners/lib/agent-firewall/logger.js +141 -0
- package/bin/runners/lib/agent-firewall/policy/loader.js +312 -4
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +113 -1
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +133 -6
- package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
- package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
- package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
- package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
- package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
- package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
- package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
- package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
- package/bin/runners/lib/agent-firewall/risk/thresholds.js +321 -0
- package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
- package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
- package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
- package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
- package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
- package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
- package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
- package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
- package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
- package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
- package/bin/runners/lib/analyzers.js +81 -18
- package/bin/runners/lib/authority-badge.js +425 -0
- package/bin/runners/lib/cli-output.js +7 -1
- package/bin/runners/lib/error-handler.js +16 -9
- package/bin/runners/lib/exit-codes.js +275 -0
- package/bin/runners/lib/global-flags.js +37 -0
- package/bin/runners/lib/help-formatter.js +413 -0
- package/bin/runners/lib/logger.js +38 -0
- package/bin/runners/lib/unified-cli-output.js +604 -0
- package/bin/runners/lib/upsell.js +148 -0
- package/bin/runners/runApprove.js +1200 -0
- package/bin/runners/runAuth.js +324 -95
- package/bin/runners/runCheckpoint.js +39 -21
- package/bin/runners/runClassify.js +859 -0
- package/bin/runners/runContext.js +136 -24
- package/bin/runners/runDoctor.js +108 -68
- package/bin/runners/runFix.js +6 -5
- package/bin/runners/runGuard.js +212 -118
- package/bin/runners/runInit.js +3 -2
- package/bin/runners/runMcp.js +130 -52
- package/bin/runners/runPolish.js +43 -20
- package/bin/runners/runProve.js +1 -2
- package/bin/runners/runReport.js +3 -2
- package/bin/runners/runScan.js +63 -44
- package/bin/runners/runShip.js +3 -4
- package/bin/runners/runValidate.js +19 -2
- package/bin/runners/runWatch.js +104 -53
- package/bin/vibecheck.js +106 -19
- package/mcp-server/HARDENING_SUMMARY.md +299 -0
- package/mcp-server/agent-firewall-interceptor.js +367 -31
- package/mcp-server/authority-tools.js +569 -0
- package/mcp-server/conductor/conflict-resolver.js +588 -0
- package/mcp-server/conductor/execution-planner.js +544 -0
- package/mcp-server/conductor/index.js +377 -0
- package/mcp-server/conductor/lock-manager.js +615 -0
- package/mcp-server/conductor/request-queue.js +550 -0
- package/mcp-server/conductor/session-manager.js +500 -0
- package/mcp-server/conductor/tools.js +510 -0
- package/mcp-server/index.js +1149 -243
- package/mcp-server/lib/{api-client.js → api-client.cjs} +40 -4
- package/mcp-server/lib/logger.cjs +30 -0
- package/mcp-server/logger.js +173 -0
- package/mcp-server/package.json +2 -2
- package/mcp-server/premium-tools.js +2 -2
- package/mcp-server/tier-auth.js +245 -35
- package/mcp-server/truth-firewall-tools.js +145 -15
- package/mcp-server/vibecheck-tools.js +2 -2
- package/package.json +2 -3
- package/mcp-server/index.old.js +0 -4137
- package/mcp-server/package-lock.json +0 -165
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conductor Module
|
|
3
|
+
*
|
|
4
|
+
* Multi-Agent Coordination Firewall
|
|
5
|
+
* Prevents conflicts when multiple AI agents modify the codebase.
|
|
6
|
+
*
|
|
7
|
+
* Codename: Conductor
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
"use strict";
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
SessionManager,
|
|
14
|
+
createSessionManager,
|
|
15
|
+
getSessionManager,
|
|
16
|
+
TIER_TRUST_MAP,
|
|
17
|
+
DEFAULT_SESSION_TIMEOUT_MS,
|
|
18
|
+
} from "./session-manager.js";
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
LockManager,
|
|
22
|
+
createLockManager,
|
|
23
|
+
getLockManager,
|
|
24
|
+
LOCK_TYPES,
|
|
25
|
+
DEFAULT_LOCK_TIMEOUT_MS,
|
|
26
|
+
} from "./lock-manager.js";
|
|
27
|
+
|
|
28
|
+
import {
|
|
29
|
+
ConflictResolver,
|
|
30
|
+
createConflictResolver,
|
|
31
|
+
CONFLICT_TYPES,
|
|
32
|
+
CONFLICT_SEVERITY,
|
|
33
|
+
RESOLUTION_STRATEGIES,
|
|
34
|
+
} from "./conflict-resolver.js";
|
|
35
|
+
|
|
36
|
+
import {
|
|
37
|
+
ExecutionPlanner,
|
|
38
|
+
createExecutionPlanner,
|
|
39
|
+
TIER_PRIORITY,
|
|
40
|
+
} from "./execution-planner.js";
|
|
41
|
+
|
|
42
|
+
import {
|
|
43
|
+
RequestQueue,
|
|
44
|
+
createRequestQueue,
|
|
45
|
+
getRequestQueue,
|
|
46
|
+
REQUEST_STATE,
|
|
47
|
+
} from "./request-queue.js";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Conductor singleton that provides coordinated access to session and lock managers
|
|
51
|
+
*/
|
|
52
|
+
class Conductor {
|
|
53
|
+
constructor() {
|
|
54
|
+
this.sessionManager = null;
|
|
55
|
+
this.lockManager = null;
|
|
56
|
+
this.conflictResolver = null;
|
|
57
|
+
this.executionPlanner = null;
|
|
58
|
+
this.requestQueue = null;
|
|
59
|
+
this.initialized = false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Initialize the Conductor for a project
|
|
64
|
+
* @param {string} projectRoot - Project root directory
|
|
65
|
+
* @returns {Conductor} This instance
|
|
66
|
+
*/
|
|
67
|
+
init(projectRoot) {
|
|
68
|
+
if (this.initialized) {
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
this.sessionManager = getSessionManager(projectRoot);
|
|
73
|
+
this.lockManager = getLockManager(projectRoot);
|
|
74
|
+
this.conflictResolver = createConflictResolver();
|
|
75
|
+
this.executionPlanner = createExecutionPlanner(this.conflictResolver);
|
|
76
|
+
this.requestQueue = getRequestQueue(projectRoot);
|
|
77
|
+
this.initialized = true;
|
|
78
|
+
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Register an agent session
|
|
84
|
+
* @param {Object} params - Registration params
|
|
85
|
+
* @returns {Object} Session info
|
|
86
|
+
*/
|
|
87
|
+
registerAgent({ agentId, tier, projectRoot, workingFiles = [] }) {
|
|
88
|
+
this.ensureInitialized(projectRoot);
|
|
89
|
+
|
|
90
|
+
return this.sessionManager.registerSession({
|
|
91
|
+
agentId,
|
|
92
|
+
tier,
|
|
93
|
+
projectRoot,
|
|
94
|
+
workingFiles,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Acquire a lock for a session
|
|
100
|
+
* @param {Object} params - Lock params
|
|
101
|
+
* @returns {Object} Lock result
|
|
102
|
+
*/
|
|
103
|
+
acquireLock({ sessionId, path, type = "exclusive", reason = "" }) {
|
|
104
|
+
this.ensureInitialized();
|
|
105
|
+
|
|
106
|
+
const session = this.sessionManager.getSession(sessionId);
|
|
107
|
+
if (!session) {
|
|
108
|
+
return {
|
|
109
|
+
acquired: false,
|
|
110
|
+
error: "Invalid or expired session",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return this.lockManager.acquireLock({
|
|
115
|
+
path,
|
|
116
|
+
type,
|
|
117
|
+
sessionId,
|
|
118
|
+
agentId: session.agentId,
|
|
119
|
+
reason,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Release a lock
|
|
125
|
+
* @param {string} lockId - Lock ID
|
|
126
|
+
* @param {string} sessionId - Session ID
|
|
127
|
+
* @returns {boolean} Success
|
|
128
|
+
*/
|
|
129
|
+
releaseLock(lockId, sessionId) {
|
|
130
|
+
this.ensureInitialized();
|
|
131
|
+
|
|
132
|
+
return this.lockManager.releaseLock(lockId, sessionId);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Check if a path is locked by another session
|
|
137
|
+
* @param {string} path - Path to check
|
|
138
|
+
* @param {string} sessionId - Current session ID
|
|
139
|
+
* @returns {Object} Lock status
|
|
140
|
+
*/
|
|
141
|
+
checkLockStatus(path, sessionId) {
|
|
142
|
+
this.ensureInitialized();
|
|
143
|
+
|
|
144
|
+
const conflicts = this.lockManager.getConflictingLocks(path, LOCK_TYPES.EXCLUSIVE);
|
|
145
|
+
const otherLocks = conflicts.filter(l => l.sessionId !== sessionId);
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
locked: otherLocks.length > 0,
|
|
149
|
+
ownLock: conflicts.find(l => l.sessionId === sessionId) || null,
|
|
150
|
+
blockedBy: otherLocks,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Get the status of multi-agent coordination
|
|
156
|
+
* @param {string} projectRoot - Project root
|
|
157
|
+
* @returns {Object} Coordination status
|
|
158
|
+
*/
|
|
159
|
+
getStatus(projectRoot) {
|
|
160
|
+
this.ensureInitialized(projectRoot);
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
sessions: this.sessionManager.getStatistics(),
|
|
164
|
+
locks: this.lockManager.getStatistics(),
|
|
165
|
+
activeAgents: this.sessionManager.getActiveAgents(projectRoot),
|
|
166
|
+
deadlocks: this.lockManager.detectDeadlocks(),
|
|
167
|
+
queue: this.requestQueue.getStatistics(),
|
|
168
|
+
conflicts: this.conflictResolver.getUnresolvedConflicts().length,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Submit a proposal for coordination
|
|
174
|
+
* @param {Object} proposal - Proposal to submit
|
|
175
|
+
* @returns {Object} Submission result
|
|
176
|
+
*/
|
|
177
|
+
submitProposal(proposal) {
|
|
178
|
+
this.ensureInitialized();
|
|
179
|
+
|
|
180
|
+
// Add to conflict resolver
|
|
181
|
+
this.conflictResolver.addProposal(proposal);
|
|
182
|
+
|
|
183
|
+
// Check for conflicts
|
|
184
|
+
const canProceed = this.conflictResolver.canProceed(proposal.proposalId);
|
|
185
|
+
|
|
186
|
+
if (!canProceed.canProceed) {
|
|
187
|
+
return {
|
|
188
|
+
accepted: false,
|
|
189
|
+
queued: false,
|
|
190
|
+
conflicts: canProceed.mustResolve,
|
|
191
|
+
warnings: canProceed.shouldResolve,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Queue for processing
|
|
196
|
+
const queuedRequest = this.requestQueue.enqueue({
|
|
197
|
+
proposalId: proposal.proposalId,
|
|
198
|
+
sessionId: proposal.sessionId,
|
|
199
|
+
agentId: proposal.agentId,
|
|
200
|
+
tier: proposal.tier || "FREE",
|
|
201
|
+
payload: proposal,
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
accepted: true,
|
|
206
|
+
queued: true,
|
|
207
|
+
requestId: queuedRequest.requestId,
|
|
208
|
+
position: this.requestQueue.queue.findIndex(r => r.requestId === queuedRequest.requestId) + 1,
|
|
209
|
+
conflicts: [],
|
|
210
|
+
warnings: canProceed.shouldResolve || [],
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Create an execution plan for pending proposals
|
|
216
|
+
* @param {string} projectRoot - Project root
|
|
217
|
+
* @returns {Object} Execution plan
|
|
218
|
+
*/
|
|
219
|
+
createExecutionPlan(projectRoot) {
|
|
220
|
+
this.ensureInitialized(projectRoot);
|
|
221
|
+
|
|
222
|
+
// Get all pending proposals from queue
|
|
223
|
+
const pendingRequests = this.requestQueue.getQueue();
|
|
224
|
+
const proposals = pendingRequests.map(r => r.payload);
|
|
225
|
+
|
|
226
|
+
if (proposals.length === 0) {
|
|
227
|
+
return {
|
|
228
|
+
planId: null,
|
|
229
|
+
steps: [],
|
|
230
|
+
canExecute: true,
|
|
231
|
+
message: "No pending proposals",
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return this.executionPlanner.createPlan(proposals);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get the next request to process
|
|
240
|
+
* @returns {Object|null} Next request or null
|
|
241
|
+
*/
|
|
242
|
+
getNextRequest() {
|
|
243
|
+
this.ensureInitialized();
|
|
244
|
+
return this.requestQueue.dequeue();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Complete a request
|
|
249
|
+
* @param {string} requestId - Request ID
|
|
250
|
+
* @param {Object} result - Result
|
|
251
|
+
* @returns {boolean} Success
|
|
252
|
+
*/
|
|
253
|
+
completeRequest(requestId, result = {}) {
|
|
254
|
+
this.ensureInitialized();
|
|
255
|
+
|
|
256
|
+
const request = this.requestQueue.getRequest(requestId);
|
|
257
|
+
if (request) {
|
|
258
|
+
this.conflictResolver.removeProposal(request.proposalId);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return this.requestQueue.complete(requestId, result);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Fail a request
|
|
266
|
+
* @param {string} requestId - Request ID
|
|
267
|
+
* @param {Error|string} error - Error
|
|
268
|
+
* @returns {boolean} Success or requeued
|
|
269
|
+
*/
|
|
270
|
+
failRequest(requestId, error) {
|
|
271
|
+
this.ensureInitialized();
|
|
272
|
+
return this.requestQueue.fail(requestId, error);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Get conflicts for a proposal
|
|
277
|
+
* @param {string} proposalId - Proposal ID
|
|
278
|
+
* @returns {Object[]} Conflicts
|
|
279
|
+
*/
|
|
280
|
+
getConflicts(proposalId) {
|
|
281
|
+
this.ensureInitialized();
|
|
282
|
+
return this.conflictResolver.getConflictsForProposal(proposalId);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Resolve a conflict
|
|
287
|
+
* @param {string} conflictId - Conflict ID
|
|
288
|
+
* @param {string} strategy - Resolution strategy
|
|
289
|
+
* @param {Object} details - Resolution details
|
|
290
|
+
*/
|
|
291
|
+
resolveConflict(conflictId, strategy, details = {}) {
|
|
292
|
+
this.ensureInitialized();
|
|
293
|
+
this.conflictResolver.resolveConflict(conflictId, strategy, details);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Terminate a session and release all its locks
|
|
298
|
+
* @param {string} sessionId - Session ID
|
|
299
|
+
* @returns {Object} Termination result
|
|
300
|
+
*/
|
|
301
|
+
terminateSession(sessionId) {
|
|
302
|
+
this.ensureInitialized();
|
|
303
|
+
|
|
304
|
+
const locksReleased = this.lockManager.releaseSessionLocks(sessionId);
|
|
305
|
+
const sessionTerminated = this.sessionManager.terminateSession(sessionId);
|
|
306
|
+
|
|
307
|
+
return {
|
|
308
|
+
sessionTerminated,
|
|
309
|
+
locksReleased,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Ensure the conductor is initialized
|
|
315
|
+
* @param {string} projectRoot - Project root (optional, for lazy init)
|
|
316
|
+
*/
|
|
317
|
+
ensureInitialized(projectRoot) {
|
|
318
|
+
if (!this.initialized && projectRoot) {
|
|
319
|
+
this.init(projectRoot);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (!this.initialized) {
|
|
323
|
+
throw new Error("Conductor not initialized. Call conductor.init(projectRoot) first.");
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Shutdown the conductor
|
|
329
|
+
*/
|
|
330
|
+
shutdown() {
|
|
331
|
+
if (this.sessionManager) {
|
|
332
|
+
this.sessionManager.shutdown();
|
|
333
|
+
}
|
|
334
|
+
if (this.lockManager) {
|
|
335
|
+
this.lockManager.shutdown();
|
|
336
|
+
}
|
|
337
|
+
this.initialized = false;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Singleton instance
|
|
342
|
+
const conductor = new Conductor();
|
|
343
|
+
|
|
344
|
+
export {
|
|
345
|
+
conductor,
|
|
346
|
+
Conductor,
|
|
347
|
+
// Session Manager
|
|
348
|
+
SessionManager,
|
|
349
|
+
createSessionManager,
|
|
350
|
+
getSessionManager,
|
|
351
|
+
// Lock Manager
|
|
352
|
+
LockManager,
|
|
353
|
+
createLockManager,
|
|
354
|
+
getLockManager,
|
|
355
|
+
LOCK_TYPES,
|
|
356
|
+
// Conflict Resolver
|
|
357
|
+
ConflictResolver,
|
|
358
|
+
createConflictResolver,
|
|
359
|
+
CONFLICT_TYPES,
|
|
360
|
+
CONFLICT_SEVERITY,
|
|
361
|
+
RESOLUTION_STRATEGIES,
|
|
362
|
+
// Execution Planner
|
|
363
|
+
ExecutionPlanner,
|
|
364
|
+
createExecutionPlanner,
|
|
365
|
+
TIER_PRIORITY,
|
|
366
|
+
// Request Queue
|
|
367
|
+
RequestQueue,
|
|
368
|
+
createRequestQueue,
|
|
369
|
+
getRequestQueue,
|
|
370
|
+
REQUEST_STATE,
|
|
371
|
+
// Constants
|
|
372
|
+
TIER_TRUST_MAP,
|
|
373
|
+
DEFAULT_SESSION_TIMEOUT_MS,
|
|
374
|
+
DEFAULT_LOCK_TIMEOUT_MS,
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
export default conductor;
|