night-orch 0.3.2 → 0.4.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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -108
  3. package/dist/cli/commands/doctor.d.ts +1 -0
  4. package/dist/cli/commands/doctor.d.ts.map +1 -1
  5. package/dist/cli/commands/doctor.js +18 -0
  6. package/dist/cli/commands/doctor.js.map +1 -1
  7. package/dist/cli/commands/monitoring.d.ts.map +1 -1
  8. package/dist/cli/commands/monitoring.js +7 -3
  9. package/dist/cli/commands/monitoring.js.map +1 -1
  10. package/dist/cli/commands/settings.d.ts.map +1 -1
  11. package/dist/cli/commands/settings.js +40 -4
  12. package/dist/cli/commands/settings.js.map +1 -1
  13. package/dist/cli/commands/status.d.ts.map +1 -1
  14. package/dist/cli/commands/status.js +26 -3
  15. package/dist/cli/commands/status.js.map +1 -1
  16. package/dist/cli/index.js +3 -2
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli/tui/app.d.ts.map +1 -1
  19. package/dist/cli/tui/app.js +52 -3
  20. package/dist/cli/tui/app.js.map +1 -1
  21. package/dist/cli/tui/header.d.ts.map +1 -1
  22. package/dist/cli/tui/header.js +2 -1
  23. package/dist/cli/tui/header.js.map +1 -1
  24. package/dist/cli/tui/settings-view.d.ts.map +1 -1
  25. package/dist/cli/tui/settings-view.js +22 -5
  26. package/dist/cli/tui/settings-view.js.map +1 -1
  27. package/dist/cli/tui/stats-view.js +2 -2
  28. package/dist/cli/tui/stats-view.js.map +1 -1
  29. package/dist/config/loader.d.ts.map +1 -1
  30. package/dist/config/loader.js +141 -13
  31. package/dist/config/loader.js.map +1 -1
  32. package/dist/config/schema.d.ts +903 -21
  33. package/dist/config/schema.d.ts.map +1 -1
  34. package/dist/config/schema.js +77 -6
  35. package/dist/config/schema.js.map +1 -1
  36. package/dist/forge/types.d.ts +7 -0
  37. package/dist/forge/types.d.ts.map +1 -1
  38. package/dist/git/repo.d.ts +8 -0
  39. package/dist/git/repo.d.ts.map +1 -1
  40. package/dist/git/repo.js +19 -0
  41. package/dist/git/repo.js.map +1 -1
  42. package/dist/git/worktree.d.ts +3 -0
  43. package/dist/git/worktree.d.ts.map +1 -1
  44. package/dist/git/worktree.js +43 -21
  45. package/dist/git/worktree.js.map +1 -1
  46. package/dist/loop/cost.d.ts +33 -8
  47. package/dist/loop/cost.d.ts.map +1 -1
  48. package/dist/loop/cost.js +250 -46
  49. package/dist/loop/cost.js.map +1 -1
  50. package/dist/loop/decision.js +3 -3
  51. package/dist/loop/decision.js.map +1 -1
  52. package/dist/loop/engine.d.ts +1 -0
  53. package/dist/loop/engine.d.ts.map +1 -1
  54. package/dist/loop/engine.js +76 -13
  55. package/dist/loop/engine.js.map +1 -1
  56. package/dist/loop/parallel.d.ts.map +1 -1
  57. package/dist/loop/parallel.js +2 -0
  58. package/dist/loop/parallel.js.map +1 -1
  59. package/dist/loop/pricing.d.ts +11 -4
  60. package/dist/loop/pricing.d.ts.map +1 -1
  61. package/dist/loop/pricing.js +62 -20
  62. package/dist/loop/pricing.js.map +1 -1
  63. package/dist/loop/progress.d.ts +24 -0
  64. package/dist/loop/progress.d.ts.map +1 -0
  65. package/dist/loop/progress.js +52 -0
  66. package/dist/loop/progress.js.map +1 -0
  67. package/dist/loop/step-executor.d.ts +4 -5
  68. package/dist/loop/step-executor.d.ts.map +1 -1
  69. package/dist/loop/step-executor.js +1 -0
  70. package/dist/loop/step-executor.js.map +1 -1
  71. package/dist/loop/types.d.ts +17 -0
  72. package/dist/loop/types.d.ts.map +1 -1
  73. package/dist/mcp/tools/admin.d.ts +29 -0
  74. package/dist/mcp/tools/admin.d.ts.map +1 -0
  75. package/dist/mcp/tools/admin.js +89 -0
  76. package/dist/mcp/tools/admin.js.map +1 -0
  77. package/dist/mcp/tools/auth.d.ts +3 -0
  78. package/dist/mcp/tools/auth.d.ts.map +1 -0
  79. package/dist/mcp/tools/auth.js +19 -0
  80. package/dist/mcp/tools/auth.js.map +1 -0
  81. package/dist/mcp/tools/index.d.ts.map +1 -1
  82. package/dist/mcp/tools/index.js +5 -533
  83. package/dist/mcp/tools/index.js.map +1 -1
  84. package/dist/mcp/tools/operations.d.ts +32 -0
  85. package/dist/mcp/tools/operations.d.ts.map +1 -0
  86. package/dist/mcp/tools/operations.js +95 -0
  87. package/dist/mcp/tools/operations.js.map +1 -0
  88. package/dist/mcp/tools/settings.d.ts +12 -0
  89. package/dist/mcp/tools/settings.d.ts.map +1 -0
  90. package/dist/mcp/tools/settings.js +58 -0
  91. package/dist/mcp/tools/settings.js.map +1 -0
  92. package/dist/mcp/tools/status.d.ts +25 -0
  93. package/dist/mcp/tools/status.d.ts.map +1 -0
  94. package/dist/mcp/tools/status.js +307 -0
  95. package/dist/mcp/tools/status.js.map +1 -0
  96. package/dist/ops/continue.js +6 -1
  97. package/dist/ops/continue.js.map +1 -1
  98. package/dist/ops/project-check.d.ts +15 -0
  99. package/dist/ops/project-check.d.ts.map +1 -0
  100. package/dist/ops/project-check.js +136 -0
  101. package/dist/ops/project-check.js.map +1 -0
  102. package/dist/ops/rebase-and-check.d.ts +2 -1
  103. package/dist/ops/rebase-and-check.d.ts.map +1 -1
  104. package/dist/ops/rebase-and-check.js +2 -2
  105. package/dist/ops/rebase-and-check.js.map +1 -1
  106. package/dist/ops/rebase.d.ts +8 -5
  107. package/dist/ops/rebase.d.ts.map +1 -1
  108. package/dist/ops/rebase.js +43 -29
  109. package/dist/ops/rebase.js.map +1 -1
  110. package/dist/runner/comment-commands.d.ts +20 -0
  111. package/dist/runner/comment-commands.d.ts.map +1 -0
  112. package/dist/runner/comment-commands.js +221 -0
  113. package/dist/runner/comment-commands.js.map +1 -0
  114. package/dist/runner/helpers.d.ts +57 -0
  115. package/dist/runner/helpers.d.ts.map +1 -0
  116. package/dist/runner/helpers.js +259 -0
  117. package/dist/runner/helpers.js.map +1 -0
  118. package/dist/runner/poller.d.ts.map +1 -1
  119. package/dist/runner/poller.js +19 -781
  120. package/dist/runner/poller.js.map +1 -1
  121. package/dist/runner/reaction-scan.d.ts +17 -0
  122. package/dist/runner/reaction-scan.d.ts.map +1 -0
  123. package/dist/runner/reaction-scan.js +33 -0
  124. package/dist/runner/reaction-scan.js.map +1 -0
  125. package/dist/runner/run-finalizer.d.ts +30 -0
  126. package/dist/runner/run-finalizer.d.ts.map +1 -0
  127. package/dist/runner/run-finalizer.js +217 -0
  128. package/dist/runner/run-finalizer.js.map +1 -0
  129. package/dist/settings/definitions/github.d.ts +3 -0
  130. package/dist/settings/definitions/github.d.ts.map +1 -0
  131. package/dist/settings/definitions/github.js +267 -0
  132. package/dist/settings/definitions/github.js.map +1 -0
  133. package/dist/settings/definitions/loop.d.ts +3 -0
  134. package/dist/settings/definitions/loop.d.ts.map +1 -0
  135. package/dist/settings/definitions/loop.js +113 -0
  136. package/dist/settings/definitions/loop.js.map +1 -0
  137. package/dist/settings/definitions/observability.d.ts +3 -0
  138. package/dist/settings/definitions/observability.d.ts.map +1 -0
  139. package/dist/settings/definitions/observability.js +74 -0
  140. package/dist/settings/definitions/observability.js.map +1 -0
  141. package/dist/settings/definitions/security.d.ts +3 -0
  142. package/dist/settings/definitions/security.d.ts.map +1 -0
  143. package/dist/settings/definitions/security.js +121 -0
  144. package/dist/settings/definitions/security.js.map +1 -0
  145. package/dist/settings/registry.d.ts +82 -6
  146. package/dist/settings/registry.d.ts.map +1 -1
  147. package/dist/settings/registry.js +301 -194
  148. package/dist/settings/registry.js.map +1 -1
  149. package/dist/settings/runtime.d.ts +5 -1
  150. package/dist/settings/runtime.d.ts.map +1 -1
  151. package/dist/settings/runtime.js +46 -9
  152. package/dist/settings/runtime.js.map +1 -1
  153. package/dist/state/db.d.ts.map +1 -1
  154. package/dist/state/db.js +2 -0
  155. package/dist/state/db.js.map +1 -1
  156. package/dist/state/migrations/020-cost-ledger.d.ts +3 -0
  157. package/dist/state/migrations/020-cost-ledger.d.ts.map +1 -0
  158. package/dist/state/migrations/020-cost-ledger.js +37 -0
  159. package/dist/state/migrations/020-cost-ledger.js.map +1 -0
  160. package/dist/state/runs.d.ts +1 -0
  161. package/dist/state/runs.d.ts.map +1 -1
  162. package/dist/state/runs.js +3 -0
  163. package/dist/state/runs.js.map +1 -1
  164. package/dist/state/stats.d.ts +20 -0
  165. package/dist/state/stats.d.ts.map +1 -1
  166. package/dist/state/stats.js +68 -8
  167. package/dist/state/stats.js.map +1 -1
  168. package/dist/utils/logger.d.ts +9 -0
  169. package/dist/utils/logger.d.ts.map +1 -1
  170. package/dist/utils/logger.js +13 -0
  171. package/dist/utils/logger.js.map +1 -1
  172. package/dist/web/routes/api-events.d.ts +10 -0
  173. package/dist/web/routes/api-events.d.ts.map +1 -0
  174. package/dist/web/routes/api-events.js +251 -0
  175. package/dist/web/routes/api-events.js.map +1 -0
  176. package/dist/web/routes/api-operations.d.ts +3 -0
  177. package/dist/web/routes/api-operations.d.ts.map +1 -0
  178. package/dist/web/routes/api-operations.js +371 -0
  179. package/dist/web/routes/api-operations.js.map +1 -0
  180. package/dist/web/routes/api-runs.d.ts +3 -0
  181. package/dist/web/routes/api-runs.d.ts.map +1 -0
  182. package/dist/web/routes/api-runs.js +96 -0
  183. package/dist/web/routes/api-runs.js.map +1 -0
  184. package/dist/web/routes/api-settings.d.ts +3 -0
  185. package/dist/web/routes/api-settings.d.ts.map +1 -0
  186. package/dist/web/routes/api-settings.js +61 -0
  187. package/dist/web/routes/api-settings.js.map +1 -0
  188. package/dist/web/routes/context.d.ts +15 -0
  189. package/dist/web/routes/context.d.ts.map +1 -0
  190. package/dist/web/routes/context.js +2 -0
  191. package/dist/web/routes/context.js.map +1 -0
  192. package/dist/web/server.d.ts +58 -1
  193. package/dist/web/server.d.ts.map +1 -1
  194. package/dist/web/server.js +116 -847
  195. package/dist/web/server.js.map +1 -1
  196. package/dist/web/shell-session.d.ts +74 -0
  197. package/dist/web/shell-session.d.ts.map +1 -0
  198. package/dist/web/shell-session.js +279 -0
  199. package/dist/web/shell-session.js.map +1 -0
  200. package/dist/web/snapshots.d.ts +159 -0
  201. package/dist/web/snapshots.d.ts.map +1 -0
  202. package/dist/web/snapshots.js +231 -0
  203. package/dist/web/snapshots.js.map +1 -0
  204. package/dist/workers/acp.d.ts.map +1 -1
  205. package/dist/workers/acp.js +116 -0
  206. package/dist/workers/acp.js.map +1 -1
  207. package/dist/workers/claude.d.ts.map +1 -1
  208. package/dist/workers/claude.js +13 -3
  209. package/dist/workers/claude.js.map +1 -1
  210. package/dist/workers/codex.d.ts.map +1 -1
  211. package/dist/workers/codex.js +16 -4
  212. package/dist/workers/codex.js.map +1 -1
  213. package/dist/workers/types.d.ts +14 -4
  214. package/dist/workers/types.d.ts.map +1 -1
  215. package/examples/config.example.yaml +12 -3
  216. package/package.json +8 -2
  217. package/web/dist/assets/index-BIrXUwFe.css +1 -0
  218. package/web/dist/assets/index-COMzHPcP.js +26 -0
  219. package/web/dist/index.html +2 -2
  220. package/web/dist/assets/index-k6kgdnzy.js +0 -9
  221. package/web/dist/assets/index-xm9qPlYB.css +0 -1
