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,136 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { isGitRepo, branchExistsLocally, branchExistsRemotely, fetchOrigin } from '../git/repo.js';
3
+ import { logger } from '../utils/logger.js';
4
+ /**
5
+ * Validate that a target project is properly set up for night-orch.
6
+ * Returns a list of check results — all must pass for the project to be ready.
7
+ */
8
+ export async function validateProjectSetup(repoConfig, config, forge) {
9
+ const results = [];
10
+ // 1. Repo local path exists and is a git repo
11
+ if (!existsSync(repoConfig.localPath)) {
12
+ results.push({
13
+ name: 'Local path exists',
14
+ passed: false,
15
+ message: `Path does not exist: ${repoConfig.localPath}`,
16
+ category: 'repo',
17
+ });
18
+ }
19
+ else {
20
+ const isRepo = await isGitRepo(repoConfig.localPath);
21
+ results.push({
22
+ name: 'Local path is git repo',
23
+ passed: isRepo,
24
+ message: isRepo
25
+ ? `Valid git repo at ${repoConfig.localPath}`
26
+ : `Not a git repo: ${repoConfig.localPath}`,
27
+ category: 'repo',
28
+ });
29
+ // 2. Base branch exists
30
+ if (isRepo) {
31
+ try {
32
+ await fetchOrigin(repoConfig.localPath);
33
+ results.push({
34
+ name: 'Fetch origin',
35
+ passed: true,
36
+ message: 'Successfully fetched from origin',
37
+ category: 'repo',
38
+ });
39
+ }
40
+ catch (err) {
41
+ results.push({
42
+ name: 'Fetch origin',
43
+ passed: false,
44
+ message: `Failed to fetch: ${err instanceof Error ? err.message : String(err)}`,
45
+ category: 'repo',
46
+ });
47
+ }
48
+ const localExists = await branchExistsLocally(repoConfig.localPath, repoConfig.baseBranch);
49
+ const remoteExists = await branchExistsRemotely(repoConfig.localPath, repoConfig.baseBranch);
50
+ results.push({
51
+ name: 'Base branch exists',
52
+ passed: localExists || remoteExists,
53
+ message: localExists || remoteExists
54
+ ? `Base branch '${repoConfig.baseBranch}' found (local: ${localExists}, remote: ${remoteExists})`
55
+ : `Base branch '${repoConfig.baseBranch}' not found locally or remotely`,
56
+ category: 'repo',
57
+ });
58
+ }
59
+ }
60
+ // 3. Forge auth works
61
+ try {
62
+ const authInfo = await forge.validateAuth();
63
+ results.push({
64
+ name: 'Forge authentication',
65
+ passed: true,
66
+ message: `Authenticated as ${authInfo.user}`,
67
+ category: 'auth',
68
+ });
69
+ }
70
+ catch (err) {
71
+ results.push({
72
+ name: 'Forge authentication',
73
+ passed: false,
74
+ message: `Auth failed: ${err instanceof Error ? err.message : String(err)}`,
75
+ category: 'auth',
76
+ });
77
+ }
78
+ // 4. Repo is accessible
79
+ try {
80
+ await forge.getIssue(repoConfig.repo, 1).catch(() => null); // 404 is OK — just checking access
81
+ results.push({
82
+ name: 'Repo accessible',
83
+ passed: true,
84
+ message: `Can access ${repoConfig.repo}`,
85
+ category: 'auth',
86
+ });
87
+ }
88
+ catch (err) {
89
+ results.push({
90
+ name: 'Repo accessible',
91
+ passed: false,
92
+ message: `Cannot access ${repoConfig.repo}: ${err instanceof Error ? err.message : String(err)}`,
93
+ category: 'auth',
94
+ });
95
+ }
96
+ // 5. Ready labels configured
97
+ const readyLabels = Array.isArray(repoConfig.labels.ready) ? repoConfig.labels.ready : [repoConfig.labels.ready];
98
+ results.push({
99
+ name: 'Ready labels configured',
100
+ passed: readyLabels.length > 0,
101
+ message: readyLabels.length > 0
102
+ ? `Ready labels: ${readyLabels.join(', ')} — run 'night-orch labels-init' to ensure they exist on the repo`
103
+ : 'No ready labels configured',
104
+ category: 'labels',
105
+ });
106
+ // 6. Worker profiles exist for configured roles
107
+ for (const role of ['planner', 'coder', 'reviewer']) {
108
+ const agentName = repoConfig.defaults[role];
109
+ const mappedProfile = repoConfig.agents[agentName];
110
+ const profile = mappedProfile
111
+ ? config.workerProfiles[mappedProfile]
112
+ : Object.values(config.workerProfiles).find((p) => p.type === agentName);
113
+ results.push({
114
+ name: `Worker profile for ${role} (${agentName})`,
115
+ passed: !!profile,
116
+ message: profile
117
+ ? `Found profile: ${mappedProfile ?? agentName} (command: ${profile.command})`
118
+ : `No worker profile found for agent '${agentName}'`,
119
+ category: 'environment',
120
+ });
121
+ }
122
+ // 7. Verify commands configured
123
+ const hasVerify = (repoConfig.verify?.length ?? 0) > 0;
124
+ results.push({
125
+ name: 'Verify commands configured',
126
+ passed: hasVerify,
127
+ message: hasVerify
128
+ ? `${repoConfig.verify.length} verify command(s) configured`
129
+ : 'No verify commands configured — runs will skip verification',
130
+ category: 'verify',
131
+ optional: true,
132
+ });
133
+ logger.info({ repo: repoConfig.repo, passed: results.filter((r) => r.passed).length, total: results.length }, 'Project validation complete');
134
+ return results;
135
+ }
136
+ //# sourceMappingURL=project-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-check.js","sourceRoot":"","sources":["../../src/ops/project-check.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type Database from 'better-sqlite3';
2
2
  import type { ForgeAdapter } from '../forge/types.js';
