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
@@ -1,7 +1,67 @@
1
1
  import { z } from 'zod';
2
- declare const WorkerProfileSchema: z.ZodObject<{
2
+ export declare const NotificationChannelSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
3
+ type: z.ZodLiteral<"console">;
4
+ }, "strip", z.ZodTypeAny, {
5
+ type: "console";
6
+ }, {
7
+ type: "console";
8
+ }>, z.ZodObject<{
9
+ type: z.ZodLiteral<"webhook">;
10
+ urlEnv: z.ZodString;
11
+ }, "strip", z.ZodTypeAny, {
12
+ type: "webhook";
13
+ urlEnv: string;
14
+ }, {
15
+ type: "webhook";
16
+ urlEnv: string;
17
+ }>, z.ZodObject<{
18
+ type: z.ZodLiteral<"discord">;
19
+ urlEnv: z.ZodString;
20
+ }, "strip", z.ZodTypeAny, {
21
+ type: "discord";
22
+ urlEnv: string;
23
+ }, {
24
+ type: "discord";
25
+ urlEnv: string;
26
+ }>, z.ZodObject<{
27
+ type: z.ZodLiteral<"smtp">;
28
+ host: z.ZodString;
29
+ port: z.ZodDefault<z.ZodNumber>;
30
+ from: z.ZodString;
31
+ to: z.ZodString;
32
+ userEnv: z.ZodString;
33
+ passEnv: z.ZodString;
34
+ }, "strip", z.ZodTypeAny, {
35
+ type: "smtp";
36
+ host: string;
37
+ port: number;
38
+ from: string;
39
+ to: string;
40
+ userEnv: string;
41
+ passEnv: string;
42
+ }, {
43
+ type: "smtp";
44
+ host: string;
45
+ from: string;
46
+ to: string;
47
+ userEnv: string;
48
+ passEnv: string;
49
+ port?: number | undefined;
50
+ }>]>;
51
+ export declare const AppMentionSchema: z.ZodObject<{
52
+ enabled: z.ZodDefault<z.ZodBoolean>;
53
+ commentTemplate: z.ZodString;
54
+ }, "strip", z.ZodTypeAny, {
55
+ enabled: boolean;
56
+ commentTemplate: string;
57
+ }, {
58
+ commentTemplate: string;
59
+ enabled?: boolean | undefined;
60
+ }>;
61
+ export declare const WorkerProfileSchema: z.ZodObject<{
3
62
  type: z.ZodString;
4
63
  pricingModel: z.ZodOptional<z.ZodString>;
64
+ minuteUsd: z.ZodOptional<z.ZodNumber>;
5
65
  command: z.ZodString;
6
66
  args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
7
67
  workerTimeoutSeconds: z.ZodDefault<z.ZodNumber>;
@@ -18,11 +78,13 @@ declare const WorkerProfileSchema: z.ZodObject<{
18
78
  minimalEnv: boolean;
19
79
  runtimeWrapper: string | null;
20
80
  pricingModel?: string | undefined;
81
+ minuteUsd?: number | undefined;
21
82
  }, {
22
83
  type: string;
23
84
  command: string;
24
85
  env?: Record<string, string> | undefined;
25
86
  pricingModel?: string | undefined;
87
+ minuteUsd?: number | undefined;
26
88
  args?: string[] | undefined;
27
89
  workerTimeoutSeconds?: number | undefined;
28
90
  minimalEnv?: boolean | undefined;
@@ -239,6 +301,119 @@ declare const EnvironmentConfigSchema: z.ZodObject<{
239
301
  }[] | undefined;
240
302
  }[] | undefined;
241
303
  }>;
304
+ export declare const WorkflowSchema: z.ZodObject<{
305
+ steps: z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
306
+ type: z.ZodLiteral<"worker">;
307
+ id: z.ZodString;
308
+ role: z.ZodString;
309
+ skipWhen: z.ZodOptional<z.ZodString>;
310
+ continueFrom: z.ZodOptional<z.ZodString>;
311
+ prompt: z.ZodOptional<z.ZodString>;
312
+ }, "strip", z.ZodTypeAny, {
313
+ type: "worker";
314
+ id: string;
315
+ role: string;
316
+ skipWhen?: string | undefined;
317
+ continueFrom?: string | undefined;
318
+ prompt?: string | undefined;
319
+ }, {
320
+ type: "worker";
321
+ id: string;
322
+ role: string;
323
+ skipWhen?: string | undefined;
324
+ continueFrom?: string | undefined;
325
+ prompt?: string | undefined;
326
+ }>, z.ZodObject<{
327
+ type: z.ZodLiteral<"verify">;
328
+ id: z.ZodString;
329
+ skipWhen: z.ZodOptional<z.ZodString>;
330
+ }, "strip", z.ZodTypeAny, {
331
+ type: "verify";
332
+ id: string;
333
+ skipWhen?: string | undefined;
334
+ }, {
335
+ type: "verify";
336
+ id: string;
337
+ skipWhen?: string | undefined;
338
+ }>, z.ZodObject<{
339
+ type: z.ZodLiteral<"decide">;
340
+ id: z.ZodString;
341
+ onIterate: z.ZodString;
342
+ requireReview: z.ZodOptional<z.ZodBoolean>;
343
+ }, "strip", z.ZodTypeAny, {
344
+ type: "decide";
345
+ id: string;
346
+ onIterate: string;
347
+ requireReview?: boolean | undefined;
348
+ }, {
349
+ type: "decide";
350
+ id: string;
351
+ onIterate: string;
352
+ requireReview?: boolean | undefined;
353
+ }>]>, "many">;
354
+ roles: z.ZodOptional<z.ZodObject<{
355
+ planner: z.ZodOptional<z.ZodEnum<["claude", "codex", "opencode"]>>;
356
+ coder: z.ZodOptional<z.ZodEnum<["claude", "codex", "opencode"]>>;
357
+ reviewer: z.ZodOptional<z.ZodEnum<["claude", "codex", "opencode"]>>;
358
+ }, "strip", z.ZodTypeAny, {
359
+ planner?: "claude" | "codex" | "opencode" | undefined;
360
+ coder?: "claude" | "codex" | "opencode" | undefined;
361
+ reviewer?: "claude" | "codex" | "opencode" | undefined;
362
+ }, {
363
+ planner?: "claude" | "codex" | "opencode" | undefined;
364
+ coder?: "claude" | "codex" | "opencode" | undefined;
365
+ reviewer?: "claude" | "codex" | "opencode" | undefined;
366
+ }>>;
367
+ agents: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
368
+ }, "strip", z.ZodTypeAny, {
369
+ steps: ({
370
+ type: "worker";
371
+ id: string;
372
+ role: string;
373
+ skipWhen?: string | undefined;
374
+ continueFrom?: string | undefined;
375
+ prompt?: string | undefined;
376
+ } | {
377
+ type: "verify";
378
+ id: string;
379
+ skipWhen?: string | undefined;
380
+ } | {
381
+ type: "decide";
382
+ id: string;
383
+ onIterate: string;
384
+ requireReview?: boolean | undefined;
385
+ })[];
386
+ roles?: {
387
+ planner?: "claude" | "codex" | "opencode" | undefined;
388
+ coder?: "claude" | "codex" | "opencode" | undefined;
389
+ reviewer?: "claude" | "codex" | "opencode" | undefined;
390
+ } | undefined;
391
+ agents?: Record<string, string> | undefined;
392
+ }, {
393
+ steps: ({
394
+ type: "worker";
395
+ id: string;
396
+ role: string;
397
+ skipWhen?: string | undefined;
398
+ continueFrom?: string | undefined;
399
+ prompt?: string | undefined;
400
+ } | {
401
+ type: "verify";
402
+ id: string;
403
+ skipWhen?: string | undefined;
404
+ } | {
405
+ type: "decide";
406
+ id: string;
407
+ onIterate: string;
408
+ requireReview?: boolean | undefined;
409
+ })[];
410
+ roles?: {
411
+ planner?: "claude" | "codex" | "opencode" | undefined;
412
+ coder?: "claude" | "codex" | "opencode" | undefined;
413
+ reviewer?: "claude" | "codex" | "opencode" | undefined;
414
+ } | undefined;
415
+ agents?: Record<string, string> | undefined;
416
+ }>;
242
417
  declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
