@agentic-sdlc/dispatch 0.3.0 → 0.3.1

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.
@@ -31,7 +31,7 @@ export function orchestrateStage(ctx) {
31
31
  const artifactPath = join(artifactsDir, stage.produces);
32
32
  if (!existsSync(artifactPath)) {
33
33
  console.error(`[dispatch] Artifact not found: ${artifactPath}`);
34
- postComment(repo, issueNumber, `## Stage: ${stage.name} — Escalated\n\nThe agent did not produce the expected artifact \`${stage.produces}\`. This usually means the agent ran out of time or encountered an error.\n\nLabel: \`escalated\``);
34
+ postIssueComment(repo, issueNumber, `**${stage.name}**Agent did not produce \`${stage.produces}\`. Escalating.`);
35
35
  applyLabel(repo, issueNumber, "escalated", label);
36
36
  return { stage: stage.name, action: "no-artifact", nextLabel: "escalated" };
37
37
  }
@@ -51,7 +51,12 @@ export function orchestrateStage(ctx) {
51
51
  }
52
52
  function handleGateNone(ctx, stage, stageIndex) {
53
53
  const { issueNumber, repo, label, workflowConfig, artifactsDir } = ctx;
54
- // Commit artifact to current branch and push
54
+ const branchPattern = stage.branch_pattern;
55
+ if (branchPattern) {
56
+ // Stage with a branch pattern: push to branch and open/update draft PR
57
+ return handleBranchStage(ctx, stage, stageIndex);
58
+ }
59
+ // Simple stage (triage, plan): commit to main and advance
55
60
  try {
56
61
  execFileSync("git", ["add", artifactsDir]);
57
62
  execFileSync("git", ["commit", "-m", `chore: add ${stage.produces} for issue #${issueNumber}`]);
@@ -60,11 +65,51 @@ function handleGateNone(ctx, stage, stageIndex) {
60
65
  catch (err) {
61
66
  console.error(`[dispatch] Git commit/push failed for gate=none:`, err);
62
67
  }
63
- // Post stage completion comment with artifact summary
68
+ const nextLabel = findNextStageLabel(workflowConfig.pipeline, stageIndex);
69
+ const artifactContent = readArtifactContent(artifactsDir, stage.produces);
70
+ postIssueComment(repo, issueNumber, `**${stage.name}** — Complete. Advancing to \`${nextLabel ?? "done"}\`.\n\n<details>\n<summary>${stage.produces}</summary>\n\n${artifactContent}\n</details>`);
71
+ if (nextLabel) {
72
+ applyLabel(repo, issueNumber, nextLabel, label);
73
+ }
74
+ return { stage: stage.name, action: "advanced", nextLabel };
75
+ }
76
+ function handleBranchStage(ctx, stage, stageIndex) {
77
+ const { issueNumber, repo, label, workflowConfig, artifactsDir } = ctx;
78
+ const branchName = renderTemplate(stage.branch_pattern, issueNumber);
79
+ // Create or checkout branch
80
+ try {
81
+ execFileSync("git", ["checkout", "-b", branchName], { stdio: "pipe" });
82
+ }
83
+ catch {
84
+ try {
85
+ execFileSync("git", ["checkout", branchName], { stdio: "pipe" });
86
+ }
87
+ catch (err) {
88
+ console.error(`[dispatch] Failed to checkout branch ${branchName}:`, err);
89
+ }
90
+ }
91
+ // Commit and push
92
+ try {
93
+ execFileSync("git", ["add", artifactsDir]);
94
+ execFileSync("git", ["commit", "-m", `feat: ${stage.name} for issue #${issueNumber}`], { stdio: "pipe" });
95
+ }
96
+ catch { /* may be nothing to commit */ }
97
+ try {
98
+ execFileSync("git", ["push", "-u", "--force-with-lease", "origin", branchName], { stdio: "pipe" });
99
+ }
100
+ catch (err) {
101
+ console.error(`[dispatch] Git push failed:`, err);
102
+ }
103
+ // Open draft PR if none exists, or find existing
104
+ const prNumber = ensureDraftPr(repo, issueNumber, branchName, stage.name);
105
+ // Post build log as PR comment
64
106
  const artifactContent = readArtifactContent(artifactsDir, stage.produces);
107
+ if (prNumber && artifactContent) {
108
+ postPrComment(repo, prNumber, `## Build Log\n\n${artifactContent}`);
109
+ }
110
+ // Advance to next stage
65
111
  const nextLabel = findNextStageLabel(workflowConfig.pipeline, stageIndex);
66
- postComment(repo, issueNumber, `## Stage: ${stage.name} — Complete\n\n<details>\n<summary>Artifact: ${stage.produces}</summary>\n\n${artifactContent}\n</details>\n\nAdvancing to: \`${nextLabel ?? "done"}\``);
67
- // Advance to next stage label
112
+ postIssueComment(repo, issueNumber, `**${stage.name}** — Complete. Draft PR opened. Advancing to \`${nextLabel ?? "done"}\`.`);
68
113
  if (nextLabel) {
69
114
  applyLabel(repo, issueNumber, nextLabel, label);
70
115
  }
@@ -75,49 +120,40 @@ function handleGatePrReview(ctx, stage, stageIndex) {
75
120
  const branchName = renderTemplate(stage.branch_pattern ?? `${stage.name}/issue-{{ issue.number }}`, issueNumber);
76
121
  // Create or checkout branch
77
122
  try {
78
- execFileSync("git", ["checkout", "-b", branchName]);
123
+ execFileSync("git", ["checkout", "-b", branchName], { stdio: "pipe" });
79
124
  }
80
125
  catch {
81
- // Branch may already exist — try checking it out
82
126
  try {
83
- execFileSync("git", ["checkout", branchName]);
127
+ execFileSync("git", ["checkout", branchName], { stdio: "pipe" });
84
128
  }
85
129
  catch (err) {
86
130
  console.error(`[dispatch] Failed to checkout branch ${branchName}:`, err);
87
131
  }
88
132
  }
89
- // Commit artifacts
133
+ // Commit and push
90
134
  try {
91
135
  execFileSync("git", ["add", artifactsDir]);
92
- execFileSync("git", ["commit", "-m", `feat: add ${stage.produces} for issue #${issueNumber}`]);
136
+ execFileSync("git", ["commit", "-m", `feat: add ${stage.produces} for issue #${issueNumber}`], { stdio: "pipe" });
93
137
  }
94
- catch (err) {
95
- console.error(`[dispatch] Git commit failed for pr-review gate:`, err);
96
- }
97
- // Push branch (force to handle re-runs where branch already exists)
138
+ catch { /* may be nothing to commit */ }
98
139
  try {
99
- execFileSync("git", ["push", "-u", "--force-with-lease", "origin", branchName]);
140
+ execFileSync("git", ["push", "-u", "--force-with-lease", "origin", branchName], { stdio: "pipe" });
100
141
  }
101
142
  catch (err) {
102
143
  console.error(`[dispatch] Git push failed:`, err);
103
144
  }
104
- // Open PR if one does not already exist
145
+ // Open PR (not draft this is for human review)
105
146
  let prCreated = false;
106
147
  try {
107
148
  const existing = execFileSync("gh", [
108
- "pr", "list",
109
- "--repo", repo,
110
- "--head", branchName,
111
- "--json", "number",
112
- ]).toString().trim();
149
+ "pr", "list", "--repo", repo, "--head", branchName, "--json", "number",
150
+ ], { stdio: "pipe" }).toString().trim();
113
151
  const prs = JSON.parse(existing || "[]");
114
152
  if (prs.length === 0) {
115
153
  execFileSync("gh", [
116
- "pr", "create",
117
- "--repo", repo,
118
- "--head", branchName,
154
+ "pr", "create", "--repo", repo, "--head", branchName,
119
155
  "--title", `[#${issueNumber}] ${stage.name}: ${stage.produces}`,
120
- "--body", `Automated PR for issue #${issueNumber} stage: ${stage.name}`,
156
+ "--body", `Automated PR for issue #${issueNumber}.\n\nReview and merge to advance the pipeline.\n\nCloses #${issueNumber}`,
121
157
  ]);
122
158
  prCreated = true;
123
159
  }
@@ -125,31 +161,35 @@ function handleGatePrReview(ctx, stage, stageIndex) {
125
161
  catch (err) {
126
162
  console.error(`[dispatch] PR creation failed:`, err);
127
163
  }
128
- // Find the "ready" label for this stage (convention: stage's own ready label)
129
164
  const readyLabel = findReadyLabel(workflowConfig.pipeline, stage.name);
130
165
  const nextLabel = readyLabel ?? findNextStageLabel(workflowConfig.pipeline, stageIndex);
131
- // Post comment about PR
132
166
  const artifactContent = readArtifactContent(artifactsDir, stage.produces);
133
- const prMsg = prCreated ? `PR opened on branch \`${branchName}\`. Please review and merge to advance.` : `Branch \`${branchName}\` updated.`;
134
- postComment(repo, issueNumber, `## Stage: ${stage.name} — PR Ready\n\n${prMsg}\n\n<details>\n<summary>Artifact: ${stage.produces}</summary>\n\n${artifactContent}\n</details>\n\nLabel: \`${nextLabel ?? "done"}\``);
167
+ postIssueComment(repo, issueNumber, `**${stage.name}** PR ready for review on \`${branchName}\`.\n\n<details>\n<summary>${stage.produces}</summary>\n\n${artifactContent}\n</details>`);
135
168
  if (nextLabel) {
136
169
  applyLabel(repo, issueNumber, nextLabel, label);
137
170
  }
138
- return {
139
- stage: stage.name,
140
- action: prCreated ? "opened-pr" : "advanced",
141
- nextLabel,
142
- };
171
+ return { stage: stage.name, action: prCreated ? "opened-pr" : "advanced", nextLabel };
143
172
  }
144
173
  function handleGateRetry(ctx, stage, stageIndex) {
145
174
  const { issueNumber, repo, label, workflowConfig, artifactsDir } = ctx;
146
- // Read verdict from artifact frontmatter
147
175
  const verdict = readVerdictFromArtifact(artifactsDir, stage.produces ?? "");
148
176
  const maxRetries = stage.max_retries ?? 3;
149
177
  const artifactContent = readArtifactContent(artifactsDir, stage.produces);
178
+ // Find the impl PR to comment on
179
+ const implBranch = `impl/issue-${issueNumber}`;
180
+ const prNumber = findPrByBranch(repo, implBranch);
150
181
  if (verdict === "pass") {
182
+ // Post QA report on PR
183
+ if (prNumber) {
184
+ postPrComment(repo, prNumber, `## QA Report — PASS\n\n${artifactContent}`);
185
+ // Mark PR as ready for review (remove draft)
186
+ try {
187
+ execFileSync("gh", ["pr", "ready", String(prNumber), "--repo", repo], { stdio: "pipe" });
188
+ }
189
+ catch { /* may already be ready */ }
190
+ }
151
191
  const nextLabel = findNextStageLabel(workflowConfig.pipeline, stageIndex);
152
- postComment(repo, issueNumber, `## Stage: ${stage.name} — PASS\n\n<details>\n<summary>QA Report</summary>\n\n${artifactContent}\n</details>\n\nAdvancing to: \`${nextLabel ?? "done"}\``);
192
+ postIssueComment(repo, issueNumber, `**${stage.name}** — PASS. PR ready for human review.`);
153
193
  if (nextLabel) {
154
194
  applyLabel(repo, issueNumber, nextLabel, label);
155
195
  }
@@ -158,13 +198,19 @@ function handleGateRetry(ctx, stage, stageIndex) {
158
198
  // verdict is "fail" or unknown — check retry count
159
199
  const attemptCount = getAttemptCount(artifactsDir, stage.name);
160
200
  if (attemptCount >= maxRetries) {
161
- postComment(repo, issueNumber, `## Stage: ${stage.name} — ESCALATED\n\nQA failed after ${attemptCount} attempts (max: ${maxRetries}). Human intervention required.\n\n<details>\n<summary>Last QA Report</summary>\n\n${artifactContent}\n</details>\n\nLabel: \`escalated\``);
201
+ if (prNumber) {
202
+ postPrComment(repo, prNumber, `## QA Report — ESCALATED (attempt ${attemptCount}/${maxRetries})\n\nMax retries exceeded. Human intervention required.\n\n${artifactContent}`);
203
+ }
204
+ postIssueComment(repo, issueNumber, `**${stage.name}** — ESCALATED after ${attemptCount} attempts. Human intervention required.`);
162
205
  applyLabel(repo, issueNumber, "escalated", label);
163
206
  return { stage: stage.name, action: "escalated", nextLabel: "escalated" };
164
207
  }
165
- // Apply retry label (needs-fix)
208
+ // Retry post failure on PR and issue
209
+ if (prNumber) {
210
+ postPrComment(repo, prNumber, `## QA Report — FAIL (attempt ${attemptCount}/${maxRetries})\n\nRetrying. Builder will fix the issues below.\n\n${artifactContent}`);
211
+ }
212
+ postIssueComment(repo, issueNumber, `**${stage.name}** — FAIL (attempt ${attemptCount}/${maxRetries}). Retrying.`);
166
213
  const retryLabel = findRetryLabel(workflowConfig.pipeline, stage.name);
167
- postComment(repo, issueNumber, `## Stage: ${stage.name} — FAIL (attempt ${attemptCount}/${maxRetries})\n\nRetrying. The builder will read the QA report and fix the issues.\n\n<details>\n<summary>QA Report</summary>\n\n${artifactContent}\n</details>\n\nLabel: \`${retryLabel ?? "needs-fix"}\``);
168
214
  if (retryLabel) {
169
215
  applyLabel(repo, issueNumber, retryLabel, label);
170
216
  }
@@ -181,22 +227,70 @@ function applyLabel(repo, issueNumber, addLabel, removeLabel) {
181
227
  "--repo", repo,
182
228
  "--add-label", addLabel,
183
229
  "--remove-label", removeLabel,
184
- ]);
230
+ ], { stdio: "pipe" });
185
231
  }
186
232
  catch (err) {
187
233
  console.error(`[dispatch] Label transition failed (add=${addLabel}, remove=${removeLabel}):`, err);
188
234
  }
189
235
  }
190
- function postComment(repo, issueNumber, body) {
236
+ function postIssueComment(repo, issueNumber, body) {
191
237
  try {
192
238
  execFileSync("gh", [
193
239
  "issue", "comment", String(issueNumber),
194
240
  "--repo", repo,
195
241
  "--body", body,
196
- ]);
242
+ ], { stdio: "pipe" });
243
+ }
244
+ catch (err) {
245
+ console.error(`[dispatch] Failed to post issue comment:`, err);
246
+ }
247
+ }
248
+ function postPrComment(repo, prNumber, body) {
249
+ try {
250
+ execFileSync("gh", [
251
+ "pr", "comment", String(prNumber),
252
+ "--repo", repo,
253
+ "--body", body,
254
+ ], { stdio: "pipe" });
197
255
  }
198
256
  catch (err) {
199
- console.error(`[dispatch] Failed to post comment:`, err);
257
+ console.error(`[dispatch] Failed to post PR comment:`, err);
258
+ }
259
+ }
260
+ function ensureDraftPr(repo, issueNumber, branchName, stageName) {
261
+ try {
262
+ const existing = execFileSync("gh", [
263
+ "pr", "list", "--repo", repo, "--head", branchName, "--json", "number",
264
+ ], { stdio: "pipe" }).toString().trim();
265
+ const prs = JSON.parse(existing || "[]");
266
+ if (prs.length > 0) {
267
+ return prs[0].number;
268
+ }
269
+ // Create draft PR
270
+ const output = execFileSync("gh", [
271
+ "pr", "create", "--repo", repo, "--head", branchName, "--draft",
272
+ "--title", `[#${issueNumber}] Implementation`,
273
+ "--body", `Automated implementation for issue #${issueNumber}.\n\nThis PR is a draft while the build/QA loop runs. It will be marked ready for review when QA passes.\n\nCloses #${issueNumber}`,
274
+ ], { stdio: "pipe" }).toString().trim();
275
+ // Extract PR number from output URL
276
+ const match = output.match(/\/pull\/(\d+)/);
277
+ return match ? parseInt(match[1], 10) : null;
278
+ }
279
+ catch (err) {
280
+ console.error(`[dispatch] Draft PR creation failed:`, err);
281
+ return null;
282
+ }
283
+ }
284
+ function findPrByBranch(repo, branchName) {
285
+ try {
286
+ const output = execFileSync("gh", [
287
+ "pr", "list", "--repo", repo, "--head", branchName, "--json", "number",
288
+ ], { stdio: "pipe" }).toString().trim();
289
+ const prs = JSON.parse(output || "[]");
290
+ return prs.length > 0 ? prs[0].number : null;
291
+ }
292
+ catch {
293
+ return null;
200
294
  }
201
295
  }
202
296
  function readArtifactContent(artifactsDir, artifactName) {
@@ -204,7 +298,7 @@ function readArtifactContent(artifactsDir, artifactName) {
204
298
  return "";
205
299
  try {
206
300
  const content = readFileSync(join(artifactsDir, artifactName), "utf-8");
207
- const maxLen = 2000;
301
+ const maxLen = 3000;
208
302
  return content.length > maxLen ? content.slice(0, maxLen) + "\n\n_(truncated)_" : content;
209
303
  }
210
304
  catch {
@@ -215,7 +309,6 @@ function findNextStageLabel(pipeline, currentStageIndex) {
215
309
  const nextStage = pipeline.stages[currentStageIndex + 1];
216
310
  if (!nextStage)
217
311
  return undefined;
218
- // Find the label that maps to the next stage's name
219
312
  for (const [lbl, stageName] of Object.entries(pipeline.labels)) {
220
313
  if (stageName === nextStage.name) {
221
314
  return lbl;
@@ -224,7 +317,6 @@ function findNextStageLabel(pipeline, currentStageIndex) {
224
317
  return undefined;
225
318
  }
226
319
  function findReadyLabel(pipeline, stageName) {
227
- // Convention: look for a label like "{stage}-ready" that maps to this stage
228
320
  for (const [lbl, mapped] of Object.entries(pipeline.labels)) {
229
321
  if (mapped === stageName && lbl.endsWith("-ready")) {
230
322
  return lbl;
@@ -232,10 +324,8 @@ function findReadyLabel(pipeline, stageName) {
232
324
  }
233
325
  return undefined;
234
326
  }
235
- function findRetryLabel(pipeline, stageName) {
236
- // Look for a label that triggers the preceding stage (for retry, we go back)
237
- // Convention: "needs-fix" maps to the build stage for retries
238
- for (const [lbl, mapped] of Object.entries(pipeline.labels)) {
327
+ function findRetryLabel(pipeline, _stageName) {
328
+ for (const [lbl] of Object.entries(pipeline.labels)) {
239
329
  if (lbl === "needs-fix" || lbl.includes("retry") || lbl.includes("fix")) {
240
330
  return lbl;
241
331
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,UAAU,gBAAgB,CAAC,GAAyB;IACxD,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IACvE,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC;IAEpC,sEAAsE;IACtE,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,0BAA0B,OAAO,eAAe,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtI,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAE3B,mCAAmC;IACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,KAAK,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC1E,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,qBAAqB,SAAS,gCAAgC,CAAC,CAAC;QAC9E,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE1C,mDAAmD;IACnD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;YAChE,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,gCAAgC,KAAK,CAAC,QAAQ,iBAAiB,CAAC,CAAC;YACpH,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAChD,KAAK,WAAW;YACd,OAAO,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACpD,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACjD;YACE,OAAO,CAAC,KAAK,CAAC,iCAAiC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,GAAyB,EACzB,KAAkB,EAClB,UAAkB;IAElB,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IACvE,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC;IAE3C,IAAI,aAAa,EAAE,CAAC;QAClB,uEAAuE;QACvE,OAAO,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,0DAA0D;IAC1D,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3C,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,KAAK,CAAC,QAAQ,eAAe,WAAW,EAAE,CAAC,CAAC,CAAC;QAChG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1E,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,iCAAiC,SAAS,IAAI,MAAM,8BAA8B,KAAK,CAAC,QAAQ,iBAAiB,eAAe,cAAc,CAAC,CAAC;IAEnM,IAAI,SAAS,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAyB,EACzB,KAAkB,EAClB,UAAkB;IAElB,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IACvE,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,cAAe,EAAE,WAAW,CAAC,CAAC;IAEtE,4BAA4B;IAC5B,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3C,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,KAAK,CAAC,IAAI,eAAe,WAAW,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5G,CAAC;IAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACrG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,iDAAiD;IACjD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAE1E,+BAA+B;IAC/B,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1E,IAAI,QAAQ,IAAI,eAAe,EAAE,CAAC;QAChC,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,mBAAmB,eAAe,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,kBAAkB,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC1E,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,kDAAkD,SAAS,IAAI,MAAM,KAAK,CAAC,CAAC;IAE/H,IAAI,SAAS,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,kBAAkB,CACzB,GAAyB,EACzB,KAAkB,EAClB,UAAkB;IAElB,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IACvE,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,IAAI,GAAG,KAAK,CAAC,IAAI,2BAA2B,EAAE,WAAW,CAAC,CAAC;IAEjH,4BAA4B;IAC5B,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3C,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,KAAK,CAAC,QAAQ,eAAe,WAAW,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACpH,CAAC;IAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACrG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,iDAAiD;IACjD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE;YAClC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ;SACvE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAExC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,EAAE;gBACjB,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU;gBACpD,SAAS,EAAE,KAAK,WAAW,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,EAAE;gBAC/D,QAAQ,EAAE,2BAA2B,WAAW,6DAA6D,WAAW,EAAE;aAC3H,CAAC,CAAC;YACH,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,UAAU,IAAI,kBAAkB,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAExF,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1E,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,iCAAiC,UAAU,8BAA8B,KAAK,CAAC,QAAQ,iBAAiB,eAAe,cAAc,CAAC,CAAC;IAE1L,IAAI,SAAS,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,eAAe,CACtB,GAAyB,EACzB,KAAkB,EAClB,UAAkB;IAElB,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IAEvE,MAAM,OAAO,GAAG,uBAAuB,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE1E,iCAAiC;IACjC,MAAM,UAAU,GAAG,cAAc,WAAW,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAElD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,uBAAuB;QACvB,IAAI,QAAQ,EAAE,CAAC;YACb,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,0BAA0B,eAAe,EAAE,CAAC,CAAC;YAC3E,6CAA6C;YAC7C,IAAI,CAAC;gBACH,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3F,CAAC;YAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1E,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,uCAAuC,CAAC,CAAC;QAE5F,IAAI,SAAS,EAAE,CAAC;YACd,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC9D,CAAC;IAED,mDAAmD;IACnD,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/D,IAAI,YAAY,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,qCAAqC,YAAY,IAAI,UAAU,8DAA8D,eAAe,EAAE,CAAC,CAAC;QAChL,CAAC;QACD,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,wBAAwB,YAAY,yCAAyC,CAAC,CAAC;QAClI,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IAC5E,CAAC;IAED,uCAAuC;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,gCAAgC,YAAY,IAAI,UAAU,wDAAwD,eAAe,EAAE,CAAC,CAAC;IACrK,CAAC;IACD,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,sBAAsB,YAAY,IAAI,UAAU,cAAc,CAAC,CAAC;IAEnH,MAAM,UAAU,GAAG,cAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACzE,CAAC;AAED,kBAAkB;AAElB,SAAS,cAAc,CAAC,OAAe,EAAE,WAAmB;IAC1D,OAAO,OAAO,CAAC,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,WAAmB,EAAE,QAAgB,EAAE,WAAmB;IAC1F,IAAI,CAAC;QACH,YAAY,CAAC,IAAI,EAAE;YACjB,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;YACpC,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,QAAQ;YACvB,gBAAgB,EAAE,WAAW;SAC9B,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,QAAQ,YAAY,WAAW,IAAI,EAAE,GAAG,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,WAAmB,EAAE,IAAY;IACvE,IAAI,CAAC;QACH,YAAY,CAAC,IAAI,EAAE;YACjB,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;YACvC,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;SACf,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,QAAgB,EAAE,IAAY;IACjE,IAAI,CAAC;QACH,YAAY,CAAC,IAAI,EAAE;YACjB,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;YACjC,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;SACf,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,WAAmB,EAAE,UAAkB,EAAE,SAAiB;IAC7F,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE;YAClC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ;SACvE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAExC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACvB,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE;YAChC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS;YAC/D,SAAS,EAAE,KAAK,WAAW,kBAAkB;YAC7C,QAAQ,EAAE,uCAAuC,WAAW,uHAAuH,WAAW,EAAE;SACjM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAExC,oCAAoC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,UAAkB;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE;YAChC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ;SACvE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAExC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAoB,EAAE,YAAgC;IACjF,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC;QACpB,OAAO,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,QAA4D,EAC5D,iBAAyB;IAEzB,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,IAAI,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CACrB,QAA4D,EAC5D,SAAiB;IAEjB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,IAAI,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CACrB,QAA4D,EAC5D,UAAkB;IAElB,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,uBAAuB,CAAC,YAAoB,EAAE,YAAoB;IACzE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB;YAAE,OAAO,SAAS,CAAC;QAExC,MAAM,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACrE,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,YAAoB,EAAE,SAAiB;IAC9D,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,SAAS,WAAW,CAAC,CAAC;QACjE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACtE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentic-sdlc/dispatch",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "description": "CI-side dispatch and orchestration for the agentic SDLC harness",
6
6
  "repository": {
@@ -37,7 +37,7 @@ export function orchestrateStage(ctx: OrchestrationContext): OrchestrationResult
37
37
  const artifactPath = join(artifactsDir, stage.produces);
38
38
  if (!existsSync(artifactPath)) {
39
39
  console.error(`[dispatch] Artifact not found: ${artifactPath}`);
40
- postComment(repo, issueNumber, `## Stage: ${stage.name} — Escalated\n\nThe agent did not produce the expected artifact \`${stage.produces}\`. This usually means the agent ran out of time or encountered an error.\n\nLabel: \`escalated\``);
40
+ postIssueComment(repo, issueNumber, `**${stage.name}**Agent did not produce \`${stage.produces}\`. Escalating.`);
41
41
  applyLabel(repo, issueNumber, "escalated", label);
42
42
  return { stage: stage.name, action: "no-artifact", nextLabel: "escalated" };
43
43
  }
@@ -63,8 +63,14 @@ function handleGateNone(
63
63
  stageIndex: number
64
64
  ): OrchestrationResult {
65
65
  const { issueNumber, repo, label, workflowConfig, artifactsDir } = ctx;
66
+ const branchPattern = stage.branch_pattern;
66
67
 
67
- // Commit artifact to current branch and push
68
+ if (branchPattern) {
69
+ // Stage with a branch pattern: push to branch and open/update draft PR
70
+ return handleBranchStage(ctx, stage, stageIndex);
71
+ }
72
+
73
+ // Simple stage (triage, plan): commit to main and advance
68
74
  try {
69
75
  execFileSync("git", ["add", artifactsDir]);
70
76
  execFileSync("git", ["commit", "-m", `chore: add ${stage.produces} for issue #${issueNumber}`]);
@@ -73,12 +79,61 @@ function handleGateNone(
73
79
  console.error(`[dispatch] Git commit/push failed for gate=none:`, err);
74
80
  }
75
81
 
76
- // Post stage completion comment with artifact summary
82
+ const nextLabel = findNextStageLabel(workflowConfig.pipeline, stageIndex);
77
83
  const artifactContent = readArtifactContent(artifactsDir, stage.produces);
84
+ postIssueComment(repo, issueNumber, `**${stage.name}** — Complete. Advancing to \`${nextLabel ?? "done"}\`.\n\n<details>\n<summary>${stage.produces}</summary>\n\n${artifactContent}\n</details>`);
85
+
86
+ if (nextLabel) {
87
+ applyLabel(repo, issueNumber, nextLabel, label);
88
+ }
89
+
90
+ return { stage: stage.name, action: "advanced", nextLabel };
91
+ }
92
+
93
+ function handleBranchStage(
94
+ ctx: OrchestrationContext,
95
+ stage: StageConfig,
96
+ stageIndex: number
97
+ ): OrchestrationResult {
98
+ const { issueNumber, repo, label, workflowConfig, artifactsDir } = ctx;
99
+ const branchName = renderTemplate(stage.branch_pattern!, issueNumber);
100
+
101
+ // Create or checkout branch
102
+ try {
103
+ execFileSync("git", ["checkout", "-b", branchName], { stdio: "pipe" });
104
+ } catch {
105
+ try {
106
+ execFileSync("git", ["checkout", branchName], { stdio: "pipe" });
107
+ } catch (err) {
108
+ console.error(`[dispatch] Failed to checkout branch ${branchName}:`, err);
109
+ }
110
+ }
111
+
112
+ // Commit and push
113
+ try {
114
+ execFileSync("git", ["add", artifactsDir]);
115
+ execFileSync("git", ["commit", "-m", `feat: ${stage.name} for issue #${issueNumber}`], { stdio: "pipe" });
116
+ } catch { /* may be nothing to commit */ }
117
+
118
+ try {
119
+ execFileSync("git", ["push", "-u", "--force-with-lease", "origin", branchName], { stdio: "pipe" });
120
+ } catch (err) {
121
+ console.error(`[dispatch] Git push failed:`, err);
122
+ }
123
+
124
+ // Open draft PR if none exists, or find existing
125
+ const prNumber = ensureDraftPr(repo, issueNumber, branchName, stage.name);
126
+
127
+ // Post build log as PR comment
128
+ const artifactContent = readArtifactContent(artifactsDir, stage.produces);
129
+ if (prNumber && artifactContent) {
130
+ postPrComment(repo, prNumber, `## Build Log\n\n${artifactContent}`);
131
+ }
132
+
133
+ // Advance to next stage
78
134
  const nextLabel = findNextStageLabel(workflowConfig.pipeline, stageIndex);
79
- postComment(repo, issueNumber, `## Stage: ${stage.name} — Complete\n\n<details>\n<summary>Artifact: ${stage.produces}</summary>\n\n${artifactContent}\n</details>\n\nAdvancing to: \`${nextLabel ?? "done"}\``);
135
+ postIssueComment(repo, issueNumber, `**${stage.name}** — Complete. Draft PR opened. Advancing to \`${nextLabel ?? "done"}\`.`);
80
136
 
81
- // Advance to next stage label
82
137
  if (nextLabel) {
83
138
  applyLabel(repo, issueNumber, nextLabel, label);
84
139
  }
@@ -92,54 +147,44 @@ function handleGatePrReview(
92
147
  stageIndex: number
93
148
  ): OrchestrationResult {
94
149
  const { issueNumber, repo, label, workflowConfig, artifactsDir } = ctx;
95
-
96
150
  const branchName = renderTemplate(stage.branch_pattern ?? `${stage.name}/issue-{{ issue.number }}`, issueNumber);
97
151
 
98
152
  // Create or checkout branch
99
153
  try {
100
- execFileSync("git", ["checkout", "-b", branchName]);
154
+ execFileSync("git", ["checkout", "-b", branchName], { stdio: "pipe" });
101
155
  } catch {
102
- // Branch may already exist — try checking it out
103
156
  try {
104
- execFileSync("git", ["checkout", branchName]);
157
+ execFileSync("git", ["checkout", branchName], { stdio: "pipe" });
105
158
  } catch (err) {
106
159
  console.error(`[dispatch] Failed to checkout branch ${branchName}:`, err);
107
160
  }
108
161
  }
109
162
 
110
- // Commit artifacts
163
+ // Commit and push
111
164
  try {
112
165
  execFileSync("git", ["add", artifactsDir]);
113
- execFileSync("git", ["commit", "-m", `feat: add ${stage.produces} for issue #${issueNumber}`]);
114
- } catch (err) {
115
- console.error(`[dispatch] Git commit failed for pr-review gate:`, err);
116
- }
166
+ execFileSync("git", ["commit", "-m", `feat: add ${stage.produces} for issue #${issueNumber}`], { stdio: "pipe" });
167
+ } catch { /* may be nothing to commit */ }
117
168
 
118
- // Push branch (force to handle re-runs where branch already exists)
119
169
  try {
120
- execFileSync("git", ["push", "-u", "--force-with-lease", "origin", branchName]);
170
+ execFileSync("git", ["push", "-u", "--force-with-lease", "origin", branchName], { stdio: "pipe" });
121
171
  } catch (err) {
122
172
  console.error(`[dispatch] Git push failed:`, err);
123
173
  }
124
174
 
125
- // Open PR if one does not already exist
175
+ // Open PR (not draft this is for human review)
126
176
  let prCreated = false;
127
177
  try {
128
178
  const existing = execFileSync("gh", [
129
- "pr", "list",
130
- "--repo", repo,
131
- "--head", branchName,
132
- "--json", "number",
133
- ]).toString().trim();
179
+ "pr", "list", "--repo", repo, "--head", branchName, "--json", "number",
180
+ ], { stdio: "pipe" }).toString().trim();
134
181
 
135
182
  const prs = JSON.parse(existing || "[]");
136
183
  if (prs.length === 0) {
137
184
  execFileSync("gh", [
138
- "pr", "create",
139
- "--repo", repo,
140
- "--head", branchName,
185
+ "pr", "create", "--repo", repo, "--head", branchName,
141
186
  "--title", `[#${issueNumber}] ${stage.name}: ${stage.produces}`,
142
- "--body", `Automated PR for issue #${issueNumber} stage: ${stage.name}`,
187
+ "--body", `Automated PR for issue #${issueNumber}.\n\nReview and merge to advance the pipeline.\n\nCloses #${issueNumber}`,
143
188
  ]);
144
189
  prCreated = true;
145
190
  }
@@ -147,24 +192,17 @@ function handleGatePrReview(
147
192
  console.error(`[dispatch] PR creation failed:`, err);
148
193
  }
149
194
 
150
- // Find the "ready" label for this stage (convention: stage's own ready label)
151
195
  const readyLabel = findReadyLabel(workflowConfig.pipeline, stage.name);
152
196
  const nextLabel = readyLabel ?? findNextStageLabel(workflowConfig.pipeline, stageIndex);
153
197
 
154
- // Post comment about PR
155
198
  const artifactContent = readArtifactContent(artifactsDir, stage.produces);
156
- const prMsg = prCreated ? `PR opened on branch \`${branchName}\`. Please review and merge to advance.` : `Branch \`${branchName}\` updated.`;
157
- postComment(repo, issueNumber, `## Stage: ${stage.name} — PR Ready\n\n${prMsg}\n\n<details>\n<summary>Artifact: ${stage.produces}</summary>\n\n${artifactContent}\n</details>\n\nLabel: \`${nextLabel ?? "done"}\``);
199
+ postIssueComment(repo, issueNumber, `**${stage.name}** PR ready for review on \`${branchName}\`.\n\n<details>\n<summary>${stage.produces}</summary>\n\n${artifactContent}\n</details>`);
158
200
 
159
201
  if (nextLabel) {
160
202
  applyLabel(repo, issueNumber, nextLabel, label);
161
203
  }
162
204
 
163
- return {
164
- stage: stage.name,
165
- action: prCreated ? "opened-pr" : "advanced",
166
- nextLabel,
167
- };
205
+ return { stage: stage.name, action: prCreated ? "opened-pr" : "advanced", nextLabel };
168
206
  }
169
207
 
170
208
  function handleGateRetry(
@@ -174,15 +212,27 @@ function handleGateRetry(
174
212
  ): OrchestrationResult {
175
213
  const { issueNumber, repo, label, workflowConfig, artifactsDir } = ctx;
176
214
 
177
- // Read verdict from artifact frontmatter
178
215
  const verdict = readVerdictFromArtifact(artifactsDir, stage.produces ?? "");
179
216
  const maxRetries = stage.max_retries ?? 3;
180
-
181
217
  const artifactContent = readArtifactContent(artifactsDir, stage.produces);
182
218
 
219
+ // Find the impl PR to comment on
220
+ const implBranch = `impl/issue-${issueNumber}`;
221
+ const prNumber = findPrByBranch(repo, implBranch);
222
+
183
223
  if (verdict === "pass") {
224
+ // Post QA report on PR
225
+ if (prNumber) {
226
+ postPrComment(repo, prNumber, `## QA Report — PASS\n\n${artifactContent}`);
227
+ // Mark PR as ready for review (remove draft)
228
+ try {
229
+ execFileSync("gh", ["pr", "ready", String(prNumber), "--repo", repo], { stdio: "pipe" });
230
+ } catch { /* may already be ready */ }
231
+ }
232
+
184
233
  const nextLabel = findNextStageLabel(workflowConfig.pipeline, stageIndex);
185
- postComment(repo, issueNumber, `## Stage: ${stage.name} — PASS\n\n<details>\n<summary>QA Report</summary>\n\n${artifactContent}\n</details>\n\nAdvancing to: \`${nextLabel ?? "done"}\``);
234
+ postIssueComment(repo, issueNumber, `**${stage.name}** — PASS. PR ready for human review.`);
235
+
186
236
  if (nextLabel) {
187
237
  applyLabel(repo, issueNumber, nextLabel, label);
188
238
  }
@@ -193,14 +243,21 @@ function handleGateRetry(
193
243
  const attemptCount = getAttemptCount(artifactsDir, stage.name);
194
244
 
195
245
  if (attemptCount >= maxRetries) {
196
- postComment(repo, issueNumber, `## Stage: ${stage.name} — ESCALATED\n\nQA failed after ${attemptCount} attempts (max: ${maxRetries}). Human intervention required.\n\n<details>\n<summary>Last QA Report</summary>\n\n${artifactContent}\n</details>\n\nLabel: \`escalated\``);
246
+ if (prNumber) {
247
+ postPrComment(repo, prNumber, `## QA Report — ESCALATED (attempt ${attemptCount}/${maxRetries})\n\nMax retries exceeded. Human intervention required.\n\n${artifactContent}`);
248
+ }
249
+ postIssueComment(repo, issueNumber, `**${stage.name}** — ESCALATED after ${attemptCount} attempts. Human intervention required.`);
197
250
  applyLabel(repo, issueNumber, "escalated", label);
198
251
  return { stage: stage.name, action: "escalated", nextLabel: "escalated" };
199
252
  }
200
253
 
201
- // Apply retry label (needs-fix)
254
+ // Retry post failure on PR and issue
255
+ if (prNumber) {
256
+ postPrComment(repo, prNumber, `## QA Report — FAIL (attempt ${attemptCount}/${maxRetries})\n\nRetrying. Builder will fix the issues below.\n\n${artifactContent}`);
257
+ }
258
+ postIssueComment(repo, issueNumber, `**${stage.name}** — FAIL (attempt ${attemptCount}/${maxRetries}). Retrying.`);
259
+
202
260
  const retryLabel = findRetryLabel(workflowConfig.pipeline, stage.name);
203
- postComment(repo, issueNumber, `## Stage: ${stage.name} — FAIL (attempt ${attemptCount}/${maxRetries})\n\nRetrying. The builder will read the QA report and fix the issues.\n\n<details>\n<summary>QA Report</summary>\n\n${artifactContent}\n</details>\n\nLabel: \`${retryLabel ?? "needs-fix"}\``);
204
261
  if (retryLabel) {
205
262
  applyLabel(repo, issueNumber, retryLabel, label);
206
263
  }
@@ -221,21 +278,73 @@ function applyLabel(repo: string, issueNumber: number, addLabel: string, removeL
221
278
  "--repo", repo,
222
279
  "--add-label", addLabel,
223
280
  "--remove-label", removeLabel,
224
- ]);
281
+ ], { stdio: "pipe" });
225
282
  } catch (err) {
226
283
  console.error(`[dispatch] Label transition failed (add=${addLabel}, remove=${removeLabel}):`, err);
227
284
  }
228
285
  }
229
286
 
230
- function postComment(repo: string, issueNumber: number, body: string): void {
287
+ function postIssueComment(repo: string, issueNumber: number, body: string): void {
231
288
  try {
232
289
  execFileSync("gh", [
233
290
  "issue", "comment", String(issueNumber),
234
291
  "--repo", repo,
235
292
  "--body", body,
236
- ]);
293
+ ], { stdio: "pipe" });
294
+ } catch (err) {
295
+ console.error(`[dispatch] Failed to post issue comment:`, err);
296
+ }
297
+ }
298
+
299
+ function postPrComment(repo: string, prNumber: number, body: string): void {
300
+ try {
301
+ execFileSync("gh", [
302
+ "pr", "comment", String(prNumber),
303
+ "--repo", repo,
304
+ "--body", body,
305
+ ], { stdio: "pipe" });
237
306
  } catch (err) {
238
- console.error(`[dispatch] Failed to post comment:`, err);
307
+ console.error(`[dispatch] Failed to post PR comment:`, err);
308
+ }
309
+ }
310
+
311
+ function ensureDraftPr(repo: string, issueNumber: number, branchName: string, stageName: string): number | null {
312
+ try {
313
+ const existing = execFileSync("gh", [
314
+ "pr", "list", "--repo", repo, "--head", branchName, "--json", "number",
315
+ ], { stdio: "pipe" }).toString().trim();
316
+
317
+ const prs = JSON.parse(existing || "[]");
318
+ if (prs.length > 0) {
319
+ return prs[0].number;
320
+ }
321
+
322
+ // Create draft PR
323
+ const output = execFileSync("gh", [
324
+ "pr", "create", "--repo", repo, "--head", branchName, "--draft",
325
+ "--title", `[#${issueNumber}] Implementation`,
326
+ "--body", `Automated implementation for issue #${issueNumber}.\n\nThis PR is a draft while the build/QA loop runs. It will be marked ready for review when QA passes.\n\nCloses #${issueNumber}`,
327
+ ], { stdio: "pipe" }).toString().trim();
328
+
329
+ // Extract PR number from output URL
330
+ const match = output.match(/\/pull\/(\d+)/);
331
+ return match ? parseInt(match[1], 10) : null;
332
+ } catch (err) {
333
+ console.error(`[dispatch] Draft PR creation failed:`, err);
334
+ return null;
335
+ }
336
+ }
337
+
338
+ function findPrByBranch(repo: string, branchName: string): number | null {
339
+ try {
340
+ const output = execFileSync("gh", [
341
+ "pr", "list", "--repo", repo, "--head", branchName, "--json", "number",
342
+ ], { stdio: "pipe" }).toString().trim();
343
+
344
+ const prs = JSON.parse(output || "[]");
345
+ return prs.length > 0 ? prs[0].number : null;
346
+ } catch {
347
+ return null;
239
348
  }
240
349
  }
241
350
 
@@ -243,7 +352,7 @@ function readArtifactContent(artifactsDir: string, artifactName: string | undefi
243
352
  if (!artifactName) return "";
244
353
  try {
245
354
  const content = readFileSync(join(artifactsDir, artifactName), "utf-8");
246
- const maxLen = 2000;
355
+ const maxLen = 3000;
247
356
  return content.length > maxLen ? content.slice(0, maxLen) + "\n\n_(truncated)_" : content;
248
357
  } catch {
249
358
  return "";
@@ -257,7 +366,6 @@ function findNextStageLabel(
257
366
  const nextStage = pipeline.stages[currentStageIndex + 1];
258
367
  if (!nextStage) return undefined;
259
368
 
260
- // Find the label that maps to the next stage's name
261
369
  for (const [lbl, stageName] of Object.entries(pipeline.labels)) {
262
370
  if (stageName === nextStage.name) {
263
371
  return lbl;
@@ -270,7 +378,6 @@ function findReadyLabel(
270
378
  pipeline: OrchestrationContext["workflowConfig"]["pipeline"],
271
379
  stageName: string
272
380
  ): string | undefined {
273
- // Convention: look for a label like "{stage}-ready" that maps to this stage
274
381
  for (const [lbl, mapped] of Object.entries(pipeline.labels)) {
275
382
  if (mapped === stageName && lbl.endsWith("-ready")) {
276
383
  return lbl;
@@ -281,11 +388,9 @@ function findReadyLabel(
281
388
 
282
389
  function findRetryLabel(
283
390
  pipeline: OrchestrationContext["workflowConfig"]["pipeline"],
284
- stageName: string
391
+ _stageName: string
285
392
  ): string | undefined {
286
- // Look for a label that triggers the preceding stage (for retry, we go back)
287
- // Convention: "needs-fix" maps to the build stage for retries
288
- for (const [lbl, mapped] of Object.entries(pipeline.labels)) {
393
+ for (const [lbl] of Object.entries(pipeline.labels)) {
289
394
  if (lbl === "needs-fix" || lbl.includes("retry") || lbl.includes("fix")) {
290
395
  return lbl;
291
396
  }