@virtengine/openfleet 0.25.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.
Files changed (120) hide show
  1. package/.env.example +914 -0
  2. package/LICENSE +190 -0
  3. package/README.md +500 -0
  4. package/agent-endpoint.mjs +918 -0
  5. package/agent-hook-bridge.mjs +230 -0
  6. package/agent-hooks.mjs +1188 -0
  7. package/agent-pool.mjs +2403 -0
  8. package/agent-prompts.mjs +689 -0
  9. package/agent-sdk.mjs +141 -0
  10. package/anomaly-detector.mjs +1195 -0
  11. package/autofix.mjs +1294 -0
  12. package/claude-shell.mjs +708 -0
  13. package/cli.mjs +906 -0
  14. package/codex-config.mjs +1274 -0
  15. package/codex-model-profiles.mjs +135 -0
  16. package/codex-shell.mjs +762 -0
  17. package/config-doctor.mjs +613 -0
  18. package/config.mjs +1720 -0
  19. package/conflict-resolver.mjs +248 -0
  20. package/container-runner.mjs +450 -0
  21. package/copilot-shell.mjs +827 -0
  22. package/daemon-restart-policy.mjs +56 -0
  23. package/diff-stats.mjs +282 -0
  24. package/error-detector.mjs +829 -0
  25. package/fetch-runtime.mjs +34 -0
  26. package/fleet-coordinator.mjs +838 -0
  27. package/get-telegram-chat-id.mjs +71 -0
  28. package/git-safety.mjs +170 -0
  29. package/github-reconciler.mjs +403 -0
  30. package/hook-profiles.mjs +651 -0
  31. package/kanban-adapter.mjs +4491 -0
  32. package/lib/logger.mjs +645 -0
  33. package/maintenance.mjs +828 -0
  34. package/merge-strategy.mjs +1171 -0
  35. package/monitor.mjs +12207 -0
  36. package/openfleet.config.example.json +115 -0
  37. package/openfleet.schema.json +465 -0
  38. package/package.json +203 -0
  39. package/postinstall.mjs +187 -0
  40. package/pr-cleanup-daemon.mjs +978 -0
  41. package/preflight.mjs +408 -0
  42. package/prepublish-check.mjs +90 -0
  43. package/presence.mjs +328 -0
  44. package/primary-agent.mjs +282 -0
  45. package/publish.mjs +151 -0
  46. package/repo-root.mjs +29 -0
  47. package/restart-controller.mjs +100 -0
  48. package/review-agent.mjs +557 -0
  49. package/rotate-agent-logs.sh +133 -0
  50. package/sdk-conflict-resolver.mjs +973 -0
  51. package/session-tracker.mjs +880 -0
  52. package/setup.mjs +3937 -0
  53. package/shared-knowledge.mjs +410 -0
  54. package/shared-state-manager.mjs +841 -0
  55. package/shared-workspace-cli.mjs +199 -0
  56. package/shared-workspace-registry.mjs +537 -0
  57. package/shared-workspaces.json +18 -0
  58. package/startup-service.mjs +1070 -0
  59. package/sync-engine.mjs +1063 -0
  60. package/task-archiver.mjs +801 -0
  61. package/task-assessment.mjs +550 -0
  62. package/task-claims.mjs +924 -0
  63. package/task-complexity.mjs +581 -0
  64. package/task-executor.mjs +5111 -0
  65. package/task-store.mjs +753 -0
  66. package/telegram-bot.mjs +9281 -0
  67. package/telegram-sentinel.mjs +2010 -0
  68. package/ui/app.js +867 -0
  69. package/ui/app.legacy.js +1464 -0
  70. package/ui/app.monolith.js +2488 -0
  71. package/ui/components/charts.js +226 -0
  72. package/ui/components/chat-view.js +567 -0
  73. package/ui/components/command-palette.js +587 -0
  74. package/ui/components/diff-viewer.js +190 -0
  75. package/ui/components/forms.js +327 -0
  76. package/ui/components/kanban-board.js +451 -0
  77. package/ui/components/session-list.js +305 -0
  78. package/ui/components/shared.js +473 -0
  79. package/ui/index.html +70 -0
  80. package/ui/modules/api.js +297 -0
  81. package/ui/modules/icons.js +461 -0
  82. package/ui/modules/router.js +81 -0
  83. package/ui/modules/settings-schema.js +261 -0
  84. package/ui/modules/state.js +679 -0
  85. package/ui/modules/telegram.js +331 -0
  86. package/ui/modules/utils.js +270 -0
  87. package/ui/styles/animations.css +140 -0
  88. package/ui/styles/base.css +98 -0
  89. package/ui/styles/components.css +1915 -0
  90. package/ui/styles/kanban.css +286 -0
  91. package/ui/styles/layout.css +809 -0
  92. package/ui/styles/sessions.css +827 -0
  93. package/ui/styles/variables.css +188 -0
  94. package/ui/styles.css +141 -0
  95. package/ui/styles.monolith.css +1046 -0
  96. package/ui/tabs/agents.js +1417 -0
  97. package/ui/tabs/chat.js +74 -0
  98. package/ui/tabs/control.js +887 -0
  99. package/ui/tabs/dashboard.js +515 -0
  100. package/ui/tabs/infra.js +537 -0
  101. package/ui/tabs/logs.js +783 -0
  102. package/ui/tabs/settings.js +1487 -0
  103. package/ui/tabs/tasks.js +1385 -0
  104. package/ui-server.mjs +4073 -0
  105. package/update-check.mjs +465 -0
  106. package/utils.mjs +172 -0
  107. package/ve-kanban.mjs +654 -0
  108. package/ve-kanban.ps1 +1365 -0
  109. package/ve-kanban.sh +18 -0
  110. package/ve-orchestrator.mjs +340 -0
  111. package/ve-orchestrator.ps1 +6546 -0
  112. package/ve-orchestrator.sh +18 -0
  113. package/vibe-kanban-wrapper.mjs +41 -0
  114. package/vk-error-resolver.mjs +470 -0
  115. package/vk-log-stream.mjs +914 -0
  116. package/whatsapp-channel.mjs +520 -0
  117. package/workspace-monitor.mjs +581 -0
  118. package/workspace-reaper.mjs +405 -0
  119. package/workspace-registry.mjs +238 -0
  120. package/worktree-manager.mjs +1266 -0
