pi-crew 0.10.1 → 0.10.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/CHANGELOG.md +98 -0
  2. package/NOTICE.md +21 -0
  3. package/README.md +44 -2
  4. package/agents/executor.md +1 -1
  5. package/agents/test-engineer.md +1 -1
  6. package/dist/index.mjs +2781 -949
  7. package/package.json +1 -1
  8. package/schema.json +492 -94
  9. package/src/config/config-validation.ts +7 -1
  10. package/src/config/defaults.ts +8 -1
  11. package/src/config/role-tools.ts +4 -2
  12. package/src/config/types.ts +19 -1
  13. package/src/extension/crew-cleanup.ts +13 -0
  14. package/src/extension/crew-vibes/footer.ts +19 -0
  15. package/src/extension/crew-vibes/index.ts +11 -1
  16. package/src/extension/register.ts +8 -0
  17. package/src/extension/registration/command-registration.ts +1 -0
  18. package/src/extension/registration/commands/run.ts +15 -1
  19. package/src/extension/registration/commands/shared.ts +8 -0
  20. package/src/extension/registration/foreground-run-controller.ts +10 -2
  21. package/src/extension/registration/lifecycle-handlers.ts +52 -2
  22. package/src/extension/registration/runtime-cleanup.ts +23 -5
  23. package/src/extension/registration/team-tool.ts +5 -1
  24. package/src/extension/registration/ui.ts +5 -4
  25. package/src/extension/team-tool/run-deadline.ts +20 -3
  26. package/src/extension/team-tool/run.ts +26 -2
  27. package/src/runtime/child-pi/child-pi-constants.ts +8 -0
  28. package/src/runtime/child-pi/child-pi-streams.ts +21 -1
  29. package/src/runtime/detached-run-results.ts +90 -0
  30. package/src/runtime/goal-workflow/adaptive-plan.ts +30 -3
  31. package/src/runtime/goal-workflow/dynamic-workflow-runner.ts +5 -1
  32. package/src/runtime/merge-gate.ts +25 -9
  33. package/src/runtime/model/model-fallback.ts +7 -3
  34. package/src/runtime/process-status.ts +16 -1
  35. package/src/runtime/recovery/crash-recovery.ts +16 -0
  36. package/src/runtime/run-tracker.ts +77 -10
  37. package/src/runtime/team-runner.ts +3 -2
  38. package/src/schema/config-schema.ts +1 -1
  39. package/src/state/stores/plan-store.ts +1 -1
  40. package/src/state/stores/state-store.ts +73 -3
  41. package/src/state/types.ts +2 -0
  42. package/src/ui/dock-footer.ts +49 -0
  43. package/src/ui/inline-panel/agent-pane.ts +375 -0
  44. package/src/ui/inline-panel/agent-transcript.ts +338 -0
  45. package/src/ui/inline-panel/agent-view-overlay.ts +225 -0
  46. package/src/ui/inline-panel/crew-editor.ts +192 -0
  47. package/src/ui/inline-panel/index.ts +290 -0
  48. package/src/ui/inline-panel/panel-rows.ts +37 -0
  49. package/src/ui/inline-panel/panel-selection.ts +157 -0
  50. package/src/ui/inline-panel/panel-store.ts +111 -0
  51. package/src/ui/inline-panel/view-session-store.ts +36 -0
  52. package/src/ui/pi-ui-compat.ts +9 -0
  53. package/src/ui/widget/index.ts +176 -22
  54. package/src/ui/widget/task-list.ts +198 -0
  55. package/src/ui/widget/widget-formatters.ts +240 -4
  56. package/src/ui/widget/widget-renderer.ts +234 -37
  57. package/src/ui/widget/widget-types.ts +11 -0
  58. package/src/utils/child-process-shield.ts +106 -0
  59. package/src/utils/redaction.ts +7 -0
  60. package/src/utils/safe-abort.ts +45 -0
  61. package/src/workflows/discover-workflows.ts +1 -0
  62. package/src/workflows/workflow-config.ts +7 -0
  63. package/workflows/default.workflow.md +36 -26
  64. package/workflows/strict-fast-fix.workflow.md +26 -0
