nightshift-mcp 1.1.2 → 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/README.md CHANGED
@@ -25,22 +25,28 @@ An MCP (Model Context Protocol) server for agent teams and multi-agent orchestra
25
25
  - **Workflow management**: Phases, strategic decisions, and agent assignments
26
26
  - **Watch/polling**: Monitor for new messages with cursor-based polling
27
27
  - **Auto-archiving**: Archive old messages to keep the chat file manageable
28
- - **Cross-platform**: Works on Windows, Linux, and macOS (uses cross-spawn and platform-safe process management)
28
+ - **Cross-platform**: Works on Windows, Linux, and macOS with platform-safe process management
29
29
  - **Heterogeneous agent teams**: Mix different AI models — use each for what it's best at
30
30
  - **Universal compatibility**: Works with any MCP-supporting tool (49 tools across 10 categories)
31
31
  - **Flexible savepoints**: Git-based checkpoints when available, JSON state snapshots when not
32
- - **Simple file-based storage**: No external services required
32
+ - **SQLite-backed storage**: ACID transactions, indexed queries, zero external services required
33
+ - **Autoresearch**: Built-in agent performance analytics — success rates, duration, scope leak tracking
33
34
 
34
- ## What's New in 1.1.0
35
+ ## What's New in 2.0.0
35
36
 
36
- - **Local model support**: New `ollama` agent type + Goose/Ollama integration for local model tool use
37
- - **Agent availability checks**: All spawn/delegate tools validate agents before attempting clear errors with available alternatives
38
- - **PRD dependencies**: `dependsOn` field prevents stories from running before their prerequisites complete
39
- - **PRD tags**: `tags` field enables smart agent routing (e.g., `["code"]` routes to codex, `["research"]` routes to gemini)
40
- - **Optional savepoints**: Works without git falls back to JSON state snapshots
41
- - **Persistent agent tracking**: Agent registry survives restarts (`.robot-chat/agent-registry.json`)
42
- - **Flexible workflow phases**: Custom phase names beyond the built-in set
43
- - **Benchmark suite**: Test local model tool-use reliability (`benchmarks/run-experiment.mjs`)
37
+ - **SQLite data layer**: ACID transactions replace scattered JSON/text files. All state stored in `.robot-chat/nightshift.db` with WAL mode for concurrent access. Migration path to PostgreSQL.
38
+ - **Circuit breaker**: Proper CLOSED/OPEN/HALF\_OPEN state machine tracks per-agent health. Auto-disables failing agents after configurable threshold, re-enables after cooldown. Persisted across daemon restarts.
39
+ - **Immutable audit trail**: Append-only `audit_log` table records every agent spawn, completion, failure, circuit break, and stuck-agent kill. Feeds directly into autoresearch.
40
+ - **Run records**: Structured execution history for every agent run duration, exit status, files changed, scope leak detection, verification results.
41
+ - **Budget tracking**: Per-agent cost tracking with enable/disable toggle. Daily and monthly limits with configurable warning thresholds. Ready for OpenRouter integration.
42
+ - **Autoresearch queries**: Built-in analytics — agent success rates, average duration, scope leak rates. Data accumulates automatically for future intelligent agent routing.
43
+ - **Dependency security**: MCP SDK upgraded to 1.28.0, all production dependency vulnerabilities resolved.
44
+
45
+ ### Previous releases
46
+
47
+ **1.1.0**: Local model support (Ollama/Goose), agent availability checks, PRD dependencies (`dependsOn`), PRD tags for routing, optional savepoints, persistent agent tracking, benchmark suite.
48
+
49
+ **1.0.10**: NightShift CLI (`nightshift` command), daemon manager fixes for Windows, goose agent support.
44
50
 
45
51
  ## Installation
46
52
 
@@ -500,9 +506,9 @@ With multiple agents working together:
500
506
  │ │ │ │ │ │ │
501
507
  │ ▼ ▼ ▼ ▼ ▼ │
502
508
  │ ┌────────┐ ┌────────┐ ┌────┐ ┌──────────┐ ┌──────────┐ │