@@ -0,0 +1,115 @@
1
+ {
2
+ "$schema": "./openfleet.schema.json",
3
+ "projectName": "my-project",
4
+ "primaryAgent": "codex-sdk",
5
+ "kanban": {
6
+ "backend": "vk"
7
+ },
8
+ "internalExecutor": {
9
+ "mode": "vk"
10
+ },
11
+ "auth": {
12
+ "copilot": {
13
+ "sources": ["env", "cli"],
14
+ "fallbackToInteractive": false
15
+ },
16
+ "claude": {
17
+ "sources": ["env", "cli"],
18
+ "fallbackToInteractive": false
19
+ },
20
+ "codex": {
21
+ "sources": ["config"],
22
+ "fallbackToInteractive": true
23
+ }
24
+ },
25
+ "interactiveShellEnabled": false,
26
+ "executors": [
27
+ {
28
+ "name": "codex-default",
29
+ "executor": "CODEX",
30
+ "variant": "DEFAULT",
31
+ "weight": 100,
32
+ "role": "primary"
33
+ }
34
+ ],
35
+ "failover": {
36
+ "strategy": "weighted-random",
37
+ "maxRetries": 3,
38
+ "cooldownMinutes": 5,
39
+ "disableOnConsecutiveFailures": 3
40
+ },
41
+ "distribution": "primary-only",
42
+ "repositories": [
43
+ {
44
+ "name": "my-project",
45
+ "slug": "org/my-project",
46
+ "primary": true
47
+ }
48
+ ],
49
+ "agentPrompts": {
50
+ "orchestrator": ".openfleet/agents/orchestrator.md",
51
+ "planner": ".openfleet/agents/task-planner.md",
52
+ "monitorMonitor": ".openfleet/agents/monitor-monitor.md",
53
+ "taskExecutor": ".openfleet/agents/task-executor.md",
54
+ "taskExecutorRetry": ".openfleet/agents/task-executor-retry.md",
55
+ "taskExecutorContinueHasCommits": ".openfleet/agents/task-executor-continue-has-commits.md",
56
+ "taskExecutorContinueHasEdits": ".openfleet/agents/task-executor-continue-has-edits.md",
57
+ "taskExecutorContinueNoProgress": ".openfleet/agents/task-executor-continue-no-progress.md",
58
+ "reviewer": ".openfleet/agents/reviewer.md",
59
+ "conflictResolver": ".openfleet/agents/conflict-resolver.md",
60
+ "sdkConflictResolver": ".openfleet/agents/sdk-conflict-resolver.md",
61
+ "mergeStrategy": ".openfleet/agents/merge-strategy.md",
62
+ "mergeStrategyFix": ".openfleet/agents/merge-strategy-fix.md",
63
+ "mergeStrategyReAttempt": ".openfleet/agents/merge-strategy-reattempt.md",
64
+ "autofixFix": ".openfleet/agents/autofix-fix.md",
65
+ "autofixFallback": ".openfleet/agents/autofix-fallback.md",
66
+ "autofixLoop": ".openfleet/agents/autofix-loop.md",
67
+ "monitorCrashFix": ".openfleet/agents/monitor-crash-fix.md",
68
+ "monitorRestartLoopFix": ".openfleet/agents/monitor-restart-loop-fix.md"
69
+ },
70
+ "hookProfiles": {
71
+ "enabled": true,
72
+ "profile": "strict",
73
+ "targets": ["codex", "claude", "copilot"],
74
+ "overwriteExisting": false
75
+ },
76
+ "complexityRouting": {
77
+ "enabled": true,
78
+ "models": {
79
+ "CODEX": {
80
+ "low": {
81
+ "model": "gpt-5.1-codex-mini",
82
+ "variant": "GPT51_CODEX_MINI",
83
+ "reasoningEffort": "low"
84
+ },
85
+ "medium": {
86
+ "model": "gpt-5.2-codex",
87
+ "variant": "DEFAULT",
88
+ "reasoningEffort": "medium"
89
+ },
90
+ "high": {
91
+ "model": "gpt-5.1-codex-max",
92
+ "variant": "GPT51_CODEX_MAX",
93
+ "reasoningEffort": "high"
94
+ }
95
+ },
96
+ "COPILOT": {
97
+ "low": {
98
+ "model": "haiku-4.5",
99
+ "variant": "CLAUDE_HAIKU_4_5",
100
+ "reasoningEffort": "low"
101
+ },
102
+ "medium": {
103
+ "model": "sonnet-4.5",
104
+ "variant": "CLAUDE_SONNET_4_5",
105
+ "reasoningEffort": "medium"
106
+ },
107
+ "high": {
108
+ "model": "opus-4.6",
109
+ "variant": "CLAUDE_OPUS_4_6",
110
+ "reasoningEffort": "high"
111
+ }
112
+ }
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,465 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "openfleet config",
4
+ "type": "object",
5
+ "additionalProperties": true,
6
+ "properties": {
7
+ "$schema": { "type": "string" },
8
+ "projectName": { "type": "string" },
9
+ "mode": {
10
+ "type": "string",
11
+ "enum": ["virtengine", "generic"]
12
+ },
13
+ "orchestratorScript": { "type": "string" },
14
+ "orchestratorArgs": { "type": "string" },
15
+ "logDir": { "type": "string" },
16
+ "logMaxSizeMb": {
17
+ "type": "number",
18
+ "description": "Max total log folder size in MB. 0 = unlimited.",
19
+ "default": 500
20
+ },
21
+ "logCleanupIntervalMin": {
22
+ "type": "number",
23
+ "description": "How often to check log folder size (minutes). 0 = startup only.",
24
+ "default": 30
25
+ },
26
+ "telegramVerbosity": {
27
+ "type": "string",
28
+ "enum": ["minimal", "summary", "detailed"],
29
+ "description": "Notification verbosity: minimal (critical+error), summary (default), detailed (everything)",
30
+ "default": "summary"
31
+ },
32
+ "watchPath": { "type": "string" },
33
+ "watchEnabled": { "type": "boolean" },
34
+ "echoLogs": { "type": "boolean" },
35
+ "autoFixEnabled": { "type": "boolean" },
36
+ "interactiveShellEnabled": { "type": "boolean" },
37
+ "shellEnabled": { "type": "boolean" },
38
+ "codexEnabled": { "type": "boolean" },
39
+ "primaryAgent": {
40
+ "type": "string",
41
+ "enum": ["codex-sdk", "copilot-sdk", "claude-sdk"]
42
+ },
43
+ "vkSpawnEnabled": { "type": "boolean" },
44
+ "kanban": {
45
+ "type": "object",
46
+ "additionalProperties": false,
47
+ "properties": {
48
+ "backend": {
49
+ "type": "string",
50
+ "enum": ["internal", "vk", "github", "jira"]
51
+ },
52
+ "projectId": { "type": "string" },
53
+ "github": {
54
+ "type": "object",
55
+ "additionalProperties": false,
56
+ "properties": {
57
+ "project": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "description": "GitHub Projects v2 integration settings",
61
+ "properties": {
62
+ "mode": {
63
+ "type": "string",
64
+ "enum": ["issues", "kanban"],
65
+ "default": "issues",
66
+ "description": "Task source mode: 'issues' for repo issues only, 'kanban' for project board sync"
67
+ },
68
+ "owner": {
69
+ "type": "string",
70
+ "description": "GitHub org/user that owns the project board"
71
+ },
72
+ "number": {
73
+ "type": ["string", "number"],
74
+ "description": "GitHub project number"
75
+ },
76
+ "title": {
77
+ "type": "string",
78
+ "description": "Project title for auto-detection"
79
+ },
80
+ "autoSync": {
81
+ "type": "boolean",
82
+ "default": true,
83
+ "description": "Auto-sync task status to project board Status field"
84
+ },
85
+ "statusMapping": {
86
+ "type": "object",
87
+ "additionalProperties": false,
88
+ "description": "Map internal statuses to project board column names",
89
+ "properties": {
90
+ "todo": { "type": "string", "default": "Todo" },
91
+ "inprogress": { "type": "string", "default": "In Progress" },
92
+ "inreview": { "type": "string", "default": "In Review" },
93
+ "done": { "type": "string", "default": "Done" },
94
+ "cancelled": { "type": "string", "default": "Cancelled" }
95
+ }
96
+ },
97
+ "webhook": {
98
+ "type": "object",
99
+ "additionalProperties": false,
100
+ "description": "GitHub project webhook settings for near-real-time sync triggers",
101
+ "properties": {
102
+ "path": {
103
+ "type": "string",
104
+ "description": "HTTP path exposed by ui-server for GitHub webhook deliveries"
105
+ },
106
+ "secret": {
107
+ "type": "string",
108
+ "description": "Shared secret used to validate X-Hub-Signature-256"
109
+ },
110
+ "requireSignature": {
111
+ "type": "boolean",
112
+ "description": "Require a valid webhook signature before accepting payloads"
113
+ }
114
+ }
115
+ },
116
+ "syncMonitoring": {
117
+ "type": "object",
118
+ "additionalProperties": false,
119
+ "description": "Monitoring and alert thresholds for project-sync failures and rate-limits",
120
+ "properties": {
121
+ "alertFailureThreshold": {
122
+ "type": "number",
123
+ "description": "Consecutive webhook/sync failures that trigger an alert",
124
+ "default": 3
125
+ },
126
+ "rateLimitAlertThreshold": {
127
+ "type": "number",
128
+ "description": "Rate-limit events counted before triggering an alert",
129
+ "default": 3
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ },
137
+ "jira": {
138
+ "type": "object",
139
+ "additionalProperties": false,
140
+ "properties": {
141
+ "baseUrl": {
142
+ "type": "string",
143
+ "description": "Jira Cloud base URL (e.g. https://your-domain.atlassian.net)"
144
+ },
145
+ "email": {
146
+ "type": "string",
147
+ "description": "Jira account email used for API authentication"
148
+ },
149
+ "apiToken": {
150
+ "type": "string",
151
+ "description": "Jira API token used for Basic authentication"
152
+ },
153
+ "projectKey": {
154
+ "type": "string",
155
+ "description": "Default Jira project key used for list/create operations"
156
+ },
157
+ "issueType": {
158
+ "type": "string",
159
+ "default": "Task",
160
+ "description": "Default Jira issue type for new tasks"
161
+ },
162
+ "statusMapping": {
163
+ "type": "object",
164
+ "additionalProperties": false,
165
+ "description": "Map internal statuses to Jira workflow status names",
166
+ "properties": {
167
+ "todo": { "type": "string", "default": "To Do" },
168
+ "inprogress": { "type": "string", "default": "In Progress" },
169
+ "inreview": { "type": "string", "default": "In Review" },
170
+ "done": { "type": "string", "default": "Done" },
171
+ "cancelled": { "type": "string", "default": "Cancelled" }
172
+ }
173
+ },
174
+ "labels": {
175
+ "type": "object",
176
+ "additionalProperties": false,
177
+ "description": "Jira labels used to mark codex shared-state lifecycle",
178
+ "properties": {
179
+ "claimed": { "type": "string", "default": "codex:claimed" },
180
+ "working": { "type": "string", "default": "codex:working" },
181
+ "stale": { "type": "string", "default": "codex:stale" },
182
+ "ignore": { "type": "string", "default": "codex:ignore" }
183
+ }
184
+ },
185
+ "sharedStateFields": {
186
+ "type": "object",
187
+ "additionalProperties": false,
188
+ "description": "Custom field IDs used to persist shared-state payload",
189
+ "properties": {
190
+ "ownerId": {
191
+ "type": "string",
192
+ "description": "Custom field ID for sharedState.ownerId"
193
+ },
194
+ "attemptToken": {
195
+ "type": "string",
196
+ "description": "Custom field ID for sharedState.attemptToken"
197
+ },
198
+ "attemptStarted": {
199
+ "type": "string",
200
+ "description": "Custom field ID for sharedState.attemptStarted (ISO timestamp)"
201
+ },
202
+ "heartbeat": {
203
+ "type": "string",
204
+ "description": "Custom field ID for sharedState.heartbeat (ISO timestamp)"
205
+ },
206
+ "retryCount": {
207
+ "type": "string",
208
+ "description": "Custom field ID for sharedState.retryCount"
209
+ },
210
+ "ignoreReason": {
211
+ "type": "string",
212
+ "description": "Optional custom field ID for ignore reason"
213
+ }
214
+ }
215
+ }
216
+ }
217
+ }
218
+ }
219
+ },
220
+ "plannerMode": {
221
+ "type": "string",
222
+ "enum": ["codex-sdk", "kanban", "disabled"]
223
+ },
224
+ "defaultRepository": { "type": "string" },
225
+ "repositoryDefaults": { "$ref": "#/$defs/repositoryDefaults" },
226
+ "repositories": {
227
+ "oneOf": [
228
+ {
229
+ "type": "array",
230
+ "items": { "$ref": "#/$defs/repository" }
231
+ },
232
+ {
233
+ "type": "object",
234
+ "additionalProperties": true,
235
+ "properties": {
236
+ "default": { "type": "string" },
237
+ "defaults": { "$ref": "#/$defs/repositoryDefaults" },
238
+ "items": {
239
+ "type": "array",
240
+ "items": { "$ref": "#/$defs/repository" }
241
+ },
242
+ "list": {
243
+ "type": "array",
244
+ "items": { "$ref": "#/$defs/repository" }
245
+ }
246
+ }
247
+ }
248
+ ]
249
+ },
250
+ "profiles": { "$ref": "#/$defs/profiles" },
251
+ "envProfiles": { "$ref": "#/$defs/profiles" },
252
+ "executors": {
253
+ "type": "array",
254
+ "items": { "$ref": "#/$defs/executor" }
255
+ },
256
+ "failover": { "$ref": "#/$defs/failover" },
257
+ "distribution": {
258
+ "type": "string",
259
+ "enum": ["weighted", "round-robin", "primary-only"]
260
+ },
261
+ "agentPrompts": {
262
+ "type": "object",
263
+ "additionalProperties": false,
264
+ "properties": {
265
+ "orchestrator": { "type": "string" },
266
+ "planner": { "type": "string" },
267
+ "monitorMonitor": { "type": "string" },
268
+ "taskExecutor": { "type": "string" },
269
+ "taskExecutorRetry": { "type": "string" },
270
+ "taskExecutorContinueHasCommits": { "type": "string" },
271
+ "taskExecutorContinueHasEdits": { "type": "string" },
272
+ "taskExecutorContinueNoProgress": { "type": "string" },
273
+ "reviewer": { "type": "string" },
274
+ "conflictResolver": { "type": "string" },
275
+ "sdkConflictResolver": { "type": "string" },
276
+ "mergeStrategy": { "type": "string" },
277
+ "mergeStrategyFix": { "type": "string" },
278
+ "mergeStrategyReAttempt": { "type": "string" },
279
+ "autofixFix": { "type": "string" },
280
+ "autofixFallback": { "type": "string" },
281
+ "autofixLoop": { "type": "string" },
282
+ "monitorCrashFix": { "type": "string" },
283
+ "monitorRestartLoopFix": { "type": "string" }
284
+ }
285
+ },
286
+ "hookProfiles": { "$ref": "#/$defs/hookProfiles" },
287
+ "agentHooks": { "$ref": "#/$defs/agentHooks" },
288
+ "auth": {
289
+ "type": "object",
290
+ "description": "Authentication configuration for agent SDKs",
291
+ "additionalProperties": false,
292
+ "properties": {
293
+ "copilot": {
294
+ "type": "object",
295
+ "properties": {
296
+ "sources": {
297
+ "type": "array",
298
+ "items": {
299
+ "type": "string",
300
+ "enum": ["env", "cli", "vscode", "interactive"]
301
+ },
302
+ "description": "Auth source priority: env (tokens), cli (gh auth), vscode (extension), interactive (prompt)"
303
+ },
304
+ "fallbackToInteractive": {
305
+ "type": "boolean",
306
+ "description": "Allow interactive login if all other sources fail"
307
+ }
308
+ }
309
+ },
310
+ "claude": {
311
+ "type": "object",
312
+ "properties": {
313
+ "sources": {
314
+ "type": "array",
315
+ "items": {
316
+ "type": "string",
317
+ "enum": ["env", "cli", "interactive"]
318
+ },
319
+ "description": "Auth source priority: env (API key), cli (config file), interactive (prompt)"
320
+ },
321
+ "fallbackToInteractive": {
322
+ "type": "boolean",
323
+ "description": "Allow interactive API key prompt if all other sources fail"
324
+ }
325
+ }
326
+ },
327
+ "codex": {
328
+ "type": "object",
329
+ "properties": {
330
+ "sources": {
331
+ "type": "array",
332
+ "items": {
333
+ "type": "string",
334
+ "enum": ["config", "env", "interactive"]
335
+ },
336
+ "description": "Auth source priority: config (config.toml), env (API key), interactive (prompt)"
337
+ },
338
+ "fallbackToInteractive": {
339
+ "type": "boolean",
340
+ "description": "Allow interactive configuration if all other sources fail"
341
+ }
342
+ }
343
+ }
344
+ }
345
+ }
346
+ },
347
+ "$defs": {
348
+ "executor": {
349
+ "type": "object",
350
+ "additionalProperties": false,
351
+ "properties": {
352
+ "name": { "type": "string" },
353
+ "executor": { "type": "string" },
354
+ "variant": { "type": "string" },
355
+ "weight": { "type": "number" },
356
+ "role": { "type": "string" },
357
+ "enabled": { "type": "boolean" }
358
+ }
359
+ },
360
+ "failover": {
361
+ "type": "object",
362
+ "additionalProperties": false,
363
+ "properties": {
364
+ "strategy": {
365
+ "type": "string",
366
+ "enum": ["next-in-line", "weighted-random", "round-robin"]
367
+ },
368
+ "maxRetries": { "type": "number" },
369
+ "cooldownMinutes": { "type": "number" },
370
+ "disableOnConsecutiveFailures": { "type": "number" }
371
+ }
372
+ },
373
+ "repositoryDefaults": {
374
+ "type": "object",
375
+ "additionalProperties": true,
376
+ "properties": {
377
+ "path": { "type": "string" },
378
+ "slug": { "type": "string" },
379
+ "projectName": { "type": "string" },
380
+ "orchestratorScript": { "type": "string" },
381
+ "orchestratorArgs": { "type": "string" },
382
+ "logDir": { "type": "string" },
383
+ "watchPath": { "type": "string" },
384
+ "profile": { "type": "string" },
385
+ "envProfile": { "type": "string" },
386
+ "mode": { "type": "string" }
387
+ }
388
+ },
389
+ "repository": {
390
+ "type": "object",
391
+ "additionalProperties": true,
392
+ "properties": {
393
+ "name": { "type": "string" },
394
+ "id": { "type": "string" },
395
+ "aliases": {
396
+ "type": "array",
397
+ "items": { "type": "string" }
398
+ },
399
+ "path": { "type": "string" },
400
+ "repoRoot": { "type": "string" },
401
+ "slug": { "type": "string" },
402
+ "repo": { "type": "string" },
403
+ "repoUrlBase": { "type": "string" },
404
+ "projectName": { "type": "string" },
405
+ "primary": { "type": "boolean" },
406
+ "orchestratorScript": { "type": "string" },
407
+ "orchestratorArgs": { "type": "string" },
408
+ "logDir": { "type": "string" },
409
+ "watchPath": { "type": "string" },
410
+ "profile": { "type": "string" },
411
+ "envProfile": { "type": "string" },
412
+ "mode": { "type": "string" },
413
+ "cacheDir": { "type": "string" },
414
+ "statusPath": { "type": "string" },
415
+ "telegramPollLockPath": { "type": "string" }
416
+ }
417
+ },
418
+ "profiles": {
419
+ "type": "object",
420
+ "additionalProperties": {
421
+ "type": "object",
422
+ "additionalProperties": true,
423
+ "properties": {
424
+ "description": { "type": "string" },
425
+ "env": {
426
+ "type": "object",
427
+ "additionalProperties": { "type": "string" }
428
+ },
429
+ "envFile": { "type": "string" },
430
+ "envOverride": { "type": "boolean" },
431
+ "repository": { "type": "string" },
432
+ "repo": { "type": "string" },
433
+ "defaultRepository": { "type": "string" },
434
+ "overrides": { "type": "object" },
435
+ "config": { "type": "object" },
436
+ "settings": { "type": "object" }
437
+ }
438
+ }
439
+ },
440
+ "hookProfiles": {
441
+ "type": "object",
442
+ "additionalProperties": false,
443
+ "properties": {
444
+ "enabled": { "type": "boolean" },
445
+ "profile": {
446
+ "type": "string",
447
+ "enum": ["strict", "balanced", "lightweight", "none"]
448
+ },
449
+ "targets": {
450
+ "type": "array",
451
+ "items": {
452
+ "type": "string",
453
+ "enum": ["codex", "claude", "copilot"]
454
+ }
455
+ },
456
+ "overwriteExisting": { "type": "boolean" }
457
+ }
458
+ },
459
+ "agentHooks": {
460
+ "type": "object",
461
+ "description": "Hook definitions loaded by agent-hooks.mjs (event -> hook list).",
462
+ "additionalProperties": true
463
+ }
464
+ }
465
+ }