package/schema.json CHANGED
@@ -24,7 +24,10 @@
24
24
  },
25
25
  "ignoreMethod": {
26
26
  "type": "string",
27
- "enum": ["gitignore", "exclude"],
27
+ "enum": [
28
+ "gitignore",
29
+ "exclude"
30
+ ],
28
31
  "default": "gitignore",
29
32
  "description": "Method for ignoring pi-crew generated directories from VCS: 'gitignore' appends to .gitignore, 'exclude' writes to .git/info/exclude."
30
33
  },
@@ -33,16 +36,34 @@
33
36
  "additionalProperties": false,
34
37
  "description": "Autonomous team routing policy injected into the agent system prompt.",
35
38
  "properties": {
36
- "profile": { "type": "string", "enum": ["manual", "suggested", "assisted", "aggressive"] },
37
- "enabled": { "type": "boolean" },
38
- "injectPolicy": { "type": "boolean" },
39
- "preferAsyncForLongTasks": { "type": "boolean" },
40
- "allowWorktreeSuggestion": { "type": "boolean" },
39
+ "profile": {
40
+ "type": "string",
41
+ "enum": [
42
+ "manual",
43
+ "suggested",
44
+ "assisted",
45
+ "aggressive"
46
+ ]
47
+ },
48
+ "enabled": {
49
+ "type": "boolean"
50
+ },
51
+ "injectPolicy": {
52
+ "type": "boolean"
53
+ },
54
+ "preferAsyncForLongTasks": {
55
+ "type": "boolean"
56
+ },
57
+ "allowWorktreeSuggestion": {
58
+ "type": "boolean"
59
+ },
41
60
  "magicKeywords": {
42
61
  "type": "object",
43
62
  "additionalProperties": {
44
63
  "type": "array",
45
- "items": { "type": "string" }
64
+ "items": {
65
+ "type": "string"
66
+ }
46
67
  }
47
68
  }
48
69
  }
@@ -52,14 +73,37 @@
52
73
  "additionalProperties": false,
53
74
  "description": "Runtime safety limits for crew workers and policy decisions.",
54
75
  "properties": {
55
- "maxConcurrentWorkers": { "type": "integer", "minimum": 1 },
56
- "allowUnboundedConcurrency": { "type": "boolean" },
57
- "maxTaskDepth": { "type": "integer", "minimum": 1 },
58
- "maxChildrenPerTask": { "type": "integer", "minimum": 1 },
59
- "maxRunMinutes": { "type": "integer", "minimum": 1 },
60
- "maxRetriesPerTask": { "type": "integer", "minimum": 1 },
61
- "maxTasksPerRun": { "type": "integer", "minimum": 1 },
62
- "heartbeatStaleMs": { "type": "integer", "minimum": 1 }
76
+ "maxConcurrentWorkers": {
77
+ "type": "integer",
78
+ "minimum": 1
79
+ },
80
+ "allowUnboundedConcurrency": {
81
+ "type": "boolean"
82
+ },
83
+ "maxTaskDepth": {
84
+ "type": "integer",
85
+ "minimum": 1
86
+ },
87
+ "maxChildrenPerTask": {
88
+ "type": "integer",
89
+ "minimum": 1
90
+ },
91
+ "maxRunMinutes": {
92
+ "type": "integer",
93
+ "minimum": 1
94
+ },
95
+ "maxRetriesPerTask": {
96
+ "type": "integer",
97
+ "minimum": 1
98
+ },
99
+ "maxTasksPerRun": {
100
+ "type": "integer",
101
+ "minimum": 1
102
+ },
103
+ "heartbeatStaleMs": {
104
+ "type": "integer",
105
+ "minimum": 1
106
+ }
63
107
  }
64
108
  },