3
3
  import type { RepoConfig } from '../config/schema.js';
4
+ import type { UpdateStrategy } from '../git/worktree.js';
4
5
  /**
5
6
  * Queue an issue for rebase-and-re-evaluate.
6
7
  *
@@ -26,7 +27,7 @@ export declare function queueRebase(db: Database.Database, forge: ForgeAdapter,
26
27
  * Returns false if verify fails — the caller should continue with
27
28
  * a code→verify→review cycle to fix the issues.
28
29
  */
29
- export declare function executeRebase(repoLocalPath: string, worktreePath: string, branchName: string, baseBranch: string, repo: string, issueNumber: number, verifyCommands: Array<string | string[]>): Promise<{
30
+ export declare function executeRebase(repoLocalPath: string, worktreePath: string, branchName: string, baseBranch: string, repo: string, issueNumber: number, verifyCommands: Array<string | string[]>, strategy?: UpdateStrategy): Promise<{
30
31
  rebased: boolean;
31
32
  verifyPassed: boolean;
32
33
  conflict: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"rebase-and-check.d.ts","sourceRoot":"","sources":["../../src/ops/rebase-and-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAarD;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgD9C;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,GACvC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CA+BzE"}
1
+ {"version":3,"file":"rebase-and-check.d.ts","sourceRoot":"","sources":["../../src/ops/rebase-and-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAYxD;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgD9C;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EACxC,QAAQ,GAAE,cAAwB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CA+BzE"}
@@ -68,7 +68,7 @@ export async function queueRebase(db, forge, repoConfig, issueNumber, botUser) {
68
68
  * Returns false if verify fails — the caller should continue with
69
69
  * a code→verify→review cycle to fix the issues.
70
70
  */
71
- export async function executeRebase(repoLocalPath, worktreePath, branchName, baseBranch, repo, issueNumber, verifyCommands) {
71
+ export async function executeRebase(repoLocalPath, worktreePath, branchName, baseBranch, repo, issueNumber, verifyCommands, strategy = 'merge') {
72
72
  const target = {
73
73
  repo,
74
74
  issueNumber,
@@ -77,7 +77,7 @@ export async function executeRebase(repoLocalPath, worktreePath, branchName, bas
77
77
  baseBranch,
78
78
  worktreePath,
79
79
  };
80
- const rebaseResult = await autoRebase(target, repoLocalPath);
80
+ const rebaseResult = await autoRebase(target, repoLocalPath, strategy);
81
81
  if (rebaseResult === 'up_to_date') {
82
82
  return { rebased: false, verifyPassed: true, conflict: false };
83
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rebase-and-check.js","sourceRoot":"","sources":["../../src/ops/rebase-and-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rebase-and-check.js","sourceRoot":"","sources":["../../src/ops/rebase-and-check.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { UpdateStrategy } from '../git/worktree.js';
1
2
  export interface RebaseTarget {
2
3
  repo: string;
3
4
  issueNumber: number;
@@ -8,11 +9,13 @@ export interface RebaseTarget {
8
9
  }
9
10
  export type RebaseResult = 'up_to_date' | 'rebased' | 'conflict' | 'error';
10
11
  /**
11
- * Check if a branch needs rebase and perform it automatically.
12
- * Uses --force-with-lease for push to protect against overwriting others' work.
12
+ * Update a branch to incorporate latest base branch changes and push.
13
+ * Supports both merge and rebase strategies. Uses --force-with-lease for
14
+ * push to protect against overwriting others' work.
13
15
  *
14
- * @returns 'up_to_date' if no rebase needed, 'rebased' on success,
15
- * 'conflict' if rebase had conflicts (aborted), 'error' on other failures.
16
+ * @param strategy - 'merge' creates a merge commit (reliable), 'rebase' replays commits (linear history)
17
+ * @returns 'up_to_date' if no update needed, 'rebased' on success,
18
+ * 'conflict' if update had conflicts (aborted), 'error' on other failures.
16
19
  */
17
- export declare function autoRebase(target: RebaseTarget, repoLocalPath: string): Promise<RebaseResult>;
20
+ export declare function autoRebase(target: RebaseTarget, repoLocalPath: string, strategy?: UpdateStrategy): Promise<RebaseResult>;
18
21
  //# sourceMappingURL=rebase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rebase.d.ts","sourceRoot":"","sources":["../../src/ops/rebase.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAE1E;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,YAAY,CAAC,CA0DvB"}
1
+ {"version":3,"file":"rebase.d.ts","sourceRoot":"","sources":["../../src/ops/rebase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAE1E;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EACrB,QAAQ,GAAE,cAAwB,GACjC,OAAO,CAAC,YAAY,CAAC,CAoEvB"}
@@ -1,13 +1,16 @@
1
1
  import { runGit } from '../git/process.js';
2
+ import { mergeFromBranch } from '../git/repo.js';
2
3
  import { logger } from '../utils/logger.js';
3
4
  /**
4
- * Check if a branch needs rebase and perform it automatically.
5
- * Uses --force-with-lease for push to protect against overwriting others' work.
5
+ * Update a branch to incorporate latest base branch changes and push.
6
+ * Supports both merge and rebase strategies. Uses --force-with-lease for
7
+ * push to protect against overwriting others' work.
6
8
  *
7
- * @returns 'up_to_date' if no rebase needed, 'rebased' on success,
8
- * 'conflict' if rebase had conflicts (aborted), 'error' on other failures.
9
+ * @param strategy - 'merge' creates a merge commit (reliable), 'rebase' replays commits (linear history)
10
+ * @returns 'up_to_date' if no update needed, 'rebased' on success,
11
+ * 'conflict' if update had conflicts (aborted), 'error' on other failures.
9
12
  */
10
- export async function autoRebase(target, repoLocalPath) {
13
+ export async function autoRebase(target, repoLocalPath, strategy = 'merge') {
11
14
  const { branchName, baseBranch, worktreePath } = target;
12
15
  const log = logger.child({ repo: target.repo, issue: target.issueNumber, branch: branchName });
13
16
  try {
@@ -16,51 +19,62 @@ export async function autoRebase(target, repoLocalPath) {
16
19
  cwd: repoLocalPath,
17
20
  timeout: 60_000,
18
21
  });
19
- // Check if base branch is already an ancestor of HEAD (i.e., no rebase needed)
22
+ // Check if base branch is already an ancestor of HEAD (i.e., no update needed)
20
23
  try {
21
24
  await runGit(['merge-base', '--is-ancestor', `origin/${baseBranch}`, 'HEAD'], {
22
25
  cwd: worktreePath,
23
26
  timeout: 30_000,
24
27
  });
25
- // Exit code 0 means base is ancestor → already up to date
26
28
  return 'up_to_date';
27
29
  }
28
30
  catch {
29
- // Non-zero exit = base is NOT an ancestor → rebase needed
31
+ // Non-zero exit = base is NOT an ancestor → update needed
30
32
  }
31
- log.info({ baseBranch }, 'Base branch has moved ahead — rebasing');
32
- // Attempt rebase
33
- try {
34
- await runGit(['rebase', `origin/${baseBranch}`], {
35
- cwd: worktreePath,
36
- timeout: 120_000,
37
- });
38
- }
39
- catch (rebaseErr) {
40
- const stderr = rebaseErr.stderr ?? '';
41
- if (stderr.includes('CONFLICT') || stderr.includes('could not apply')) {
42
- log.warn({ baseBranch }, 'Rebase conflict — aborting');
43
- try {
44
- await runGit(['rebase', '--abort'], { cwd: worktreePath, timeout: 30_000 });
33
+ const remoteRef = `origin/${baseBranch}`;
34
+ log.info({ baseBranch, strategy }, 'Base branch has moved ahead — updating');
35
+ if (strategy === 'merge') {
36
+ const result = await mergeFromBranch(worktreePath, remoteRef);
37
+ if (!result.success) {
38
+ if (result.conflict) {
39
+ log.warn({ baseBranch }, 'Merge conflict with base branch — aborting');
40
+ return 'conflict';
45
41
  }
46
- catch {
47
- // Abort itself failed — worktree may be in bad state
48
- log.error('Failed to abort rebase');
42
+ return 'error';
43
+ }
44
+ }
45
+ else {
46
+ // Rebase strategy
47
+ try {
48
+ await runGit(['rebase', remoteRef], {
49
+ cwd: worktreePath,
50
+ timeout: 120_000,
51
+ });
52
+ }
53
+ catch (rebaseErr) {
54
+ const stderr = rebaseErr.stderr ?? '';
55
+ if (stderr.includes('CONFLICT') || stderr.includes('could not apply')) {
56
+ log.warn({ baseBranch }, 'Rebase conflict — aborting');
57
+ try {
58
+ await runGit(['rebase', '--abort'], { cwd: worktreePath, timeout: 30_000 });
59
+ }
60
+ catch {
61
+ log.error('Failed to abort rebase');
62
+ }
63
+ return 'conflict';
49
64
  }
50
- return 'conflict';
65
+ throw rebaseErr;
51
66
  }
52
- throw rebaseErr;
53
67
  }
54
68
  // Push with --force-with-lease
55
69
  await runGit(['push', '--force-with-lease', 'origin', branchName], {
56
70
  cwd: worktreePath,
57
71
  timeout: 60_000,
58
72
  });
59
- log.info({ baseBranch }, 'Rebased and pushed successfully');
73
+ log.info({ baseBranch, strategy }, 'Updated and pushed successfully');
60
74
  return 'rebased';
61
75
  }
62
76
  catch (err) {
63
- log.error({ err }, 'Auto-rebase failed');
77
+ log.error({ err }, 'Auto-update failed');
64
78
  return 'error';
65
79
  }
66
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rebase.js","sourceRoot":"","sources":["../../src/ops/rebase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAa3C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAoB,EACpB,aAAqB;IAErB,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAE9F,IAAI,CAAC;QACH,4BAA4B;QAC5B,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YAChC,GAAG,EAAE,aAAa;YAClB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAA;QAEF,+EAA+E;QAC/E,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,UAAU,UAAU,EAAE,EAAE,MAAM,CAAC,EAAE;gBAC5E,GAAG,EAAE,YAAY;gBACjB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAA;YACF,0DAA0D;YAC1D,OAAO,YAAY,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,wCAAwC,CAAC,CAAA;QAElE,iBAAiB;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,UAAU,UAAU,EAAE,CAAC,EAAE;gBAC/C,GAAG,EAAE,YAAY;gBACjB,OAAO,EAAE,OAAO;aACjB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,MAAM,MAAM,GAAI,SAAiC,CAAC,MAAM,IAAI,EAAE,CAAA;YAC9D,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACtE,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,4BAA4B,CAAC,CAAA;gBACtD,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;gBAC7E,CAAC;gBAAC,MAAM,CAAC;oBACP,qDAAqD;oBACrD,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;gBACrC,CAAC;gBACD,OAAO,UAAU,CAAA;YACnB,CAAC;YACD,MAAM,SAAS,CAAA;QACjB,CAAC;QAED,+BAA+B;QAC/B,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;YACjE,GAAG,EAAE,YAAY;YACjB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAA;QAEF,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,iCAAiC,CAAC,CAAA;QAC3D,OAAO,SAAS,CAAA;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAA;QACxC,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"rebase.js","sourceRoot":"","sources":["../../src/ops/rebase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Config } from '../config/schema.js';
2
+ import type Database from 'better-sqlite3';
3
+ import type { RunManager } from '../state/runs.js';
4
+ import type { LeaseManager } from '../state/leases.js';
5
+ import type { ForgeAdapter } from '../forge/types.js';
6
+ /** Issues that returned 404 during comment scan in this process lifecycle.
7
+ * Bounded: entries are evicted when the key's run reaches a terminal state
8
+ * via cleanupRunCaches. */
9
+ export declare const missingCommentCommandIssues: Set<string>;
10
+ export interface ProcessCommentCommandsParams {
11
+ config: Config;
12
+ db: Database.Database;
13
+ forge: ForgeAdapter;
14
+ runManager: RunManager;
15
+ leaseManager: LeaseManager;
16
+ repoConfig: Config['repos'][0];
17
+ botUser: string;
18
+ }
19
+ export declare function processCommentCommands(params: ProcessCommentCommandsParams): Promise<void>;
20
+ //# sourceMappingURL=comment-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-commands.d.ts","sourceRoot":"","sources":["../../src/runner/comment-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAerD;;4BAE4B;AAC5B,eAAO,MAAM,2BAA2B,aAAoB,CAAA;AAE5D,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAA;IACrB,KAAK,EAAE,YAAY,CAAA;IACnB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;CAChB;AAUD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4HhG"}
@@ -0,0 +1,221 @@
1
+ import { transitionLabels } from '../labels/manager.js';
2
+ import { buildLabelConfig } from '../labels/config.js';
3
+ import { queueRebase } from '../ops/rebase-and-check.js';
4
+ import { queueContinue } from '../ops/continue.js';
5
+ import { isCommandProcessed, markCommandProcessed, parseOrchCommands, } from '../discovery/commands.js';
6
+ import { resolveIssueRepo } from '../utils/issue-repo.js';
7
+ import { nowUtcIso } from '../utils/time.js';
8
+ import { logger } from '../utils/logger.js';
9
+ /** Issues that returned 404 during comment scan in this process lifecycle.
10
+ * Bounded: entries are evicted when the key's run reaches a terminal state
11
+ * via cleanupRunCaches. */
12
+ export const missingCommentCommandIssues = new Set();
13
+ function getHttpStatus(err) {
14
+ if (typeof err !== 'object' || err === null)
15
+ return null;
16
+ const e = err;
17
+ if (typeof e.status === 'number')
18
+ return e.status;
19
+ if (typeof e.response?.status === 'number')
20
+ return e.response.status;
21
+ return null;
22
+ }
23
+ export async function processCommentCommands(params) {
24
+ const { config, db, forge, runManager, leaseManager, repoConfig, botUser, } = params;
25
+ const commandSettings = config.commentCommands ?? { enabled: true, requireCollaborator: false };
26
+ if (!commandSettings.enabled)
27
+ return;
28
+ if (!commandSettings.requireCollaborator) {
29
+ logger.warn({ repo: repoConfig.repo }, 'commentCommands.requireCollaborator=false — /orch commands accept any commenter. Enable on public repos.');
30
+ }
31
+ const activeRuns = runManager
32
+ .getActive()
33
+ .filter((run) => run.repo === repoConfig.repo);
34
+ const issueRows = [...new Map(activeRuns.map((run) => {
35
+ const issueRepo = resolveIssueRepo(run.phaseData, repoConfig.repo);
36
+ return [`${issueRepo}#${run.issueNumber}`, { issue_number: run.issueNumber, issue_repo: issueRepo }];
37
+ })).values()]
38
+ .sort((a, b) => a.issue_repo.localeCompare(b.issue_repo) || a.issue_number - b.issue_number);
39
+ if (issueRows.length === 0)
40
+ return;
41
+ const collaboratorCache = new Map();
42
+ for (const row of issueRows) {
43
+ const issueKey = `${row.issue_repo}#${row.issue_number}`;
44
+ if (missingCommentCommandIssues.has(issueKey)) {
45
+ continue;
46
+ }
47
+ let comments;
48
+ try {
49
+ comments = await forge.listIssueComments(row.issue_repo, row.issue_number);
50
+ }
51
+ catch (err) {
52
+ if (getHttpStatus(err) === 404) {
53
+ missingCommentCommandIssues.add(issueKey);
54
+ logger.debug({ repo: row.issue_repo, issueNumber: row.issue_number }, 'Skipping comment command scan for missing or inaccessible issue');
55
+ continue;
56
+ }
57
+ throw err;
58
+ }
59
+ const parsed = parseOrchCommands(comments, '1970-01-01T00:00:00Z');
60
+ for (const item of parsed) {
61
+ if (isCommandProcessed(db, row.issue_repo, row.issue_number, item.commentId))
62
+ continue;
63
+ let commandStatus = null;
64
+ try {
65
+ const allowed = await canExecuteCommentCommand({
66
+ forge,
67
+ repo: row.issue_repo,
68
+ user: item.user,
69
+ requireCollaborator: commandSettings.requireCollaborator,
70
+ cache: collaboratorCache,
71
+ });
72
+ if (!allowed) {
73
+ commandStatus = 'denied';
74
+ logger.info({ repo: repoConfig.repo, issueNumber: row.issue_number, user: item.user, commentId: item.commentId }, 'Ignoring comment command from non-collaborator');
75
+ continue;
76
+ }
77
+ const result = await executeCommentCommand({
78
+ command: item.command,
79
+ db,
80
+ forge,
81
+ runManager,
82
+ leaseManager,
83
+ repoConfig,
84
+ issueRepo: row.issue_repo,
85
+ issueNumber: row.issue_number,
86
+ botUser,
87
+ user: item.user,
88
+ });
89
+ if (!result.ok) {
90
+ commandStatus = 'rejected';
91
+ logger.info({ repo: repoConfig.repo, issueNumber: row.issue_number, command: item.command.type, reason: result.reason }, 'Comment command rejected');
92
+ }
93
+ else {
94
+ commandStatus = 'applied';
95
+ logger.info({ repo: repoConfig.repo, issueNumber: row.issue_number, command: item.command.type, user: item.user }, 'Comment command applied');
96
+ }
97
+ }
98
+ catch (err) {
99
+ logger.warn({ repo: repoConfig.repo, issueNumber: row.issue_number, commentId: item.commentId, command: item.command.type, err }, 'Comment command failed (transient — will retry)');
100
+ }
101
+ finally {
102
+ if (commandStatus !== null) {
103
+ markCommandProcessed(db, row.issue_repo, row.issue_number, item.commentId, `${item.command.type}:${commandStatus}`);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ async function canExecuteCommentCommand(params) {
110
+ const { forge, repo, user, requireCollaborator, cache } = params;
111
+ if (!requireCollaborator)
112
+ return true;
113
+ if (!user)
114
+ return false;
115
+ const cacheKey = `${repo}\n${user}`;
116
+ const cached = cache.get(cacheKey);
117
+ if (cached !== undefined)
118
+ return cached;
119
+ if (!forge.isCollaborator) {
120
+ logger.warn({ repo, user }, 'requireCollaborator=true but forge adapter has no isCollaborator() implementation');
121
+ cache.set(cacheKey, false);
122
+ return false;
123
+ }
124
+ try {
125
+ const allowed = await forge.isCollaborator(repo, user);
126
+ cache.set(cacheKey, allowed);
127
+ return allowed;
128
+ }
129
+ catch (err) {
130
+ logger.warn({ repo, user, err }, 'Failed collaborator check for comment command user');
131
+ cache.set(cacheKey, false);
132
+ return false;
133
+ }
134
+ }
135
+ async function executeCommentCommand(params) {
136
+ const { command, db, forge, runManager, leaseManager, repoConfig, issueRepo, issueNumber, botUser, user, } = params;
137
+ switch (command.type) {
138
+ case 'retry':
139
+ return queueRetryFromComment({
140
+ runManager,
141
+ leaseManager,
142
+ forge,
143
+ repoConfig,
144
+ issueRepo,
145
+ issueNumber,
146
+ resetPlan: command.resetPlan,
147
+ });
148
+ case 'continue':
149
+ {
150
+ const result = await queueContinue(db, forge, repoConfig, issueNumber, botUser, { issueRepo });
151
+ return result.queued ? { ok: true } : { ok: false, reason: result.reason };
152
+ }
153
+ case 'rebase': {
154
+ const result = await queueRebase(db, forge, repoConfig, issueNumber, botUser);
155
+ return result.queued ? { ok: true } : { ok: false, reason: result.reason };
156
+ }
157
+ case 'cancel':
158
+ return cancelRunFromComment({
159
+ runManager,
160
+ leaseManager,
161
+ forge,
162
+ repoConfig,
163
+ issueRepo,
164
+ issueNumber,
165
+ user,
166
+ });
167
+ default: {
168
+ const exhaustive = command;
169
+ return { ok: false, reason: `Unsupported command: ${String(exhaustive)}` };
170
+ }
171
+ }
172
+ }
173
+ async function queueRetryFromComment(params) {
174
+ const { runManager, leaseManager, forge, repoConfig, issueRepo, issueNumber, resetPlan } = params;
175
+ const run = runManager.getByRepoAndIssue(repoConfig.repo, issueNumber);
176
+ if (!run)
177
+ return { ok: false, reason: 'No run found for issue' };
178
+ if (run.status === 'running')
179
+ return { ok: false, reason: 'Run is currently running' };
180
+ if (!['blocked', 'error', 'review_ready'].includes(run.status)) {
181
+ return { ok: false, reason: `Retry not allowed from status ${run.status}` };
182
+ }
183
+ runManager.update(run.id, {
184
+ status: 'queued',
185
+ currentPhase: null,
186
+ endedAt: null,
187
+ lastError: null,
188
+ phaseData: resetPlan ? null : run.phaseData,
189
+ blockReason: null,
190
+ });
191
+ leaseManager.release(issueRepo, issueNumber);
192
+ if (issueRepo !== repoConfig.repo) {
193
+ leaseManager.release(repoConfig.repo, issueNumber);
194
+ }
195
+ const issue = await forge.getIssue(issueRepo, issueNumber);
196
+ await transitionLabels(forge, issueRepo, issueNumber, issue.labels, run.status, 'queued', buildLabelConfig(repoConfig, issue.labels));
197
+ return { ok: true };
198
+ }
199
+ async function cancelRunFromComment(params) {
200
+ const { runManager, leaseManager, forge, repoConfig, issueRepo, issueNumber, user } = params;
201
+ const run = runManager.getByRepoAndIssue(repoConfig.repo, issueNumber);
202
+ if (!run)
203
+ return { ok: false, reason: 'No run found for issue' };
204
+ if (run.status !== 'running' && run.status !== 'queued') {
205
+ return { ok: false, reason: `Cancel only supports running/queued runs (current: ${run.status})` };
206
+ }
207
+ runManager.update(run.id, {
208
+ status: 'blocked',
209
+ endedAt: nowUtcIso(),
210
+ lastError: `Cancelled by @${user} via comment command`,
211
+ blockReason: null,
212
+ });
213
+ leaseManager.release(issueRepo, issueNumber);
214
+ if (issueRepo !== repoConfig.repo) {
215
+ leaseManager.release(repoConfig.repo, issueNumber);
216
+ }
217
+ const issue = await forge.getIssue(issueRepo, issueNumber);
218
+ await transitionLabels(forge, issueRepo, issueNumber, issue.labels, run.status, 'blocked', buildLabelConfig(repoConfig, issue.labels));
219
+ return { ok: true };
220
+ }
221
+ //# sourceMappingURL=comment-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-commands.js","sourceRoot":"","sources":["../../src/runner/comment-commands.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,GAElB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C;;4BAE4B;AAC5B,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,GAAG,EAAU,CAAA;AAY5D,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IACxD,MAAM,CAAC,GAAG,GAA4D,CAAA;IACtE,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,MAAM,CAAA;IACjD,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAA;IACpE,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAoC;IAC/E,MAAM,EACJ,MAAM,EACN,EAAE,EACF,KAAK,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,OAAO,GACR,GAAG,MAAM,CAAA;IAEV,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAA;IAC/F,IAAI,CAAC,eAAe,CAAC,OAAO;QAAE,OAAM;IACpC,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,EACzB,0GAA0G,CAC3G,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,UAAU;SAC1B,SAAS,EAAE;SACX,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,CAAA;IAEhD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAC3B,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACrB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;YAClE,OAAO,CAAC,GAAG,SAAS,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,CAAU,CAAA;QAC/G,CAAC,CAAC,CACH,CAAC,MAAM,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAA;IAE9F,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAElC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAmB,CAAA;IAEpD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,YAAY,EAAE,CAAA;QACxD,IAAI,2BAA2B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,SAAQ;QACV,CAAC;QAED,IAAI,QAA6D,CAAA;QACjE,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,CAAA;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC/B,2BAA2B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACzC,MAAM,CAAC,KAAK,CACV,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,EACvD,iEAAiE,CAClE,CAAA;gBACD,SAAQ;YACV,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAA;QAElE,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,kBAAkB,CAAC,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;gBAAE,SAAQ;YAEtF,IAAI,aAAa,GAAkB,IAAI,CAAA;YACvC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC;oBAC7C,KAAK;oBACL,IAAI,EAAE,GAAG,CAAC,UAAU;oBACpB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,mBAAmB,EAAE,eAAe,CAAC,mBAAmB;oBACxD,KAAK,EAAE,iBAAiB;iBACzB,CAAC,CAAA;gBAEF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,aAAa,GAAG,QAAQ,CAAA;oBACxB,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EACpG,gDAAgD,CACjD,CAAA;oBACD,SAAQ;gBACV,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;oBACzC,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,EAAE;oBACF,KAAK;oBACL,UAAU;oBACV,YAAY;oBACZ,UAAU;oBACV,SAAS,EAAE,GAAG,CAAC,UAAU;oBACzB,WAAW,EAAE,GAAG,CAAC,YAAY;oBAC7B,OAAO;oBACP,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAA;gBAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,aAAa,GAAG,UAAU,CAAA;oBAC1B,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAC3G,0BAA0B,CAC3B,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,aAAa,GAAG,SAAS,CAAA;oBACzB,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EACrG,yBAAyB,CAC1B,CAAA;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,EACpH,iDAAiD,CAClD,CAAA;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;oBAC3B,oBAAoB,CAClB,EAAE,EACF,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,YAAY,EAChB,IAAI,CAAC,SAAS,EACd,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,aAAa,EAAE,CACxC,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAUD,KAAK,UAAU,wBAAwB,CAAC,MAAsC;IAC5E,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;IAChE,IAAI,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAA;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAEvB,MAAM,QAAQ,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,CAAA;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IAEvC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,mFAAmF,CAAC,CAAA;QAChH,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACtD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC5B,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,oDAAoD,CAAC,CAAA;QACtF,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAiBD,KAAK,UAAU,qBAAqB,CAAC,MAAmC;IACtE,MAAM,EACJ,OAAO,EACP,EAAE,EACF,KAAK,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,OAAO,EACP,IAAI,GACL,GAAG,MAAM,CAAA;IAEV,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,qBAAqB,CAAC;gBAC3B,UAAU;gBACV,YAAY;gBACZ,KAAK;gBACL,UAAU;gBACV,SAAS;gBACT,WAAW;gBACX,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAA;QACJ,KAAK,UAAU;YACb,CAAC;gBACC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC9F,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;YAC5E,CAAC;QACH,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;YAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;QAC5E,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC;gBAC1B,UAAU;gBACV,YAAY;gBACZ,KAAK;gBACL,UAAU;gBACV,SAAS;gBACT,WAAW;gBACX,IAAI;aACL,CAAC,CAAA;QACJ,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,UAAU,GAAU,OAAO,CAAA;YACjC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,CAAA;QAC5E,CAAC;IACH,CAAC;AACH,CAAC;AAYD,KAAK,UAAU,qBAAqB,CAAC,MAAmC;IACtE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IACjG,MAAM,GAAG,GAAG,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IACtE,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAA;IAChE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAA;IACtF,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iCAAiC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;IAC7E,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;QACxB,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS;QAC3C,WAAW,EAAE,IAAI;KAClB,CAAC,CAAA;IACF,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC5C,IAAI,SAAS,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;QAClC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IACpD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC1D,MAAM,gBAAgB,CACpB,KAAK,EACL,SAAS,EACT,WAAW,EACX,KAAK,CAAC,MAAM,EACZ,GAAG,CAAC,MAAM,EACV,QAAQ,EACR,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAC3C,CAAA;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;AACrB,CAAC;AAYD,KAAK,UAAU,oBAAoB,CAAC,MAAkC;IACpE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAC5F,MAAM,GAAG,GAAG,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IACtE,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAA;IAChE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sDAAsD,GAAG,CAAC,MAAM,GAAG,EAAE,CAAA;IACnG,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;QACxB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,SAAS,EAAE;QACpB,SAAS,EAAE,iBAAiB,IAAI,sBAAsB;QACtD,WAAW,EAAE,IAAI;KAClB,CAAC,CAAA;IACF,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC5C,IAAI,SAAS,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;QAClC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IACpD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC1D,MAAM,gBAAgB,CACpB,KAAK,EACL,SAAS,EACT,WAAW,EACX,KAAK,CAAC,MAAM,EACZ,GAAG,CAAC,MAAM,EACV,SAAS,EACT,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAC3C,CAAA;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;AACrB,CAAC"}