503
- │ │prd.json│ │progress│ │Code│ │ context/ │ │trace.json│ │
504
- │ │(tasks) │ │ .txt │ │ │ │(per-topic│ │(execution│ │
505
- │ │ │ │ │ │ │ │ queries) │ │ tree) │ │
509
+ │ │prd.json│ │progress│ │Code│ │nightshift│ │ audit │ │
510
+ │ │(tasks) │ │ .txt │ │ │ │ .db │ │ trail │ │
511
+ │ │ │ │ │ │ │ │ (SQLite) │ │(immutable│ │
506
512
  │ └────────┘ └────────┘ └────┘ └──────────┘ └──────────┘ │
507
513
  │ │
508
514
  └──────────────────────────────────────────────────────────────────┘
@@ -835,9 +841,11 @@ The daemon provides hands-off multi-agent orchestration:
835
841
  2. **Auto-Spawning**: Spawns agents for orphaned stories (up to concurrency limit)
836
842
  3. **Failover Handling**: Automatically claims and reassigns failover requests
837
843
  4. **Smart Retry**: Tracks failed agents per story and tries a different agent on retry
838
- 5. **Health Checks**: Periodic reconciliation as a fallback (default: every 2 min)
839
- 6. **Poison Pill Protection**: Quarantines stories that fail repeatedly
840
- 7. **Stuck Detection**: Kills agents that haven't reported activity
844
+ 5. **Circuit Breaker**: Per-agent health tracking auto-disables after consecutive failures, re-enables after cooldown
845
+ 6. **Health Checks**: Periodic reconciliation as a fallback (default: every 2 min)
846
+ 7. **Poison Pill Protection**: Quarantines stories that fail repeatedly
847
+ 8. **Stuck Detection**: Kills agents that haven't reported activity
848
+ 9. **Audit Trail**: Every spawn, completion, failure, and circuit break is recorded in SQLite
841
849
 
842
850
  ### Options
843
851
 
package/dist/daemon.d.ts CHANGED
@@ -16,15 +16,20 @@ interface DaemonConfig {
16
16
  agents: AgentType[];
17
17
  verbose: boolean;
18
18
  dryRun: boolean;
19
+ circuitBreakerThreshold: number;
20
+ circuitBreakerCooldownMs: number;
19
21
  }
22
+ type CircuitState = "CLOSED" | "OPEN" | "HALF_OPEN";
20
23
  export declare class NightShiftDaemon {
21
24
  private config;
22
25
  private ralph;
23
26
  private chat;
24
27
  private workflow;
28
+ private db;
25
29
  private running;
26
30
  private activeAgents;
27
31
  private storyStates;
32
+ private agentCircuits;
28
33
  private availableAgents;
29
34
  private agentIndex;
30
35
  private prdWatcher;
@@ -47,6 +52,22 @@ export declare class NightShiftDaemon {
47
52
  private onPrdChanged;
48
53
  private onChatChanged;
49
54
  private handleFailover;
55
+ private initializeCircuits;
56
+ private recordAgentFailure;
57
+ private recordAgentSuccess;
58
+ /**
59
+ * Try to reserve an agent for work. Returns true if the agent is available.
60
+ * For HALF_OPEN state, only one probe is allowed at a time.
61
+ */
62
+ private tryReserveAgent;
63
+ private releaseProbe;
64
+ private getHealthyAgents;
65
+ getCircuitStatus(): Record<string, {
66
+ state: CircuitState;
67
+ failures: number;
68
+ successes: number;
69
+ consecutiveFailures: number;
70
+ }>;
50
71
  private reconcile;
51
72
  private getNextAgent;
52
73
  private spawnAgentForStory;
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAQH,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAO5B,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAuBD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,QAAQ,CAAkB;IAGlC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,UAAU,CAAK;IAGvB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAAQ;IAG/B,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,cAAc,CAA0C;IAGhE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAuBnE,OAAO,CAAC,GAAG;IAwBX,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ;YAkBF,YAAY;YAKZ,aAAa;YAwBb,cAAc;YA2Bd,SAAS;IA6CvB,OAAO,CAAC,YAAY;YAQN,kBAAkB;IA4DhC,OAAO,CAAC,gBAAgB;IAgCxB,OAAO,CAAC,YAAY;YAaN,WAAW;IA4BzB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;YAOT,WAAW;IA0CnB,KAAK;IAuCL,QAAQ;CAoBf"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAQH,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAQ5B,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAmBD,KAAK,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAiBpD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,EAAE,CAAe;IAGzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,aAAa,CAAgD;IACrE,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,UAAU,CAAK;IAGvB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAAQ;IAG/B,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,cAAc,CAA0C;IAGhE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IA0BnE,OAAO,CAAC,GAAG;IAwBX,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ;YAkBF,YAAY;YAKZ,aAAa;YAwBb,cAAc;IA2B5B,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,kBAAkB;IAyB1B;;;OAGG;IACH,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,gBAAgB;IAexB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAC;YAiB/G,SAAS;IA6CvB,OAAO,CAAC,YAAY;YAQN,kBAAkB;IAgFhC,OAAO,CAAC,gBAAgB;IAgCxB,OAAO,CAAC,YAAY;YAaN,WAAW;IA2CzB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;YAOT,WAAW;IAgDnB,KAAK;IA0CL,QAAQ;CAuBf"}
package/dist/daemon.js CHANGED
@@ -12,6 +12,7 @@ import { ChatManager } from "./chat-manager.js";
12
12
  import { WorkflowManager } from "./workflow-manager.js";
13
13
  import { spawnAgentBackground, getAvailableAgents, } from "./agent-spawner.js";
14
14
  import { killProcess, isProcessRunning, getNightshiftCliCommand } from "./platform.js";
15
+ import { NightShiftDB } from "./database.js";
15
16
  // ============================================
16
17
  // Daemon Class
17
18
  // ============================================
@@ -20,10 +21,12 @@ export class NightShiftDaemon {
20
21
  ralph;
21
22
  chat;
22
23
  workflow;
24
+ db;
23
25
  // State
24
26
  running = false;
25
27
  activeAgents = new Map();
26
28
  storyStates = new Map();
29
+ agentCircuits = new Map();
27
30
  availableAgents = [];
28
31
  agentIndex = 0; // Round-robin
29
32
  // File watchers
@@ -47,10 +50,13 @@ export class NightShiftDaemon {
47
50
  agents: config.agents ?? ["claude", "codex", "gemini", "vibe", "goose", "ollama"],
48
51
  verbose: config.verbose ?? false,
49
52
  dryRun: config.dryRun ?? false,
53
+ circuitBreakerThreshold: config.circuitBreakerThreshold ?? 3,
54
+ circuitBreakerCooldownMs: config.circuitBreakerCooldownMs ?? 60_000,
50
55
  };
51
56
  this.ralph = new RalphManager(this.config.projectPath);
52
57
  this.chat = new ChatManager(this.config.projectPath);
53
58
  this.workflow = new WorkflowManager(this.config.projectPath);
59
+ this.db = new NightShiftDB(this.config.projectPath);
54
60
  this.lockFile = path.join(this.config.projectPath, ".robot-chat", "daemon.lock");
55
61
  }
56
62
  // ============================================
@@ -229,6 +235,162 @@ export class NightShiftDaemon {
229
235
  }
230
236
  }
231
237
  // ============================================
238
+ // Circuit Breaker
239
+ // ============================================
240
+ initializeCircuits() {
241
+ for (const agent of this.availableAgents) {
242
+ // Try to restore persisted state from SQLite
243
+ const persisted = this.db.loadCircuitState(agent);
244
+ const circuit = {
245
+ agent,
246
+ state: persisted?.state ?? "CLOSED",
247
+ consecutiveFailures: persisted?.consecutiveFailures ?? 0,
248
+ brokenSince: persisted?.brokenSince ? new Date(persisted.brokenSince).getTime() : undefined,
249
+ probeInFlight: false,
250
+ cooldownMs: this.config.circuitBreakerCooldownMs,
251
+ totalFailures: persisted?.totalFailures ?? 0,
252
+ totalSuccesses: persisted?.totalSuccesses ?? 0,
253
+ };
254
+ this.agentCircuits.set(agent, circuit);
255
+ if (circuit.state !== "CLOSED") {
256
+ this.log("info", `Restored circuit breaker state for ${agent}: ${circuit.state} (${circuit.consecutiveFailures} consecutive failures)`);
257
+ }
258
+ }
259
+ }
260
+ recordAgentFailure(agent) {
261
+ const circuit = this.agentCircuits.get(agent);
262
+ if (!circuit)
263
+ return;
264
+ circuit.consecutiveFailures++;
265
+ circuit.totalFailures++;
266
+ if (circuit.state === "HALF_OPEN") {
267
+ // Probe failed — reopen with fresh cooldown
268
+ circuit.state = "OPEN";
269
+ circuit.brokenSince = Date.now();
270
+ circuit.probeInFlight = false;
271
+ this.log("warn", `Circuit breaker re-OPENED for ${agent} — half-open probe failed, restarting cooldown`);
272
+ this.db.appendAudit("circuit_break", { transition: "HALF_OPEN->OPEN", consecutiveFailures: circuit.consecutiveFailures }, agent);
273
+ }
274
+ else if (circuit.state === "CLOSED" && circuit.consecutiveFailures >= this.config.circuitBreakerThreshold) {
275
+ // Threshold reached — open the circuit
276
+ circuit.state = "OPEN";
277
+ circuit.brokenSince = Date.now();
278
+ this.log("warn", `Circuit breaker OPEN for ${agent} — disabled after ${circuit.consecutiveFailures} consecutive failures`);
279
+ this.db.appendAudit("circuit_break", { transition: "CLOSED->OPEN", consecutiveFailures: circuit.consecutiveFailures, cooldownMs: circuit.cooldownMs }, agent);
280
+ this.chat.writeMessage({
281
+ agent: "NightShift",
282
+ type: "ERROR",
283
+ content: `Circuit breaker tripped for ${agent}: ${circuit.consecutiveFailures} consecutive failures. Agent disabled for ${circuit.cooldownMs / 1000}s cooldown.`,
284
+ });
285
+ }
286
+ // Persist circuit state
287
+ this.db.saveCircuitState(agent, {
288
+ state: circuit.state,
289
+ consecutiveFailures: circuit.consecutiveFailures,
290
+ brokenSince: circuit.brokenSince ? new Date(circuit.brokenSince).toISOString() : undefined,
291
+ totalFailures: circuit.totalFailures,
292
+ totalSuccesses: circuit.totalSuccesses,
293
+ });
294
+ }
295
+ recordAgentSuccess(agent) {
296
+ const circuit = this.agentCircuits.get(agent);
297
+ if (!circuit)
298
+ return;
299
+ const prevState = circuit.state;
300
+ circuit.consecutiveFailures = 0;
301
+ circuit.state = "CLOSED";
302
+ circuit.brokenSince = undefined;
303
+ circuit.probeInFlight = false;
304
+ circuit.totalSuccesses++;
305
+ if (prevState !== "CLOSED") {
306
+ this.log("info", `Circuit breaker CLOSED for ${agent} — recovered after successful run`);
307
+ this.db.appendAudit("circuit_break", { transition: `${prevState}->CLOSED` }, agent);
308
+ }
309
+ // Persist circuit state
310
+ this.db.saveCircuitState(agent, {
311
+ state: circuit.state,
312
+ consecutiveFailures: circuit.consecutiveFailures,
313
+ totalFailures: circuit.totalFailures,
314
+ totalSuccesses: circuit.totalSuccesses,
315
+ });
316
+ }
317
+ /**
318
+ * Try to reserve an agent for work. Returns true if the agent is available.
319
+ * For HALF_OPEN state, only one probe is allowed at a time.
320
+ */
321
+ tryReserveAgent(agent) {
322
+ const circuit = this.agentCircuits.get(agent);
323
+ if (!circuit)
324
+ return true;
325
+ switch (circuit.state) {
326
+ case "CLOSED":
327
+ return true;
328
+ case "OPEN": {
329
+ // Check if cooldown has elapsed
330
+ const elapsed = Date.now() - (circuit.brokenSince ?? 0);
331
+ if (elapsed >= circuit.cooldownMs) {
332
+ // Transition to HALF_OPEN, reserve probe
333
+ circuit.state = "HALF_OPEN";
334
+ circuit.probeInFlight = true;
335
+ this.log("info", `Circuit breaker HALF-OPEN for ${agent} — cooldown expired, allowing single probe`);
336
+ this.db.appendAudit("circuit_break", { transition: "OPEN->HALF_OPEN" }, agent);
337
+ this.db.saveCircuitState(agent, {
338
+ state: circuit.state,
339
+ consecutiveFailures: circuit.consecutiveFailures,
340
+ brokenSince: circuit.brokenSince ? new Date(circuit.brokenSince).toISOString() : undefined,
341
+ totalFailures: circuit.totalFailures,
342
+ totalSuccesses: circuit.totalSuccesses,
343
+ });
344
+ return true;
345
+ }
346
+ return false; // Still in cooldown
347
+ }
348
+ case "HALF_OPEN":
349
+ // Only allow if no probe is already in flight
350
+ if (!circuit.probeInFlight) {
351
+ circuit.probeInFlight = true;
352
+ return true;
353
+ }
354
+ return false; // Probe already running
355
+ default:
356
+ return false;
357
+ }
358
+ }
359
+ releaseProbe(agent) {
360
+ const circuit = this.agentCircuits.get(agent);
361
+ if (circuit?.state === "HALF_OPEN" && circuit.probeInFlight) {
362
+ circuit.probeInFlight = false;
363
+ }
364
+ }
365
+ getHealthyAgents() {
366
+ // Note: this is a read-only check for filtering, does NOT reserve
367
+ return this.availableAgents.filter(a => {
368
+ const circuit = this.agentCircuits.get(a);
369
+ if (!circuit)
370
+ return true;
371
+ if (circuit.state === "CLOSED")
372
+ return true;
373
+ if (circuit.state === "OPEN") {
374
+ const elapsed = Date.now() - (circuit.brokenSince ?? 0);
375
+ return elapsed >= circuit.cooldownMs;
376
+ }
377
+ // HALF_OPEN: available only if no probe in flight
378
+ return !circuit.probeInFlight;
379
+ });
380
+ }
381
+ getCircuitStatus() {
382
+ const status = {};
383
+ for (const [agent, circuit] of this.agentCircuits) {
384
+ status[agent] = {
385
+ state: circuit.state,
386
+ failures: circuit.totalFailures,
387
+ successes: circuit.totalSuccesses,
388
+ consecutiveFailures: circuit.consecutiveFailures,
389
+ };
390
+ }
391
+ return status;
392
+ }
393
+ // ============================================
232
394
  // Reconciliation Loop
233
395
  // ============================================
234
396
  async reconcile() {
@@ -275,17 +437,29 @@ export class NightShiftDaemon {
275
437
  async spawnAgentForStory(storyId) {
276
438
  const storyState = this.storyStates.get(storyId);
277
439
  const failedAgents = storyState?.failedAgents ?? [];
278
- // Pick an agent that hasn't failed for this story
279
- const eligibleAgents = this.availableAgents.filter((a) => !failedAgents.includes(a));
280
- const agent = eligibleAgents.length > 0
281
- ? eligibleAgents[this.agentIndex++ % eligibleAgents.length]
282
- : this.getNextAgent(); // Fall back to round-robin if all have failed
440
+ // Pick an agent that hasn't failed for this story AND can be reserved (circuit check)
441
+ const healthyAgents = this.getHealthyAgents();
442
+ const eligibleAgents = healthyAgents.filter((a) => !failedAgents.includes(a));
443
+ const candidates = eligibleAgents.length > 0 ? eligibleAgents : healthyAgents;
444
+ // Try to reserve an agent (handles HALF_OPEN single-probe enforcement)
445
+ let agent = null;
446
+ if (candidates.length > 0) {
447
+ const startIdx = this.agentIndex++;
448
+ for (let i = 0; i < candidates.length; i++) {
449
+ const candidate = candidates[(startIdx + i) % candidates.length];
450
+ if (this.tryReserveAgent(candidate)) {
451
+ agent = candidate;
452
+ break;
453
+ }
454
+ }
455
+ }
283
456
  if (!agent) {
284
457
  this.log("warn", "No agents available");
285
458
  return;
286
459
  }
287
460
  if (this.config.dryRun) {
288
461
  this.log("info", `[DRY RUN] Would spawn ${agent} for ${storyId}`);
462
+ this.releaseProbe(agent);
289
463
  return;
290
464
  }
291
465
  this.log("info", `Spawning ${agent} for ${storyId}`);
@@ -293,6 +467,7 @@ export class NightShiftDaemon {
293
467
  const story = this.ralph.getStory(storyId);
294
468
  if (!story) {
295
469
  this.log("error", `Story ${storyId} not found`);
470
+ this.releaseProbe(agent);
296
471
  return;
297
472
  }
298
473
  // Build prompt
@@ -312,6 +487,11 @@ export class NightShiftDaemon {
312
487
  lastActivity: Date.now(),
313
488
  outputFile: result.outputFile,
314
489
  });
490
+ // Audit: agent spawned
491
+ this.db.appendAudit("spawn", {
492
+ pid: result.pid,
493
+ storyTitle: story.title,
494
+ }, agent, storyId);
315
495
  // Post to chat
316
496
  this.chat.writeMessage({
317
497
  agent: "NightShift",
@@ -368,16 +548,27 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
368
548
  if (!agentProc)
369
549
  return;
370
550
  this.log("info", `Agent ${agentProc.agent} (PID: ${pid}) exited for ${storyId}`);
551
+ const duration = Date.now() - agentProc.startTime;
371
552
  // Check if story is complete
372
553
  const story = this.ralph.getStory(storyId);
373
554
  if (story?.passes) {
374
- this.log("info", `✅ ${storyId} completed successfully`);
555
+ this.log("info", `${storyId} completed successfully`);
556
+ this.recordAgentSuccess(agentProc.agent);
375
557
  this.activeAgents.delete(storyId);
558
+ // Audit + run record: success
559
+ this.db.appendAudit("complete", { duration_ms: duration }, agentProc.agent, storyId);
560
+ this.db.insertRunRecord({ story_id: storyId, agent: agentProc.agent, status: "success", duration_ms: duration });
376
561
  }
377
562
  else {
378
- // Agent exited without completing - record failure and retry with different agent
563
+ // Agent exited without completing - record failure on both story and circuit breaker
564
+ this.recordAgentFailure(agentProc.agent);
379
565
  this.incrementRetry(storyId, agentProc.agent);
380
566
  this.activeAgents.delete(storyId);
567
+ // Classify exit: short runs are likely crashes, long runs are likely timeouts
568
+ const exitStatus = duration < this.config.stuckTimeout / 2 ? "failed" : "timeout";
569
+ // Audit + run record: failure
570
+ this.db.appendAudit("fail", { duration_ms: duration, exitStatus, retryCount: this.storyStates.get(storyId)?.retryCount }, agentProc.agent, storyId);
571
+ this.db.insertRunRecord({ story_id: storyId, agent: agentProc.agent, status: exitStatus, duration_ms: duration });
381
572
  if (this.isQuarantined(storyId)) {
382
573
  const state = this.storyStates.get(storyId);
383
574
  this.log("warn", `${storyId} quarantined after ${this.config.maxRetries} failures (tried: ${state?.failedAgents.join(", ")})`);
@@ -429,13 +620,18 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
429
620
  for (const [storyId, proc] of this.activeAgents) {
430
621
  const inactiveTime = now - proc.lastActivity;
431
622
  if (inactiveTime > this.config.stuckTimeout) {
623
+ const stuckDuration = Date.now() - proc.startTime;
432
624
  this.log("warn", `Agent ${proc.agent} stuck on ${storyId} (inactive ${Math.round(inactiveTime / 60000)}min)`);
433
625
  // Kill the stuck process using cross-platform killProcess
434
626
  if (proc.pid) {
435
627
  killProcess(proc.pid, false);
436
628
  }
629
+ this.recordAgentFailure(proc.agent);
437
630
  this.activeAgents.delete(storyId);
438
- this.incrementRetry(storyId);
631
+ this.incrementRetry(storyId, proc.agent);
632
+ // Audit + run record for stuck agent
633
+ this.db.appendAudit("fail", { reason: "stuck", inactiveMs: inactiveTime, duration_ms: stuckDuration }, proc.agent, storyId);
634
+ this.db.insertRunRecord({ story_id: storyId, agent: proc.agent, status: "timeout", duration_ms: stuckDuration, error_message: `Agent stuck (inactive ${Math.round(inactiveTime / 60000)}min)` });
439
635
  }
440
636
  }
441
637
  // 2. Check for unclaimed failovers
@@ -472,6 +668,8 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
472
668
  }
473
669
  this.availableAgents = configuredAgents;
474
670
  this.log("info", `Available agents: ${this.availableAgents.join(", ")}`);
671
+ // Initialize circuit breakers for each available agent
672
+ this.initializeCircuits();
475
673
  this.running = true;
476
674
  // Start event watchers (primary)
477
675
  this.startWatchers();
@@ -496,6 +694,8 @@ ${progress ? progress.substring(0, 2000) : "No progress file yet."}
496
694
  this.stopWatchers();
497
695
  // Release lock
498
696
  this.releaseLock();
697
+ // Close database
698
+ this.db.close();
499
699
  this.log("info", "Daemon stopped");
500
700
  process.exit(0);
501
701
  }
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * NightShift Database Layer
3
+ *
4
+ * SQLite-backed storage for all NightShift state.
5
+ * Replaces scattered JSON/text files with ACID transactions and indexed queries.
6
+ * Uses better-sqlite3 for synchronous, high-performance access.
7
+ */
8
+ export declare class NightShiftDB {
9
+ private db;
10
+ private dbPath;
11
+ constructor(projectPath: string);
12
+ private initSchema;
13
+ private getSchemaVersion;
14
+ private setSchemaVersion;
15
+ transaction<T>(fn: () => T): T;
16
+ appendAudit(eventType: string, data: Record<string, unknown>, agent?: string, storyId?: string): number;
17
+ queryAudit(options?: {
18
+ eventType?: string;
19
+ agent?: string;
20
+ storyId?: string;
21
+ limit?: number;
22
+ since?: string;
23
+ }): AuditEntry[];
24
+ insertRunRecord(record: Omit<RunRecord, "id">): number;
25
+ getRunRecords(options?: {
26
+ storyId?: string;
27
+ agent?: string;
28
+ status?: string;
29
+ limit?: number;
30
+ }): RunRecord[];
31
+ addBudgetEntry(entry: Omit<BudgetEntry, "id" | "timestamp">): number;
32
+ getBudgetStatus(agent: string): {
33
+ totalCost: number;
34
+ todayCost: number;
35
+ monthCost: number;
36
+ limit: BudgetLimit | null;
37
+ exceeded: boolean;
38
+ warning: boolean;
39
+ exceededReason?: string;
40
+ };
41
+ setBudgetLimit(agent: string, limit: Partial<BudgetLimit>): void;
42
+ saveCircuitState(agent: string, state: {
43
+ state: string;
44
+ consecutiveFailures: number;
45
+ brokenSince?: string;
46
+ totalFailures: number;
47
+ totalSuccesses: number;
48
+ }): void;
49
+ loadCircuitState(agent: string): {
50
+ state: string;
51
+ consecutiveFailures: number;
52
+ brokenSince?: string;
53
+ totalFailures: number;
54
+ totalSuccesses: number;
55
+ } | null;
56
+ insertChatMessage(agent: string, type: string, content: string): number;
57
+ getChatMessages(options?: {
58
+ agent?: string;
59
+ type?: string;
60
+ limit?: number;
61
+ sinceId?: number;
62
+ }): ChatRow[];
63
+ getAgentSuccessRate(agent?: string): {
64
+ agent: string;
65
+ total: number;
66
+ successes: number;
67
+ rate: number;
68
+ }[];
69
+ getAverageDuration(agent?: string): {
70
+ agent: string;
71
+ avg_duration_ms: number;
72
+ median_stories: number;
73
+ }[];
74
+ getScopeLeakRate(): {
75
+ agent: string;
76
+ total: number;
77
+ leaks: number;
78
+ rate: number;
79
+ }[];
80
+ close(): void;
81
+ getPath(): string;
82
+ }
83
+ export interface AuditEntry {
84
+ id: number;
85
+ event_type: string;
86
+ agent: string | null;
87
+ story_id: string | null;
88
+ data: Record<string, unknown>;
89
+ timestamp: string;
90
+ }
91
+ export interface RunRecord {
92
+ id?: number;
93
+ story_id?: string;
94
+ agent: string;
95
+ model?: string;
96
+ timeout_set_ms?: number;
97
+ duration_ms?: number;
98
+ status: string;
99
+ files_declared?: string[];
100
+ files_actual?: string[];
101
+ scope_leak?: boolean;
102
+ out_of_scope_files?: string[];
103
+ tests_passed?: boolean;
104
+ verification_passed?: boolean;
105
+ rollback_triggered?: boolean;
106
+ diff_stats?: Record<string, unknown>;
107
+ exit_code?: number;
108
+ error_message?: string;
109
+ started_at?: string;
110
+ ended_at?: string;
111
+ }
112
+ export interface BudgetEntry {
113
+ id?: number;
114
+ agent: string;
115
+ provider?: string;
116
+ tokens_in?: number;
117
+ tokens_out?: number;
118
+ estimated_cost_usd?: number;
119
+ story_id?: string;
120
+ run_record_id?: number;
121
+ timestamp?: string;
122
+ }
123
+ export interface BudgetLimit {
124
+ agent: string;
125
+ enabled: boolean;
126
+ max_tokens_per_run?: number;
127
+ max_cost_per_day_usd?: number;
128
+ max_cost_per_month_usd?: number;
129
+ warning_threshold_pct?: number;
130
+ }
131
+ interface ChatRow {
132
+ id: number;
133
+ agent: string;
134
+ type: string;
135
+ content: string;
136
+ timestamp: string;
137
+ }
138
+ export {};
139
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,503 @@
1
+ /**
2
+ * NightShift Database Layer
3
+ *
4
+ * SQLite-backed storage for all NightShift state.
5
+ * Replaces scattered JSON/text files with ACID transactions and indexed queries.
6
+ * Uses better-sqlite3 for synchronous, high-performance access.
7
+ */
8
+ import Database from "better-sqlite3";
9
+ import * as fs from "fs";
10
+ import * as path from "path";
11
+ // ============================================
12
+ // Schema Version & Migrations
13
+ // ============================================
14
+ const SCHEMA_VERSION = 1;
15
+ const SCHEMA_SQL = `
16
+ -- Schema version tracking
17
+ CREATE TABLE IF NOT EXISTS schema_version (
18
+ version INTEGER NOT NULL,
19
+ applied_at TEXT DEFAULT (datetime('now'))
20
+ );
21
+
22
+ -- Chat messages (replaces chat.txt)
23
+ CREATE TABLE IF NOT EXISTS chat_messages (
24
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
25
+ agent TEXT NOT NULL,
26
+ type TEXT NOT NULL,
27
+ content TEXT NOT NULL,
28
+ timestamp TEXT DEFAULT (datetime('now'))
29
+ );
30
+ CREATE INDEX IF NOT EXISTS idx_chat_agent ON chat_messages(agent);
31
+ CREATE INDEX IF NOT EXISTS idx_chat_type ON chat_messages(type);
32
+ CREATE INDEX IF NOT EXISTS idx_chat_timestamp ON chat_messages(timestamp);
33
+
34
+ -- Workflow state (replaces workflow.json)
35
+ CREATE TABLE IF NOT EXISTS workflow (
36
+ id INTEGER PRIMARY KEY CHECK (id = 1), -- singleton row
37
+ phase TEXT NOT NULL DEFAULT 'planning',
38
+ project_goal TEXT,
39
+ data TEXT NOT NULL DEFAULT '{}', -- full workflow JSON for complex nested state
40
+ updated_at TEXT DEFAULT (datetime('now'))
41
+ );
42
+
43
+ -- Story assignments (extracted from workflow for better querying)
44
+ CREATE TABLE IF NOT EXISTS story_assignments (
45
+ story_id TEXT PRIMARY KEY,
46
+ agent TEXT NOT NULL,
47
+ status TEXT NOT NULL DEFAULT 'active', -- active, completed, failed, abandoned
48
+ assigned_at TEXT DEFAULT (datetime('now')),
49
+ completed_at TEXT
50
+ );
51
+ CREATE INDEX IF NOT EXISTS idx_assignments_agent ON story_assignments(agent);
52
+ CREATE INDEX IF NOT EXISTS idx_assignments_status ON story_assignments(status);
53
+
54
+ -- Decisions (extracted from workflow)
55
+ CREATE TABLE IF NOT EXISTS decisions (
56
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
57
+ topic TEXT NOT NULL,
58
+ chosen TEXT NOT NULL,
59
+ rationale TEXT,
60
+ agent TEXT,
61
+ timestamp TEXT DEFAULT (datetime('now'))
62
+ );
63
+
64
+ -- Trace events (replaces trace.json)
65
+ CREATE TABLE IF NOT EXISTS trace_events (
66
+ id TEXT PRIMARY KEY,
67
+ parent_id TEXT,
68
+ type TEXT NOT NULL, -- spawn, complete, fail, failover, decision
69
+ agent TEXT NOT NULL,
70
+ task_id TEXT,
71
+ status TEXT NOT NULL DEFAULT 'active', -- active, completed, failed
72
+ outcome TEXT,
73
+ metadata TEXT, -- JSON
74
+ started_at TEXT DEFAULT (datetime('now')),
75
+ ended_at TEXT,
76
+ duration_ms INTEGER
77
+ );
78
+ CREATE INDEX IF NOT EXISTS idx_trace_parent ON trace_events(parent_id);
79
+ CREATE INDEX IF NOT EXISTS idx_trace_task ON trace_events(task_id);
80
+ CREATE INDEX IF NOT EXISTS idx_trace_agent ON trace_events(agent);
81
+
82
+ -- Context store (replaces context/*.json files)
83
+ CREATE TABLE IF NOT EXISTS context_entries (
84
+ id TEXT PRIMARY KEY,
85
+ topic TEXT NOT NULL,
86
+ content TEXT NOT NULL,
87
+ agent TEXT NOT NULL,
88
+ tags TEXT, -- JSON array
89
+ created_at TEXT DEFAULT (datetime('now')),
90
+ updated_at TEXT DEFAULT (datetime('now'))
91
+ );
92
+ CREATE INDEX IF NOT EXISTS idx_context_topic ON context_entries(topic);
93
+
94
+ -- Agent registry (replaces agent-registry.json)
95
+ CREATE TABLE IF NOT EXISTS agent_registry (
96
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
97
+ agent TEXT NOT NULL,
98
+ pid INTEGER,
99
+ output_file TEXT,
100
+ story_id TEXT,
101
+ prompt_preview TEXT, -- first 500 chars
102
+ started_at TEXT DEFAULT (datetime('now')),
103
+ status TEXT NOT NULL DEFAULT 'running' -- running, completed, failed, killed
104
+ );
105
+ CREATE INDEX IF NOT EXISTS idx_registry_agent ON agent_registry(agent);
106
+ CREATE INDEX IF NOT EXISTS idx_registry_status ON agent_registry(status);
107
+
108
+ -- ============================================
109
+ -- NEW v2 tables
110
+ -- ============================================
111
+
112
+ -- Immutable audit log (append-only)
113
+ CREATE TABLE IF NOT EXISTS audit_log (
114
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
115
+ event_type TEXT NOT NULL, -- spawn, complete, fail, rollback, scope_leak, rate_limit, circuit_break, budget_warning, budget_exceeded
116
+ agent TEXT,
117
+ story_id TEXT,
118
+ data TEXT NOT NULL DEFAULT '{}', -- JSON blob with event-specific details
119
+ timestamp TEXT DEFAULT (datetime('now'))
120
+ );
121
+ CREATE INDEX IF NOT EXISTS idx_audit_type ON audit_log(event_type);
122
+ CREATE INDEX IF NOT EXISTS idx_audit_agent ON audit_log(agent);
123
+ CREATE INDEX IF NOT EXISTS idx_audit_story ON audit_log(story_id);
124
+ CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_log(timestamp);
125
+
126
+ -- Run records (for run-guard and autoresearch)
127
+ CREATE TABLE IF NOT EXISTS run_records (
128
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
129
+ story_id TEXT,
130
+ agent TEXT NOT NULL,
131
+ model TEXT,
132
+ timeout_set_ms INTEGER,
133
+ duration_ms INTEGER,
134
+ status TEXT NOT NULL, -- success, verification_failed, scope_leak, timeout, rate_limited, rollback_failed, quarantined
135
+ files_declared TEXT, -- JSON array
136
+ files_actual TEXT, -- JSON array
137
+ scope_leak INTEGER DEFAULT 0,
138
+ out_of_scope_files TEXT, -- JSON array
139
+ tests_passed INTEGER,
140
+ verification_passed INTEGER,
141
+ rollback_triggered INTEGER DEFAULT 0,
142
+ diff_stats TEXT, -- JSON
143
+ exit_code INTEGER,
144
+ error_message TEXT,
145
+ started_at TEXT DEFAULT (datetime('now')),
146
+ ended_at TEXT
147
+ );
148
+ CREATE INDEX IF NOT EXISTS idx_runs_story ON run_records(story_id);
149
+ CREATE INDEX IF NOT EXISTS idx_runs_agent ON run_records(agent);
150
+ CREATE INDEX IF NOT EXISTS idx_runs_status ON run_records(status);
151
+
152
+ -- Budget tracking
153
+ CREATE TABLE IF NOT EXISTS budget_entries (
154
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
155
+ agent TEXT NOT NULL,
156
+ provider TEXT, -- openrouter, anthropic, google, local, ollama
157
+ tokens_in INTEGER DEFAULT 0,
158
+ tokens_out INTEGER DEFAULT 0,
159
+ estimated_cost_usd REAL DEFAULT 0,
160
+ story_id TEXT,
161
+ run_record_id INTEGER REFERENCES run_records(id),
162
+ timestamp TEXT DEFAULT (datetime('now'))
163
+ );
164
+ CREATE INDEX IF NOT EXISTS idx_budget_agent ON budget_entries(agent);
165
+ CREATE INDEX IF NOT EXISTS idx_budget_provider ON budget_entries(provider);
166
+
167
+ -- Budget limits (configurable per agent)
168
+ CREATE TABLE IF NOT EXISTS budget_limits (
169
+ agent TEXT PRIMARY KEY,
170
+ enabled INTEGER DEFAULT 0,
171
+ max_tokens_per_run INTEGER,
172
+ max_cost_per_day_usd REAL,
173
+ max_cost_per_month_usd REAL,
174
+ warning_threshold_pct REAL DEFAULT 0.8
175
+ );
176
+
177
+ -- Circuit breaker state (persisted across restarts)
178
+ CREATE TABLE IF NOT EXISTS circuit_breaker_state (
179
+ agent TEXT PRIMARY KEY,
180
+ state TEXT NOT NULL DEFAULT 'CLOSED', -- CLOSED, OPEN, HALF_OPEN
181
+ consecutive_failures INTEGER DEFAULT 0,
182
+ broken_since TEXT,
183
+ total_failures INTEGER DEFAULT 0,
184
+ total_successes INTEGER DEFAULT 0,
185
+ updated_at TEXT DEFAULT (datetime('now'))
186
+ );
187
+ `;
188
+ // ============================================
189
+ // Database Manager
190
+ // ============================================
191
+ export class NightShiftDB {
192
+ db;
193
+ dbPath;
194
+ constructor(projectPath) {
195
+ const robotChatDir = path.join(projectPath, ".robot-chat");
196
+ if (!fs.existsSync(robotChatDir)) {
197
+ fs.mkdirSync(robotChatDir, { recursive: true });
198
+ }
199
+ this.dbPath = path.join(robotChatDir, "nightshift.db");
200
+ this.db = new Database(this.dbPath);
201
+ // Performance settings
202
+ this.db.pragma("journal_mode = WAL"); // Concurrent readers
203
+ this.db.pragma("synchronous = NORMAL"); // Good durability/performance balance
204
+ this.db.pragma("foreign_keys = ON");
205
+ this.db.pragma("busy_timeout = 5000"); // Wait up to 5s for locks
206
+ this.initSchema();
207
+ }
208
+ initSchema() {
209
+ const version = this.getSchemaVersion();
210
+ if (version < SCHEMA_VERSION) {
211
+ this.db.exec(SCHEMA_SQL);
212
+ this.setSchemaVersion(SCHEMA_VERSION);
213
+ }
214
+ }
215
+ getSchemaVersion() {
216
+ try {
217
+ const row = this.db.prepare("SELECT version FROM schema_version ORDER BY applied_at DESC LIMIT 1").get();
218
+ return row?.version ?? 0;
219
+ }
220
+ catch {
221
+ return 0; // Table doesn't exist yet
222
+ }
223
+ }
224
+ setSchemaVersion(version) {
225
+ this.db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(version);
226
+ }
227
+ // ============================================
228
+ // Transaction helper
229
+ // ============================================
230
+ transaction(fn) {
231
+ return this.db.transaction(fn)();
232
+ }
233
+ // ============================================
234
+ // Audit Log (immutable, append-only)
235
+ // ============================================
236
+ appendAudit(eventType, data, agent, storyId) {
237
+ const result = this.db.prepare("INSERT INTO audit_log (event_type, agent, story_id, data) VALUES (?, ?, ?, ?)").run(eventType, agent ?? null, storyId ?? null, JSON.stringify(data));
238
+ return result.lastInsertRowid;
239
+ }
240
+ queryAudit(options = {}) {
241
+ let sql = "SELECT * FROM audit_log WHERE 1=1";
242
+ const params = [];
243
+ if (options.eventType) {
244
+ sql += " AND event_type = ?";
245
+ params.push(options.eventType);
246
+ }
247
+ if (options.agent) {
248
+ sql += " AND agent = ?";
249
+ params.push(options.agent);
250
+ }
251
+ if (options.storyId) {
252
+ sql += " AND story_id = ?";
253
+ params.push(options.storyId);
254
+ }
255
+ if (options.since) {
256
+ sql += " AND timestamp >= ?";
257
+ params.push(options.since);
258
+ }
259
+ sql += " ORDER BY id DESC";
260
+ if (options.limit) {
261
+ sql += " LIMIT ?";
262
+ params.push(options.limit);
263
+ }
264
+ const rows = this.db.prepare(sql).all(...params);
265
+ return rows.map(r => ({ ...r, data: JSON.parse(r.data) }));
266
+ }
267
+ // ============================================
268
+ // Run Records
269
+ // ============================================
270
+ insertRunRecord(record) {
271
+ const result = this.db.prepare(`
272
+ INSERT INTO run_records (story_id, agent, model, timeout_set_ms, duration_ms, status,
273
+ files_declared, files_actual, scope_leak, out_of_scope_files, tests_passed,
274
+ verification_passed, rollback_triggered, diff_stats, exit_code, error_message, started_at, ended_at)
275
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
276
+ `).run(record.story_id ?? null, record.agent, record.model ?? null, record.timeout_set_ms ?? null, record.duration_ms ?? null, record.status, JSON.stringify(record.files_declared ?? []), JSON.stringify(record.files_actual ?? []), record.scope_leak ? 1 : 0, JSON.stringify(record.out_of_scope_files ?? []), record.tests_passed != null ? (record.tests_passed ? 1 : 0) : null, record.verification_passed != null ? (record.verification_passed ? 1 : 0) : null, record.rollback_triggered ? 1 : 0, JSON.stringify(record.diff_stats ?? {}), record.exit_code ?? null, record.error_message ?? null, record.started_at ?? new Date().toISOString(), record.ended_at ?? null);
277
+ return result.lastInsertRowid;
278
+ }
279
+ getRunRecords(options = {}) {
280
+ let sql = "SELECT * FROM run_records WHERE 1=1";
281
+ const params = [];
282
+ if (options.storyId) {
283
+ sql += " AND story_id = ?";
284
+ params.push(options.storyId);
285
+ }
286
+ if (options.agent) {
287
+ sql += " AND agent = ?";
288
+ params.push(options.agent);
289
+ }
290
+ if (options.status) {
291
+ sql += " AND status = ?";
292
+ params.push(options.status);
293
+ }
294
+ sql += " ORDER BY id DESC";
295
+ if (options.limit) {
296
+ sql += " LIMIT ?";
297
+ params.push(options.limit);
298
+ }
299
+ const rows = this.db.prepare(sql).all(...params);
300
+ return rows.map(r => ({
301
+ id: r.id,
302
+ story_id: r.story_id ?? undefined,
303
+ agent: r.agent,
304
+ model: r.model ?? undefined,
305
+ timeout_set_ms: r.timeout_set_ms ?? undefined,
306
+ duration_ms: r.duration_ms ?? undefined,
307
+ status: r.status,
308
+ files_declared: r.files_declared ? JSON.parse(r.files_declared) : [],
309
+ files_actual: r.files_actual ? JSON.parse(r.files_actual) : [],
310
+ scope_leak: r.scope_leak === 1,
311
+ out_of_scope_files: r.out_of_scope_files ? JSON.parse(r.out_of_scope_files) : [],
312
+ tests_passed: r.tests_passed != null ? r.tests_passed === 1 : undefined,
313
+ verification_passed: r.verification_passed != null ? r.verification_passed === 1 : undefined,
314
+ rollback_triggered: r.rollback_triggered === 1,
315
+ diff_stats: r.diff_stats ? JSON.parse(r.diff_stats) : {},
316
+ exit_code: r.exit_code ?? undefined,
317
+ error_message: r.error_message ?? undefined,
318
+ started_at: r.started_at,
319
+ ended_at: r.ended_at ?? undefined,
320
+ }));
321
+ }
322
+ // ============================================
323
+ // Budget
324
+ // ============================================
325
+ addBudgetEntry(entry) {
326
+ const result = this.db.prepare(`
327
+ INSERT INTO budget_entries (agent, provider, tokens_in, tokens_out, estimated_cost_usd, story_id, run_record_id)
328
+ VALUES (?, ?, ?, ?, ?, ?, ?)
329
+ `).run(entry.agent, entry.provider ?? null, entry.tokens_in ?? 0, entry.tokens_out ?? 0, entry.estimated_cost_usd ?? 0, entry.story_id ?? null, entry.run_record_id ?? null);
330
+ return result.lastInsertRowid;
331
+ }
332
+ getBudgetStatus(agent) {
333
+ const totalRow = this.db.prepare("SELECT COALESCE(SUM(estimated_cost_usd), 0) as total FROM budget_entries WHERE agent = ?").get(agent);
334
+ const todayRow = this.db.prepare("SELECT COALESCE(SUM(estimated_cost_usd), 0) as total FROM budget_entries WHERE agent = ? AND date(timestamp) = date('now')").get(agent);
335
+ const monthRow = this.db.prepare("SELECT COALESCE(SUM(estimated_cost_usd), 0) as total FROM budget_entries WHERE agent = ? AND strftime('%Y-%m', timestamp) = strftime('%Y-%m', 'now')").get(agent);
336
+ const limit = this.db.prepare("SELECT * FROM budget_limits WHERE agent = ?").get(agent);
337
+ const parsedLimit = limit ? {
338
+ agent: limit.agent,
339
+ enabled: limit.enabled === 1,
340
+ max_tokens_per_run: limit.max_tokens_per_run ?? undefined,
341
+ max_cost_per_day_usd: limit.max_cost_per_day_usd ?? undefined,
342
+ max_cost_per_month_usd: limit.max_cost_per_month_usd ?? undefined,
343
+ warning_threshold_pct: limit.warning_threshold_pct ?? undefined,
344
+ } : null;
345
+ let exceeded = false;
346
+ let exceededReason;
347
+ let warning = false;
348
+ if (parsedLimit?.enabled) {
349
+ const warnPct = parsedLimit.warning_threshold_pct ?? 0.8;
350
+ if (parsedLimit.max_cost_per_day_usd != null) {
351
+ if (todayRow.total >= parsedLimit.max_cost_per_day_usd) {
352
+ exceeded = true;
353
+ exceededReason = `Daily limit $${parsedLimit.max_cost_per_day_usd} exceeded ($${todayRow.total.toFixed(4)})`;
354
+ }
355
+ else if (todayRow.total >= parsedLimit.max_cost_per_day_usd * warnPct) {
356
+ warning = true;
357
+ }
358
+ }
359
+ if (parsedLimit.max_cost_per_month_usd != null) {
360
+ if (monthRow.total >= parsedLimit.max_cost_per_month_usd) {
361
+ exceeded = true;
362
+ exceededReason = `Monthly limit $${parsedLimit.max_cost_per_month_usd} exceeded ($${monthRow.total.toFixed(4)})`;
363
+ }
364
+ else if (monthRow.total >= parsedLimit.max_cost_per_month_usd * warnPct) {
365
+ warning = true;
366
+ }
367
+ }
368
+ }
369
+ return {
370
+ totalCost: totalRow.total,
371
+ todayCost: todayRow.total,
372
+ monthCost: monthRow.total,
373
+ limit: parsedLimit,
374
+ exceeded,
375
+ warning,
376
+ exceededReason,
377
+ };
378
+ }
379
+ setBudgetLimit(agent, limit) {
380
+ // Use null sentinel to distinguish "field omitted" from "field set to null/false"
381
+ const enabled = limit.enabled !== undefined ? (limit.enabled ? 1 : 0) : null;
382
+ const maxTokens = limit.max_tokens_per_run !== undefined ? limit.max_tokens_per_run : null;
383
+ const maxDaily = limit.max_cost_per_day_usd !== undefined ? limit.max_cost_per_day_usd : null;
384
+ const maxMonthly = limit.max_cost_per_month_usd !== undefined ? limit.max_cost_per_month_usd : null;
385
+ const warnPct = limit.warning_threshold_pct !== undefined ? limit.warning_threshold_pct : null;
386
+ this.db.prepare(`
387
+ INSERT INTO budget_limits (agent, enabled, max_tokens_per_run, max_cost_per_day_usd, max_cost_per_month_usd, warning_threshold_pct)
388
+ VALUES (?, COALESCE(?, 0), ?, ?, ?, COALESCE(?, 0.8))
389
+ ON CONFLICT(agent) DO UPDATE SET
390
+ enabled = COALESCE(?, enabled),
391
+ max_tokens_per_run = COALESCE(?, max_tokens_per_run),
392
+ max_cost_per_day_usd = COALESCE(?, max_cost_per_day_usd),
393
+ max_cost_per_month_usd = COALESCE(?, max_cost_per_month_usd),
394
+ warning_threshold_pct = COALESCE(?, warning_threshold_pct)
395
+ `).run(agent, enabled, maxTokens, maxDaily, maxMonthly, warnPct, enabled, maxTokens, maxDaily, maxMonthly, warnPct);
396
+ }
397
+ // ============================================
398
+ // Circuit Breaker Persistence
399
+ // ============================================
400
+ saveCircuitState(agent, state) {
401
+ this.db.prepare(`
402
+ INSERT INTO circuit_breaker_state (agent, state, consecutive_failures, broken_since, total_failures, total_successes, updated_at)
403
+ VALUES (?, ?, ?, ?, ?, ?, datetime('now'))
404
+ ON CONFLICT(agent) DO UPDATE SET
405
+ state = excluded.state,
406
+ consecutive_failures = excluded.consecutive_failures,
407
+ broken_since = excluded.broken_since,
408
+ total_failures = excluded.total_failures,
409
+ total_successes = excluded.total_successes,
410
+ updated_at = excluded.updated_at
411
+ `).run(agent, state.state, state.consecutiveFailures, state.brokenSince ?? null, state.totalFailures, state.totalSuccesses);
412
+ }
413
+ loadCircuitState(agent) {
414
+ const row = this.db.prepare("SELECT * FROM circuit_breaker_state WHERE agent = ?").get(agent);
415
+ if (!row)
416
+ return null;
417
+ return {
418
+ state: row.state,
419
+ consecutiveFailures: row.consecutive_failures,
420
+ brokenSince: row.broken_since ?? undefined,
421
+ totalFailures: row.total_failures,
422
+ totalSuccesses: row.total_successes,
423
+ };
424
+ }
425
+ // ============================================
426
+ // Chat Messages
427
+ // ============================================
428
+ insertChatMessage(agent, type, content) {
429
+ const result = this.db.prepare("INSERT INTO chat_messages (agent, type, content) VALUES (?, ?, ?)").run(agent, type, content);
430
+ return result.lastInsertRowid;
431
+ }
432
+ getChatMessages(options = {}) {
433
+ let sql = "SELECT * FROM chat_messages WHERE 1=1";
434
+ const params = [];
435
+ if (options.agent) {
436
+ sql += " AND agent = ?";
437
+ params.push(options.agent);
438
+ }
439
+ if (options.type) {
440
+ sql += " AND type = ?";
441
+ params.push(options.type);
442
+ }
443
+ if (options.sinceId) {
444
+ sql += " AND id > ?";
445
+ params.push(options.sinceId);
446
+ }
447
+ sql += " ORDER BY id DESC";
448
+ if (options.limit) {
449
+ sql += " LIMIT ?";
450
+ params.push(options.limit);
451
+ }
452
+ return this.db.prepare(sql).all(...params);
453
+ }
454
+ // ============================================
455
+ // Autoresearch Queries
456
+ // ============================================
457
+ getAgentSuccessRate(agent) {
458
+ let sql = `
459
+ SELECT agent, COUNT(*) as total,
460
+ SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) as successes,
461
+ ROUND(CAST(SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) AS REAL) / COUNT(*), 3) as rate
462
+ FROM run_records
463
+ `;
464
+ const params = [];
465
+ if (agent) {
466
+ sql += " WHERE agent = ?";
467
+ params.push(agent);
468
+ }
469
+ sql += " GROUP BY agent ORDER BY rate DESC";
470
+ return this.db.prepare(sql).all(...params);
471
+ }
472
+ getAverageDuration(agent) {
473
+ let sql = `
474
+ SELECT agent, AVG(duration_ms) as avg_duration_ms, COUNT(DISTINCT story_id) as median_stories
475
+ FROM run_records WHERE duration_ms IS NOT NULL
476
+ `;
477
+ const params = [];
478
+ if (agent) {
479
+ sql += " AND agent = ?";
480
+ params.push(agent);
481
+ }
482
+ sql += " GROUP BY agent";
483
+ return this.db.prepare(sql).all(...params);
484
+ }
485
+ getScopeLeakRate() {
486
+ return this.db.prepare(`
487
+ SELECT agent, COUNT(*) as total,
488
+ SUM(CASE WHEN scope_leak = 1 THEN 1 ELSE 0 END) as leaks,
489
+ ROUND(CAST(SUM(CASE WHEN scope_leak = 1 THEN 1 ELSE 0 END) AS REAL) / COUNT(*), 3) as rate
490
+ FROM run_records GROUP BY agent ORDER BY rate DESC
491
+ `).all();
492
+ }
493
+ // ============================================
494
+ // Cleanup
495
+ // ============================================
496
+ close() {
497
+ this.db.close();
498
+ }
499
+ getPath() {
500
+ return this.dbPath;
501
+ }
502
+ }
503
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nightshift-mcp",
3
- "version": "1.1.2",
3
+ "version": "2.0.0",
4
4
  "description": "Agent teams and multi-agent orchestration across AI models via MCP. Coordinate Claude, Codex, Gemini, Vibe, and Goose with delegation, failovers, and autonomous workflows.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -42,10 +42,12 @@
42
42
  "license": "MIT",
43
43
  "dependencies": {
44
44
  "@modelcontextprotocol/sdk": "^1.0.0",
45
+ "better-sqlite3": "^12.8.0",
45
46
  "proper-lockfile": "^4.1.2",
46
47
  "zod": "^3.25.0"
47
48
  },
48
49
  "devDependencies": {
50
+ "@types/better-sqlite3": "^7.6.13",
49
51
  "@types/node": "^20.0.0",
50
52
  "@types/proper-lockfile": "^4.1.4",
51
53
  "typescript": "^5.0.0",