65
109
  "runtime": {
@@ -67,18 +111,71 @@
67
111
  "additionalProperties": false,
68
112
  "description": "Crew runtime selection and live-agent behavior knobs.",
69
113
  "properties": {
70
- "mode": { "type": "string", "enum": ["auto", "scaffold", "child-process", "live-session"] },
71
- "preferLiveSession": { "type": "boolean" },
72
- "allowChildProcessFallback": { "type": "boolean" },
73
- "maxTurns": { "type": "integer", "minimum": 1 },
74
- "graceTurns": { "type": "integer", "minimum": 1 },
75
- "inheritContext": { "type": "boolean" },
76
- "promptMode": { "type": "string", "enum": ["replace", "append"] },
77
- "groupJoin": { "type": "string", "enum": ["off", "group", "smart"] },
78
- "groupJoinAckTimeoutMs": { "type": "integer", "minimum": 1 },
79
- "requirePlanApproval": { "type": "boolean" },
80
- "completionMutationGuard": { "type": "string", "enum": ["off", "warn", "fail"] },
81
- "effectivenessGuard": { "type": "string", "enum": ["off", "warn", "block", "fail"] }
114
+ "mode": {
115
+ "type": "string",
116
+ "enum": [
117
+ "auto",
118
+ "scaffold",
119
+ "child-process",
120
+ "live-session"
121
+ ]
122
+ },
123
+ "preferLiveSession": {
124
+ "type": "boolean"
125
+ },
126
+ "allowChildProcessFallback": {
127
+ "type": "boolean"
128
+ },
129
+ "maxTurns": {
130
+ "type": "integer",
131
+ "minimum": 1
132
+ },
133
+ "graceTurns": {
134
+ "type": "integer",
135
+ "minimum": 1
136
+ },
137
+ "inheritContext": {
138
+ "type": "boolean"
139
+ },
140
+ "promptMode": {
141
+ "type": "string",
142
+ "enum": [
143
+ "replace",
144
+ "append"
145
+ ]
146
+ },
147
+ "groupJoin": {
148
+ "type": "string",
149
+ "enum": [
150
+ "off",
151
+ "group",
152
+ "smart"
153
+ ]
154
+ },
155
+ "groupJoinAckTimeoutMs": {
156
+ "type": "integer",
157
+ "minimum": 1
158
+ },
159
+ "requirePlanApproval": {
160
+ "type": "boolean"
161
+ },
162
+ "completionMutationGuard": {
163
+ "type": "string",
164
+ "enum": [
165
+ "off",
166
+ "warn",
167
+ "fail"
168
+ ]
169
+ },
170
+ "effectivenessGuard": {
171
+ "type": "string",
172
+ "enum": [
173
+ "off",
174
+ "warn",
175
+ "block",
176
+ "fail"
177
+ ]
178
+ }
82
179
  }
83
180
  },
84
181
  "control": {
@@ -86,8 +183,13 @@
86
183
  "additionalProperties": false,
87
184
  "description": "Agent control-plane settings for attention/stale activity detection.",
88
185
  "properties": {
89
- "enabled": { "type": "boolean" },
90
- "needsAttentionAfterMs": { "type": "integer", "minimum": 1 }
186
+ "enabled": {
187
+ "type": "boolean"
188
+ },
189
+ "needsAttentionAfterMs": {
190
+ "type": "integer",
191
+ "minimum": 1
192
+ }
91
193
  }
92
194
  },
93
195
  "worktree": {
@@ -95,9 +197,17 @@
95
197
  "additionalProperties": false,
96
198
  "description": "Worktree setup hooks and dependency-linking options.",
97
199
  "properties": {
98
- "setupHook": { "type": "string", "minLength": 1 },
99
- "setupHookTimeoutMs": { "type": "integer", "minimum": 1 },
100
- "linkNodeModules": { "type": "boolean" }
200
+ "setupHook": {
201
+ "type": "string",
202
+ "minLength": 1
203
+ },
204
+ "setupHookTimeoutMs": {
205
+ "type": "integer",
206
+ "minimum": 1
207
+ },
208
+ "linkNodeModules": {
209
+ "type": "boolean"
210
+ }
101
211
  }
102
212
  },
