bosun 0.41.0 → 0.41.2

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 (64) hide show
  1. package/.env.example +8 -0
  2. package/README.md +20 -0
  3. package/agent/agent-event-bus.mjs +248 -6
  4. package/agent/agent-pool.mjs +125 -28
  5. package/agent/agent-work-analyzer.mjs +8 -16
  6. package/agent/retry-queue.mjs +164 -0
  7. package/bosun.config.example.json +25 -0
  8. package/bosun.schema.json +825 -183
  9. package/cli.mjs +59 -5
  10. package/config/config.mjs +130 -3
  11. package/infra/monitor.mjs +693 -67
  12. package/infra/runtime-accumulator.mjs +376 -84
  13. package/infra/session-tracker.mjs +82 -25
  14. package/lib/codebase-audit.mjs +133 -18
  15. package/package.json +23 -4
  16. package/server/setup-web-server.mjs +25 -0
  17. package/server/ui-server.mjs +248 -29
  18. package/setup.mjs +27 -24
  19. package/shell/codex-shell.mjs +34 -3
  20. package/shell/copilot-shell.mjs +50 -8
  21. package/task/msg-hub.mjs +193 -0
  22. package/task/pipeline.mjs +544 -0
  23. package/task/task-cli.mjs +38 -2
  24. package/task/task-executor-pipeline.mjs +143 -0
  25. package/task/task-executor.mjs +36 -27
  26. package/telegram/get-telegram-chat-id.mjs +57 -47
  27. package/ui/components/workspace-switcher.js +7 -7
  28. package/ui/demo-defaults.js +15694 -10573
  29. package/ui/modules/settings-schema.js +2 -0
  30. package/ui/modules/state.js +54 -57
  31. package/ui/modules/voice-client-sdk.js +375 -36
  32. package/ui/modules/voice-client.js +140 -31
  33. package/ui/setup.html +68 -2
  34. package/ui/styles/components.css +57 -0
  35. package/ui/styles.css +201 -1
  36. package/ui/tabs/dashboard.js +74 -0
  37. package/ui/tabs/logs.js +10 -0
  38. package/ui/tabs/settings.js +178 -99
  39. package/ui/tabs/tasks.js +31 -1
  40. package/ui/tabs/telemetry.js +34 -0
  41. package/ui/tabs/workflow-canvas-utils.mjs +8 -1
  42. package/ui/tabs/workflows.js +532 -275
  43. package/voice/voice-agents-sdk.mjs +1 -1
  44. package/voice/voice-relay.mjs +6 -6
  45. package/workflow/declarative-workflows.mjs +145 -0
  46. package/workflow/msg-hub.mjs +237 -0
  47. package/workflow/pipeline-workflows.mjs +287 -0
  48. package/workflow/pipeline.mjs +828 -315
  49. package/workflow/workflow-cli.mjs +128 -0
  50. package/workflow/workflow-engine.mjs +329 -17
  51. package/workflow/workflow-nodes/custom-loader.mjs +250 -0
  52. package/workflow/workflow-nodes.mjs +1955 -223
  53. package/workflow/workflow-templates.mjs +26 -8
  54. package/workflow-templates/agents.mjs +0 -1
  55. package/workflow-templates/bosun-native.mjs +212 -2
  56. package/workflow-templates/continuation-loop.mjs +339 -0
  57. package/workflow-templates/github.mjs +516 -40
  58. package/workflow-templates/planning.mjs +446 -17
  59. package/workflow-templates/reliability.mjs +65 -12
  60. package/workflow-templates/task-batch.mjs +24 -8
  61. package/workflow-templates/task-lifecycle.mjs +83 -6
  62. package/workspace/context-cache.mjs +66 -18
  63. package/workspace/workspace-manager.mjs +2 -1
  64. package/workflow-templates/issue-continuation.mjs +0 -243
package/bosun.schema.json CHANGED
@@ -4,15 +4,28 @@
4
4
  "type": "object",
5
5
  "additionalProperties": true,
