steroids-cli 0.10.30 → 0.10.31

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 (48) hide show
  1. package/dist/commands/loop-phases.d.ts.map +1 -1
  2. package/dist/commands/loop-phases.js +111 -22
  3. package/dist/commands/loop-phases.js.map +1 -1
  4. package/dist/orchestrator/signal-parser.d.ts +4 -0
  5. package/dist/orchestrator/signal-parser.d.ts.map +1 -1
  6. package/dist/orchestrator/signal-parser.js +48 -8
  7. package/dist/orchestrator/signal-parser.js.map +1 -1
  8. package/dist/providers/claude.d.ts.map +1 -1
  9. package/dist/providers/claude.js +4 -1
  10. package/dist/providers/claude.js.map +1 -1
  11. package/dist/runners/global-db-backoffs.d.ts +17 -0
  12. package/dist/runners/global-db-backoffs.d.ts.map +1 -0
  13. package/dist/runners/global-db-backoffs.js +69 -0
  14. package/dist/runners/global-db-backoffs.js.map +1 -0
  15. package/dist/runners/global-db-connection.d.ts +37 -0
  16. package/dist/runners/global-db-connection.d.ts.map +1 -0
  17. package/dist/runners/global-db-connection.js +245 -0
  18. package/dist/runners/global-db-connection.js.map +1 -0
  19. package/dist/runners/global-db-daemon.d.ts +12 -0
  20. package/dist/runners/global-db-daemon.d.ts.map +1 -0
  21. package/dist/runners/global-db-daemon.js +35 -0
  22. package/dist/runners/global-db-daemon.js.map +1 -0
  23. package/dist/runners/global-db-schema.d.ts +79 -0
  24. package/dist/runners/global-db-schema.d.ts.map +1 -0
  25. package/dist/runners/global-db-schema.js +433 -0
  26. package/dist/runners/global-db-schema.js.map +1 -0
  27. package/dist/runners/global-db-sessions.d.ts +13 -0
  28. package/dist/runners/global-db-sessions.d.ts.map +1 -0
  29. package/dist/runners/global-db-sessions.js +65 -0
  30. package/dist/runners/global-db-sessions.js.map +1 -0
  31. package/dist/runners/global-db-validation.d.ts +27 -0
  32. package/dist/runners/global-db-validation.d.ts.map +1 -0
  33. package/dist/runners/global-db-validation.js +43 -0
  34. package/dist/runners/global-db-validation.js.map +1 -0
  35. package/dist/runners/global-db.d.ts +10 -87
  36. package/dist/runners/global-db.d.ts.map +1 -1
  37. package/dist/runners/global-db.js +61 -809
  38. package/dist/runners/global-db.js.map +1 -1
  39. package/dist/runners/orchestrator-loop.d.ts.map +1 -1
  40. package/dist/runners/orchestrator-loop.js +56 -29
  41. package/dist/runners/orchestrator-loop.js.map +1 -1
  42. package/dist/runners/wakeup-checks.d.ts.map +1 -1
  43. package/dist/runners/wakeup-checks.js +14 -1
  44. package/dist/runners/wakeup-checks.js.map +1 -1
  45. package/dist/runners/wakeup-reconcile.d.ts.map +1 -1
  46. package/dist/runners/wakeup-reconcile.js +14 -0
  47. package/dist/runners/wakeup-reconcile.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,433 @@