103
213
  "goalWrap": {
@@ -107,20 +217,47 @@
107
217
  "type": "object",
108
218
  "additionalProperties": false,
109
219
  "properties": {
110
- "enabled": { "type": "boolean" },
111
- "maxTurns": { "type": "integer", "minimum": 1, "maximum": 50 },
112
- "evaluatorModel": { "type": "string", "minLength": 1 },
220
+ "enabled": {
221
+ "type": "boolean"
222
+ },
223
+ "maxTurns": {
224
+ "type": "integer",
225
+ "minimum": 1,
226
+ "maximum": 50
227
+ },
228
+ "evaluatorModel": {
229
+ "type": "string",
230
+ "minLength": 1
231
+ },
113
232
  "verification": {
114
233
  "type": "object",
115
234
  "additionalProperties": false,
116
235
  "properties": {
117
- "commands": { "type": "array", "items": { "type": "string", "minLength": 1 } },
118
- "mode": { "type": "string", "enum": ["text-only"] }
236
+ "commands": {
237
+ "type": "array",
238
+ "items": {
239
+ "type": "string",
240
+ "minLength": 1
241
+ }
242
+ },
243
+ "mode": {
244
+ "type": "string",
245
+ "enum": [
246
+ "text-only"
247
+ ]
248
+ }
119
249
  },
120
- "required": ["commands"]
250
+ "required": [
251
+ "commands"
252
+ ]
253
+ },
254
+ "budgetTotal": {
255
+ "type": "integer",
256
+ "minimum": 1000
121
257
  },
122
- "budgetTotal": { "type": "integer", "minimum": 1000 },
123
- "budgetUnlimited": { "type": "boolean" }
258
+ "budgetUnlimited": {
259
+ "type": "boolean"
260
+ }
124
261
  }
125
262
  }
126
263
  },
@@ -129,18 +266,61 @@
129
266
  "additionalProperties": false,
130
267
  "description": "Builtin agent override settings.",