6
6
  "properties": {
7
- "$schema": { "type": "string" },
8
- "projectName": { "type": "string" },
7
+ "$schema": {
8
+ "type": "string"
9
+ },
10
+ "projectName": {
11
+ "type": "string"
12
+ },
9
13
  "mode": {
10
14
  "type": "string",
11
- "enum": ["virtengine", "generic"]
15
+ "enum": [
16
+ "virtengine",
17
+ "generic"
18
+ ]
19
+ },
20
+ "orchestratorScript": {
21
+ "type": "string"
22
+ },
23
+ "orchestratorArgs": {
24
+ "type": "string"
25
+ },
26
+ "logDir": {
27
+ "type": "string"
12
28
  },
13
- "orchestratorScript": { "type": "string" },
14
- "orchestratorArgs": { "type": "string" },
15
- "logDir": { "type": "string" },
16
29
  "logMaxSizeMb": {
17
30
  "type": "number",
18
31
  "description": "Max total log folder size in MB. 0 = unlimited.",
@@ -25,14 +38,26 @@
25
38
  },
26
39
  "telegramVerbosity": {
27
40
  "type": "string",
28
- "enum": ["minimal", "summary", "detailed"],
41
+ "enum": [
42
+ "minimal",
43
+ "summary",
44
+ "detailed"
45
+ ],
29
46
  "description": "Notification verbosity: minimal (critical+error), summary (default), detailed (everything)",
30
47
  "default": "summary"
31
48
  },
32
- "watchPath": { "type": "string" },
33
- "watchEnabled": { "type": "boolean" },
34
- "echoLogs": { "type": "boolean" },
35
- "autoFixEnabled": { "type": "boolean" },
49
+ "watchPath": {
50
+ "type": "string"
51
+ },
52
+ "watchEnabled": {
53
+ "type": "boolean"
54
+ },
55
+ "echoLogs": {
56
+ "type": "boolean"
57
+ },
58
+ "autoFixEnabled": {
59
+ "type": "boolean"
60
+ },
36
61
  "workflowFirst": {
37
62
  "type": "boolean",
38
63
  "default": false,
@@ -43,6 +68,71 @@
43
68
  "default": false,
44
69
  "description": "Delegate task finalization and recovery to workflow automation instead of the legacy TaskExecutor. Automatically set to true when workflowFirst is enabled."
45
70
  },
71
+ "workflowDefaults": {
72
+ "type": "object",
73
+ "additionalProperties": true,
74
+ "properties": {
75
+ "profile": {
76
+ "type": "string",
77
+ "description": "Default workflow setup profile (for example: balanced, autonomous, workflowFirst)."
78
+ },
79
+ "autoInstall": {
80
+ "type": "boolean",
81
+ "description": "Automatically install requested templates on startup."
82
+ },
83
+ "templates": {
84
+ "oneOf": [
85
+ { "type": "array", "items": { "type": "string" } },
86
+ { "type": "string" }
87
+ ],
88
+ "description": "Explicit template IDs to install/enable."
89
+ },
90
+ "templateOverridesById": {
91
+ "type": "object",
92
+ "additionalProperties": { "type": "object" },
93
+ "description": "Template variable overrides keyed by template id."
94
+ }
95
+ }
96
+ },
97
+ "workflows": {
98
+ "type": "array",
99
+ "description": "Opt-in typed workflow templates that resolve to built-in workflow definitions.",
100
+ "items": {
101
+ "type": "object",
102
+ "additionalProperties": true,
103
+ "properties": {
104
+ "type": {
105
+ "type": "string",
106
+ "enum": ["continuation-loop"]
107
+ },
108
+ "enabled": { "type": "boolean" },
109
+ "name": { "type": "string" },
110
+ "taskId": { "type": "string" },
111
+ "worktreePath": { "type": "string" },
112
+ "pollIntervalMs": { "type": "number" },
113
+ "maxTurns": { "type": "number" },
114
+ "terminalStates": {
115
+ "oneOf": [
116
+ { "type": "array", "items": { "type": "string" } },
117
+ { "type": "string" }
118
+ ]
119
+ },
120
+ "stuckThresholdMs": { "type": "number" },
121
+ "onStuck": { "type": "string", "enum": ["retry", "escalate", "pause"] },
122
+ "continuePrompt": { "type": "string" },
123
+ "retryPrompt": { "type": "string" },
124
+ "sdk": { "type": "string" },
125
+ "model": { "type": "string" },
126
+ "timeoutMs": { "type": "number" },
127
+ "options": {
128
+ "type": "object",
129
+ "additionalProperties": true,
130
+ "description": "Additional template variable overrides for this typed workflow entry."
131
+ }
132
+ },
133
+ "required": ["type"]
134
+ }
135
+ },
46
136
  "interactiveShellEnabled": { "type": "boolean" },
47
137
  "shellEnabled": { "type": "boolean" },
48
138
  "codexEnabled": { "type": "boolean" },
@@ -58,7 +148,13 @@
58
148
  },
59
149
  "telegramUiTunnel": {
60
150
  "type": "string",
61
- "enum": ["named", "quick", "auto", "cloudflared", "disabled"],
151
+ "enum": [
152
+ "named",
153
+ "quick",
154
+ "auto",
155
+ "cloudflared",
156
+ "disabled"
157
+ ],
62
158
  "default": "named",
63
159
  "description": "Mini App tunnel mode. named is the default permanent hostname mode."
64
160
  },
@@ -85,7 +181,10 @@
85
181
  },
86
182
  "cloudflareUsernameHostnamePolicy": {
87
183
  "type": "string",
88
- "enum": ["per-user-fixed", "fixed"],
184
+ "enum": [
185
+ "per-user-fixed",
186
+ "fixed"
187
+ ],
89
188
  "default": "per-user-fixed",
90
189
  "description": "Policy for deriving named tunnel hostname from workstation identity."
91
190
  },
@@ -159,7 +258,14 @@
159
258
  },
160
259
  "provider": {
161
260
  "type": "string",
162
- "enum": ["openai", "azure", "claude", "gemini", "fallback", "auto"],
261
+ "enum": [
262
+ "openai",
263
+ "azure",
264
+ "claude",
265
+ "gemini",
266
+ "fallback",
267
+ "auto"
268
+ ],
163
269
  "default": "auto",
164
270
  "description": "Voice provider: openai/azure (Tier 1 realtime), claude/gemini (Tier 2 voice + provider vision), fallback (browser STT/TTS), auto (detect from env)"
165
271
  },
@@ -170,7 +276,13 @@
170
276
  "anyOf": [
171
277
  {
172
278
  "type": "string",
173
- "enum": ["openai", "azure", "claude", "gemini", "fallback"]
279
+ "enum": [
280
+ "openai",
281
+ "azure",
282
+ "claude",
283
+ "gemini",
284
+ "fallback"
285
+ ]
174
286
  },
175
287
  {
176
288
  "type": "object",
@@ -178,10 +290,20 @@
178
290
  "properties": {
179
291
  "provider": {
180
292
  "type": "string",
181
- "enum": ["openai", "azure", "claude", "gemini", "fallback"]
293
+ "enum": [
294
+ "openai",
295
+ "azure",
296
+ "claude",
297
+ "gemini",
298
+ "fallback"
299
+ ]
300
+ },
301
+ "model": {
302
+ "type": "string"
303
+ },
304
+ "visionModel": {
305
+ "type": "string"
182
306
  },
183
- "model": { "type": "string" },
184
- "visionModel": { "type": "string" },
185
307
  "voiceId": {
186
308
  "type": "string",
187
309
  "enum": [
@@ -198,13 +320,17 @@
198
320
  "verse"
199
321
  ]
200
322
  },
201
- "azureDeployment": { "type": "string" },
323
+ "azureDeployment": {
324
+ "type": "string"
325
+ },
202
326
  "endpointId": {
203
327
  "type": "string",
204
328
  "description": "ID of the voice endpoint to use for this provider slot"
205
329
  }
206
330
  },
207
- "required": ["provider"]
331
+ "required": [
332
+ "provider"
333
+ ]
208
334
  }
209
335
  ]
210
336
  }
@@ -280,7 +406,11 @@
280
406
  },
281
407
  "turnDetection": {
282
408
  "type": "string",
283
- "enum": ["server_vad", "semantic_vad", "none"],
409
+ "enum": [
410
+ "server_vad",
411
+ "semantic_vad",
412
+ "none"
413
+ ],
284
414
  "default": "semantic_vad",
285
415
  "description": "Turn detection mode for voice activity detection"
286
416
  },
@@ -290,7 +420,10 @@
290
420
  },
