omp-conductor 0.14.0 → 0.15.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omp-conductor",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "A 24/7 dispatcher that takes ready GitHub issues to green, mergeable PRs using omp coding sessions, with tiered escalation first to an orchestrator session and then to a human.",
@@ -9,10 +9,9 @@
9
9
  "url": "git+https://github.com/TerrifiedBug/conductor.git",
10
10
  "directory": "omp"
11
11
  },
12
- "main": "./src/plugin.ts",
12
+ "main": "./src/orchestrator-tick.ts",
13
13
  "omp": {
14
14
  "extensions": [
15
- "./src/plugin.ts",
16
15
  "./src/orchestrator-tick.ts"
17
16
  ]
18
17
  },
@@ -22,14 +21,18 @@
22
21
  "files": [
23
22
  "src",
24
23
  "!src/**/*.test.ts",
25
- "skills",
26
24
  "systemd",
25
+ "schema",
27
26
  "README.md",
28
27
  "LICENSE"
29
28
  ],
30
29
  "scripts": {
31
30
  "check": "tsc --noEmit",
32
- "test": "bun test"
31
+ "test": "bun test",
32
+ "schema": "bun run src/generate-schema.ts"
33
+ },
34
+ "dependencies": {
35
+ "zod": "^4"
33
36
  },