131
268
  "properties": {
132
- "disableBuiltins": { "type": "boolean" },
269
+ "disableBuiltins": {
270
+ "type": "boolean"
271
+ },
133
272
  "overrides": {
134
273
  "type": "object",
135
274
  "additionalProperties": {
136
275
  "type": "object",
137
276
  "additionalProperties": false,
138
277
  "properties": {
139
- "disabled": { "type": "boolean" },
140
- "model": { "oneOf": [{ "type": "string", "minLength": 1 }, { "const": false }] },
141
- "fallbackModels": { "oneOf": [{ "type": "array", "items": { "type": "string", "minLength": 1 } }, { "const": false }] },
142
- "thinking": { "oneOf": [{ "type": "string", "minLength": 1 }, { "const": false }] },
143
- "tools": { "type": "array", "items": { "type": "string", "minLength": 1 } }
278
+ "disabled": {
279
+ "type": "boolean"
280
+ },
281
+ "model": {
282
+ "oneOf": [
283
+ {
284
+ "type": "string",
285
+ "minLength": 1
286
+ },
287
+ {
288
+ "const": false
289
+ }
290
+ ]
291
+ },
292
+ "fallbackModels": {
293
+ "oneOf": [
294
+ {
295
+ "type": "array",
296
+ "items": {
297
+ "type": "string",
298
+ "minLength": 1
299
+ }
300
+ },
301
+ {
302
+ "const": false
303
+ }
304
+ ]
305
+ },
306
+ "thinking": {
307
+ "oneOf": [
308
+ {
309
+ "type": "string",
310
+ "minLength": 1
311
+ },
312
+ {
313
+ "const": false
314
+ }
315
+ ]
316
+ },
317
+ "tools": {
318
+ "type": "array",
319
+ "items": {
320
+ "type": "string",
321
+ "minLength": 1
322
+ }
323
+ }
144
324
  }
145
325
  }
146
326
  }
@@ -151,20 +331,93 @@
151
331
  "additionalProperties": false,
152
332
  "description": "Pi UI settings for the crew widget, dashboard, and optional powerbar segments.",
153
333
  "properties": {
154
- "widgetPlacement": { "type": "string", "enum": ["aboveEditor", "belowEditor"] },
155
- "widgetMaxLines": { "type": "integer", "minimum": 1, "maximum": 50 },
156
- "powerbar": { "type": "boolean" },
157
- "dashboardPlacement": { "type": "string", "enum": ["center", "right"], "default": "right", "description": "Place /team-dashboard as a centered overlay or right-side panel." },
158
- "dashboardWidth": { "type": "integer", "minimum": 32, "maximum": 120, "default": 56 },
159
- "dashboardLiveRefreshMs": { "type": "integer", "minimum": 250, "maximum": 60000, "default": 1000 },
160
- "autoOpenDashboard": { "type": "boolean", "default": false, "description": "Opt in to automatically opening the live right sidebar for foreground runs when UI is available. Disabled by default because Pi overlays are modal in some terminals." },
161
- "autoOpenDashboardForForegroundRuns": { "type": "boolean", "default": true },
162
- "showModel": { "type": "boolean", "default": true, "description": "Show worker model attempts in dashboard agent rows." },
163
- "showTokens": { "type": "boolean", "description": "Show token usage in dashboard agent rows." },
164
- "showTools": { "type": "boolean", "description": "Show tool activity in dashboard agent rows." },
165
- "transcriptTailBytes": { "type": "integer", "minimum": 1024, "maximum": 52428800, "default": 262144, "description": "Maximum transcript bytes to parse by default; use viewer hotkey f to load full content." },
166
- "mascotStyle": { "type": "string", "enum": ["cat", "armin"] },
167
- "mascotEffect": { "type": "string", "enum": ["random", "none", "typewriter", "scanline", "rain", "fade", "crt", "glitch", "dissolve"] }
334
+ "widgetPlacement": {
335
+ "type": "string",
336
+ "enum": [
337
+ "aboveEditor",
338
+ "belowEditor",
339
+ "bottom"
340
+ ]
341
+ },
342
+ "widgetMaxLines": {
343
+ "type": "integer",
344
+ "minimum": 1,
345
+ "maximum": 50
346
+ },
347
+ "powerbar": {
348
+ "type": "boolean"
349
+ },
350
+ "dashboardPlacement": {
351
+ "type": "string",
352
+ "enum": [
353
+ "center",
354
+ "right"
355
+ ],
356
+ "default": "right",
357
+ "description": "Place /team-dashboard as a centered overlay or right-side panel."
358
+ },
359
+ "dashboardWidth": {
360
+ "type": "integer",
361
+ "minimum": 32,
362
+ "maximum": 120,
363
+ "default": 56
364
+ },
365
+ "dashboardLiveRefreshMs": {
366
+ "type": "integer",
367
+ "minimum": 250,
368
+ "maximum": 60000,
369
+ "default": 1000
370
+ },
371
+ "autoOpenDashboard": {
372
+ "type": "boolean",
373
+ "default": false,
374
+ "description": "Opt in to automatically opening the live right sidebar for foreground runs when UI is available. Disabled by default because Pi overlays are modal in some terminals."
375
+ },
376
+ "autoOpenDashboardForForegroundRuns": {
377
+ "type": "boolean",
378
+ "default": true
379
+ },
380
+ "showModel": {
381
+ "type": "boolean",
382
+ "default": true,
383
+ "description": "Show worker model attempts in dashboard agent rows."
384
+ },
385
+ "showTokens": {
386
+ "type": "boolean",
387
+ "description": "Show token usage in dashboard agent rows."
388
+ },
389
+ "showTools": {
390
+ "type": "boolean",
391
+ "description": "Show tool activity in dashboard agent rows."
392
+ },
393
+ "transcriptTailBytes": {
394
+ "type": "integer",
395
+ "minimum": 1024,
396
+ "maximum": 52428800,
397
+ "default": 262144,
398
+ "description": "Maximum transcript bytes to parse by default; use viewer hotkey f to load full content."
399
+ },
400
+ "mascotStyle": {
401
+ "type": "string",
402
+ "enum": [
403
+ "cat",
404
+ "armin"
405
+ ]
406
+ },
407
+ "mascotEffect": {
408
+ "type": "string",
409
+ "enum": [
410
+ "random",
411
+ "none",
412
+ "typewriter",
413
+ "scanline",
414
+ "rain",
415
+ "fade",
416
+ "crt",
417
+ "glitch",
418
+ "dissolve"
419
+ ]
420
+ }
168
421
  }
169
422
  },