291
421
  "fallbackMode": {
292
422
  "type": "string",
293
- "enum": ["browser", "disabled"],
423
+ "enum": [
424
+ "browser",
425
+ "disabled"
426
+ ],
294
427
  "default": "browser",
295
428
  "description": "Fallback when Realtime API unavailable: browser (Web Speech API) or disabled"
296
429
  },
@@ -316,7 +449,9 @@
316
449
  "items": {
317
450
  "type": "object",
318
451
  "additionalProperties": false,
319
- "required": ["provider"],
452
+ "required": [
453
+ "provider"
454
+ ],
320
455
  "properties": {
321
456
  "id": {
322
457
  "type": "string",
@@ -328,7 +463,12 @@
328
463
  },
329
464
  "provider": {
330
465
  "type": "string",
331
- "enum": ["azure", "openai", "claude", "gemini"],
466
+ "enum": [
467
+ "azure",
468
+ "openai",
469
+ "claude",
470
+ "gemini"
471
+ ],
332
472
  "description": "Provider type"
333
473
  },
334
474
  "endpoint": {
@@ -347,11 +487,18 @@
347
487
  "type": "string",
348
488
  "description": "Model name (for openai provider)"
349
489
  },
350
- "voiceId": { "type": "string" },
351
- "visionModel": { "type": "string" },
490
+ "voiceId": {
491
+ "type": "string"
492
+ },
493
+ "visionModel": {
494
+ "type": "string"
495
+ },
352
496
  "role": {
353
497
  "type": "string",
354
- "enum": ["primary", "backup"],
498
+ "enum": [
499
+ "primary",
500
+ "backup"
501
+ ],
355
502
  "default": "primary"
356
503
  },
357
504
  "weight": {
@@ -359,7 +506,10 @@
359
506
  "default": 100,
360
507
  "description": "Priority weight — higher = tried first"
361
508
  },
362
- "enabled": { "type": "boolean", "default": true }
509
+ "enabled": {
510
+ "type": "boolean",
511
+ "default": true
512
+ }
363
513
  }
364
514
  }
365
515
  },
@@ -376,21 +526,33 @@
376
526
  }
377
527
  }
378
528
  },