@@ -0,0 +1,267 @@
1
+ import { z } from 'zod';
2
+ import { AppMentionSchema, NotificationChannelSchema, WorkflowSchema, } from '../../config/schema.js';
3
+ import { booleanSetting, jsonSetting, numberSetting, stringSetting, validateJsonSettingShape, } from '../registry.js';
4
+ const GithubAppMentionsOverrideSchema = z.record(AppMentionSchema);
5
+ const NotificationsChannelsOverrideSchema = z.array(NotificationChannelSchema);
6
+ const WorkflowsOverrideSchema = z.record(WorkflowSchema);
7
+ export function githubDefinitions() {
8
+ return [
9
+ stringSetting({
10
+ key: 'github.tokenEnv',
11
+ label: 'GitHub Token Env Var',
12
+ description: 'Environment variable name used for GitHub authentication.',
13
+ details: 'Set the env var name that stores the GitHub token. This must be a variable name, not a literal token value.',
14
+ defaultValue: null,
15
+ yamlPath: ['github', 'tokenEnv'],
16
+ minLength: 1,
17
+ validate: (value) => {
18
+ if (value.startsWith('ghp_') || value.startsWith('ghs_') || value.startsWith('github_pat_')) {
19
+ return 'github.tokenEnv should be an environment variable name, not a literal token';
20
+ }
21
+ return null;
22
+ },
23
+ }),
24
+ stringSetting({
25
+ key: 'github.apiBaseUrl',
26
+ label: 'GitHub API Base URL',
27
+ description: 'Base URL for GitHub API requests.',
28
+ details: 'Override the API base URL used for GitHub repos. Useful for GitHub Enterprise deployments.',
29
+ defaultValue: 'https://api.github.com',
30
+ yamlPath: ['github', 'apiBaseUrl'],
31
+ minLength: 1,
32
+ url: true,
33
+ }),
34
+ numberSetting({
35
+ key: 'github.pollIntervalSeconds',
36
+ label: 'Poll Interval (seconds)',
37
+ description: 'Delay between automatic poll cycles.',
38
+ details: 'Controls how often night-orch checks configured repos for work. Lower values react faster but increase API traffic.',
39
+ defaultValue: 300,
40
+ yamlPath: ['github', 'pollIntervalSeconds'],
41
+ integer: true,
42
+ min: 5,
43
+ max: 3600,
44
+ step: 5,
45
+ }),
46
+ jsonSetting({
47
+ key: 'github.appMentions',
48
+ label: 'GitHub App Mentions',
49
+ description: 'Mention template map used for app-trigger comments.',
50
+ details: 'Record keyed by mention alias with enabled flag and comment template payloads.',
51
+ defaultValue: {},
52
+ yamlPath: ['github', 'appMentions'],
53
+ normalize: (value) => validateJsonSettingShape(value, GithubAppMentionsOverrideSchema, 'github.appMentions'),
54
+ }),
55
+ stringSetting({
56
+ key: 'storage.dbPath',
57
+ label: 'State DB Path',
58
+ description: 'SQLite database file path.',
59
+ details: 'Location of the runtime state database file. Read-only at runtime because DB opens before overrides are loaded.',
60
+ defaultValue: '~/.config/night-orch/state.db',
61
+ yamlPath: ['storage', 'dbPath'],
62
+ minLength: 1,
63
+ mutable: false,
64
+ }),
65
+ stringSetting({
66
+ key: 'storage.worktreeRoot',
67
+ label: 'Worktree Root',
68
+ description: 'Root directory used for issue worktrees.',
69
+ details: 'Base path where dedicated issue worktrees are created.',
70
+ defaultValue: '~/code/.night-orch/worktrees',
71
+ yamlPath: ['storage', 'worktreeRoot'],
72
+ minLength: 1,
73
+ }),
74
+ stringSetting({
75
+ key: 'storage.logsRoot',
76
+ label: 'Logs Root',
77
+ description: 'Root directory used for run/session logs.',
78
+ details: 'Base path where runtime log files are written.',
79
+ defaultValue: '~/code/.night-orch/logs',
80
+ yamlPath: ['storage', 'logsRoot'],
81
+ minLength: 1,
82
+ }),
83
+ booleanSetting({
84
+ key: 'storage.autoCleanup.enabled',
85
+ label: 'Auto Cleanup Enabled',
86
+ description: 'Enable periodic cleanup jobs.',
87
+ details: 'When enabled, stale worktrees and old logs are cleaned up automatically on schedule.',
88
+ defaultValue: true,
89
+ yamlPath: ['storage', 'autoCleanup', 'enabled'],
90
+ }),
91
+ numberSetting({
92
+ key: 'storage.autoCleanup.intervalMinutes',
93
+ label: 'Auto Cleanup Interval (minutes)',
94
+ description: 'How often automatic cleanup runs.',
95
+ details: 'Interval between automatic cleanup runs.',
96
+ defaultValue: 60,
97
+ yamlPath: ['storage', 'autoCleanup', 'intervalMinutes'],
98
+ integer: true,
99
+ min: 1,
100
+ step: 5,
101
+ }),
102
+ numberSetting({
103
+ key: 'storage.retention.worktreeAgeDays',
104
+ label: 'Worktree Retention (days)',
105
+ description: 'Retention window for stale worktrees.',
106
+ details: 'Completed/error worktrees older than this threshold may be removed during cleanup.',
107
+ defaultValue: 7,
108
+ yamlPath: ['storage', 'retention', 'worktreeAgeDays'],
109
+ integer: true,
110
+ min: 1,
111
+ step: 1,
112
+ }),
113
+ numberSetting({
114
+ key: 'storage.retention.detailDays',
115
+ label: 'Detail Retention (days)',
116
+ description: 'Retention window for detailed run data.',
117
+ details: 'Detailed run artifacts are retained for this many days before archival/cleanup.',
118
+ defaultValue: 30,
119
+ yamlPath: ['storage', 'retention', 'detailDays'],
120
+ integer: true,
121
+ min: 1,
122
+ step: 1,
123
+ }),
124
+ numberSetting({
125
+ key: 'storage.retention.archiveDays',
126
+ label: 'Archive Retention (days)',
127
+ description: 'Retention window for archived run data.',
128
+ details: 'Archived records older than this threshold can be removed.',
129
+ defaultValue: 90,
130
+ yamlPath: ['storage', 'retention', 'archiveDays'],
131
+ integer: true,
132
+ min: 1,
133
+ step: 1,
134
+ }),
135
+ jsonSetting({
136
+ key: 'notifications.channels',
137
+ label: 'Notification Channels',
138
+ description: 'Configured notification channel list.',
139
+ details: 'Array of notification channel definitions (console/webhook/discord/smtp).',
140
+ defaultValue: [{ type: 'console' }],
141
+ yamlPath: ['notifications', 'channels'],
142
+ normalize: (value) => validateJsonSettingShape(value, NotificationsChannelsOverrideSchema, 'notifications.channels'),
143
+ }),
144
+ booleanSetting({
145
+ key: 'notifications.events.onRunStarted',
146
+ label: 'Notify: Run Started',
147
+ description: 'Send notifications when runs start.',
148
+ details: 'Controls whether run-started notifications are dispatched.',
149
+ defaultValue: false,
150
+ yamlPath: ['notifications', 'events', 'onRunStarted'],
151
+ }),
152
+ booleanSetting({
153
+ key: 'notifications.events.onBlocked',
154
+ label: 'Notify: Blocked',
155
+ description: 'Send notifications when runs become blocked.',
156
+ details: 'Controls whether blocked-run notifications are dispatched.',
157
+ defaultValue: true,
158
+ yamlPath: ['notifications', 'events', 'onBlocked'],
159
+ }),
160
+ booleanSetting({
161
+ key: 'notifications.events.onPrReady',
162
+ label: 'Notify: PR Ready',
163
+ description: 'Send notifications when PRs are ready.',
164
+ details: 'Controls whether ready-for-review PR notifications are dispatched.',
165
+ defaultValue: true,
166
+ yamlPath: ['notifications', 'events', 'onPrReady'],
167
+ }),
168
+ booleanSetting({
169
+ key: 'notifications.events.onPrUpdated',
170
+ label: 'Notify: PR Updated',
171
+ description: 'Send notifications when PRs are updated.',
172
+ details: 'Controls whether PR update notifications are dispatched.',
173
+ defaultValue: true,
174
+ yamlPath: ['notifications', 'events', 'onPrUpdated'],
175
+ }),
176
+ booleanSetting({
177
+ key: 'notifications.events.onError',
178
+ label: 'Notify: Error',
179
+ description: 'Send notifications on orchestration errors.',
180
+ details: 'Controls whether error notifications are dispatched.',
181
+ defaultValue: true,
182
+ yamlPath: ['notifications', 'events', 'onError'],
183
+ }),
184
+ booleanSetting({
185
+ key: 'notifications.events.onRetryExhausted',
186
+ label: 'Notify: Retry Exhausted',
187
+ description: 'Send notifications when retries are exhausted.',
188
+ details: 'Controls whether retry-exhausted notifications are dispatched.',
189
+ defaultValue: true,
190
+ yamlPath: ['notifications', 'events', 'onRetryExhausted'],
191
+ }),
192
+ booleanSetting({
193
+ key: 'mcp.enabled',
194
+ label: 'MCP Enabled',
195
+ description: 'Enable MCP server exposure.',
196
+ details: 'Turns MCP server availability on or off for applicable commands/modes.',
197
+ defaultValue: false,
198
+ yamlPath: ['mcp', 'enabled'],
199
+ }),
200
+ stringSetting({
201
+ key: 'mcp.transport',
202
+ label: 'MCP Transport',
203
+ description: 'Transport protocol used by MCP server.',
204
+ details: 'Currently only stdio transport is supported.',
205
+ defaultValue: 'stdio',
206
+ yamlPath: ['mcp', 'transport'],
207
+ options: ['stdio'],
208
+ }),
209
+ stringSetting({
210
+ key: 'mcp.authTokenEnv',
211
+ label: 'MCP Auth Token Env Var',
212
+ description: 'Optional env var name containing MCP mutation auth token.',
213
+ details: 'Set to null (or clear in YAML) to disable MCP mutation token checks.',
214
+ defaultValue: null,
215
+ yamlPath: ['mcp', 'authTokenEnv'],
216
+ allowNull: true,
217
+ minLength: 1,
218
+ }),
219
+ numberSetting({
220
+ key: 'mcp.httpPort',
221
+ label: 'MCP HTTP Port',
222
+ description: 'TCP port for embedded MCP HTTP transport.',
223
+ details: 'Port used when running embedded MCP HTTP/SSE mode.',
224
+ defaultValue: 3100,
225
+ yamlPath: ['mcp', 'httpPort'],
226
+ integer: true,
227
+ min: 1,
228
+ max: 65535,
229
+ step: 1,
230
+ }),
231
+ stringSetting({
232
+ key: 'mcp.httpHost',
233
+ label: 'MCP HTTP Host',
234
+ description: 'Bind address for embedded MCP HTTP transport.',
235
+ details: 'Network interface/address used for MCP HTTP endpoint binding.',
236
+ defaultValue: '127.0.0.1',
237
+ yamlPath: ['mcp', 'httpHost'],
238
+ minLength: 1,
239
+ }),
240
+ booleanSetting({
241
+ key: 'commentCommands.enabled',
242
+ label: 'Comment Commands Enabled',
243
+ description: 'Enable issue comment command processing.',
244
+ details: 'If enabled, `/orch` comment commands are parsed and processed.',
245
+ defaultValue: true,
246
+ yamlPath: ['commentCommands', 'enabled'],
247
+ }),
248
+ booleanSetting({
249
+ key: 'commentCommands.requireCollaborator',
250
+ label: 'Require Collaborator For Commands',
251
+ description: 'Require collaborator permission for comment commands.',
252
+ details: 'When enabled, only collaborators can run issue comment commands.',
253
+ defaultValue: true,
254
+ yamlPath: ['commentCommands', 'requireCollaborator'],
255
+ }),
256
+ jsonSetting({
257
+ key: 'workflows',
258
+ label: 'Workflow Definitions',
259
+ description: 'Named workflow definitions.',
260
+ details: 'Record of named workflow graphs (steps/roles/agents) used by workflow selection.',
261
+ defaultValue: {},
262
+ yamlPath: ['workflows'],
263
+ normalize: (value) => validateJsonSettingShape(value, WorkflowsOverrideSchema, 'workflows'),
264
+ }),
265
+ ];
266
+ }
267
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/settings/definitions/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SettingDefinition } from '../registry.js';
2
+ export declare function loopDefinitions(): SettingDefinition[];
3
+ //# sourceMappingURL=loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../../src/settings/definitions/loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGvD,wBAAgB,eAAe,IAAI,iBAAiB,EAAE,CA8GrD"}
@@ -0,0 +1,113 @@
1
+ import { booleanSetting, numberSetting, stringSetting } from '../registry.js';
2
+ export function loopDefinitions() {
3
+ return [
4
+ numberSetting({
5
+ key: 'loop.maxReviewIterations',
6
+ label: 'Max Review Iterations',
7
+ description: 'Maximum review correction loops per run.',
8
+ details: 'Limits how many review-fix-review cycles a run can execute before stopping.',
9
+ defaultValue: 4,
10
+ yamlPath: ['loop', 'maxReviewIterations'],
11
+ integer: true,
12
+ min: 1,
13
+ step: 1,
14
+ }),
15
+ numberSetting({
16
+ key: 'loop.maxTotalAgentPasses',
17
+ label: 'Max Total Agent Passes',
18
+ description: 'Hard cap on planner/coder/reviewer passes in one run.',
19
+ details: 'Caps total planner/coder/reviewer passes across the full run.',
20
+ defaultValue: 10,
21
+ yamlPath: ['loop', 'maxTotalAgentPasses'],
22
+ integer: true,
23
+ min: 1,
24
+ step: 1,
25
+ }),
26
+ booleanSetting({
27
+ key: 'loop.stopOnPlannerFailure',
28
+ label: 'Stop On Planner Failure',
29
+ description: 'Stop run when planner output fails validation.',
30
+ details: 'If enabled, planner failure ends the run early instead of proceeding.',
31
+ defaultValue: true,
32
+ yamlPath: ['loop', 'stopOnPlannerFailure'],
33
+ }),
34
+ booleanSetting({
35
+ key: 'loop.requireVerificationPass',
36
+ label: 'Require Verification Pass',
37
+ description: 'Require verify commands to pass before completion.',
38
+ details: 'If enabled, failed verification blocks completion.',
39
+ defaultValue: true,
40
+ yamlPath: ['loop', 'requireVerificationPass'],
41
+ }),
42
+ stringSetting({
43
+ key: 'loop.reviewApprovalKeyword',
44
+ label: 'Review Approval Keyword',
45
+ description: 'Reviewer keyword interpreted as approval.',
46
+ details: 'Expected keyword emitted by reviewer agent for approval.',
47
+ defaultValue: 'APPROVED',
48
+ yamlPath: ['loop', 'reviewApprovalKeyword'],
49
+ minLength: 1,
50
+ }),
51
+ stringSetting({
52
+ key: 'loop.reviewNeedsChangesKeyword',
53
+ label: 'Review Needs-Changes Keyword',
54
+ description: 'Reviewer keyword interpreted as changes required.',
55
+ details: 'Expected keyword emitted by reviewer agent for change requests.',
56
+ defaultValue: 'CHANGES_REQUIRED',
57
+ yamlPath: ['loop', 'reviewNeedsChangesKeyword'],
58
+ minLength: 1,
59
+ }),
60
+ booleanSetting({
61
+ key: 'loop.blockOnAmbiguousReview',
62
+ label: 'Block On Ambiguous Review',
63
+ description: 'Block run if review output is ambiguous.',
64
+ details: 'If enabled, unparseable reviewer output results in blocked status.',
65
+ defaultValue: true,
66
+ yamlPath: ['loop', 'blockOnAmbiguousReview'],
67
+ }),
68
+ numberSetting({
69
+ key: 'loop.maxAutoRetries',
70
+ label: 'Max Auto Retries',
71
+ description: 'Automatic retry attempts for infrastructure failures.',
72
+ details: 'Maximum number of automatic retries after transient failures.',
73
+ defaultValue: 3,
74
+ yamlPath: ['loop', 'maxAutoRetries'],
75
+ integer: true,
76
+ min: 0,
77
+ step: 1,
78
+ }),
79
+ booleanSetting({
80
+ key: 'loop.decompose',
81
+ label: 'Enable Decomposition',
82
+ description: 'Allow issue decomposition into sub-tasks.',
83
+ details: 'If enabled, eligible issues can be split into dependent sub-tasks.',
84
+ defaultValue: false,
85
+ yamlPath: ['loop', 'decompose'],
86
+ }),
87
+ numberSetting({
88
+ key: 'loop.maxSubtasks',
89
+ label: 'Max Subtasks',
90
+ description: 'Maximum sub-tasks per decomposition.',
91
+ details: 'Upper bound for generated decomposition sub-tasks.',
92
+ defaultValue: 5,
93
+ yamlPath: ['loop', 'maxSubtasks'],
94
+ integer: true,
95
+ min: 1,
96
+ max: 10,
97
+ step: 1,
98
+ }),
99
+ numberSetting({
100
+ key: 'loop.maxConcurrentSubtasks',
101
+ label: 'Max Concurrent Subtasks',
102
+ description: 'Maximum parallel sub-task executions.',
103
+ details: 'Upper bound for concurrently running sub-task worktrees.',
104
+ defaultValue: 3,
105
+ yamlPath: ['loop', 'maxConcurrentSubtasks'],
106
+ integer: true,
107
+ min: 1,
108
+ max: 10,
109
+ step: 1,
110
+ }),
111
+ ];
112
+ }
113
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../../src/settings/definitions/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SettingDefinition } from '../registry.js';
2
+ export declare function observabilityDefinitions(): SettingDefinition[];
3
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/settings/definitions/observability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGvD,wBAAgB,wBAAwB,IAAI,iBAAiB,EAAE,CAwE9D"}
@@ -0,0 +1,74 @@
1
+ import { booleanSetting, numberSetting, stringSetting } from '../registry.js';
2
+ export function observabilityDefinitions() {
3
+ return [
4
+ booleanSetting({
5
+ key: 'metrics.enabled',
6
+ label: 'Metrics Enabled',
7
+ description: 'Enable Prometheus metrics export.',
8
+ details: 'Turns `/metrics` export on or off.',
9
+ defaultValue: true,
10
+ yamlPath: ['metrics', 'enabled'],
11
+ }),
12
+ numberSetting({
13
+ key: 'metrics.port',
14
+ label: 'Metrics Port',
15
+ description: 'TCP port for Prometheus metrics endpoint.',
16
+ details: 'Port used when metrics exporter is enabled.',
17
+ defaultValue: 9090,
18
+ yamlPath: ['metrics', 'port'],
19
+ integer: true,
20
+ min: 1,
21
+ max: 65535,
22
+ step: 1,
23
+ }),
24
+ stringSetting({
25
+ key: 'metrics.host',
26
+ label: 'Metrics Host',
27
+ description: 'Bind address for Prometheus metrics endpoint.',
28
+ details: 'Network interface/address used by metrics exporter.',
29
+ defaultValue: '0.0.0.0',
30
+ yamlPath: ['metrics', 'host'],
31
+ minLength: 1,
32
+ }),
33
+ booleanSetting({
34
+ key: 'observability.agentStreaming',
35
+ label: 'Agent Streaming',
36
+ description: 'Enable in-flight agent event streaming to TUI/Web.',
37
+ details: 'Turns live agent event streaming on or off for terminal and web views.',
38
+ defaultValue: true,
39
+ yamlPath: ['observability', 'agentStreaming'],
40
+ }),
41
+ numberSetting({
42
+ key: 'observability.eventRetention',
43
+ label: 'Event Retention',
44
+ description: 'Maximum in-memory event backlog per run/session.',
45
+ details: 'Controls event retention window for stream history.',
46
+ defaultValue: 1000,
47
+ yamlPath: ['observability', 'eventRetention'],
48
+ integer: true,
49
+ min: 100,
50
+ max: 10000,
51
+ step: 100,
52
+ }),
53
+ booleanSetting({
54
+ key: 'observability.sessionLogs',
55
+ label: 'Session Logs Enabled',
56
+ description: 'Persist interactive agent session logs to disk.',
57
+ details: 'If enabled, interactive session logs are written and retained.',
58
+ defaultValue: true,
59
+ yamlPath: ['observability', 'sessionLogs'],
60
+ }),
61
+ numberSetting({
62
+ key: 'observability.sessionLogRetention',
63
+ label: 'Session Log Retention (days)',
64
+ description: 'Retention period for interactive session logs.',
65
+ details: 'Session logs older than this many days may be deleted by cleanup.',
66
+ defaultValue: 7,
67
+ yamlPath: ['observability', 'sessionLogRetention'],
68
+ integer: true,
69
+ min: 1,
70
+ step: 1,
71
+ }),
72
+ ];
73
+ }
74
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../../src/settings/definitions/observability.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE7E,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,cAAc,CAAC;YACb,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,mCAAmC;YAChD,OAAO,EAAE,oCAAoC;YAC7C,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;SACjC,CAAC;QACF,aAAa,CAAC;YACZ,GAAG,EAAE,cAAc;YACnB,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,2CAA2C;YACxD,OAAO,EAAE,6CAA6C;YACtD,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;YAC7B,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,CAAC;SACR,CAAC;QACF,aAAa,CAAC;YACZ,GAAG,EAAE,cAAc;YACnB,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,+CAA+C;YAC5D,OAAO,EAAE,qDAAqD;YAC9D,YAAY,EAAE,SAAS;YACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;YAC7B,SAAS,EAAE,CAAC;SACb,CAAC;QAEF,cAAc,CAAC;YACb,GAAG,EAAE,8BAA8B;YACnC,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,oDAAoD;YACjE,OAAO,EAAE,wEAAwE;YACjF,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;SAC9C,CAAC;QACF,aAAa,CAAC;YACZ,GAAG,EAAE,8BAA8B;YACnC,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,kDAAkD;YAC/D,OAAO,EAAE,qDAAqD;YAC9D,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;YAC7C,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,GAAG;SACV,CAAC;QACF,cAAc,CAAC;YACb,GAAG,EAAE,2BAA2B;YAChC,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE,iDAAiD;YAC9D,OAAO,EAAE,gEAAgE;YACzE,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC;SAC3C,CAAC;QACF,aAAa,CAAC;YACZ,GAAG,EAAE,mCAAmC;YACxC,KAAK,EAAE,8BAA8B;YACrC,WAAW,EAAE,gDAAgD;YAC7D,OAAO,EAAE,mEAAmE;YAC5E,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC,eAAe,EAAE,qBAAqB,CAAC;YAClD,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;SACR,CAAC;KACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SettingDefinition } from '../registry.js';
2
+ export declare function securityDefinitions(): SettingDefinition[];
3
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/settings/definitions/security.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAa,iBAAiB,EAAgB,MAAM,gBAAgB,CAAA;AAYhF,wBAAgB,mBAAmB,IAAI,iBAAiB,EAAE,CAwGzD"}
@@ -0,0 +1,121 @@
1
+ import { z } from 'zod';
2
+ import { CostPricingModelSchema, SubscriptionMeteredSchema, WorkerProfileSchema, } from '../../config/schema.js';
3
+ import { jsonSetting, numberSetting, stringSetting, validateJsonSettingShape, } from '../registry.js';
4
+ const CostPricingModelsOverrideSchema = z.record(CostPricingModelSchema);
5
+ const SubscriptionMeteredOverrideSchema = SubscriptionMeteredSchema;
6
+ const WorkerProfilesOverrideSchema = z.record(WorkerProfileSchema);
7
+ export function securityDefinitions() {
8
+ return [
9
+ numberSetting({
10
+ key: 'security.maxChangedFiles',
11
+ label: 'Max Changed Files',
12
+ description: 'Diff guard threshold for changed files.',
13
+ details: 'Runs are blocked when changed-file count exceeds this threshold.',
14
+ defaultValue: 50,
15
+ yamlPath: ['security', 'maxChangedFiles'],
16
+ integer: true,
17
+ min: 1,
18
+ step: 1,
19
+ }),
20
+ numberSetting({
21
+ key: 'security.maxChangedLines',
22
+ label: 'Max Changed Lines',
23
+ description: 'Diff guard threshold for changed lines.',
24
+ details: 'Runs are blocked when changed-line count exceeds this threshold.',
25
+ defaultValue: 5000,
26
+ yamlPath: ['security', 'maxChangedLines'],
27
+ integer: true,
28
+ min: 1,
29
+ step: 50,
30
+ }),
31
+ numberSetting({
32
+ key: 'security.maxDailyCostUsd',
33
+ label: 'Daily Cost Budget (USD)',
34
+ description: 'Maximum allowed spend per UTC day before new runs are blocked.',
35
+ details: 'Sets the global daily spend cap for pay-per-use mode.',
36
+ defaultValue: 50,
37
+ yamlPath: ['security', 'maxDailyCostUsd'],
38
+ integer: false,
39
+ min: 0.01,
40
+ step: 1,
41
+ }),
42
+ numberSetting({
43
+ key: 'security.maxCostPerRunUsd',
44
+ label: 'Per-Run Cost Budget (USD)',
45
+ description: 'Maximum allowed spend for a single run before it is blocked.',
46
+ details: 'Sets the per-issue run cost ceiling for pay-per-use mode.',
47
+ defaultValue: 10,
48
+ yamlPath: ['security', 'maxCostPerRunUsd'],
49
+ integer: false,
50
+ min: 0.01,
51
+ step: 0.5,
52
+ }),
53
+ stringSetting({
54
+ key: 'cost.model',
55
+ label: 'Cost Model',
56
+ description: 'Cost enforcement model.',
57
+ details: 'pay-per-use enforces spend caps; subscription is advisory-only; subscription-metered tracks advisory spend with optional enforcement.',
58
+ defaultValue: 'pay-per-use',
59
+ yamlPath: ['cost', 'model'],
60
+ options: ['pay-per-use', 'subscription', 'subscription-metered'],
61
+ }),
62
+ jsonSetting({
63
+ key: 'cost.subscriptionMetered',
64
+ label: 'Subscription Metered Options',
65
+ description: 'Warning and optional enforcement controls for subscription-metered mode.',
66
+ details: 'advisoryThresholdUsd logs warnings; enforcePerRunLimit/enforceDailyLimit turn security caps into hard blocks.',
67
+ defaultValue: {
68
+ advisoryThresholdUsd: null,
69
+ enforcePerRunLimit: false,
70
+ enforceDailyLimit: false,
71
+ },
72
+ yamlPath: ['cost', 'subscriptionMetered'],
73
+ normalize: (value) => validateJsonSettingShape(value, SubscriptionMeteredOverrideSchema, 'cost.subscriptionMetered'),
74
+ }),
75
+ stringSetting({
76
+ key: 'cost.pricing.defaultModel',
77
+ label: 'Default Pricing Model',
78
+ description: 'Fallback model key for pricing lookups.',
79
+ details: 'Used when a worker profile does not specify a pricing model.',
80
+ defaultValue: 'default',
81
+ yamlPath: ['cost', 'pricing', 'defaultModel'],
82
+ minLength: 1,
83
+ }),
84
+ jsonSetting({
85
+ key: 'cost.pricing.models',
86
+ label: 'Pricing Models Map',
87
+ description: 'Model-specific pricing table.',
88
+ details: 'Record keyed by model name with token/minute pricing values.',
89
+ defaultValue: {},
90
+ yamlPath: ['cost', 'pricing', 'models'],
91
+ normalize: (value) => validateJsonSettingShape(value, CostPricingModelsOverrideSchema, 'cost.pricing.models'),
92
+ }),
93
+ jsonSetting({
94
+ key: 'workerProfiles',
95
+ label: 'Worker Profiles',
96
+ description: 'Global worker profile definitions.',
97
+ details: 'Record of worker profile definitions keyed by profile name.',
98
+ defaultValue: {},
99
+ yamlPath: ['workerProfiles'],
100
+ sensitive: true,
101
+ normalize: (value) => validateJsonSettingShape(value, WorkerProfilesOverrideSchema, 'workerProfiles'),
102
+ sanitizeForDisplay: (value) => redactWorkerProfiles(value),
103
+ }),
104
+ ];
105
+ }
106
+ function redactWorkerProfiles(value) {
107
+ if (!isRecord(value)) {
108
+ return value;
109
+ }
110
+ return Object.fromEntries(Object.entries(value).map(([profileName, profile]) => {
111
+ if (!isRecord(profile) || !isRecord(profile['env'])) {
112
+ return [profileName, profile];
113
+ }
114
+ const redactedEnv = Object.fromEntries(Object.keys(profile['env']).map((envKey) => [envKey, '[redacted]']));
115
+ return [profileName, { ...profile, env: redactedEnv }];
116
+ }));
117
+ }
118
+ function isRecord(value) {
119
+ return typeof value === 'object' && value !== null;
120
+ }
121
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/settings/definitions/security.ts"],"names":[],"mappings":"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"}