170
423
  "tools": {
@@ -172,9 +425,19 @@
172
425
  "additionalProperties": false,
173
426
  "description": "Public tool registration and foreground result behavior.",
174
427
  "properties": {
175
- "enableClaudeStyleAliases": { "type": "boolean", "default": true },
176
- "enableSteer": { "type": "boolean", "default": true },
177
- "terminateOnForeground": { "type": "boolean", "default": false, "description": "Opt in to returning terminate:true from foreground Agent/crew_agent calls after the child result is available." }
428
+ "enableClaudeStyleAliases": {
429
+ "type": "boolean",
430
+ "default": true
431
+ },
432
+ "enableSteer": {
433
+ "type": "boolean",
434
+ "default": true
435
+ },
436
+ "terminateOnForeground": {
437
+ "type": "boolean",
438
+ "default": false,
439
+ "description": "Opt in to returning terminate:true from foreground Agent/crew_agent calls after the child result is available."
440
+ }
178
441
  }
179
442
  },
180
443
  "telemetry": {
@@ -182,7 +445,10 @@
182
445
  "additionalProperties": false,
183
446
  "description": "Pi-crew telemetry event controls.",
184
447
  "properties": {
185
- "enabled": { "type": "boolean", "default": true }
448
+ "enabled": {
449
+ "type": "boolean",
450
+ "default": true
451
+ }
186
452
  }
187
453
  },
188
454
  "policy": {
@@ -190,7 +456,11 @@
190
456
  "additionalProperties": false,
191
457
  "description": "Operator policy gates for high-risk pi-crew actions.",
192
458
  "properties": {
193
- "requireIntentForDestructiveActions": { "type": "boolean", "default": false, "description": "Require config.intent or config._intent for destructive actions such as cancel, delete, forget, prune, and forced cleanup." }
459
+ "requireIntentForDestructiveActions": {
460
+ "type": "boolean",
461
+ "default": false,
462
+ "description": "Require config.intent or config._intent for destructive actions such as cancel, delete, forget, prune, and forced cleanup."
463
+ }
194
464
  }
195
465
  },
196
466
  "notifications": {
@@ -198,12 +468,48 @@
198
468
  "additionalProperties": false,
199
469
  "description": "Operator notification routing, quiet-hours, batching, and JSONL sink settings.",
200
470
  "properties": {
201
- "enabled": { "type": "boolean", "default": true },
202
- "severityFilter": { "type": "array", "items": { "type": "string", "enum": ["info", "warning", "error", "critical"] }, "default": ["warning", "error", "critical"] },
203
- "dedupWindowMs": { "type": "integer", "minimum": 1000, "default": 30000 },
204
- "batchWindowMs": { "type": "integer", "minimum": 0, "default": 0 },
205
- "quietHours": { "type": "string", "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$", "description": "Local HH:MM-HH:MM quiet-hours range; supports cross-day ranges such as 22:00-07:00." },
206
- "sinkRetentionDays": { "type": "integer", "minimum": 1, "maximum": 90, "default": 7 }
471
+ "enabled": {
472
+ "type": "boolean",
473
+ "default": true
474
+ },
475
+ "severityFilter": {
476
+ "type": "array",
477
+ "items": {
478
+ "type": "string",
479
+ "enum": [
480
+ "info",
481
+ "warning",
482
+ "error",
483
+ "critical"
484
+ ]
485
+ },
486
+ "default": [
487
+ "warning",
488
+ "error",
489
+ "critical"
490
+ ]
491
+ },
492
+ "dedupWindowMs": {
493
+ "type": "integer",
494
+ "minimum": 1000,
495
+ "default": 30000
496
+ },
497
+ "batchWindowMs": {
498
+ "type": "integer",
499
+ "minimum": 0,
500
+ "default": 0
501
+ },
502
+ "quietHours": {
503
+ "type": "string",
504
+ "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$",
505
+ "description": "Local HH:MM-HH:MM quiet-hours range; supports cross-day ranges such as 22:00-07:00."
506
+ },
507
+ "sinkRetentionDays": {
508
+ "type": "integer",
509
+ "minimum": 1,
510
+ "maximum": 90,
511
+ "default": 7
512
+ }
207
513
  }
208
514
  },