379
- "vkSpawnEnabled": { "type": "boolean" },
529
+ "vkSpawnEnabled": {
530
+ "type": "boolean"
531
+ },
380
532
  "kanban": {
381
533
  "type": "object",
382
534
  "additionalProperties": false,
383
535
  "properties": {
384
536
  "backend": {
385
537
  "type": "string",
386
- "enum": ["internal", "vk", "github", "jira"]
538
+ "enum": [
539
+ "internal",
540
+ "vk",
541
+ "github",
542
+ "jira"
543
+ ]
387
544
  },
388
545
  "syncPolicy": {
389
546
  "type": "string",
390
- "enum": ["internal-primary", "bidirectional"],
547
+ "enum": [
548
+ "internal-primary",
549
+ "bidirectional"
550
+ ],
391
551
  "default": "internal-primary"
392
552
  },
393
- "projectId": { "type": "string" },
553
+ "projectId": {
554
+ "type": "string"
555
+ },
394
556
  "github": {
395
557
  "type": "object",
396
558
  "additionalProperties": false,
@@ -402,7 +564,10 @@
402
564
  "properties": {
403
565
  "mode": {
404
566
  "type": "string",
405
- "enum": ["issues", "kanban"],
567
+ "enum": [
568
+ "issues",
569
+ "kanban"
570
+ ],
406
571
  "default": "issues",
407
572
  "description": "Task source mode: 'issues' for repo issues only, 'kanban' for project board sync"
408
573
  },
@@ -411,7 +576,10 @@
411
576
  "description": "GitHub org/user that owns the project board"
412
577
  },
413
578
  "number": {
414
- "type": ["string", "number"],
579
+ "type": [
580
+ "string",
581
+ "number"
582
+ ],
415
583
  "description": "GitHub project number"
416
584
  },
417
585
  "title": {
@@ -428,14 +596,26 @@
428
596
  "additionalProperties": false,
429
597
  "description": "Map internal statuses to project board column names",
430
598
  "properties": {
431
- "todo": { "type": "string", "default": "Todo" },
599
+ "todo": {
600
+ "type": "string",
601
+ "default": "Todo"
602
+ },
432
603
  "inprogress": {
433
604
  "type": "string",
434
605
  "default": "In Progress"
435
606
  },
436
- "inreview": { "type": "string", "default": "In Review" },
437
- "done": { "type": "string", "default": "Done" },
438
- "cancelled": { "type": "string", "default": "Cancelled" }
607
+ "inreview": {
608
+ "type": "string",
609
+ "default": "In Review"
610
+ },
611
+ "done": {
612
+ "type": "string",
613
+ "default": "Done"
614
+ },
615
+ "cancelled": {
616
+ "type": "string",
617
+ "default": "Cancelled"
618
+ }
439
619
  }
440
620
  },
441
621
  "webhook": {
@@ -508,11 +688,26 @@
508
688
  "additionalProperties": false,
509
689
  "description": "Map internal statuses to Jira workflow status names",
510
690
  "properties": {
511
- "todo": { "type": "string", "default": "To Do" },
512
- "inprogress": { "type": "string", "default": "In Progress" },
513
- "inreview": { "type": "string", "default": "In Review" },
514
- "done": { "type": "string", "default": "Done" },
515
- "cancelled": { "type": "string", "default": "Cancelled" }
691
+ "todo": {
692
+ "type": "string",
693
+ "default": "To Do"
694
+ },
695
+ "inprogress": {
696
+ "type": "string",
697
+ "default": "In Progress"
698
+ },
699
+ "inreview": {
700
+ "type": "string",
701
+ "default": "In Review"
702
+ },
703
+ "done": {
704
+ "type": "string",
705
+ "default": "Done"
706
+ },
707
+ "cancelled": {
708
+ "type": "string",
709
+ "default": "Cancelled"
710
+ }
516
711
  }
517
712
  },
518
713
  "labels": {
@@ -520,10 +715,22 @@
520
715
  "additionalProperties": false,
521
716
  "description": "Jira labels used to mark codex shared-state lifecycle",
522
717
  "properties": {
523
- "claimed": { "type": "string", "default": "codex:claimed" },
524
- "working": { "type": "string", "default": "codex:working" },
525
- "stale": { "type": "string", "default": "codex:stale" },
526
- "ignore": { "type": "string", "default": "codex:ignore" }
718
+ "claimed": {
719
+ "type": "string",
720
+ "default": "codex:claimed"
721
+ },
722
+ "working": {
723
+ "type": "string",
724
+ "default": "codex:working"
725
+ },
726
+ "stale": {
727
+ "type": "string",
728
+ "default": "codex:stale"
729
+ },
730
+ "ignore": {
731
+ "type": "string",
732
+ "default": "codex:ignore"
733
+ }
527
734
  }
528
735
  },
529
736
  "sharedStateFields": {
@@ -563,28 +770,50 @@
563
770
  },
564
771
  "plannerMode": {
565
772
  "type": "string",
566
- "enum": ["codex-sdk", "kanban", "disabled"]
773
+ "enum": [
774
+ "codex-sdk",
775
+ "kanban",
776
+ "disabled"
777
+ ]
567
778
  },
568
779
  "triggerSystem": {
569
780
  "type": "object",
570
781
  "additionalProperties": true,
571
782
  "properties": {
572
- "enabled": { "type": "boolean", "default": false },
783
+ "enabled": {
784
+ "type": "boolean",
785
+ "default": false
786
+ },
573
787
  "templates": {
574
788
  "type": "array",
575
789
  "items": {
576
790
  "type": "object",
577
791
  "additionalProperties": true,
578
792
  "properties": {
579
- "id": { "type": "string" },
580
- "name": { "type": "string" },
581
- "description": { "type": "string" },
582
- "enabled": { "type": "boolean", "default": false },
793
+ "id": {
794
+ "type": "string"
795
+ },
796
+ "name": {
797
+ "type": "string"
798
+ },
799
+ "description": {
800
+ "type": "string"
801
+ },
802
+ "enabled": {
803
+ "type": "boolean",
804
+ "default": false
805
+ },
583
806
  "action": {
584
807
  "type": "string",
585
- "enum": ["task-planner", "create-task"]
808
+ "enum": [
809
+ "task-planner",
810
+ "create-task"
811
+ ]
812
+ },
813
+ "minIntervalMinutes": {
814
+ "type": "number",
815
+ "minimum": 1
586
816
  },
587
- "minIntervalMinutes": { "type": "number", "minimum": 1 },
588
817
  "trigger": {
589
818
  "type": "object",
590
819
  "additionalProperties": true,
@@ -597,15 +826,36 @@
597
826
  "properties": {
598
827
  "kind": {
599
828
  "type": "string",
600
- "enum": ["metric", "interval"]
829
+ "enum": [
830
+ "metric",
831
+ "interval"
832
+ ]
833
+ },
834
+ "metric": {
835
+ "type": "string"
601
836
  },
602
- "metric": { "type": "string" },
603
837
  "operator": {
604
838
  "type": "string",
605
- "enum": ["lt", "lte", "gt", "gte", "eq", "neq"]
839
+ "enum": [
840
+ "lt",
841
+ "lte",
842
+ "gt",
843
+ "gte",
844
+ "eq",
845
+ "neq"
846
+ ]
606
847
  },
607
- "value": { "type": ["number", "string", "boolean"] },
608
- "minutes": { "type": "number", "minimum": 1 }
848
+ "value": {
849
+ "type": [
850
+ "number",
851
+ "string",
852
+ "boolean"
853
+ ]
854
+ },
855
+ "minutes": {
856
+ "type": "number",
857
+ "minimum": 1
858
+ }
609
859
  }
610
860
  }
611
861
  }
@@ -617,14 +867,31 @@
617
867
  "properties": {
618
868
  "plannerMode": {
619
869
  "type": "string",
620
- "enum": ["codex-sdk", "kanban", "disabled"]
870
+ "enum": [
871
+ "codex-sdk",
872
+ "kanban",
873
+ "disabled"
874
+ ]
875
+ },
876
+ "defaultTaskCount": {
877
+ "type": "number",
878
+ "minimum": 1
879
+ },
880
+ "title": {
881
+ "type": "string"
882
+ },
883
+ "description": {
884
+ "type": "string"
621
885
  },
622
- "defaultTaskCount": { "type": "number", "minimum": 1 },
623
- "title": { "type": "string" },
624
- "description": { "type": "string" },
625
- "priority": { "type": "string" },
626
- "executor": { "type": "string" },
627
- "model": { "type": "string" }
886
+ "priority": {
887
+ "type": "string"
888
+ },
889
+ "executor": {
890
+ "type": "string"
891
+ },
892
+ "model": {
893
+ "type": "string"
894
+ }
628
895
  }
629
896
  }
630
897
  }
@@ -634,8 +901,12 @@
634
901
  "type": "object",
635
902
  "additionalProperties": false,
636
903
  "properties": {
637
- "executor": { "type": "string" },
638
- "model": { "type": "string" }
904
+ "executor": {
905
+ "type": "string"
906
+ },
907
+ "model": {
908
+ "type": "string"
909
+ }
639
910
  }
640
911
  }
641
912
  }
@@ -650,7 +921,10 @@
650
921
  "items": {
651
922
  "type": "object",
652
923
  "additionalProperties": true,
653
- "required": ["id", "name"],
924
+ "required": [
925
+ "id",
926
+ "name"
927
+ ],
654
928
  "properties": {
655
929
  "id": {
656
930
  "type": "string",
@@ -666,13 +940,18 @@
666
940
  "items": {
667
941
  "type": "object",
668
942
  "additionalProperties": true,
669
- "required": ["name"],
943
+ "required": [
944
+ "name"
945
+ ],
670
946
  "properties": {
671
947
  "name": {
672
948
  "type": "string",
673
949
  "description": "Repository directory name"
674
950
  },
675
- "url": { "type": "string", "description": "Git clone URL" },
951
+ "url": {
952
+ "type": "string",
953
+ "description": "Git clone URL"
954
+ },
676
955
  "slug": {
677
956
  "type": "string",
678
957
  "description": "GitHub slug (org/repo)"
@@ -689,7 +968,10 @@
689
968
  }
690
969
  },
691
970
  "activeRepo": {
692
- "type": ["string", "null"],
971
+ "type": [
972
+ "string",
973
+ "null"
974
+ ],
693
975
  "description": "Currently active repository name within the workspace"
694
976
  },
695
977
  "createdAt": {
@@ -699,27 +981,41 @@
699
981
  }
700
982
  }
701
983
  },
702
- "defaultRepository": { "type": "string" },
703
- "repositoryDefaults": { "$ref": "#/$defs/repositoryDefaults" },
984
+ "defaultRepository": {
985
+ "type": "string"
986
+ },
987
+ "repositoryDefaults": {
988
+ "$ref": "#/$defs/repositoryDefaults"
989
+ },
704
990
  "repositories": {
705
991
  "oneOf": [
706
992
  {
707
993
  "type": "array",
708
- "items": { "$ref": "#/$defs/repository" }
994
+ "items": {
995
+ "$ref": "#/$defs/repository"
996
+ }
709
997
  },
710
998
  {
711
999
  "type": "object",
712
1000
  "additionalProperties": true,
713
1001
  "properties": {
714
- "default": { "type": "string" },
715
- "defaults": { "$ref": "#/$defs/repositoryDefaults" },
1002
+ "default": {
1003
+ "type": "string"
1004
+ },
1005
+ "defaults": {
1006
+ "$ref": "#/$defs/repositoryDefaults"
1007
+ },
716
1008
  "items": {
717
1009
  "type": "array",
718
- "items": { "$ref": "#/$defs/repository" }
1010
+ "items": {
1011
+ "$ref": "#/$defs/repository"
1012
+ }
719
1013
  },
720
1014
  "list": {
721
1015
  "type": "array",
722
- "items": { "$ref": "#/$defs/repository" }
1016
+ "items": {
1017
+ "$ref": "#/$defs/repository"
1018
+ }
723
1019
  }
724
1020
  }
725
1021
  }
@@ -731,20 +1027,47 @@
731
1027
  "properties": {
732
1028
  "mode": {
733
1029
  "type": "string",
734
- "enum": ["vk", "internal", "hybrid"]
1030
+ "enum": [
1031
+ "vk",
1032
+ "internal",
1033
+ "hybrid"
1034
+ ]
1035
+ },
1036
+ "maxParallel": {
1037
+ "type": "number"
1038
+ },
1039
+ "baseBranchParallelLimit": {
1040
+ "type": "number"
1041
+ },
1042
+ "pollIntervalMs": {
1043
+ "type": "number"
735
1044
  },
736
- "maxParallel": { "type": "number" },
737
- "baseBranchParallelLimit": { "type": "number" },
738
- "pollIntervalMs": { "type": "number" },
739
1045
  "sdk": {
740
1046
  "type": "string",
741
- "enum": ["auto", "codex", "copilot", "claude", "gemini", "opencode"]
1047
+ "enum": [
1048
+ "auto",
1049
+ "codex",
1050
+ "copilot",
1051
+ "claude",
1052
+ "gemini",
1053
+ "opencode"
1054
+ ]
1055
+ },
1056
+ "taskTimeoutMs": {
1057
+ "type": "number"
1058
+ },
1059
+ "maxRetries": {
1060
+ "type": "number"
1061
+ },
1062
+ "reviewAgentEnabled": {
1063
+ "type": "boolean"
1064
+ },
1065
+ "reviewMaxConcurrent": {
1066
+ "type": "number"
1067
+ },
1068
+ "reviewTimeoutMs": {
1069
+ "type": "number"
742
1070
  },
743
- "taskTimeoutMs": { "type": "number" },
744
- "maxRetries": { "type": "number" },
745
- "reviewAgentEnabled": { "type": "boolean" },
746
- "reviewMaxConcurrent": { "type": "number" },
747
- "reviewTimeoutMs": { "type": "number" },
748
1071
  "stream": {
749
1072
  "type": "object",
750
1073
  "additionalProperties": false,
@@ -777,44 +1100,98 @@
777
1100
  }
778
1101
  }
779
1102
  },
780
- "profiles": { "$ref": "#/$defs/profiles" },
781
- "envProfiles": { "$ref": "#/$defs/profiles" },
1103
+ "profiles": {
1104
+ "$ref": "#/$defs/profiles"
1105
+ },
1106
+ "envProfiles": {
1107
+ "$ref": "#/$defs/profiles"
1108
+ },
782
1109
  "executors": {
783
1110
  "type": "array",
784
- "items": { "$ref": "#/$defs/executor" }
1111
+ "items": {
1112
+ "$ref": "#/$defs/executor"
1113
+ }
1114
+ },
1115
+ "failover": {
1116
+ "$ref": "#/$defs/failover"
785
1117
  },
786
- "failover": { "$ref": "#/$defs/failover" },
787
1118
  "distribution": {
788
1119
  "type": "string",
789
- "enum": ["weighted", "round-robin", "primary-only"]
1120
+ "enum": [
1121
+ "weighted",
1122
+ "round-robin",
1123
+ "primary-only"
1124
+ ]
790
1125
  },
791
1126
  "agentPrompts": {
792
1127
  "type": "object",
793
1128
  "additionalProperties": false,
794
1129
  "properties": {
795
- "orchestrator": { "type": "string" },
796
- "planner": { "type": "string" },
797
- "monitorMonitor": { "type": "string" },
798
- "taskExecutor": { "type": "string" },
799
- "taskExecutorRetry": { "type": "string" },
800
- "taskExecutorContinueHasCommits": { "type": "string" },
801
- "taskExecutorContinueHasEdits": { "type": "string" },
802
- "taskExecutorContinueNoProgress": { "type": "string" },
803
- "reviewer": { "type": "string" },
804
- "conflictResolver": { "type": "string" },
805
- "sdkConflictResolver": { "type": "string" },
806
- "mergeStrategy": { "type": "string" },
807
- "mergeStrategyFix": { "type": "string" },
808
- "mergeStrategyReAttempt": { "type": "string" },
809
- "autofixFix": { "type": "string" },
810
- "autofixFallback": { "type": "string" },
811
- "autofixLoop": { "type": "string" },
812
- "monitorCrashFix": { "type": "string" },
813
- "monitorRestartLoopFix": { "type": "string" }
1130
+ "orchestrator": {
1131
+ "type": "string"
1132
+ },
1133
+ "planner": {
1134
+ "type": "string"
1135
+ },
1136
+ "monitorMonitor": {
1137
+ "type": "string"
1138
+ },
1139
+ "taskExecutor": {
1140
+ "type": "string"
1141
+ },
1142
+ "taskExecutorRetry": {
1143
+ "type": "string"
1144
+ },
1145
+ "taskExecutorContinueHasCommits": {
1146
+ "type": "string"
1147
+ },
1148
+ "taskExecutorContinueHasEdits": {
1149
+ "type": "string"
1150
+ },
1151
+ "taskExecutorContinueNoProgress": {
1152
+ "type": "string"
1153
+ },
1154
+ "reviewer": {
1155
+ "type": "string"
1156
+ },
1157
+ "conflictResolver": {
1158
+ "type": "string"
1159
+ },
1160
+ "sdkConflictResolver": {
1161
+ "type": "string"
1162
+ },
1163
+ "mergeStrategy": {
1164
+ "type": "string"
1165
+ },
1166
+ "mergeStrategyFix": {
1167
+ "type": "string"
1168
+ },
1169
+ "mergeStrategyReAttempt": {
1170
+ "type": "string"
1171
+ },
1172
+ "autofixFix": {
1173
+ "type": "string"
1174
+ },
1175
+ "autofixFallback": {
1176
+ "type": "string"
1177
+ },
1178
+ "autofixLoop": {
1179
+ "type": "string"
1180
+ },
1181
+ "monitorCrashFix": {
1182
+ "type": "string"
1183
+ },
1184
+ "monitorRestartLoopFix": {
1185
+ "type": "string"
1186
+ }
814
1187
  }
815
1188
  },
816
- "hookProfiles": { "$ref": "#/$defs/hookProfiles" },
817
- "agentHooks": { "$ref": "#/$defs/agentHooks" },
1189
+ "hookProfiles": {
1190
+ "$ref": "#/$defs/hookProfiles"
1191
+ },
1192
+ "agentHooks": {
1193
+ "$ref": "#/$defs/agentHooks"
1194
+ },
818
1195
  "auth": {
819
1196
  "type": "object",
820
1197
  "description": "Authentication configuration for agent SDKs",
@@ -827,7 +1204,12 @@
827
1204
  "type": "array",
828
1205
  "items": {
829
1206
  "type": "string",
830
- "enum": ["env", "cli", "vscode", "interactive"]
1207
+ "enum": [
1208
+ "env",
1209
+ "cli",
1210
+ "vscode",
1211
+ "interactive"
1212
+ ]
831
1213
  },
832
1214
  "description": "Auth source priority: env (tokens), cli (gh auth), vscode (extension), interactive (prompt)"
833
1215
  },
@@ -844,7 +1226,11 @@
844
1226
  "type": "array",
845
1227
  "items": {
846
1228
  "type": "string",
847
- "enum": ["env", "cli", "interactive"]
1229
+ "enum": [
1230
+ "env",
1231
+ "cli",
1232
+ "interactive"
1233
+ ]
848
1234
  },
849
1235
  "description": "Auth source priority: env (API key), cli (config file), interactive (prompt)"
850
1236
  },
@@ -861,7 +1247,11 @@
861
1247
  "type": "array",
862
1248
  "items": {
863
1249
  "type": "string",
864
- "enum": ["config", "env", "interactive"]
1250
+ "enum": [
1251
+ "config",
1252
+ "env",
1253
+ "interactive"
1254
+ ]
865
1255
  },
866
1256
  "description": "Auth source priority: config (config.toml), env (API key), interactive (prompt)"
867
1257
  },
@@ -872,6 +1262,104 @@
872
1262
  }
873
1263
  }
874
1264
  }
1265
+ },
1266
+ "workflows": {
1267
+ "type": "object",
1268
+ "description": "Declarative multi-agent pipeline workflows runnable via bosun workflow run <name>.",
1269
+ "additionalProperties": {
1270
+ "type": "object",
1271
+ "properties": {
1272
+ "type": {
1273
+ "type": "string",
1274
+ "enum": [
1275
+ "sequential",
1276
+ "fanout",
1277
+ "race"
1278
+ ]
1279
+ },
1280
+ "description": {
1281
+ "type": "string"
1282
+ },
1283
+ "stages": {
1284
+ "type": "array",
1285
+ "items": {
1286
+ "oneOf": [
1287
+ {
1288
+ "type": "string"
1289
+ },
1290
+ {
1291
+ "type": "object",
1292
+ "properties": {
1293
+ "name": {
1294
+ "type": "string"
1295
+ },
1296
+ "stage": {
1297
+ "type": "string"
1298
+ },
1299
+ "prompt": {
1300
+ "type": "string"
1301
+ },
1302
+ "promptTemplate": {
1303
+ "type": "string"
1304
+ },
1305
+ "sdk": {
1306
+ "type": "string"
1307
+ },
1308
+ "model": {
1309
+ "type": "string"
1310
+ },
1311
+ "cwd": {
1312
+ "type": "string"
1313
+ },
1314
+ "timeoutMs": {
1315
+ "type": "number"
1316
+ }
1317
+ }
1318
+ }
1319
+ ]
1320
+ }
1321
+ },
1322
+ "agents": {
1323
+ "type": "array",
1324
+ "items": {
1325
+ "oneOf": [
1326
+ {
1327
+ "type": "string"
1328
+ },
1329
+ {
1330
+ "type": "object",
1331
+ "properties": {
1332
+ "name": {
1333
+ "type": "string"
1334
+ },
1335
+ "stage": {
1336
+ "type": "string"
1337
+ },
1338
+ "prompt": {
1339
+ "type": "string"
1340
+ },
1341
+ "promptTemplate": {
1342
+ "type": "string"
1343
+ },
1344
+ "sdk": {
1345
+ "type": "string"
1346
+ },
1347
+ "model": {
1348
+ "type": "string"
1349
+ },
1350
+ "cwd": {
1351
+ "type": "string"
1352
+ },
1353
+ "timeoutMs": {
1354
+ "type": "number"
1355
+ }
1356
+ }
1357
+ }
1358
+ ]
1359
+ }
1360
+ }
1361
+ }
1362
+ }
875
1363
  }