243
418
  repo: z.ZodString;
244
419
  forge: z.ZodDefault<z.ZodEnum<["github", "forgejo"]>>;
@@ -249,6 +424,10 @@ declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
249
424
  localPath: z.ZodString;
250
425
  baseBranch: z.ZodDefault<z.ZodString>;
251
426
  branchPrefix: z.ZodDefault<z.ZodString>;
427
+ /** How to incorporate upstream base branch changes into work branches.
428
+ * 'merge' (default) creates merge commits — reliable for automated systems.
429
+ * 'rebase' replays commits for linear history — fragile with conflicts. */
430
+ updateStrategy: z.ZodDefault<z.ZodEnum<["merge", "rebase"]>>;
252
431
  labels: z.ZodDefault<z.ZodObject<{
253
432
  ready: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>, string[], string | string[]>;
254
433
  running: z.ZodDefault<z.ZodString>;
@@ -673,6 +852,7 @@ declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
673
852
  stagingBranchPrefix?: string | undefined;
674
853
  }>>;
675
854
  }, "strip", z.ZodTypeAny, {
855
+ repo: string;
676
856
  planning: {
677
857
  prdDirectory: string;
678
858
  };
@@ -691,13 +871,13 @@ declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
691
871
  };
692
872
  verify: (string | string[])[];
693
873
  agents: Record<string, string>;
694
- repo: string;
695
874
  forge: "github" | "forgejo";
696
875
  linkedProjects: string[];
697
876
  maxConcurrentRuns: number;
698
877
  localPath: string;
699
878
  baseBranch: string;
700
879
  branchPrefix: string;