209
515
  "observability": {
@@ -211,9 +517,22 @@
211
517
  "additionalProperties": false,
212
518
  "description": "Metric registry, heartbeat watcher, and metric file sink settings.",
213
519
  "properties": {
214
- "enabled": { "type": "boolean", "default": true },
215
- "pollIntervalMs": { "type": "integer", "minimum": 1000, "maximum": 60000, "default": 5000 },
216
- "metricRetentionDays": { "type": "integer", "minimum": 1, "maximum": 365, "default": 7 }
520
+ "enabled": {
521
+ "type": "boolean",
522
+ "default": true
523
+ },
524
+ "pollIntervalMs": {
525
+ "type": "integer",
526
+ "minimum": 1000,
527
+ "maximum": 60000,
528
+ "default": 5000
529
+ },
530
+ "metricRetentionDays": {
531
+ "type": "integer",
532
+ "minimum": 1,
533
+ "maximum": 365,
534
+ "default": 7
535
+ }
217
536
  }
218
537
  },
219
538
  "reliability": {
@@ -221,18 +540,54 @@
221
540
  "additionalProperties": false,
222
541
  "description": "Opt-in reliability controls for retry, recovery, and deadletter handling.",
223
542
  "properties": {
224
- "autoRetry": { "type": "boolean", "default": false },
225
- "autoRecover": { "type": "boolean", "default": false },
226
- "deadletterThreshold": { "type": "integer", "minimum": 1, "default": 3 },
543
+ "autoRetry": {
544
+ "type": "boolean",
545
+ "default": false
546
+ },
547
+ "autoRecover": {
548
+ "type": "boolean",
549
+ "default": false
550
+ },
551
+ "deadletterThreshold": {
552
+ "type": "integer",
553
+ "minimum": 1,
554
+ "default": 3
555
+ },
227
556
  "retryPolicy": {
228
557
  "type": "object",
229
558
  "additionalProperties": false,
230
559
  "properties": {
231
- "maxAttempts": { "type": "integer", "minimum": 1, "maximum": 10, "default": 3 },
232
- "backoffMs": { "type": "integer", "minimum": 100, "maximum": 60000, "default": 1000 },
233
- "jitterRatio": { "type": "number", "minimum": 0, "maximum": 1, "default": 0.3 },
234
- "exponentialFactor": { "type": "number", "minimum": 1, "maximum": 5, "default": 2 },
235
- "retryableErrors": { "type": "array", "items": { "type": "string", "minLength": 1 } }
560
+ "maxAttempts": {
561
+ "type": "integer",
562
+ "minimum": 1,
563
+ "maximum": 10,
564
+ "default": 3
565
+ },
566
+ "backoffMs": {
567
+ "type": "integer",
568
+ "minimum": 100,
569
+ "maximum": 60000,
570
+ "default": 1000
571
+ },
572
+ "jitterRatio": {
573
+ "type": "number",
574
+ "minimum": 0,
575
+ "maximum": 1,
576
+ "default": 0.3
577
+ },
578
+ "exponentialFactor": {
579
+ "type": "number",
580
+ "minimum": 1,
581
+ "maximum": 5,
582
+ "default": 2
583
+ },
584
+ "retryableErrors": {
585
+ "type": "array",
586
+ "items": {
587
+ "type": "string",
588
+ "minLength": 1
589
+ }
590
+ }
236
591
  }
237
592
  }
238
593
  }
@@ -242,10 +597,25 @@
242
597
  "additionalProperties": false,
243
598
  "description": "Optional OpenTelemetry metric export. Disabled by default.",
244
599
  "properties": {
245
- "enabled": { "type": "boolean", "default": false },
246
- "endpoint": { "type": "string", "minLength": 1 },
247
- "headers": { "type": "object", "additionalProperties": { "type": "string" } },
248
- "intervalMs": { "type": "integer", "minimum": 5000, "default": 60000 }
600
+ "enabled": {
601
+ "type": "boolean",
602
+ "default": false
603
+ },
604
+ "endpoint": {
605
+ "type": "string",
606
+ "minLength": 1
607
+ },
608
+ "headers": {
609
+ "type": "object",
610
+ "additionalProperties": {
611
+ "type": "string"
612
+ }
613
+ },
614
+ "intervalMs": {
615
+ "type": "integer",
616
+ "minimum": 5000,
617
+ "default": 60000
618
+ }
249
619
  }
250
620
  },