34
37
  "peerDependencies": {
35
38
  "@oh-my-pi/pi-coding-agent": ">=17.1.4"
@@ -0,0 +1,609 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "$schema": {
6
+ "description": "Path to the shipped config.schema.json",
7
+ "type": "string"
8
+ },
9
+ "version": {
10
+ "type": "number",
11
+ "description": "The config format version (1 or 2)"
12
+ },
13
+ "defaults": {
14
+ "type": "object",
15
+ "properties": {
16
+ "maxConcurrentWorkers": {
17
+ "type": "number",
18
+ "minimum": 0,
19
+ "description": "Parallel omp sessions (default 2)"
20
+ },
21
+ "maxConcurrentWorkersPerRepo": {
22
+ "type": "number",
23
+ "minimum": 0,
24
+ "description": "Max live workers per repository (default 1)"
25
+ },
26
+ "dailySpendUsd": {
27
+ "anyOf": [
28
+ {
29
+ "type": "number",
30
+ "minimum": 0
31
+ },
32
+ {
33
+ "type": "null"
34
+ }
35
+ ],
36
+ "description": "Rolling-day spend ceiling; null means no spend gate (default 25)"
37
+ },
38
+ "planUsage": {
39
+ "anyOf": [
40
+ {
41
+ "type": "object",
42
+ "properties": {
43
+ "windowId": {
44
+ "type": "string",
45
+ "minLength": 1,
46
+ "description": "The allowance window this threshold guards"
47
+ },
48
+ "maxUsedFraction": {
49
+ "type": "number",
50
+ "minimum": 0,
51
+ "maximum": 1,
52
+ "description": "Consumed share, 0–1, at which new claims stop"
53
+ }
54
+ },
55
+ "required": [
56
+ "windowId",
57
+ "maxUsedFraction"
58
+ ],
59
+ "additionalProperties": false,
60
+ "description": "An allowance-window spend guard, or null for unmetered"
61
+ },
62
+ {
63
+ "type": "null"
64
+ }
65
+ ],
66
+ "description": "Plan-allowance guard, or null for unmetered"
67
+ },
68
+ "workerMaxTurns": {
69
+ "type": "number",
70
+ "minimum": 0,
71
+ "description": "Turn ceiling for one worker (default 120)"
72
+ },
73
+ "workerMaxTurnsCeiling": {
74
+ "type": "number",
75
+ "minimum": 0,
76
+ "description": "Maximum turn budget assignable to one issue's next attempt"
77
+ },
78
+ "workerWallClockMs": {
79
+ "type": "number",
80
+ "minimum": 0,
81
+ "description": "Wall-clock ceiling for one worker (default 5400000)"
82
+ },
83
+ "maxAttemptsPerIssue": {
84
+ "type": "number",
85
+ "minimum": 0,
86
+ "description": "Failed attempts allowed before escalation (default 2)"
87
+ },
88
+ "maxContinuationsPerIssue": {
89
+ "type": "number",
90
+ "minimum": 0,
91
+ "description": "Operational continuations allowed before crash/resume escalation (default 2)"
92
+ }
93
+ },
94
+ "additionalProperties": {},
95
+ "description": "Per-fleet or per-project hard limits"
96
+ },
97
+ "projects": {
98
+ "minItems": 1,
99
+ "type": "array",
100
+ "items": {
101
+ "type": "object",
102
+ "properties": {
103
+ "name": {
104
+ "type": "string",
105
+ "minLength": 1
106
+ },
107
+ "tracker": {
108
+ "type": "object",
109
+ "properties": {
110
+ "kind": {
111
+ "type": "string",
112
+ "const": "github"
113
+ },
114
+ "repo": {
115
+ "type": "string",
116
+ "pattern": "^[A-Za-z0-9._-]+\\/[A-Za-z0-9._-]+$"
117
+ }
118
+ },
119
+ "required": [
120
+ "repo"
121
+ ],
122
+ "additionalProperties": false
123
+ },
124
+ "queueLabel": {
125
+ "type": "string",
126
+ "minLength": 1
127
+ },
128
+ "groomBelow": {},
129
+ "stateLabels": {
130
+ "type": "object",
131
+ "properties": {
132
+ "inProgress": {},
133
+ "blocked": {},
134
+ "failed": {}
135
+ },
136
+ "additionalProperties": false
137
+ },
138
+ "routing": {
139
+ "type": "object",
140
+ "properties": {
141
+ "labelPrefix": {},
142
+ "repos": {
143
+ "type": "object",
144
+ "propertyNames": {
145
+ "type": "string"
146
+ },
147
+ "additionalProperties": {
148
+ "type": "object",
149
+ "properties": {
150
+ "name": {},
151
+ "cloneUrl": {
152
+ "type": "string",
153
+ "minLength": 1
154
+ },
155
+ "defaultBranch": {
156
+ "default": "main"
157
+ },
158
+ "gates": {
159
+ "type": "array",
160
+ "items": {
161
+ "type": "object",
162
+ "properties": {
163
+ "cmd": {
164
+ "type": "string"
165
+ },
166
+ "cwd": {
167
+ "default": "."
168
+ }
169
+ },
170
+ "required": [
171
+ "cwd"
172
+ ],
173
+ "additionalProperties": false
174
+ }
175
+ },
176
+ "graphProject": {
177
+ "type": "string"
178
+ },
179
+ "migrations": {
180
+ "type": "object",
181
+ "properties": {
182
+ "dir": {
183
+ "type": "string",
184
+ "minLength": 1
185
+ }
186
+ },
187
+ "required": [
188
+ "dir"
189
+ ],
190
+ "additionalProperties": false
191
+ }
192
+ },
193
+ "required": [
194
+ "cloneUrl"
195
+ ],
196
+ "additionalProperties": false
197
+ }
198
+ }
199
+ },
200
+ "required": [
201
+ "repos"
202
+ ],
203
+ "additionalProperties": false
204
+ },
205
+ "caps": {
206
+ "type": "object",
207
+ "properties": {
208
+ "maxConcurrentWorkers": {
209
+ "type": "number",
210
+ "minimum": 0,
211
+ "description": "Parallel omp sessions (default 2)"
212
+ },
213
+ "maxConcurrentWorkersPerRepo": {
214
+ "type": "number",
215
+ "minimum": 0,
216
+ "description": "Max live workers per repository (default 1)"
217
+ },
218
+ "dailySpendUsd": {
219
+ "anyOf": [
220
+ {
221
+ "type": "number",
222
+ "minimum": 0
223
+ },
224
+ {
225
+ "type": "null"
226
+ }
227
+ ],
228
+ "description": "Rolling-day spend ceiling; null means no spend gate (default 25)"
229
+ },
230
+ "planUsage": {
231
+ "anyOf": [
232
+ {
233
+ "type": "object",
234
+ "properties": {
235
+ "windowId": {
236
+ "type": "string",
237
+ "minLength": 1,
238
+ "description": "The allowance window this threshold guards"
239
+ },
240
+ "maxUsedFraction": {
241
+ "type": "number",
242
+ "minimum": 0,
243
+ "maximum": 1,
244
+ "description": "Consumed share, 0–1, at which new claims stop"
245
+ }
246
+ },
247
+ "required": [
248
+ "windowId",
249
+ "maxUsedFraction"
250
+ ],
251
+ "additionalProperties": false,
252
+ "description": "An allowance-window spend guard, or null for unmetered"
253
+ },
254
+ {
255
+ "type": "null"
256
+ }
257
+ ],
258
+ "description": "Plan-allowance guard, or null for unmetered"
259
+ },
260
+ "workerMaxTurns": {
261
+ "type": "number",
262
+ "minimum": 0,
263
+ "description": "Turn ceiling for one worker (default 120)"
264
+ },
265
+ "workerMaxTurnsCeiling": {
266
+ "type": "number",
267
+ "minimum": 0,
268
+ "description": "Maximum turn budget assignable to one issue's next attempt"
269
+ },
270
+ "workerWallClockMs": {
271
+ "type": "number",
272
+ "minimum": 0,
273
+ "description": "Wall-clock ceiling for one worker (default 5400000)"
274
+ },
275
+ "maxAttemptsPerIssue": {
276
+ "type": "number",
277
+ "minimum": 0,
278
+ "description": "Failed attempts allowed before escalation (default 2)"
279
+ },
280
+ "maxContinuationsPerIssue": {
281
+ "type": "number",
282
+ "minimum": 0,
283
+ "description": "Operational continuations allowed before crash/resume escalation (default 2)"
284
+ }
285
+ },
286
+ "additionalProperties": {},
287
+ "description": "Per-fleet or per-project hard limits"
288
+ },
289
+ "workerModel": {},
290
+ "escalation": {
291
+ "type": "object",
292
+ "properties": {
293
+ "telegramChatId": {},
294
+ "telegramTopicId": {},
295
+ "fallbackToIssueComment": {
296
+ "default": true
297
+ },
298
+ "orchestrator": {
299
+ "default": "embedded",
300
+ "type": "string",
301
+ "enum": [
302
+ "embedded",
303
+ "external"
304
+ ]
305
+ }
306
+ },
307
+ "required": [
308
+ "fallbackToIssueComment",
309
+ "orchestrator"
310
+ ],
311
+ "additionalProperties": false
312
+ },
313
+ "authority": {
314
+ "type": "object",
315
+ "properties": {
316
+ "merge": {
317
+ "default": "human",
318
+ "type": "string",
319
+ "enum": [
320
+ "human",
321
+ "orchestrator"
322
+ ]
323
+ },
324
+ "release": {
325
+ "default": "human",
326
+ "type": "string",
327
+ "enum": [
328
+ "human",
329
+ "orchestrator"
330
+ ]
331
+ }
332
+ },
333
+ "required": [
334
+ "merge",
335
+ "release"
336
+ ],
337
+ "additionalProperties": false
338
+ },
339
+ "releasePolicy": {
340
+ "anyOf": [
341
+ {
342
+ "type": "string",
343
+ "enum": [
344
+ "none",
345
+ "operator-brief"
346
+ ]
347
+ },
348
+ {
349
+ "type": "object",
350
+ "propertyNames": {
351
+ "type": "string"
352
+ },
353
+ "additionalProperties": {
354
+ "type": "string",
355
+ "enum": [
356
+ "human",
357
+ "orchestrator"
358
+ ]
359
+ }
360
+ }
361
+ ]
362
+ },
363
+ "policy": {
364
+ "type": "object",
365
+ "properties": {
366
+ "merge": {
367
+ "type": "object",
368
+ "properties": {
369
+ "requiredChecks": {
370
+ "default": [],
371
+ "type": "array",
372
+ "items": {
373
+ "type": "string",
374
+ "minLength": 1
375
+ }
376
+ },
377
+ "baseFreshness": {
378
+ "default": "up-to-date",
379
+ "type": "string",
380
+ "enum": [
381
+ "up-to-date",
382
+ "any"
383
+ ]
384
+ },
385
+ "drafts": {
386
+ "default": "block",
387
+ "type": "string",
388
+ "enum": [
389
+ "block",
390
+ "allow"
391
+ ]
392
+ },
393
+ "whenBehindBase": {
394
+ "default": "update-branch",
395
+ "type": "string",
396
+ "enum": [
397
+ "update-branch",
398
+ "hold",
399
+ "escalate"
400
+ ]
401
+ }
402
+ },
403
+ "required": [
404
+ "requiredChecks",
405
+ "baseFreshness",
406
+ "drafts",
407
+ "whenBehindBase"
408
+ ],
409
+ "additionalProperties": false
410
+ },
411
+ "release": {
412
+ "type": "object",
413
+ "properties": {
414
+ "requires": {
415
+ "default": [
416
+ "runs-settled"
417
+ ],
418
+ "type": "array",
419
+ "items": {
420
+ "type": "string",
421
+ "enum": [
422
+ "runs-settled",
423
+ "no-open-prs",
424
+ "queue-drained",
425
+ "base-branch-green",
426
+ "epic-children-closed"
427
+ ]
428
+ }
429
+ },
430
+ "requiredChecks": {
431
+ "default": [],
432
+ "type": "array",
433
+ "items": {
434
+ "type": "string",
435
+ "minLength": 1
436
+ }
437
+ },
438
+ "artefacts": {
439
+ "default": [],
440
+ "type": "array",
441
+ "items": {
442
+ "type": "string",
443
+ "minLength": 1
444
+ }
445
+ },
446
+ "environments": {
447
+ "default": [],
448
+ "type": "array",
449
+ "items": {
450
+ "type": "string",
451
+ "minLength": 1
452
+ }
453
+ }
454
+ },
455
+ "required": [
456
+ "requires",
457
+ "requiredChecks",
458
+ "artefacts",
459
+ "environments"
460
+ ],
461
+ "additionalProperties": false
462
+ }
463
+ },
464
+ "additionalProperties": false
465
+ },
466
+ "reporting": {
467
+ "type": "object",
468
+ "properties": {
469
+ "scope": {
470
+ "description": "Legacy reporting preset; mutually exclusive with the explicit form",
471
+ "type": "string",
472
+ "enum": [
473
+ "escalations",
474
+ "decisions",
475
+ "material"
476
+ ]
477
+ },
478
+ "scopePreset": {
479
+ "description": "Back-annotation of the legacy preset this policy came from",
480
+ "type": "string",
481
+ "enum": [
482
+ "escalations",
483
+ "decisions",
484
+ "material"
485
+ ]
486
+ },
487
+ "interruptOn": {
488
+ "description": "Which categories interrupt the operator's phone",
489
+ "type": "array",
490
+ "items": {
491
+ "type": "string",
492
+ "enum": [
493
+ "tier2",
494
+ "decision-needed",
495
+ "fleet-stopped",
496
+ "confirmed-failure",
497
+ "material"
498
+ ]
499
+ }
500
+ },
501
+ "digest": {
502
+ "type": "object",
503
+ "properties": {
504
+ "cadence": {
505
+ "type": "string",
506
+ "enum": [
507
+ "none",
508
+ "per-tick",
509
+ "daily"
510
+ ],
511
+ "description": "When the daily/report rollup is due"
512
+ },
513
+ "at": {
514
+ "description": "Daily rollup time",
515
+ "type": "string",
516
+ "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
517
+ },
518
+ "timezone": {
519
+ "type": "string",
520
+ "description": "IANA timezone of the daily rollup"
521
+ }
522
+ },
523
+ "required": [
524
+ "cadence"
525
+ ],
526
+ "additionalProperties": false,
527
+ "description": "The reporting digest/rollup schedule"
528
+ },
529
+ "availability": {
530
+ "type": "object",
531
+ "properties": {
532
+ "timezone": {
533
+ "type": "string",
534
+ "minLength": 1,
535
+ "description": "IANA timezone of the window"
536
+ },
537
+ "days": {
538
+ "minItems": 1,
539
+ "type": "array",
540
+ "items": {
541
+ "type": "string",
542
+ "enum": [
543
+ "mon",
544
+ "tue",
545
+ "wed",
546
+ "thu",
547
+ "fri",
548
+ "sat",
549
+ "sun"
550
+ ]
551
+ },
552
+ "description": "Days the window is open"
553
+ },
554
+ "start": {
555
+ "type": "string",
556
+ "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
557
+ "description": "Window open time, operator-local"
558
+ },
559
+ "end": {
560
+ "type": "string",
561
+ "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
562
+ "description": "Window close time, operator-local"
563
+ },
564
+ "bypass": {
565
+ "type": "array",
566
+ "items": {
567
+ "type": "string",
568
+ "enum": [
569
+ "tier2",
570
+ "decision-needed",
571
+ "fleet-stopped",
572
+ "confirmed-failure",
573
+ "material"
574
+ ]
575
+ },
576
+ "description": "Categories that may interrupt outside the window"
577
+ }
578
+ },
579
+ "required": [
580
+ "timezone",
581
+ "days",
582
+ "start",
583
+ "end"
584
+ ],
585
+ "additionalProperties": false
586
+ }
587
+ },
588
+ "additionalProperties": false
589
+ },
590
+ "workspaceRoot": {},
591
+ "mirrorRoot": {}
592
+ },
593
+ "required": [
594
+ "name",
595
+ "tracker",
596
+ "queueLabel"
597
+ ],
598
+ "additionalProperties": {},
599
+ "description": "One product this conductor services"
600
+ }
601
+ }
602
+ },
603
+ "required": [
604
+ "version",
605
+ "projects"
606
+ ],
607
+ "additionalProperties": {},
608
+ "description": "On-disk configuration for omp-conductor"
609
+ }