876
1364
  },
877
1365
  "$defs": {
@@ -879,16 +1367,30 @@
879
1367
  "type": "object",
880
1368
  "additionalProperties": false,
881
1369
  "properties": {
882
- "name": { "type": "string" },
883
- "executor": { "type": "string" },
884
- "variant": { "type": "string" },
1370
+ "name": {
1371
+ "type": "string"
1372
+ },
1373
+ "executor": {
1374
+ "type": "string"
1375
+ },
1376
+ "variant": {
1377
+ "type": "string"
1378
+ },
885
1379
  "models": {
886
1380
  "type": "array",
887
- "items": { "type": "string" }
1381
+ "items": {
1382
+ "type": "string"
1383
+ }
1384
+ },
1385
+ "weight": {
1386
+ "type": "number"
1387
+ },
1388
+ "role": {
1389
+ "type": "string"
1390
+ },
1391
+ "enabled": {
1392
+ "type": "boolean"
888
1393
  },
889
- "weight": { "type": "number" },
890
- "role": { "type": "string" },
891
- "enabled": { "type": "boolean" },
892
1394
  "provider": {
893
1395
  "type": "string",
894
1396
  "description": "AI provider for this executor (e.g. anthropic, openai, ollama, nebius, scaleway, deepinfra, qiniu, cloudflare, xiaomi, synthetic, perplexity)"
@@ -927,56 +1429,126 @@
927
1429
  "properties": {
928
1430
  "strategy": {
929
1431
  "type": "string",
930
- "enum": ["next-in-line", "weighted-random", "round-robin"]
1432
+ "enum": [
1433
+ "next-in-line",
1434
+ "weighted-random",
1435
+ "round-robin"
1436
+ ]
1437
+ },
1438
+ "maxRetries": {
1439
+ "type": "number"
931
1440
  },
932
- "maxRetries": { "type": "number" },
933
- "cooldownMinutes": { "type": "number" },
934
- "disableOnConsecutiveFailures": { "type": "number" }
1441
+ "cooldownMinutes": {
1442
+ "type": "number"
1443
+ },
1444
+ "disableOnConsecutiveFailures": {
1445
+ "type": "number"
1446
+ }
935
1447
  }
936
1448
  },
937
1449
  "repositoryDefaults": {
938
1450
  "type": "object",
939
1451
  "additionalProperties": true,
940
1452
  "properties": {
941
- "path": { "type": "string" },
942
- "slug": { "type": "string" },
943
- "projectName": { "type": "string" },
944
- "orchestratorScript": { "type": "string" },
945
- "orchestratorArgs": { "type": "string" },
946
- "logDir": { "type": "string" },
947
- "watchPath": { "type": "string" },
948
- "profile": { "type": "string" },
949
- "envProfile": { "type": "string" },
950
- "mode": { "type": "string" }
1453
+ "path": {
1454
+ "type": "string"
1455
+ },
1456
+ "slug": {
1457
+ "type": "string"
1458
+ },
1459
+ "projectName": {
1460
+ "type": "string"
1461
+ },
1462
+ "orchestratorScript": {
1463
+ "type": "string"
1464
+ },
1465
+ "orchestratorArgs": {
1466
+ "type": "string"
1467
+ },
1468
+ "logDir": {
1469
+ "type": "string"
1470
+ },
1471
+ "watchPath": {
1472
+ "type": "string"
1473
+ },
1474
+ "profile": {
1475
+ "type": "string"
1476
+ },
1477
+ "envProfile": {
1478
+ "type": "string"
1479
+ },
1480
+ "mode": {
1481
+ "type": "string"
1482
+ }
951
1483
  }
952
1484
  },
953
1485
  "repository": {
954
1486
  "type": "object",
955
1487
  "additionalProperties": true,
956
1488
  "properties": {
957
- "name": { "type": "string" },
958
- "id": { "type": "string" },
1489
+ "name": {
1490
+ "type": "string"
1491
+ },
1492
+ "id": {
1493
+ "type": "string"
1494
+ },
959
1495
  "aliases": {
960
1496
  "type": "array",
961
- "items": { "type": "string" }
962
- },
963
- "path": { "type": "string" },
964
- "repoRoot": { "type": "string" },
965
- "slug": { "type": "string" },
966
- "repo": { "type": "string" },
967
- "repoUrlBase": { "type": "string" },
968
- "projectName": { "type": "string" },
969
- "primary": { "type": "boolean" },
970
- "orchestratorScript": { "type": "string" },
971
- "orchestratorArgs": { "type": "string" },
972
- "logDir": { "type": "string" },
973
- "watchPath": { "type": "string" },
974
- "profile": { "type": "string" },
975
- "envProfile": { "type": "string" },
976
- "mode": { "type": "string" },
977
- "cacheDir": { "type": "string" },
978
- "statusPath": { "type": "string" },
979
- "telegramPollLockPath": { "type": "string" }
1497
+ "items": {
1498
+ "type": "string"
1499
+ }
1500
+ },
1501
+ "path": {
1502
+ "type": "string"
1503
+ },
1504
+ "repoRoot": {
1505
+ "type": "string"
1506
+ },
1507
+ "slug": {
1508
+ "type": "string"
1509
+ },
1510
+ "repo": {
1511
+ "type": "string"
1512
+ },
1513
+ "repoUrlBase": {
1514
+ "type": "string"
1515
+ },
1516
+ "projectName": {
1517
+ "type": "string"
1518
+ },
1519
+ "primary": {
1520
+ "type": "boolean"
1521
+ },
1522
+ "orchestratorScript": {
1523
+ "type": "string"
1524
+ },
1525
+ "orchestratorArgs": {
1526
+ "type": "string"
1527
+ },
1528
+ "logDir": {
1529
+ "type": "string"
1530
+ },
1531
+ "watchPath": {
1532
+ "type": "string"
1533
+ },
1534
+ "profile": {
1535
+ "type": "string"
1536
+ },
1537
+ "envProfile": {
1538
+ "type": "string"
1539
+ },
1540
+ "mode": {
1541
+ "type": "string"
1542
+ },
1543
+ "cacheDir": {
1544
+ "type": "string"
1545
+ },
1546
+ "statusPath": {
1547
+ "type": "string"
1548
+ },
1549
+ "telegramPollLockPath": {
1550
+ "type": "string"
1551
+ }
980
1552
  }
981
1553
  },
982
1554
  "profiles": {
@@ -985,19 +1557,39 @@
985
1557
  "type": "object",
986
1558
  "additionalProperties": true,
987
1559
  "properties": {
988
- "description": { "type": "string" },
1560
+ "description": {
1561
+ "type": "string"
1562
+ },
989
1563
  "env": {
990
1564
  "type": "object",
991
- "additionalProperties": { "type": "string" }
1565
+ "additionalProperties": {
1566
+ "type": "string"
1567
+ }
1568
+ },
1569
+ "envFile": {
1570
+ "type": "string"
1571
+ },
1572
+ "envOverride": {
1573
+ "type": "boolean"
1574
+ },
1575
+ "repository": {
1576
+ "type": "string"
1577
+ },
1578
+ "repo": {
1579
+ "type": "string"
1580
+ },
1581
+ "defaultRepository": {
1582
+ "type": "string"
1583
+ },
1584
+ "overrides": {
1585
+ "type": "object"
1586
+ },
1587
+ "config": {
1588
+ "type": "object"
992
1589
  },
993
- "envFile": { "type": "string" },
994
- "envOverride": { "type": "boolean" },
995
- "repository": { "type": "string" },
996
- "repo": { "type": "string" },
997
- "defaultRepository": { "type": "string" },
998
- "overrides": { "type": "object" },
999
- "config": { "type": "object" },
1000
- "settings": { "type": "object" }
1590
+ "settings": {
1591
+ "type": "object"
1592
+ }
1001
1593
  }
1002
1594
  }
1003
1595
  },