251
621
  "broker": {
@@ -253,10 +623,24 @@
253
623
  "additionalProperties": false,
254
624
  "description": "Phase 0 inter-pi broker config for cross-process communication.",
255
625
  "properties": {
256
- "enabled": { "type": "boolean" },
257
- "pathHashLen": { "type": "integer", "minimum": 4, "maximum": 32 },
258
- "maxFrameBytes": { "type": "integer", "minimum": 1024, "maximum": 1048576 },
259
- "outboundQueueCap": { "type": "integer", "minimum": 32, "maximum": 4096 },
626
+ "enabled": {
627
+ "type": "boolean"
628
+ },
629
+ "pathHashLen": {
630
+ "type": "integer",
631
+ "minimum": 4,
632
+ "maximum": 32
633
+ },
634
+ "maxFrameBytes": {
635
+ "type": "integer",
636
+ "minimum": 1024,
637
+ "maximum": 1048576
638
+ },
639
+ "outboundQueueCap": {
640
+ "type": "integer",
641
+ "minimum": 32,
642
+ "maximum": 4096
643
+ },
260
644
  "waitMethodsEnabled": {
261
645
  "type": "boolean",
262
646
  "description": "WP-2/R2 (ADR-0 2026-08-17-waiting-producer-ask item 7): gate for the broker wait.* methods. Default false - fail-closed."
@@ -268,10 +652,24 @@
268
652
  "additionalProperties": false,
269
653
  "description": "Governed nesting (ADR-5 docs/decisions/2026-08-17-governed-nesting.md). Worker-to-grandchild delegation via the delegate tool. Default false - fail-closed until WP-5 completes.",
270
654
  "properties": {
271
- "enabled": { "type": "boolean", "sensitive": true, "description": "Master switch. Privilege-raising: user config only; project-level nesting.enabled is ignored." },
272
- "maxSlots": { "type": "integer", "minimum": 1, "maximum": 64, "description": "Nested-slot budget override. Default max(1, floor(globalSem/2))." },
273
- "maxDepth": { "type": "integer", "minimum": 1, "maximum": 10, "description": "Max crew depth for delegate-driven nesting. Default 2 (mirrors PI_CREW_MAX_DEPTH clamp)." }
655
+ "enabled": {
656
+ "type": "boolean",
657
+ "sensitive": true,
658
+ "description": "Master switch. Privilege-raising: user config only; project-level nesting.enabled is ignored."
659
+ },
660
+ "maxSlots": {
661
+ "type": "integer",
662
+ "minimum": 1,
663
+ "maximum": 64,
664
+ "description": "Nested-slot budget override. Default max(1, floor(globalSem/2))."
665
+ },
666
+ "maxDepth": {
667
+ "type": "integer",
668
+ "minimum": 1,
669
+ "maximum": 10,
670
+ "description": "Max crew depth for delegate-driven nesting. Default 2 (mirrors PI_CREW_MAX_DEPTH clamp)."
671
+ }
274
672
  }
275
673
  }
276
674
  }
277
- }
675
+ }