880
+ updateStrategy: "merge" | "rebase";
701
881
  labelConfig: Record<string, {
702
882
  color?: string | undefined;
703
883
  description?: string | undefined;
@@ -817,6 +997,7 @@ declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
817
997
  maxConcurrentRuns?: number | undefined;
818
998
  baseBranch?: string | undefined;
819
999
  branchPrefix?: string | undefined;
1000
+ updateStrategy?: "merge" | "rebase" | undefined;
820
1001
  kanban?: {
821
1002
  triggerLabel: string;
822
1003
  labels: {
@@ -907,6 +1088,7 @@ declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
907
1088
  stagingBranchPrefix?: string | undefined;
908
1089
  } | undefined;
909
1090
  }>, {
1091
+ repo: string;
910
1092
  planning: {
911
1093
  prdDirectory: string;
912
1094
  };
@@ -925,13 +1107,13 @@ declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
925
1107
  };
926
1108
  verify: (string | string[])[];
927
1109
  agents: Record<string, string>;
928
- repo: string;
929
1110
  forge: "github" | "forgejo";
930
1111
  linkedProjects: string[];
931
1112
  maxConcurrentRuns: number;
932
1113
  localPath: string;
933
1114
  baseBranch: string;
934
1115
  branchPrefix: string;
1116
+ updateStrategy: "merge" | "rebase";
935
1117
  labelConfig: Record<string, {
936
1118
  color?: string | undefined;
937
1119
  description?: string | undefined;
@@ -1051,6 +1233,7 @@ declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
1051
1233
  maxConcurrentRuns?: number | undefined;
1052
1234
  baseBranch?: string | undefined;
1053
1235
  branchPrefix?: string | undefined;
1236
+ updateStrategy?: "merge" | "rebase" | undefined;
1054
1237
  kanban?: {
1055
1238
  triggerLabel: string;
1056
1239
  labels: {
@@ -1141,8 +1324,37 @@ declare const RepoConfigSchema: z.ZodEffects<z.ZodObject<{
1141
1324
  stagingBranchPrefix?: string | undefined;
1142
1325
  } | undefined;
1143
1326
  }>;
1144
- declare const CostModelSchema: z.ZodEnum<["pay-per-use", "subscription"]>;
1145
- export declare const ConfigSchema: z.ZodObject<{
1327
+ declare const CostModelSchema: z.ZodEnum<["pay-per-use", "subscription", "subscription-metered"]>;
1328
+ export declare const CostPricingModelSchema: z.ZodObject<{
1329
+ inputUsdPerMillionTokens: z.ZodDefault<z.ZodNumber>;
1330
+ outputUsdPerMillionTokens: z.ZodDefault<z.ZodNumber>;
1331
+ cacheReadUsdPerMillionTokens: z.ZodDefault<z.ZodNumber>;
1332
+ minuteUsd: z.ZodDefault<z.ZodNumber>;
1333
+ }, "strip", z.ZodTypeAny, {
1334
+ minuteUsd: number;
1335
+ inputUsdPerMillionTokens: number;
1336
+ outputUsdPerMillionTokens: number;
1337
+ cacheReadUsdPerMillionTokens: number;
1338
+ }, {
1339
+ minuteUsd?: number | undefined;
1340
+ inputUsdPerMillionTokens?: number | undefined;
1341
+ outputUsdPerMillionTokens?: number | undefined;
1342
+ cacheReadUsdPerMillionTokens?: number | undefined;
1343
+ }>;
1344
+ export declare const SubscriptionMeteredSchema: z.ZodDefault<z.ZodObject<{
1345
+ advisoryThresholdUsd: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
1346
+ enforcePerRunLimit: z.ZodDefault<z.ZodBoolean>;
1347
+ enforceDailyLimit: z.ZodDefault<z.ZodBoolean>;
1348
+ }, "strip", z.ZodTypeAny, {
1349
+ advisoryThresholdUsd: number | null;
1350
+ enforcePerRunLimit: boolean;
1351
+ enforceDailyLimit: boolean;
1352
+ }, {
1353
+ advisoryThresholdUsd?: number | null | undefined;
1354
+ enforcePerRunLimit?: boolean | undefined;
1355
+ enforceDailyLimit?: boolean | undefined;
1356
+ }>>;
1357
+ export declare const ConfigSchema: z.ZodEffects<z.ZodObject<{
1146
1358
  version: z.ZodLiteral<1>;
1147
1359
  github: z.ZodObject<{
1148
1360
  tokenEnv: z.ZodEffects<z.ZodString, string, string>;
@@ -1408,61 +1620,92 @@ export declare const ConfigSchema: z.ZodObject<{
1408
1620
  maxCostPerRunUsd?: number | undefined;
1409
1621
  }>>;
1410
1622
  cost: z.ZodDefault<z.ZodObject<{
1411
- model: z.ZodDefault<z.ZodEnum<["pay-per-use", "subscription"]>>;
1623
+ model: z.ZodDefault<z.ZodEnum<["pay-per-use", "subscription", "subscription-metered"]>>;
1412
1624
  pricing: z.ZodOptional<z.ZodObject<{
1413
1625
  defaultModel: z.ZodDefault<z.ZodString>;
1414
1626
  models: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
1415
1627
  inputUsdPerMillionTokens: z.ZodDefault<z.ZodNumber>;
1416
1628
  outputUsdPerMillionTokens: z.ZodDefault<z.ZodNumber>;
1629
+ cacheReadUsdPerMillionTokens: z.ZodDefault<z.ZodNumber>;
1417
1630
  minuteUsd: z.ZodDefault<z.ZodNumber>;
1418
1631
  }, "strip", z.ZodTypeAny, {
1632
+ minuteUsd: number;
1419
1633
  inputUsdPerMillionTokens: number;
1420
1634
  outputUsdPerMillionTokens: number;
1421
- minuteUsd: number;
1635
+ cacheReadUsdPerMillionTokens: number;
1422
1636
  }, {
1637
+ minuteUsd?: number | undefined;
1423
1638
  inputUsdPerMillionTokens?: number | undefined;
1424
1639
  outputUsdPerMillionTokens?: number | undefined;
1425
- minuteUsd?: number | undefined;
1640
+ cacheReadUsdPerMillionTokens?: number | undefined;
1426
1641
  }>>>;
1427
1642
  }, "strip", z.ZodTypeAny, {
1428
1643
  defaultModel: string;
1429
1644
  models: Record<string, {
1645
+ minuteUsd: number;
1430
1646
  inputUsdPerMillionTokens: number;
1431
1647
  outputUsdPerMillionTokens: number;
1432
- minuteUsd: number;
1648
+ cacheReadUsdPerMillionTokens: number;
1433
1649
  }>;
1434
1650
  }, {
1435
1651
  defaultModel?: string | undefined;
1436
1652
  models?: Record<string, {
1653
+ minuteUsd?: number | undefined;
1437
1654
  inputUsdPerMillionTokens?: number | undefined;
1438
1655
  outputUsdPerMillionTokens?: number | undefined;
1439
- minuteUsd?: number | undefined;
1656
+ cacheReadUsdPerMillionTokens?: number | undefined;
1440
1657
  }> | undefined;
1441
1658
  }>>;
1659
+ subscriptionMetered: z.ZodDefault<z.ZodObject<{
1660
+ advisoryThresholdUsd: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
1661
+ enforcePerRunLimit: z.ZodDefault<z.ZodBoolean>;
1662
+ enforceDailyLimit: z.ZodDefault<z.ZodBoolean>;
1663
+ }, "strip", z.ZodTypeAny, {
1664
+ advisoryThresholdUsd: number | null;
1665
+ enforcePerRunLimit: boolean;
1666
+ enforceDailyLimit: boolean;
1667
+ }, {
1668
+ advisoryThresholdUsd?: number | null | undefined;
1669
+ enforcePerRunLimit?: boolean | undefined;
1670
+ enforceDailyLimit?: boolean | undefined;
1671
+ }>>;
1442
1672
  }, "strip", z.ZodTypeAny, {
1443
- model: "pay-per-use" | "subscription";
1673
+ model: "pay-per-use" | "subscription" | "subscription-metered";
1674
+ subscriptionMetered: {
1675
+ advisoryThresholdUsd: number | null;
1676
+ enforcePerRunLimit: boolean;
1677
+ enforceDailyLimit: boolean;
1678
+ };
1444
1679
  pricing?: {
1445
1680
  defaultModel: string;
1446
1681
  models: Record<string, {
1682
+ minuteUsd: number;
1447
1683
  inputUsdPerMillionTokens: number;
1448
1684
  outputUsdPerMillionTokens: number;
1449
- minuteUsd: number;
1685
+ cacheReadUsdPerMillionTokens: number;
1450
1686
  }>;
1451
1687
  } | undefined;
1452
1688
  }, {
1453
- model?: "pay-per-use" | "subscription" | undefined;
1689
+ model?: "pay-per-use" | "subscription" | "subscription-metered" | undefined;
1454
1690
  pricing?: {
1455
1691
  defaultModel?: string | undefined;
1456
1692
  models?: Record<string, {
1693
+ minuteUsd?: number | undefined;
1457
1694
  inputUsdPerMillionTokens?: number | undefined;
1458
1695
  outputUsdPerMillionTokens?: number | undefined;
1459
- minuteUsd?: number | undefined;
1696
+ cacheReadUsdPerMillionTokens?: number | undefined;
1460
1697
  }> | undefined;
1461
1698
  } | undefined;
1699
+ subscriptionMetered?: {
1700
+ advisoryThresholdUsd?: number | null | undefined;
1701
+ enforcePerRunLimit?: boolean | undefined;
1702
+ enforceDailyLimit?: boolean | undefined;
1703
+ } | undefined;
1462
1704
  }>>;
1463
1705
  workerProfiles: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
1464
1706
  type: z.ZodString;
1465
1707
  pricingModel: z.ZodOptional<z.ZodString>;
1708
+ minuteUsd: z.ZodOptional<z.ZodNumber>;
1466
1709
  command: z.ZodString;
1467
1710
  args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
1468
1711
  workerTimeoutSeconds: z.ZodDefault<z.ZodNumber>;
@@ -1479,11 +1722,13 @@ export declare const ConfigSchema: z.ZodObject<{
1479
1722
  minimalEnv: boolean;
1480
1723
  runtimeWrapper: string | null;
1481
1724
  pricingModel?: string | undefined;
1725
+ minuteUsd?: number | undefined;
1482
1726
  }, {
1483
1727
  type: string;
1484
1728
  command: string;
1485
1729
  env?: Record<string, string> | undefined;
1486
1730
  pricingModel?: string | undefined;
1731
+ minuteUsd?: number | undefined;
1487
1732
  args?: string[] | undefined;
1488
1733
  workerTimeoutSeconds?: number | undefined;
1489
1734
  minimalEnv?: boolean | undefined;
@@ -1559,6 +1804,10 @@ export declare const ConfigSchema: z.ZodObject<{
1559
1804
  localPath: z.ZodString;
1560
1805
  baseBranch: z.ZodDefault<z.ZodString>;
1561
1806
  branchPrefix: z.ZodDefault<z.ZodString>;
1807
+ /** How to incorporate upstream base branch changes into work branches.
1808
+ * 'merge' (default) creates merge commits — reliable for automated systems.
1809
+ * 'rebase' replays commits for linear history — fragile with conflicts. */
1810
+ updateStrategy: z.ZodDefault<z.ZodEnum<["merge", "rebase"]>>;
1562
1811
  labels: z.ZodDefault<z.ZodObject<{
1563
1812
  ready: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>, string[], string | string[]>;
1564
1813
  running: z.ZodDefault<z.ZodString>;
@@ -1983,6 +2232,7 @@ export declare const ConfigSchema: z.ZodObject<{
1983
2232
  stagingBranchPrefix?: string | undefined;
1984
2233
  }>>;
1985
2234
  }, "strip", z.ZodTypeAny, {
2235
+ repo: string;
1986
2236
  planning: {
1987
2237
  prdDirectory: string;
1988
2238
  };
@@ -2001,13 +2251,13 @@ export declare const ConfigSchema: z.ZodObject<{
2001
2251
  };
2002
2252
  verify: (string | string[])[];
2003
2253
  agents: Record<string, string>;
2004
- repo: string;
2005
2254
  forge: "github" | "forgejo";
2006
2255
  linkedProjects: string[];
2007
2256
  maxConcurrentRuns: number;
2008
2257
  localPath: string;
2009
2258
  baseBranch: string;
2010
2259
  branchPrefix: string;
2260
+ updateStrategy: "merge" | "rebase";
2011
2261
  labelConfig: Record<string, {
2012
2262
  color?: string | undefined;
2013
2263
  description?: string | undefined;
@@ -2127,6 +2377,7 @@ export declare const ConfigSchema: z.ZodObject<{
2127
2377
  maxConcurrentRuns?: number | undefined;
2128
2378
  baseBranch?: string | undefined;
2129
2379
  branchPrefix?: string | undefined;
2380
+ updateStrategy?: "merge" | "rebase" | undefined;
2130
2381
  kanban?: {
2131
2382
  triggerLabel: string;
2132
2383
  labels: {
@@ -2217,6 +2468,7 @@ export declare const ConfigSchema: z.ZodObject<{
2217
2468
  stagingBranchPrefix?: string | undefined;
2218
2469
  } | undefined;
2219
2470
  }>, {
2471
+ repo: string;
2220
2472
  planning: {
2221
2473
  prdDirectory: string;
2222
2474
  };
@@ -2235,13 +2487,13 @@ export declare const ConfigSchema: z.ZodObject<{
2235
2487
  };
2236
2488
  verify: (string | string[])[];
2237
2489
  agents: Record<string, string>;
2238
- repo: string;
2239
2490
  forge: "github" | "forgejo";
2240
2491
  linkedProjects: string[];
2241
2492
  maxConcurrentRuns: number;
2242
2493
  localPath: string;
2243
2494
  baseBranch: string;
2244
2495
  branchPrefix: string;
2496
+ updateStrategy: "merge" | "rebase";
2245
2497
  labelConfig: Record<string, {
2246
2498
  color?: string | undefined;
2247
2499
  description?: string | undefined;
@@ -2361,6 +2613,7 @@ export declare const ConfigSchema: z.ZodObject<{
2361
2613
  maxConcurrentRuns?: number | undefined;
2362
2614
  baseBranch?: string | undefined;
2363
2615
  branchPrefix?: string | undefined;
2616
+ updateStrategy?: "merge" | "rebase" | undefined;
2364
2617
  kanban?: {
2365
2618
  triggerLabel: string;
2366
2619
  labels: {
@@ -2636,13 +2889,19 @@ export declare const ConfigSchema: z.ZodObject<{
2636
2889
  maxCostPerRunUsd: number;
2637
2890
  };
2638
2891
  cost: {
2639
- model: "pay-per-use" | "subscription";
2892
+ model: "pay-per-use" | "subscription" | "subscription-metered";
2893
+ subscriptionMetered: {
2894
+ advisoryThresholdUsd: number | null;
2895
+ enforcePerRunLimit: boolean;
2896
+ enforceDailyLimit: boolean;
2897
+ };
2640
2898
  pricing?: {
2641
2899
  defaultModel: string;
2642
2900
  models: Record<string, {
2901
+ minuteUsd: number;
2643
2902
  inputUsdPerMillionTokens: number;
2644
2903
  outputUsdPerMillionTokens: number;
2645
- minuteUsd: number;
2904
+ cacheReadUsdPerMillionTokens: number;
2646
2905
  }>;
2647
2906
  } | undefined;
2648
2907
  };
@@ -2655,6 +2914,7 @@ export declare const ConfigSchema: z.ZodObject<{
2655
2914
  minimalEnv: boolean;
2656
2915
  runtimeWrapper: string | null;
2657
2916
  pricingModel?: string | undefined;
2917
+ minuteUsd?: number | undefined;
2658
2918
  }>;
2659
2919
  metrics: {
2660
2920
  host: string;
@@ -2679,6 +2939,7 @@ export declare const ConfigSchema: z.ZodObject<{
2679
2939
  requireCollaborator: boolean;
2680
2940
  };
2681
2941
  repos: {
2942
+ repo: string;
2682
2943
  planning: {
2683
2944
  prdDirectory: string;
2684
2945
  };
@@ -2697,13 +2958,13 @@ export declare const ConfigSchema: z.ZodObject<{
2697
2958
  };
2698
2959
  verify: (string | string[])[];
2699
2960
  agents: Record<string, string>;
2700
- repo: string;
2701
2961
  forge: "github" | "forgejo";
2702
2962
  linkedProjects: string[];
2703
2963
  maxConcurrentRuns: number;
2704
2964
  localPath: string;
2705
2965
  baseBranch: string;
2706
2966
  branchPrefix: string;
2967
+ updateStrategy: "merge" | "rebase";
2707
2968
  labelConfig: Record<string, {
2708
2969
  color?: string | undefined;
2709
2970
  description?: string | undefined;
@@ -2860,6 +3121,7 @@ export declare const ConfigSchema: z.ZodObject<{
2860
3121
  maxConcurrentRuns?: number | undefined;
2861
3122
  baseBranch?: string | undefined;
2862
3123
  branchPrefix?: string | undefined;
3124
+ updateStrategy?: "merge" | "rebase" | undefined;
2863
3125
  kanban?: {
2864
3126
  triggerLabel: string;
2865
3127
  labels: {
@@ -3011,21 +3273,28 @@ export declare const ConfigSchema: z.ZodObject<{
3011
3273
  maxCostPerRunUsd?: number | undefined;
3012
3274
  } | undefined;
3013
3275
  cost?: {
3014
- model?: "pay-per-use" | "subscription" | undefined;
3276
+ model?: "pay-per-use" | "subscription" | "subscription-metered" | undefined;
3015
3277
  pricing?: {
3016
3278
  defaultModel?: string | undefined;
3017
3279
  models?: Record<string, {
3280
+ minuteUsd?: number | undefined;
3018
3281
  inputUsdPerMillionTokens?: number | undefined;
3019
3282
  outputUsdPerMillionTokens?: number | undefined;
3020
- minuteUsd?: number | undefined;
3283
+ cacheReadUsdPerMillionTokens?: number | undefined;
3021
3284
  }> | undefined;
3022
3285
  } | undefined;
3286
+ subscriptionMetered?: {
3287
+ advisoryThresholdUsd?: number | null | undefined;
3288
+ enforcePerRunLimit?: boolean | undefined;
3289
+ enforceDailyLimit?: boolean | undefined;
3290
+ } | undefined;
3023
3291
  } | undefined;
3024
3292
  workerProfiles?: Record<string, {
3025
3293
  type: string;
3026
3294
  command: string;
3027
3295
  env?: Record<string, string> | undefined;
3028
3296
  pricingModel?: string | undefined;
3297
+ minuteUsd?: number | undefined;
3029
3298
  args?: string[] | undefined;
3030
3299
  workerTimeoutSeconds?: number | undefined;
3031
3300
  minimalEnv?: boolean | undefined;
@@ -3078,11 +3347,624 @@ export declare const ConfigSchema: z.ZodObject<{
3078
3347
  } | undefined;
3079
3348
  agents?: Record<string, string> | undefined;
3080
3349
  }> | undefined;
3350
+ }>, {
3351
+ version: 1;
3352
+ github: {
3353
+ apiBaseUrl: string;
3354
+ tokenEnv: string;
3355
+ pollIntervalSeconds: number;
3356
+ appMentions: Record<string, {
3357
+ enabled: boolean;
3358
+ commentTemplate: string;
3359
+ }>;
3360
+ };
3361
+ storage: {
3362
+ dbPath: string;
3363
+ worktreeRoot: string;
3364
+ logsRoot: string;
3365
+ autoCleanup: {
3366
+ enabled: boolean;
3367
+ intervalMinutes: number;
3368
+ };
3369
+ retention: {
3370
+ worktreeAgeDays: number;
3371
+ detailDays: number;
3372
+ archiveDays: number;
3373
+ };
3374
+ };
3375
+ notifications: {
3376
+ channels: ({
3377
+ type: "console";
3378
+ } | {
3379
+ type: "webhook";
3380
+ urlEnv: string;
3381
+ } | {
3382
+ type: "discord";
3383
+ urlEnv: string;
3384
+ } | {
3385
+ type: "smtp";
3386
+ host: string;
3387
+ port: number;
3388
+ from: string;
3389
+ to: string;
3390
+ userEnv: string;
3391
+ passEnv: string;
3392
+ })[];
3393
+ events: {
3394
+ onRunStarted: boolean;
3395
+ onBlocked: boolean;
3396
+ onPrReady: boolean;
3397
+ onPrUpdated: boolean;
3398
+ onError: boolean;
3399
+ onRetryExhausted: boolean;
3400
+ };
3401
+ };
3402
+ loop: {
3403
+ maxReviewIterations: number;
3404
+ maxTotalAgentPasses: number;
3405
+ stopOnPlannerFailure: boolean;
3406
+ requireVerificationPass: boolean;
3407
+ reviewApprovalKeyword: string;
3408
+ reviewNeedsChangesKeyword: string;
3409
+ blockOnAmbiguousReview: boolean;
3410
+ maxAutoRetries: number;
3411
+ decompose: boolean;
3412
+ maxSubtasks: number;
3413
+ maxConcurrentSubtasks: number;
3414
+ };
3415
+ security: {
3416
+ maxChangedFiles: number;
3417
+ maxChangedLines: number;
3418
+ maxDailyCostUsd: number;
3419
+ maxCostPerRunUsd: number;
3420
+ };
3421
+ cost: {
3422
+ model: "pay-per-use" | "subscription" | "subscription-metered";
3423
+ subscriptionMetered: {
3424
+ advisoryThresholdUsd: number | null;
3425
+ enforcePerRunLimit: boolean;
3426
+ enforceDailyLimit: boolean;
3427
+ };
3428
+ pricing?: {
3429
+ defaultModel: string;
3430
+ models: Record<string, {
3431
+ minuteUsd: number;
3432
+ inputUsdPerMillionTokens: number;
3433
+ outputUsdPerMillionTokens: number;
3434
+ cacheReadUsdPerMillionTokens: number;
3435
+ }>;
3436
+ } | undefined;
3437
+ };
3438
+ workerProfiles: Record<string, {
3439
+ env: Record<string, string>;
3440
+ type: string;
3441
+ command: string;
3442
+ args: string[];
3443
+ workerTimeoutSeconds: number;
3444
+ minimalEnv: boolean;
3445
+ runtimeWrapper: string | null;
3446
+ pricingModel?: string | undefined;
3447
+ minuteUsd?: number | undefined;
3448
+ }>;
3449
+ metrics: {
3450
+ host: string;
3451
+ port: number;
3452
+ enabled: boolean;
3453
+ };
3454
+ observability: {
3455
+ agentStreaming: boolean;
3456
+ eventRetention: number;
3457
+ sessionLogs: boolean;
3458
+ sessionLogRetention: number;
3459
+ };
3460
+ mcp: {
3461
+ transport: "stdio";
3462
+ enabled: boolean;
3463
+ authTokenEnv: string | null;
3464
+ httpPort: number;
3465
+ httpHost: string;
3466
+ };
3467
+ commentCommands: {
3468
+ enabled: boolean;
3469
+ requireCollaborator: boolean;
3470
+ };
3471
+ repos: {
3472
+ repo: string;
3473
+ planning: {
3474
+ prdDirectory: string;
3475
+ };
3476
+ labels: {
3477
+ error: string;
3478
+ ready: string[];
3479
+ running: string;
3480
+ blocked: string;
3481
+ needsHuman: string;
3482
+ reviewReady: string;
3483
+ retry: string;
3484
+ planning: string;
3485
+ mergeQueued: string;
3486
+ merging: string;
3487
+ mergeFailed: string;
3488
+ };
3489
+ verify: (string | string[])[];
3490
+ agents: Record<string, string>;
3491
+ forge: "github" | "forgejo";
3492
+ linkedProjects: string[];
3493
+ maxConcurrentRuns: number;
3494
+ localPath: string;
3495
+ baseBranch: string;
3496
+ branchPrefix: string;
3497
+ updateStrategy: "merge" | "rebase";
3498
+ labelConfig: Record<string, {
3499
+ color?: string | undefined;
3500
+ description?: string | undefined;
3501
+ }>;
3502
+ defaults: {
3503
+ planner: "claude" | "codex" | "opencode";
3504
+ coder: "claude" | "codex" | "opencode";
3505
+ reviewer: "claude" | "codex" | "opencode";
3506
+ doneMode: "pr-ready" | "manual-only";
3507
+ notifyPriority: "normal" | "high";
3508
+ prMentions: string[];
3509
+ };
3510
+ selectors: {
3511
+ includeLabelsAny: string[];
3512
+ excludeLabelsAny: string[];
3513
+ };
3514
+ mergeQueue: {
3515
+ enabled: boolean;
3516
+ batchSize: number;
3517
+ mergeMethod: "merge" | "squash" | "rebase";
3518
+ retryFlakyOnce: boolean;
3519
+ requireApproval: boolean;
3520
+ stagingBranchPrefix: string;
3521
+ };
3522
+ apiBaseUrl?: string | undefined;
3523
+ tokenEnv?: string | undefined;
3524
+ kanban?: {
3525
+ triggerLabel: string;
3526
+ labels: {
3527
+ error: string;
3528
+ ready: string[];
3529
+ running: string;
3530
+ blocked: string;
3531
+ needsHuman: string;
3532
+ reviewReady: string;
3533
+ retry: string;
3534
+ planning: string;
3535
+ mergeQueued: string;
3536
+ merging: string;
3537
+ mergeFailed: string;
3538
+ };
3539
+ } | undefined;
3540
+ environment?: {
3541
+ defaultMode: "dedicated" | "shared";
3542
+ bootstrap: {
3543
+ command: string | string[];
3544
+ when: "always" | "dedicated" | "shared";
3545
+ failureHints: {
3546
+ message: string;
3547
+ contains: string;
3548
+ output: "stdout" | "stderr" | "combined";
3549
+ }[];
3550
+ }[];
3551
+ cleanup: {
3552
+ command: string | string[];
3553
+ when: "always" | "dedicated" | "shared";
3554
+ failureHints: {
3555
+ message: string;
3556
+ contains: string;
3557
+ output: "stdout" | "stderr" | "combined";
3558
+ }[];
3559
+ }[];
3560
+ dedicated?: {
3561
+ env: {
3562
+ copyFrom: string;
3563
+ overrides: Record<string, string>;
3564
+ overrideFiles: string[];
3565
+ };
3566
+ compose: {
3567
+ file: string;
3568
+ services: string[];
3569
+ projectName: string;
3570
+ };
3571
+ teardownOnComplete: boolean;
3572
+ healthcheck?: string | string[] | undefined;
3573
+ } | undefined;
3574
+ shared?: {
3575
+ requireRunning: boolean;
3576
+ healthcheck?: string | string[] | undefined;
3577
+ } | undefined;
3578
+ } | undefined;
3579
+ prompts?: {
3580
+ plannerSystem?: string | undefined;
3581
+ coderSystem?: string | undefined;
3582
+ reviewerSystem?: string | undefined;
3583
+ } | undefined;
3584
+ workflow?: string | undefined;
3585
+ workflowByTriage?: {
3586
+ trivial?: string | undefined;
3587
+ standard?: string | undefined;
3588
+ } | undefined;
3589
+ }[];
3590
+ workflows: Record<string, {
3591
+ steps: ({
3592
+ type: "worker";
3593
+ id: string;
3594
+ role: string;
3595
+ skipWhen?: string | undefined;
3596
+ continueFrom?: string | undefined;
3597
+ prompt?: string | undefined;
3598
+ } | {
3599
+ type: "verify";
3600
+ id: string;
3601
+ skipWhen?: string | undefined;
3602
+ } | {
3603
+ type: "decide";
3604
+ id: string;
3605
+ onIterate: string;
3606
+ requireReview?: boolean | undefined;
3607
+ })[];
3608
+ roles?: {
3609
+ planner?: "claude" | "codex" | "opencode" | undefined;
3610
+ coder?: "claude" | "codex" | "opencode" | undefined;
3611
+ reviewer?: "claude" | "codex" | "opencode" | undefined;
3612
+ } | undefined;
3613
+ agents?: Record<string, string> | undefined;
3614
+ }>;
3615
+ }, {
3616
+ version: 1;
3617
+ github: {
3618
+ tokenEnv: string;
3619
+ apiBaseUrl?: string | undefined;
3620
+ pollIntervalSeconds?: number | undefined;
3621
+ appMentions?: Record<string, {
3622
+ commentTemplate: string;
3623
+ enabled?: boolean | undefined;
3624
+ }> | undefined;
3625
+ };
3626
+ repos: {
3627
+ repo: string;
3628
+ localPath: string;
3629
+ planning?: {
3630
+ prdDirectory?: string | undefined;
3631
+ } | undefined;
3632
+ labels?: {
3633
+ ready: string | string[];
3634
+ error?: string | undefined;
3635
+ running?: string | undefined;
3636
+ blocked?: string | string[] | undefined;
3637
+ needsHuman?: string | undefined;
3638
+ reviewReady?: string | undefined;
3639
+ retry?: string | undefined;
3640
+ planning?: string | undefined;
3641
+ mergeQueued?: string | undefined;
3642
+ merging?: string | undefined;
3643
+ mergeFailed?: string | undefined;
3644
+ } | undefined;
3645
+ verify?: (string | string[])[] | undefined;
3646
+ agents?: Record<string, string> | undefined;
3647
+ forge?: "github" | "forgejo" | undefined;
3648
+ linkedProjects?: string[] | undefined;
3649
+ apiBaseUrl?: string | undefined;
3650
+ tokenEnv?: string | undefined;
3651
+ maxConcurrentRuns?: number | undefined;
3652
+ baseBranch?: string | undefined;
3653
+ branchPrefix?: string | undefined;
3654
+ updateStrategy?: "merge" | "rebase" | undefined;
3655
+ kanban?: {
3656
+ triggerLabel: string;
3657
+ labels: {
3658
+ ready: string | string[];
3659
+ error?: string | undefined;
3660
+ running?: string | undefined;
3661
+ blocked?: string | string[] | undefined;
3662
+ needsHuman?: string | undefined;
3663
+ reviewReady?: string | undefined;
3664
+ retry?: string | undefined;
3665
+ planning?: string | undefined;
3666
+ mergeQueued?: string | undefined;
3667
+ merging?: string | undefined;
3668
+ mergeFailed?: string | undefined;
3669
+ };
3670
+ } | undefined;
3671
+ labelConfig?: Record<string, {
3672
+ color?: string | undefined;
3673
+ description?: string | undefined;
3674
+ }> | undefined;
3675
+ defaults?: {
3676
+ planner?: "claude" | "codex" | "opencode" | undefined;
3677
+ coder?: "claude" | "codex" | "opencode" | undefined;
3678
+ reviewer?: "claude" | "codex" | "opencode" | undefined;
3679
+ doneMode?: "pr-ready" | "manual-only" | undefined;
3680
+ notifyPriority?: "normal" | "high" | undefined;
3681
+ prMentions?: string[] | undefined;
3682
+ } | undefined;
3683
+ environment?: {
3684
+ dedicated?: {
3685
+ compose: {
3686
+ file: string;
3687
+ services?: string[] | undefined;
3688
+ projectName?: string | undefined;
3689
+ };
3690
+ env?: {
3691
+ copyFrom?: string | undefined;
3692
+ overrides?: Record<string, string> | undefined;
3693
+ overrideFiles?: string[] | undefined;
3694
+ } | undefined;
3695
+ healthcheck?: string | string[] | undefined;
3696
+ teardownOnComplete?: boolean | undefined;
3697
+ } | undefined;
3698
+ shared?: {
3699
+ healthcheck?: string | string[] | undefined;
3700
+ requireRunning?: boolean | undefined;
3701
+ } | undefined;
3702
+ defaultMode?: "dedicated" | "shared" | undefined;
3703
+ bootstrap?: {
3704
+ command: string | string[];
3705
+ when?: "always" | "dedicated" | "shared" | undefined;
3706
+ failureHints?: {
3707
+ message: string;
3708
+ contains: string;
3709
+ output?: "stdout" | "stderr" | "combined" | undefined;
3710
+ }[] | undefined;
3711
+ }[] | undefined;
3712
+ cleanup?: {
3713
+ command: string | string[];
3714
+ when?: "always" | "dedicated" | "shared" | undefined;
3715
+ failureHints?: {
3716
+ message: string;
3717
+ contains: string;
3718
+ output?: "stdout" | "stderr" | "combined" | undefined;
3719
+ }[] | undefined;
3720
+ }[] | undefined;
3721
+ } | undefined;
3722
+ prompts?: {
3723
+ plannerSystem?: string | undefined;
3724
+ coderSystem?: string | undefined;
3725
+ reviewerSystem?: string | undefined;
3726
+ } | undefined;
3727
+ selectors?: {
3728
+ includeLabelsAny?: string[] | undefined;
3729
+ excludeLabelsAny?: string[] | undefined;
3730
+ } | undefined;
3731
+ workflow?: string | undefined;
3732
+ workflowByTriage?: {
3733
+ trivial?: string | undefined;
3734
+ standard?: string | undefined;
3735
+ } | undefined;
3736
+ mergeQueue?: {
3737
+ enabled?: boolean | undefined;
3738
+ batchSize?: number | undefined;
3739
+ mergeMethod?: "merge" | "squash" | "rebase" | undefined;
3740
+ retryFlakyOnce?: boolean | undefined;
3741
+ requireApproval?: boolean | undefined;
3742
+ stagingBranchPrefix?: string | undefined;
3743
+ } | undefined;
3744
+ }[];
3745
+ storage?: {
3746
+ dbPath?: string | undefined;
3747
+ worktreeRoot?: string | undefined;
3748
+ logsRoot?: string | undefined;
3749
+ autoCleanup?: {
3750
+ enabled?: boolean | undefined;
3751
+ intervalMinutes?: number | undefined;
3752
+ } | undefined;
3753
+ retention?: {
3754
+ worktreeAgeDays?: number | undefined;
3755
+ detailDays?: number | undefined;
3756
+ archiveDays?: number | undefined;
3757
+ } | undefined;
3758
+ } | undefined;
3759
+ notifications?: {
3760
+ channels?: ({
3761
+ type: "console";
3762
+ } | {
3763
+ type: "webhook";
3764
+ urlEnv: string;
3765
+ } | {
3766
+ type: "discord";
3767
+ urlEnv: string;
3768
+ } | {
3769
+ type: "smtp";
3770
+ host: string;
3771
+ from: string;
3772
+ to: string;
3773
+ userEnv: string;
3774
+ passEnv: string;
3775
+ port?: number | undefined;
3776
+ })[] | undefined;
3777
+ events?: {
3778
+ onRunStarted?: boolean | undefined;
3779
+ onBlocked?: boolean | undefined;
3780
+ onPrReady?: boolean | undefined;
3781
+ onPrUpdated?: boolean | undefined;
3782
+ onError?: boolean | undefined;
3783
+ onRetryExhausted?: boolean | undefined;
3784
+ } | undefined;
3785
+ } | undefined;
3786
+ loop?: {
3787
+ maxReviewIterations?: number | undefined;
3788
+ maxTotalAgentPasses?: number | undefined;
3789
+ stopOnPlannerFailure?: boolean | undefined;
3790
+ requireVerificationPass?: boolean | undefined;
3791
+ reviewApprovalKeyword?: string | undefined;
3792
+ reviewNeedsChangesKeyword?: string | undefined;
3793
+ blockOnAmbiguousReview?: boolean | undefined;
3794
+ maxAutoRetries?: number | undefined;
3795
+ decompose?: boolean | undefined;
3796
+ maxSubtasks?: number | undefined;
3797
+ maxConcurrentSubtasks?: number | undefined;
3798
+ } | undefined;
3799
+ security?: {
3800
+ maxChangedFiles?: number | undefined;
3801
+ maxChangedLines?: number | undefined;
3802
+ maxDailyCostUsd?: number | undefined;
3803
+ maxCostPerRunUsd?: number | undefined;
3804
+ } | undefined;
3805
+ cost?: {
3806
+ model?: "pay-per-use" | "subscription" | "subscription-metered" | undefined;
3807
+ pricing?: {
3808
+ defaultModel?: string | undefined;
3809
+ models?: Record<string, {
3810
+ minuteUsd?: number | undefined;
3811
+ inputUsdPerMillionTokens?: number | undefined;
3812
+ outputUsdPerMillionTokens?: number | undefined;
3813
+ cacheReadUsdPerMillionTokens?: number | undefined;
3814
+ }> | undefined;
3815
+ } | undefined;
3816
+ subscriptionMetered?: {
3817
+ advisoryThresholdUsd?: number | null | undefined;
3818
+ enforcePerRunLimit?: boolean | undefined;
3819
+ enforceDailyLimit?: boolean | undefined;
3820
+ } | undefined;
3821
+ } | undefined;
3822
+ workerProfiles?: Record<string, {
3823
+ type: string;
3824
+ command: string;
3825
+ env?: Record<string, string> | undefined;
3826
+ pricingModel?: string | undefined;
3827
+ minuteUsd?: number | undefined;
3828
+ args?: string[] | undefined;
3829
+ workerTimeoutSeconds?: number | undefined;
3830
+ minimalEnv?: boolean | undefined;
3831
+ runtimeWrapper?: string | null | undefined;
3832
+ }> | undefined;
3833
+ metrics?: {
3834
+ host?: string | undefined;
3835
+ port?: number | undefined;
3836
+ enabled?: boolean | undefined;
3837
+ } | undefined;
3838
+ observability?: {
3839
+ agentStreaming?: boolean | undefined;
3840
+ eventRetention?: number | undefined;
3841
+ sessionLogs?: boolean | undefined;
3842
+ sessionLogRetention?: number | undefined;
3843
+ } | undefined;
3844
+ mcp?: {
3845
+ transport?: "stdio" | undefined;
3846
+ enabled?: boolean | undefined;
3847
+ authTokenEnv?: string | null | undefined;
3848
+ httpPort?: number | undefined;
3849
+ httpHost?: string | undefined;
3850
+ } | undefined;
3851
+ commentCommands?: {
3852
+ enabled?: boolean | undefined;
3853
+ requireCollaborator?: boolean | undefined;
3854
+ } | undefined;
3855
+ workflows?: Record<string, {
3856
+ steps: ({
3857
+ type: "worker";
3858
+ id: string;
3859
+ role: string;
3860
+ skipWhen?: string | undefined;
3861
+ continueFrom?: string | undefined;
3862
+ prompt?: string | undefined;
3863
+ } | {
3864
+ type: "verify";
3865
+ id: string;
3866
+ skipWhen?: string | undefined;
3867
+ } | {
3868
+ type: "decide";
3869
+ id: string;
3870
+ onIterate: string;
3871
+ requireReview?: boolean | undefined;
3872
+ })[];
3873
+ roles?: {
3874
+ planner?: "claude" | "codex" | "opencode" | undefined;
3875
+ coder?: "claude" | "codex" | "opencode" | undefined;
3876
+ reviewer?: "claude" | "codex" | "opencode" | undefined;
3877
+ } | undefined;
3878
+ agents?: Record<string, string> | undefined;
3879
+ }> | undefined;
3880
+ }>;
3881
+ /**
3882
+ * Per-repo project config (`.night-orch.yml/.yaml`) loaded from inside a
3883
+ * repository checkout. Keys mirror repo-scoped config blocks plus optional
3884
+ * project-local workflow/profile definitions.
3885
+ *
3886
+ * Values are intentionally typed as `unknown` here so loader-level deep-merge
3887
+ * can preserve partial overrides without schema defaults mutating omitted
3888
+ * siblings. The merged result is then fully validated by `ConfigSchema`.
3889
+ */
3890
+ export declare const ProjectConfigSchema: z.ZodObject<{
3891
+ forge: z.ZodOptional<z.ZodUnknown>;
3892
+ linkedProjects: z.ZodOptional<z.ZodUnknown>;
3893
+ apiBaseUrl: z.ZodOptional<z.ZodUnknown>;
3894
+ tokenEnv: z.ZodOptional<z.ZodUnknown>;
3895
+ maxConcurrentRuns: z.ZodOptional<z.ZodUnknown>;
3896
+ baseBranch: z.ZodOptional<z.ZodUnknown>;
3897
+ branchPrefix: z.ZodOptional<z.ZodUnknown>;
3898
+ updateStrategy: z.ZodOptional<z.ZodUnknown>;
3899
+ labels: z.ZodOptional<z.ZodUnknown>;
3900
+ kanban: z.ZodOptional<z.ZodUnknown>;
3901
+ labelConfig: z.ZodOptional<z.ZodUnknown>;
3902
+ defaults: z.ZodOptional<z.ZodUnknown>;
3903
+ environment: z.ZodOptional<z.ZodUnknown>;
3904
+ verify: z.ZodOptional<z.ZodUnknown>;
3905
+ prompts: z.ZodOptional<z.ZodUnknown>;
3906
+ planning: z.ZodOptional<z.ZodUnknown>;
3907
+ selectors: z.ZodOptional<z.ZodUnknown>;
3908
+ agents: z.ZodOptional<z.ZodUnknown>;
3909
+ workflow: z.ZodOptional<z.ZodUnknown>;
3910
+ workflowByTriage: z.ZodOptional<z.ZodUnknown>;
3911
+ mergeQueue: z.ZodOptional<z.ZodUnknown>;
3912
+ workflows: z.ZodOptional<z.ZodUnknown>;
3913
+ workerProfiles: z.ZodOptional<z.ZodUnknown>;
3914
+ }, "strict", z.ZodTypeAny, {
3915
+ planning?: unknown;
3916
+ labels?: unknown;
3917
+ verify?: unknown;
3918
+ agents?: unknown;
3919
+ forge?: unknown;
3920
+ linkedProjects?: unknown;
3921
+ apiBaseUrl?: unknown;
3922
+ tokenEnv?: unknown;
3923
+ maxConcurrentRuns?: unknown;
3924
+ baseBranch?: unknown;
3925
+ branchPrefix?: unknown;
3926
+ updateStrategy?: unknown;
3927
+ kanban?: unknown;
3928
+ labelConfig?: unknown;
3929
+ defaults?: unknown;
3930
+ environment?: unknown;
3931
+ prompts?: unknown;
3932
+ selectors?: unknown;
3933
+ workflow?: unknown;
3934
+ workflowByTriage?: unknown;
3935
+ mergeQueue?: unknown;
3936
+ workerProfiles?: unknown;
3937
+ workflows?: unknown;
3938
+ }, {
3939
+ planning?: unknown;
3940
+ labels?: unknown;
3941
+ verify?: unknown;
3942
+ agents?: unknown;
3943
+ forge?: unknown;
3944
+ linkedProjects?: unknown;
3945
+ apiBaseUrl?: unknown;
3946
+ tokenEnv?: unknown;
3947
+ maxConcurrentRuns?: unknown;
3948
+ baseBranch?: unknown;
3949
+ branchPrefix?: unknown;
3950
+ updateStrategy?: unknown;
3951
+ kanban?: unknown;
3952
+ labelConfig?: unknown;
3953
+ defaults?: unknown;
3954
+ environment?: unknown;
3955
+ prompts?: unknown;
3956
+ selectors?: unknown;
3957
+ workflow?: unknown;
3958
+ workflowByTriage?: unknown;
3959
+ mergeQueue?: unknown;
3960
+ workerProfiles?: unknown;
3961
+ workflows?: unknown;
3081
3962
  }>;
3082
3963
  export type Config = z.infer<typeof ConfigSchema>;
3083
3964
  export type RepoConfig = z.infer<typeof RepoConfigSchema>;
3084
3965
  export type WorkerProfile = z.infer<typeof WorkerProfileSchema>;
3085
3966
  export type EnvironmentConfig = z.infer<typeof EnvironmentConfigSchema>;
3086
3967
  export type CostModel = z.infer<typeof CostModelSchema>;
3968
+ export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
3087
3969
  export {};
3088
3970
  //# sourceMappingURL=schema.d.ts.map