@@ -1005,19 +1597,32 @@
1005
1597
  "type": "object",
1006
1598
  "additionalProperties": false,
1007
1599
  "properties": {
1008
- "enabled": { "type": "boolean" },
1600
+ "enabled": {
1601
+ "type": "boolean"
1602
+ },
1009
1603
  "profile": {
1010
1604
  "type": "string",
1011
- "enum": ["strict", "balanced", "lightweight", "none"]
1605
+ "enum": [
1606
+ "strict",
1607
+ "balanced",
1608
+ "lightweight",
1609
+ "none"
1610
+ ]
1012
1611
  },
1013
1612
  "targets": {
1014
1613
  "type": "array",
1015
1614
  "items": {
1016
1615
  "type": "string",
1017
- "enum": ["codex", "claude", "copilot"]
1616
+ "enum": [
1617
+ "codex",
1618
+ "claude",
1619
+ "copilot"
1620
+ ]
1018
1621
  }
1019
1622
  },
1020
- "overwriteExisting": { "type": "boolean" }
1623
+ "overwriteExisting": {
1624
+ "type": "boolean"
1625
+ }
1021
1626
  }
1022
1627
  },
1023
1628
  "agentHooks": {
@@ -1037,7 +1642,9 @@
1037
1642
  },
1038
1643
  "defaultServers": {
1039
1644
  "type": "array",
1040
- "items": { "type": "string" },
1645
+ "items": {
1646
+ "type": "string"
1647
+ },
1041
1648
  "description": "MCP server IDs attached to every agent launch by default (e.g. [\"context7\", \"microsoft-docs\"])"
1042
1649
  },