1
+ "use strict";
2
+ /**
3
+ * Global database schema and migrations
4
+ * Handles all SQL DDL and schema upgrade logic
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.GLOBAL_SCHEMA_VERSION = exports.GLOBAL_SCHEMA_V18_SQL = exports.GLOBAL_SCHEMA_V17_SQL = exports.GLOBAL_SCHEMA_V16_SQL = exports.GLOBAL_SCHEMA_V15_SQL = exports.GLOBAL_SCHEMA_V14_SQL = exports.GLOBAL_SCHEMA_V12_SQL = exports.GLOBAL_SCHEMA_V11_SQL = exports.GLOBAL_SCHEMA_V10_SQL = exports.GLOBAL_SCHEMA_V9_INDEX_AND_TRIGGERS_SQL = exports.GLOBAL_SCHEMA_V8_SQL = exports.GLOBAL_SCHEMA_V7_SQL = exports.GLOBAL_SCHEMA_V6_SQL = exports.GLOBAL_SCHEMA_V5_SQL = exports.GLOBAL_SCHEMA_V4_SQL = exports.GLOBAL_SCHEMA_V3_SQL = exports.GLOBAL_SCHEMA_V2_SQL = exports.GLOBAL_SCHEMA_SQL = void 0;
8
+ exports.applyGlobalSchemaV9 = applyGlobalSchemaV9;
9
+ exports.applyGlobalSchemaV10 = applyGlobalSchemaV10;
10
+ exports.applyGlobalSchemaV11 = applyGlobalSchemaV11;
11
+ exports.applyGlobalSchemaV12 = applyGlobalSchemaV12;
12
+ exports.applyGlobalSchemaV13 = applyGlobalSchemaV13;
13
+ exports.applyGlobalSchemaV14 = applyGlobalSchemaV14;
14
+ exports.applyGlobalSchemaV15 = applyGlobalSchemaV15;
15
+ exports.applyGlobalSchemaV16 = applyGlobalSchemaV16;
16
+ exports.applyGlobalSchemaV17 = applyGlobalSchemaV17;
17
+ exports.applyGlobalSchemaV18 = applyGlobalSchemaV18;
18
+ /**
19
+ * Schema for global database (runners and locks)
20
+ */
21
+ exports.GLOBAL_SCHEMA_SQL = `
22
+ -- Runners table for tracking runner state
23
+ CREATE TABLE IF NOT EXISTS runners (
24
+ id TEXT PRIMARY KEY,
25
+ status TEXT NOT NULL DEFAULT 'idle',
26
+ pid INTEGER,
27
+ project_path TEXT,
28
+ current_task_id TEXT,
29
+ started_at TEXT,
30
+ heartbeat_at TEXT NOT NULL DEFAULT (datetime('now'))
31
+ );
32
+
33
+ -- Runner lock for singleton enforcement
34
+ -- Only one row allowed (id = 1)
35
+ CREATE TABLE IF NOT EXISTS runner_lock (
36
+ id INTEGER PRIMARY KEY CHECK (id = 1),
37
+ runner_id TEXT NOT NULL,
38
+ acquired_at TEXT NOT NULL DEFAULT (datetime('now'))
39
+ );
40
+
41
+ -- Schema metadata
42
+ CREATE TABLE IF NOT EXISTS _global_schema (
43
+ key TEXT PRIMARY KEY,
44
+ value TEXT NOT NULL
45
+ );
46
+ `;
47
+ /**
48
+ * Schema upgrade from version 1 to version 2: Add projects table
49
+ */
50
+ exports.GLOBAL_SCHEMA_V2_SQL = `
51
+ -- Projects table for tracking registered projects
52
+ CREATE TABLE IF NOT EXISTS projects (
53
+ path TEXT PRIMARY KEY,
54
+ name TEXT,
55
+ registered_at TEXT NOT NULL DEFAULT (datetime('now')),
56
+ last_seen_at TEXT NOT NULL DEFAULT (datetime('now')),
57
+ enabled INTEGER NOT NULL DEFAULT 1
58
+ );
59
+ `;
60
+ /**
61
+ * Schema upgrade from version 2 to version 3: Add stats columns to projects table
62
+ */
63
+ exports.GLOBAL_SCHEMA_V3_SQL = `
64
+ -- Add task stats columns (for API/WebUI display without accessing project DBs)
65
+ ALTER TABLE projects ADD COLUMN pending_count INTEGER DEFAULT 0;
66
+ ALTER TABLE projects ADD COLUMN in_progress_count INTEGER DEFAULT 0;
67
+ ALTER TABLE projects ADD COLUMN review_count INTEGER DEFAULT 0;
68
+ ALTER TABLE projects ADD COLUMN completed_count INTEGER DEFAULT 0;
69
+ ALTER TABLE projects ADD COLUMN stats_updated_at TEXT;
70
+ `;
71
+ /**
72
+ * Schema upgrade from version 3 to version 4: Add section_id to runners table
73
+ */
74
+ exports.GLOBAL_SCHEMA_V4_SQL = `
75
+ -- Add section_id column to runners for section focus feature
76
+ ALTER TABLE runners ADD COLUMN section_id TEXT;
77
+ `;
78
+ /**
79
+ * Schema upgrade from version 4 to version 5: Add activity_log table
80
+ */
81
+ exports.GLOBAL_SCHEMA_V5_SQL = `
82
+ -- Activity log for tracking task completions across all projects
83
+ CREATE TABLE IF NOT EXISTS activity_log (
84
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
85
+ project_path TEXT NOT NULL,
86
+ runner_id TEXT NOT NULL,
87
+ task_id TEXT NOT NULL,
88
+ task_title TEXT NOT NULL,
89
+ section_name TEXT,
90
+ final_status TEXT NOT NULL,
91
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
92
+ );
93
+ CREATE INDEX IF NOT EXISTS idx_activity_log_created_at ON activity_log(created_at);
94
+ CREATE INDEX IF NOT EXISTS idx_activity_log_project ON activity_log(project_path);
95
+ `;
96
+ /**
97
+ * Schema upgrade from version 5 to version 6: Add commit_message to activity_log
98
+ */
99
+ exports.GLOBAL_SCHEMA_V6_SQL = `
100
+ -- Add commit_message column to activity_log for storing coder's final message
101
+ ALTER TABLE activity_log ADD COLUMN commit_message TEXT;
102
+ `;
103
+ /**
104
+ * Schema upgrade from version 6 to version 7: Add commit_sha to activity_log
105
+ */
106
+ exports.GLOBAL_SCHEMA_V7_SQL = `
107
+ -- Add commit_sha column to activity_log for GitHub links
108
+ ALTER TABLE activity_log ADD COLUMN commit_sha TEXT;
109
+ `;
110
+ /**
111
+ * Schema upgrade from version 7 to version 8: Add parallel session tracking
112
+ */
113
+ exports.GLOBAL_SCHEMA_V8_SQL = `
114
+ -- Parallel run sessions for independent workstreams
115
+ CREATE TABLE IF NOT EXISTS parallel_sessions (
116
+ id TEXT PRIMARY KEY,
117
+ project_path TEXT NOT NULL,
118
+ status TEXT NOT NULL CHECK (
119
+ status IN (
120
+ 'running',
121
+ 'merging',
122
+ 'cleanup_pending',
123
+ 'cleanup_draining',
124
+ 'blocked_conflict',
125
+ 'blocked_recovery',
126
+ 'blocked_validation',
127
+ 'completed',
128
+ 'failed',
129
+ 'aborted'
130
+ )
131
+ ),
132
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
133
+ completed_at TEXT
134
+ );
135
+
136
+ -- Workstreams within a parallel session
137
+ CREATE TABLE IF NOT EXISTS workstreams (
138
+ id TEXT PRIMARY KEY,
139
+ session_id TEXT NOT NULL REFERENCES parallel_sessions(id),
140
+ branch_name TEXT NOT NULL,
141
+ section_ids TEXT NOT NULL,
142
+ clone_path TEXT,
143
+ status TEXT NOT NULL CHECK (status IN ('running', 'completed', 'failed')),
144
+ runner_id TEXT,
145
+ completed_at TEXT,
146
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
147
+ );
148
+
149
+ -- Associate runners with a parallel session
150
+ ALTER TABLE runners ADD COLUMN parallel_session_id TEXT;
151
+ `;
152
+ /**
153
+ * Schema upgrade from version 8 to version 9: add project_repo_id and active-session guards.
154
+ */
155
+ exports.GLOBAL_SCHEMA_V9_INDEX_AND_TRIGGERS_SQL = `
156
+ CREATE INDEX IF NOT EXISTS idx_parallel_sessions_project_repo_id
157
+ ON parallel_sessions(project_repo_id);
158
+
159
+ CREATE TRIGGER IF NOT EXISTS trg_parallel_sessions_active_insert
160
+ BEFORE INSERT ON parallel_sessions
161
+ WHEN NEW.project_repo_id IS NOT NULL
162
+ AND NEW.status NOT IN ('completed', 'failed', 'aborted')
163
+ BEGIN
164
+ SELECT RAISE(ABORT, 'active parallel session already exists for project repo')
165
+ WHERE EXISTS (
166
+ SELECT 1
167
+ FROM parallel_sessions
168
+ WHERE project_repo_id = NEW.project_repo_id
169
+ AND status NOT IN ('completed', 'failed', 'aborted')
170
+ );
171
+ END;
172
+
173
+ CREATE TRIGGER IF NOT EXISTS trg_parallel_sessions_active_update
174
+ BEFORE UPDATE OF project_repo_id, status ON parallel_sessions
175
+ WHEN NEW.project_repo_id IS NOT NULL
176
+ AND NEW.status NOT IN ('completed', 'failed', 'aborted')
177
+ BEGIN
178
+ SELECT RAISE(ABORT, 'active parallel session already exists for project repo')
179
+ WHERE EXISTS (
180
+ SELECT 1
181
+ FROM parallel_sessions
182
+ WHERE project_repo_id = NEW.project_repo_id
183
+ AND status NOT IN ('completed', 'failed', 'aborted')
184
+ AND id != NEW.id
185
+ );
186
+ END;
187
+ `;
188
+ /**
189
+ * Schema upgrade from version 9 to version 10: add workstream lease fields.
190
+ */
191
+ exports.GLOBAL_SCHEMA_V10_SQL = `
192
+ CREATE INDEX IF NOT EXISTS idx_workstreams_session_status
193
+ ON workstreams(session_id, status);
194
+ `;
195
+ /**
196
+ * Schema upgrade from version 10 to version 11: add sealed merge input fields.
197
+ */
198
+ exports.GLOBAL_SCHEMA_V11_SQL = `
199
+ CREATE INDEX IF NOT EXISTS idx_workstreams_completion_order
200
+ ON workstreams(session_id, completion_order);
201
+ `;
202
+ /**
203
+ * Schema upgrade from version 11 to version 12: add reconciliation/backoff fields.
204
+ */
205
+ exports.GLOBAL_SCHEMA_V12_SQL = `
206
+ CREATE INDEX IF NOT EXISTS idx_workstreams_next_retry_at
207
+ ON workstreams(next_retry_at);
208
+ `;
209
+ /**
210
+ * Schema upgrade from version 13 to version 14: add conflict attempt tracking.
211
+ */
212
+ exports.GLOBAL_SCHEMA_V14_SQL = `
213
+ CREATE INDEX IF NOT EXISTS idx_workstreams_conflict_attempts
214
+ ON workstreams(conflict_attempts);
215
+ `;
216
+ /**
217
+ * Schema upgrade from version 14 to version 15: add validation escalation tracking.
218
+ */
219
+ exports.GLOBAL_SCHEMA_V15_SQL = `
220
+ CREATE TABLE IF NOT EXISTS validation_escalations (
221
+ id TEXT PRIMARY KEY,
222
+ session_id TEXT NOT NULL REFERENCES parallel_sessions(id),
223
+ project_path TEXT NOT NULL,
224
+ workspace_path TEXT NOT NULL,
225
+ validation_command TEXT NOT NULL,
226
+ error_message TEXT NOT NULL,
227
+ stdout_snippet TEXT,
228
+ stderr_snippet TEXT,
229
+ status TEXT NOT NULL DEFAULT 'open' CHECK(status IN ('open', 'resolved')),
230
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
231
+ resolved_at TEXT
232
+ );
233
+
234
+ CREATE INDEX IF NOT EXISTS idx_validation_escalations_session
235
+ ON validation_escalations(session_id, status, created_at DESC);
236
+ CREATE INDEX IF NOT EXISTS idx_validation_escalations_project
237
+ ON validation_escalations(project_path, status, created_at DESC);
238
+ `;
239
+ /**
240
+ * Schema upgrade from version 15 to version 16: add provider backoff coordination.
241
+ */
242
+ exports.GLOBAL_SCHEMA_V16_SQL = `
243
+ CREATE TABLE IF NOT EXISTS provider_backoffs (
244
+ provider TEXT PRIMARY KEY,
245
+ backoff_until_ms INTEGER NOT NULL,
246
+ retry_count INTEGER NOT NULL DEFAULT 0,
247
+ reason TEXT,
248
+ updated_at INTEGER NOT NULL
249
+ );
250
+ `;
251
+ exports.GLOBAL_SCHEMA_V17_SQL = `
252
+ -- Add hibernation fields to projects table
253
+ -- Note: These columns are deprecated in V18 but kept here for schema history.
254
+ ALTER TABLE projects ADD COLUMN hibernating_until TEXT;
255
+ ALTER TABLE projects ADD COLUMN hibernation_tier INTEGER DEFAULT 0;
256
+ `;
257
+ exports.GLOBAL_SCHEMA_V18_SQL = `
258
+ -- Drop project hibernation fields and add provider backoff reason_type
259
+ ALTER TABLE projects DROP COLUMN hibernating_until;
260
+ ALTER TABLE projects DROP COLUMN hibernation_tier;
261
+ ALTER TABLE provider_backoffs ADD COLUMN reason_type TEXT;
262
+ `;
263
+ exports.GLOBAL_SCHEMA_VERSION = '18';
264
+ function hasColumn(db, tableName, columnName) {
265
+ const columns = db
266
+ .prepare(`PRAGMA table_info(${tableName})`)
267
+ .all();
268
+ return columns.some((column) => column.name === columnName);
269
+ }
270
+ function supportsBlockedParallelSessionStatuses(db) {
271
+ const row = db
272
+ .prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'parallel_sessions'")
273
+ .get();
274
+ const sql = row?.sql ?? '';
275
+ return (sql.includes('blocked_conflict') &&
276
+ sql.includes('blocked_recovery') &&
277
+ sql.includes('blocked_validation') &&
278
+ sql.includes('aborted'));
279
+ }
280
+ function applyGlobalSchemaV9(db) {
281
+ if (!hasColumn(db, 'parallel_sessions', 'project_repo_id')) {
282
+ db.exec('ALTER TABLE parallel_sessions ADD COLUMN project_repo_id TEXT');
283
+ }
284
+ db.exec("UPDATE parallel_sessions SET project_repo_id = project_path WHERE project_repo_id IS NULL");
285
+ db.exec(exports.GLOBAL_SCHEMA_V9_INDEX_AND_TRIGGERS_SQL);
286
+ }
287
+ function applyGlobalSchemaV10(db) {
288
+ if (!hasColumn(db, 'workstreams', 'claim_generation')) {
289
+ db.exec('ALTER TABLE workstreams ADD COLUMN claim_generation INTEGER NOT NULL DEFAULT 0');
290
+ }
291
+ const leaseColumnMissing = !hasColumn(db, 'workstreams', 'lease_expires_at');
292
+ if (leaseColumnMissing) {
293
+ db.exec('ALTER TABLE workstreams ADD COLUMN lease_expires_at TEXT');
294
+ // Backfill only during the one-time schema upgrade that introduces lease_expires_at.
295
+ // Do NOT run this on every startup, or wakeup reconciliation cannot observe
296
+ // intentionally NULL/expired leases for stale workstreams.
297
+ db.exec("UPDATE workstreams SET lease_expires_at = datetime('now', '+120 seconds') " +
298
+ "WHERE lease_expires_at IS NULL AND status = 'running'");
299
+ }
300
+ db.exec(exports.GLOBAL_SCHEMA_V10_SQL);
301
+ }
302
+ function applyGlobalSchemaV11(db) {
303
+ if (!hasColumn(db, 'workstreams', 'sealed_base_sha')) {
304
+ db.exec('ALTER TABLE workstreams ADD COLUMN sealed_base_sha TEXT');
305
+ }
306
+ if (!hasColumn(db, 'workstreams', 'sealed_head_sha')) {
307
+ db.exec('ALTER TABLE workstreams ADD COLUMN sealed_head_sha TEXT');
308
+ }
309
+ if (!hasColumn(db, 'workstreams', 'sealed_commit_shas')) {
310
+ db.exec('ALTER TABLE workstreams ADD COLUMN sealed_commit_shas TEXT');
311
+ }
312
+ if (!hasColumn(db, 'workstreams', 'completion_order')) {
313
+ db.exec('ALTER TABLE workstreams ADD COLUMN completion_order INTEGER');
314
+ }
315
+ db.exec(exports.GLOBAL_SCHEMA_V11_SQL);
316
+ }
317
+ function applyGlobalSchemaV12(db) {
318
+ if (!hasColumn(db, 'workstreams', 'recovery_attempts')) {
319
+ db.exec('ALTER TABLE workstreams ADD COLUMN recovery_attempts INTEGER NOT NULL DEFAULT 0');
320
+ }
321
+ if (!hasColumn(db, 'workstreams', 'next_retry_at')) {
322
+ db.exec('ALTER TABLE workstreams ADD COLUMN next_retry_at TEXT');
323
+ }
324
+ if (!hasColumn(db, 'workstreams', 'last_reconcile_action')) {
325
+ db.exec('ALTER TABLE workstreams ADD COLUMN last_reconcile_action TEXT');
326
+ }
327
+ if (!hasColumn(db, 'workstreams', 'last_reconciled_at')) {
328
+ db.exec('ALTER TABLE workstreams ADD COLUMN last_reconciled_at TEXT');
329
+ }
330
+ db.exec(exports.GLOBAL_SCHEMA_V12_SQL);
331
+ }
332
+ function applyGlobalSchemaV13(db) {
333
+ if (supportsBlockedParallelSessionStatuses(db)) {
334
+ db.exec(exports.GLOBAL_SCHEMA_V9_INDEX_AND_TRIGGERS_SQL);
335
+ return;
336
+ }
337
+ db.exec('PRAGMA foreign_keys = OFF');
338
+ try {
339
+ db.exec('BEGIN IMMEDIATE');
340
+ try {
341
+ db.exec('DROP TABLE IF EXISTS parallel_sessions_new');
342
+ db.exec(`
343
+ CREATE TABLE IF NOT EXISTS parallel_sessions_new (
344
+ id TEXT PRIMARY KEY,
345
+ project_path TEXT NOT NULL,
346
+ project_repo_id TEXT,
347
+ status TEXT NOT NULL CHECK (
348
+ status IN (
349
+ 'running',
350
+ 'merging',
351
+ 'cleanup_pending',
352
+ 'cleanup_draining',
353
+ 'blocked_conflict',
354
+ 'blocked_recovery',
355
+ 'blocked_validation',
356
+ 'completed',
357
+ 'failed',
358
+ 'aborted'
359
+ )
360
+ ),
361
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
362
+ completed_at TEXT
363
+ );
364
+ `);
365
+ db.exec(`
366
+ INSERT INTO parallel_sessions_new (id, project_path, project_repo_id, status, created_at, completed_at)
367
+ SELECT
368
+ id,
369
+ project_path,
370
+ project_repo_id,
371
+ CASE
372
+ WHEN status IN (
373
+ 'running',
374
+ 'merging',
375
+ 'cleanup_pending',
376
+ 'cleanup_draining',
377
+ 'blocked_conflict',
378
+ 'blocked_recovery',
379
+ 'blocked_validation',
380
+ 'completed',
381
+ 'failed',
382
+ 'aborted'
383
+ ) THEN status
384
+ ELSE 'running'
385
+ END,
386
+ created_at,
387
+ completed_at
388
+ FROM parallel_sessions;
389
+ `);
390
+ db.exec('DROP TABLE parallel_sessions');
391
+ db.exec('ALTER TABLE parallel_sessions_new RENAME TO parallel_sessions');
392
+ db.exec('COMMIT');
393
+ }
394
+ catch (error) {
395
+ db.exec('ROLLBACK');
396
+ throw error;
397
+ }
398
+ }
399
+ finally {
400
+ db.exec('PRAGMA foreign_keys = ON');
401
+ }
402
+ db.exec(exports.GLOBAL_SCHEMA_V9_INDEX_AND_TRIGGERS_SQL);
403
+ }
404
+ function applyGlobalSchemaV14(db) {
405
+ if (!hasColumn(db, 'workstreams', 'conflict_attempts')) {
406
+ db.exec('ALTER TABLE workstreams ADD COLUMN conflict_attempts INTEGER NOT NULL DEFAULT 0');
407
+ }
408
+ db.exec(exports.GLOBAL_SCHEMA_V14_SQL);
409
+ }
410
+ function applyGlobalSchemaV15(db) {
411
+ db.exec(exports.GLOBAL_SCHEMA_V15_SQL);
412
+ }
413
+ function applyGlobalSchemaV16(db) {
414
+ db.exec(exports.GLOBAL_SCHEMA_V16_SQL);
415
+ }
416
+ function applyGlobalSchemaV17(db) {
417
+ if (!hasColumn(db, 'projects', 'hibernating_until')) {
418
+ db.exec(exports.GLOBAL_SCHEMA_V17_SQL);
419
+ }
420
+ }
421
+ function applyGlobalSchemaV18(db) {
422
+ if (!hasColumn(db, 'provider_backoffs', 'reason_type')) {
423
+ try {
424
+ db.exec(exports.GLOBAL_SCHEMA_V18_SQL);
425
+ }
426
+ catch (e) {
427
+ // Ignore DROP COLUMN errors if sqlite version is too old
428
+ console.warn('V18 schema partial application (sqlite may not support DROP COLUMN). Adding reason_type only.');
429
+ db.exec('ALTER TABLE provider_backoffs ADD COLUMN reason_type TEXT;');
430
+ }
431
+ }
432
+ }
433
+ //# sourceMappingURL=global-db-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-db-schema.js","sourceRoot":"","sources":["../../src/runners/global-db-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Parallel session and workstream management
3
+ */
4
+ export type ParallelSessionStatus = 'running' | 'merging' | 'cleanup_pending' | 'cleanup_draining' | 'blocked_conflict' | 'blocked_recovery' | 'blocked_validation' | 'completed' | 'failed' | 'aborted';
5
+ export interface ParallelSessionRunner {
6
+ id: string;
7
+ pid: number | null;
8
+ }
9
+ export declare function updateParallelSessionStatus(sessionId: string, status: ParallelSessionStatus, markCompletedAt?: boolean): void;
10
+ export declare function revokeWorkstreamLeasesForSession(sessionId: string): number;
11
+ export declare function listParallelSessionRunners(sessionId: string): ParallelSessionRunner[];
12
+ export declare function removeParallelSessionRunner(runnerId: string): void;
13
+ //# sourceMappingURL=global-db-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-db-sessions.d.ts","sourceRoot":"","sources":["../../src/runners/global-db-sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,SAAS,GACT,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,WAAW,GACX,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,qBAAqB,EAC7B,eAAe,UAAQ,GACtB,IAAI,CAoCN;AAED,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAU1E;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAMrF;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIlE"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * Parallel session and workstream management
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.updateParallelSessionStatus = updateParallelSessionStatus;
7
+ exports.revokeWorkstreamLeasesForSession = revokeWorkstreamLeasesForSession;
8
+ exports.listParallelSessionRunners = listParallelSessionRunners;
9
+ exports.removeParallelSessionRunner = removeParallelSessionRunner;
10
+ const global_db_connection_1 = require("./global-db-connection");
11
+ function updateParallelSessionStatus(sessionId, status, markCompletedAt = false) {
12
+ const terminalStatuses = ['completed', 'failed', 'aborted'];
13
+ (0, global_db_connection_1.withGlobalDatabase)((db) => {
14
+ db.prepare(`UPDATE parallel_sessions
15
+ SET status = ?,
16
+ completed_at = CASE
17
+ WHEN ? = 1 THEN datetime('now')
18
+ ELSE completed_at
19
+ END
20
+ WHERE id = ?`).run(status, markCompletedAt ? 1 : 0, sessionId);
21
+ // When transitioning to a terminal status, kill associated runner processes
22
+ // so they don't become ghost runners that block new session creation.
23
+ // Skip the calling process's own PID to avoid self-kill (the last-to-finish
24
+ // runner calls this during auto-merge).
25
+ if (terminalStatuses.includes(status)) {
26
+ const selfPid = process.pid;
27
+ const runners = db
28
+ .prepare(`SELECT id, pid FROM runners
29
+ WHERE parallel_session_id = ?
30
+ AND status != 'stopped'`)
31
+ .all(sessionId);
32
+ for (const runner of runners) {
33
+ if (runner.pid && runner.pid !== selfPid) {
34
+ try {
35
+ process.kill(runner.pid, 'SIGTERM');
36
+ }
37
+ catch { /* already dead */ }
38
+ }
39
+ db.prepare('DELETE FROM runners WHERE id = ?').run(runner.id);
40
+ }
41
+ }
42
+ });
43
+ }
44
+ function revokeWorkstreamLeasesForSession(sessionId) {
45
+ return (0, global_db_connection_1.withGlobalDatabase)((db) => {
46
+ const result = db.prepare(`UPDATE workstreams
47
+ SET runner_id = NULL,
48
+ lease_expires_at = datetime('now')
49
+ WHERE session_id = ?`).run(sessionId);
50
+ return result.changes;
51
+ });
52
+ }
53
+ function listParallelSessionRunners(sessionId) {
54
+ return (0, global_db_connection_1.withGlobalDatabase)((db) => {
55
+ return db
56
+ .prepare('SELECT id, pid FROM runners WHERE parallel_session_id = ?')
57
+ .all(sessionId);
58
+ });
59
+ }
60
+ function removeParallelSessionRunner(runnerId) {
61
+ (0, global_db_connection_1.withGlobalDatabase)((db) => {
62
+ db.prepare('DELETE FROM runners WHERE id = ?').run(runnerId);
63
+ });
64
+ }
65
+ //# sourceMappingURL=global-db-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-db-sessions.js","sourceRoot":"","sources":["../../src/runners/global-db-sessions.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAqBH,kEAwCC;AAED,4EAUC;AAED,gEAMC;AAED,kEAIC;AArFD,iEAA4D;AAmB5D,SAAgB,2BAA2B,CACzC,SAAiB,EACjB,MAA6B,EAC7B,eAAe,GAAG,KAAK;IAEvB,MAAM,gBAAgB,GAA4B,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAErF,IAAA,yCAAkB,EAAC,CAAC,EAAE,EAAE,EAAE;QACxB,EAAE,CAAC,OAAO,CACR;;;;;;oBAMc,CACf,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAElD,4EAA4E;QAC5E,sEAAsE;QACtE,4EAA4E;QAC5E,wCAAwC;QACxC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;YAC5B,MAAM,OAAO,GAAG,EAAE;iBACf,OAAO,CACN;;qCAE2B,CAC5B;iBACA,GAAG,CAAC,SAAS,CAA8C,CAAC;YAE/D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;oBACzC,IAAI,CAAC;wBAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBAC3E,CAAC;gBACD,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,gCAAgC,CAAC,SAAiB;IAChE,OAAO,IAAA,yCAAkB,EAAC,CAAC,EAAE,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;;;4BAGsB,CACvB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjB,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,0BAA0B,CAAC,SAAiB;IAC1D,OAAO,IAAA,yCAAkB,EAAC,CAAC,EAAE,EAAE,EAAE;QAC/B,OAAO,EAAE;aACN,OAAO,CAAC,2DAA2D,CAAC;aACpE,GAAG,CAAC,SAAS,CAA4B,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,2BAA2B,CAAC,QAAgB;IAC1D,IAAA,yCAAkB,EAAC,CAAC,EAAE,EAAE,EAAE;QACxB,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Validation escalation tracking
3
+ */
4
+ export interface ValidationEscalationRecord {
5
+ id: string;
6
+ session_id: string;
7
+ project_path: string;
8
+ workspace_path: string;
9
+ validation_command: string;
10
+ error_message: string;
11
+ stdout_snippet: string | null;
12
+ stderr_snippet: string | null;
13
+ status: 'open' | 'resolved';
14
+ created_at: string;
15
+ resolved_at: string | null;
16
+ }
17
+ export declare function recordValidationEscalation(input: {
18
+ sessionId: string;
19
+ projectPath: string;
20
+ workspacePath: string;
21
+ validationCommand: string;
22
+ errorMessage: string;
23
+ stdoutSnippet?: string | null;
24
+ stderrSnippet?: string | null;
25
+ }): ValidationEscalationRecord;
26
+ export declare function resolveValidationEscalationsForSession(sessionId: string): number;
27
+ //# sourceMappingURL=global-db-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-db-validation.d.ts","sourceRoot":"","sources":["../../src/runners/global-db-validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GAAG,0BAA0B,CAqC7B;AAED,wBAAgB,sCAAsC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAYhF"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ /**
3
+ * Validation escalation tracking
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.recordValidationEscalation = recordValidationEscalation;
7
+ exports.resolveValidationEscalationsForSession = resolveValidationEscalationsForSession;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const global_db_connection_1 = require("./global-db-connection");
10
+ function recordValidationEscalation(input) {
11
+ const { db, close } = (0, global_db_connection_1.openGlobalDatabase)();
12
+ const id = (0, node_crypto_1.randomUUID)();
13
+ try {
14
+ db.prepare(`INSERT INTO validation_escalations (
15
+ id, session_id, project_path, workspace_path, validation_command,
16
+ error_message, stdout_snippet, stderr_snippet, status
17
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'open')`).run(id, input.sessionId, input.projectPath, input.workspacePath, input.validationCommand, input.errorMessage, input.stdoutSnippet ?? null, input.stderrSnippet ?? null);
18
+ const row = db
19
+ .prepare(`SELECT id, session_id, project_path, workspace_path, validation_command,
20
+ error_message, stdout_snippet, stderr_snippet, status, created_at, resolved_at
21
+ FROM validation_escalations
22
+ WHERE id = ?`)
23
+ .get(id);
24
+ if (!row) {
25
+ throw new Error(`Failed to read validation escalation record for id ${id}`);
26
+ }
27
+ return row;
28
+ }
29
+ finally {
30
+ close();
31
+ }
32
+ }
33
+ function resolveValidationEscalationsForSession(sessionId) {
34
+ return (0, global_db_connection_1.withGlobalDatabase)((db) => {
35
+ const result = db.prepare(`UPDATE validation_escalations
36
+ SET status = 'resolved',
37
+ resolved_at = datetime('now')
38
+ WHERE session_id = ?
39
+ AND status = 'open'`).run(sessionId);
40
+ return result.changes;
41
+ });
42
+ }
43
+ //# sourceMappingURL=global-db-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-db-validation.js","sourceRoot":"","sources":["../../src/runners/global-db-validation.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAmBH,gEA6CC;AAED,wFAYC;AA5ED,6CAAyC;AACzC,iEAAgF;AAgBhF,SAAgB,0BAA0B,CAAC,KAQ1C;IACC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,yCAAkB,GAAE,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAA,wBAAU,GAAE,CAAC;IACxB,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CACR;;;iDAG2C,CAC5C,CAAC,GAAG,CACH,EAAE,EACF,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,IAAI,IAAI,EAC3B,KAAK,CAAC,aAAa,IAAI,IAAI,CAC5B,CAAC;QAEF,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CACN;;;sBAGc,CACf;aACA,GAAG,CAAC,EAAE,CAA2C,CAAC;QAErD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,sDAAsD,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED,SAAgB,sCAAsC,CAAC,SAAiB;IACtE,OAAO,IAAA,yCAAkB,EAAC,CAAC,EAAE,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;;;;6BAIuB,CACxB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEjB,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC"}