1043
1650
  "catalogOverrides": {
@@ -1045,7 +1652,9 @@
1045
1652
  "additionalProperties": {
1046
1653
  "type": "object",
1047
1654
  "description": "Per-server environment variable overrides",
1048
- "additionalProperties": { "type": "string" }
1655
+ "additionalProperties": {
1656
+ "type": "string"
1657
+ }
1049
1658
  },
1050
1659
  "description": "Environment variable overrides keyed by MCP server ID"
1051
1660
  },
@@ -1206,7 +1815,11 @@
1206
1815
  },
1207
1816
  "liveToolCompactionMode": {
1208
1817
  "type": "string",
1209
- "enum": ["off", "auto", "aggressive"],
1818
+ "enum": [
1819
+ "off",
1820
+ "auto",
1821
+ "aggressive"
1822
+ ],
1210
1823
  "default": "auto",
1211
1824
  "description": "off disables live compaction, auto compacts only when pressure or signal justify it, and aggressive favors stronger reduction for noisy command families."
1212
1825
  },
@@ -1245,19 +1858,49 @@
1245
1858
  },
1246
1859
  "liveToolCompactionAllowCommands": {
1247
1860
  "type": "array",
1248
- "items": { "type": "string" },
1249
- "default": ["grep", "rg", "find", "git", "go", "npm", "pnpm", "yarn", "node", "python", "python3", "pytest", "docker", "kubectl", "cargo", "gradle", "maven", "mvn", "javac", "tsc", "jest", "vitest", "deno"],
1861
+ "items": {
1862
+ "type": "string"
1863
+ },
1864
+ "default": [
1865
+ "grep",
1866
+ "rg",
1867
+ "find",
1868
+ "git",
1869
+ "go",
1870
+ "npm",
1871
+ "pnpm",
1872
+ "yarn",
1873
+ "node",
1874
+ "python",
1875
+ "python3",
1876
+ "pytest",
1877
+ "docker",
1878
+ "kubectl",
1879
+ "cargo",
1880
+ "gradle",
1881
+ "maven",
1882
+ "mvn",
1883
+ "javac",
1884
+ "tsc",
1885
+ "jest",
1886
+ "vitest",
1887
+ "deno"
1888
+ ],
1250
1889
  "description": "Command or tool families eligible for live compaction."
1251
1890
  },
1252
1891
  "perType": {
1253
1892
  "type": "object",
1254
1893
  "description": "Per-interaction-type config overrides. Keys: task, manual, primary, chat, voice, flow.",
1255
- "additionalProperties": { "type": "object" }
1894
+ "additionalProperties": {
1895
+ "type": "object"
1896
+ }
1256
1897
  },
1257
1898
  "perAgent": {
1258
1899
  "type": "object",
1259
1900
  "description": "Per-agent-SDK config overrides. Keys: codex-sdk, copilot-sdk, claude-sdk, gemini-sdk, opencode-sdk.",
1260
- "additionalProperties": { "type": "object" }
1901
+ "additionalProperties": {
1902
+ "type": "object"
1903
+ }
1261
1904
  }
1262
1905
  }
1263
1906
  },
@@ -1287,4 +1930,3 @@
1287
1930
  }
1288
1931
  }
1289
1932
  }
1290
-