@cluesmith/codev 1.6.2 → 2.0.0-rc.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.
Files changed (94) hide show
  1. package/bin/porch.js +7 -0
  2. package/dist/agent-farm/cli.d.ts.map +1 -1
  3. package/dist/agent-farm/cli.js +23 -0
  4. package/dist/agent-farm/cli.js.map +1 -1
  5. package/dist/agent-farm/commands/index.d.ts +1 -0
  6. package/dist/agent-farm/commands/index.d.ts.map +1 -1
  7. package/dist/agent-farm/commands/index.js +1 -0
  8. package/dist/agent-farm/commands/index.js.map +1 -1
  9. package/dist/agent-farm/commands/kickoff.d.ts +19 -0
  10. package/dist/agent-farm/commands/kickoff.d.ts.map +1 -0
  11. package/dist/agent-farm/commands/kickoff.js +269 -0
  12. package/dist/agent-farm/commands/kickoff.js.map +1 -0
  13. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  14. package/dist/agent-farm/commands/spawn.js +1 -43
  15. package/dist/agent-farm/commands/spawn.js.map +1 -1
  16. package/dist/cli.d.ts.map +1 -1
  17. package/dist/cli.js +29 -0
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/pcheck/cache.d.ts +48 -0
  20. package/dist/commands/pcheck/cache.d.ts.map +1 -0
  21. package/dist/commands/pcheck/cache.js +170 -0
  22. package/dist/commands/pcheck/cache.js.map +1 -0
  23. package/dist/commands/pcheck/evaluator.d.ts +15 -0
  24. package/dist/commands/pcheck/evaluator.d.ts.map +1 -0
  25. package/dist/commands/pcheck/evaluator.js +246 -0
  26. package/dist/commands/pcheck/evaluator.js.map +1 -0
  27. package/dist/commands/pcheck/index.d.ts +12 -0
  28. package/dist/commands/pcheck/index.d.ts.map +1 -0
  29. package/dist/commands/pcheck/index.js +249 -0
  30. package/dist/commands/pcheck/index.js.map +1 -0
  31. package/dist/commands/pcheck/parser.d.ts +39 -0
  32. package/dist/commands/pcheck/parser.d.ts.map +1 -0
  33. package/dist/commands/pcheck/parser.js +155 -0
  34. package/dist/commands/pcheck/parser.js.map +1 -0
  35. package/dist/commands/pcheck/types.d.ts +82 -0
  36. package/dist/commands/pcheck/types.d.ts.map +1 -0
  37. package/dist/commands/pcheck/types.js +5 -0
  38. package/dist/commands/pcheck/types.js.map +1 -0
  39. package/dist/commands/porch/checks.d.ts +42 -0
  40. package/dist/commands/porch/checks.d.ts.map +1 -0
  41. package/dist/commands/porch/checks.js +195 -0
  42. package/dist/commands/porch/checks.js.map +1 -0
  43. package/dist/commands/porch/consultation.d.ts +56 -0
  44. package/dist/commands/porch/consultation.d.ts.map +1 -0
  45. package/dist/commands/porch/consultation.js +330 -0
  46. package/dist/commands/porch/consultation.js.map +1 -0
  47. package/dist/commands/porch/index.d.ts +60 -0
  48. package/dist/commands/porch/index.d.ts.map +1 -0
  49. package/dist/commands/porch/index.js +828 -0
  50. package/dist/commands/porch/index.js.map +1 -0
  51. package/dist/commands/porch/notifications.d.ts +99 -0
  52. package/dist/commands/porch/notifications.d.ts.map +1 -0
  53. package/dist/commands/porch/notifications.js +223 -0
  54. package/dist/commands/porch/notifications.js.map +1 -0
  55. package/dist/commands/porch/plan-parser.d.ts +38 -0
  56. package/dist/commands/porch/plan-parser.d.ts.map +1 -0
  57. package/dist/commands/porch/plan-parser.js +166 -0
  58. package/dist/commands/porch/plan-parser.js.map +1 -0
  59. package/dist/commands/porch/protocol-loader.d.ts +46 -0
  60. package/dist/commands/porch/protocol-loader.d.ts.map +1 -0
  61. package/dist/commands/porch/protocol-loader.js +249 -0
  62. package/dist/commands/porch/protocol-loader.js.map +1 -0
  63. package/dist/commands/porch/signal-parser.d.ts +88 -0
  64. package/dist/commands/porch/signal-parser.d.ts.map +1 -0
  65. package/dist/commands/porch/signal-parser.js +148 -0
  66. package/dist/commands/porch/signal-parser.js.map +1 -0
  67. package/dist/commands/porch/state.d.ts +133 -0
  68. package/dist/commands/porch/state.d.ts.map +1 -0
  69. package/dist/commands/porch/state.js +760 -0
  70. package/dist/commands/porch/state.js.map +1 -0
  71. package/dist/commands/porch/types.d.ts +232 -0
  72. package/dist/commands/porch/types.d.ts.map +1 -0
  73. package/dist/commands/porch/types.js +7 -0
  74. package/dist/commands/porch/types.js.map +1 -0
  75. package/package.json +2 -1
  76. package/skeleton/porch/prompts/defend.md +103 -0
  77. package/skeleton/porch/prompts/diagnose.md +70 -0
  78. package/skeleton/porch/prompts/evaluate.md +132 -0
  79. package/skeleton/porch/prompts/fix.md +59 -0
  80. package/skeleton/porch/prompts/implement.md +79 -0
  81. package/skeleton/porch/prompts/plan.md +74 -0
  82. package/skeleton/porch/prompts/pr.md +84 -0
  83. package/skeleton/porch/prompts/review.md +179 -0
  84. package/skeleton/porch/prompts/specify.md +53 -0
  85. package/skeleton/porch/prompts/test.md +63 -0
  86. package/skeleton/porch/prompts/understand.md +61 -0
  87. package/skeleton/porch/prompts/verify.md +58 -0
  88. package/skeleton/porch/protocols/bugfix.json +85 -0
  89. package/skeleton/porch/protocols/spider.json +135 -0
  90. package/skeleton/porch/protocols/tick.json +76 -0
  91. package/skeleton/protocols/bugfix/protocol.json +127 -0
  92. package/skeleton/protocols/protocol-schema.json +237 -0
  93. package/skeleton/protocols/spider/protocol.json +204 -0
  94. package/skeleton/protocols/tick/protocol.json +151 -0
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Multi-Agent Consultation
3
+ *
4
+ * Runs parallel 3-way consultations with external AI models (gemini, codex, claude)
5
+ * and collects feedback with APPROVE/REQUEST_CHANGES verdicts.
6
+ */
7
+ import { spawn } from 'node:child_process';
8
+ import chalk from 'chalk';
9
+ /**
10
+ * Default consultation timeout (ms)
11
+ */
12
+ const DEFAULT_TIMEOUT = 300000; // 5 minutes
13
+ /**
14
+ * Run a single consultation with an AI model
15
+ */
16
+ async function runConsultation(model, command, args, options = {}) {
17
+ const timeout = options.timeout || DEFAULT_TIMEOUT;
18
+ return new Promise((resolve) => {
19
+ const proc = spawn(command, args, {
20
+ cwd: options.cwd,
21
+ shell: true,
22
+ stdio: ['ignore', 'pipe', 'pipe'],
23
+ });
24
+ let output = '';
25
+ let stderr = '';
26
+ let timedOut = false;
27
+ const timeoutId = setTimeout(() => {
28
+ timedOut = true;
29
+ proc.kill('SIGTERM');
30
+ }, timeout);
31
+ proc.stdout.on('data', (data) => {
32
+ output += data.toString();
33
+ });
34
+ proc.stderr.on('data', (data) => {
35
+ stderr += data.toString();
36
+ });
37
+ proc.on('close', (code) => {
38
+ clearTimeout(timeoutId);
39
+ if (timedOut) {
40
+ resolve({
41
+ output,
42
+ error: `Consultation timed out after ${timeout}ms`,
43
+ success: false,
44
+ });
45
+ }
46
+ else {
47
+ resolve({
48
+ output: output + stderr,
49
+ error: code !== 0 ? `Exit code: ${code}` : undefined,
50
+ success: code === 0,
51
+ });
52
+ }
53
+ });
54
+ proc.on('error', (err) => {
55
+ clearTimeout(timeoutId);
56
+ resolve({
57
+ output: '',
58
+ error: err.message,
59
+ success: false,
60
+ });
61
+ });
62
+ });
63
+ }
64
+ /**
65
+ * Parse verdict from consultation output
66
+ * Looks for APPROVE or REQUEST_CHANGES markers
67
+ */
68
+ export function parseVerdict(output) {
69
+ // Look for explicit verdict markers
70
+ if (/verdict:\s*approve/i.test(output) || /\[APPROVE\]/i.test(output)) {
71
+ return 'APPROVE';
72
+ }
73
+ if (/verdict:\s*request_changes/i.test(output) || /\[REQUEST_CHANGES\]/i.test(output)) {
74
+ return 'REQUEST_CHANGES';
75
+ }
76
+ // Look for implicit approval signals
77
+ if (/looks good/i.test(output) && !/but|however|should|could/i.test(output.slice(output.search(/looks good/i), output.search(/looks good/i) + 100))) {
78
+ return 'APPROVE';
79
+ }
80
+ if (/approved?/i.test(output) && !/not approved/i.test(output)) {
81
+ return 'APPROVE';
82
+ }
83
+ // Look for implicit change request signals
84
+ if (/must\s+(be\s+)?fix|should\s+(be\s+)?fix|need(s)?\s+to\s+fix|critical\s+issue|blocking\s+issue/i.test(output)) {
85
+ return 'REQUEST_CHANGES';
86
+ }
87
+ // Default to approve if no clear signal (lenient mode)
88
+ return 'APPROVE';
89
+ }
90
+ /**
91
+ * Extract summary from consultation output
92
+ * Takes the first paragraph or bullet points
93
+ */
94
+ export function extractSummary(output, maxLength = 500) {
95
+ // Try to find a summary section
96
+ const summaryMatch = output.match(/##?\s*Summary\s*\n([\s\S]*?)(?=\n##|\n\*\*|$)/i);
97
+ if (summaryMatch) {
98
+ return truncate(summaryMatch[1].trim(), maxLength);
99
+ }
100
+ // Try to find verdict section
101
+ const verdictMatch = output.match(/##?\s*Verdict\s*\n([\s\S]*?)(?=\n##|\n\*\*|$)/i);
102
+ if (verdictMatch) {
103
+ return truncate(verdictMatch[1].trim(), maxLength);
104
+ }
105
+ // Fall back to first paragraph
106
+ const paragraphs = output.split(/\n\n+/);
107
+ for (const p of paragraphs) {
108
+ const trimmed = p.trim();
109
+ if (trimmed.length > 50 && !trimmed.startsWith('#') && !trimmed.startsWith('```')) {
110
+ return truncate(trimmed, maxLength);
111
+ }
112
+ }
113
+ return truncate(output.trim(), maxLength);
114
+ }
115
+ function truncate(text, maxLength) {
116
+ if (text.length <= maxLength)
117
+ return text;
118
+ return text.slice(0, maxLength - 3) + '...';
119
+ }
120
+ /**
121
+ * Build the consult command for a model
122
+ */
123
+ function buildConsultCommand(model, subcommand, identifier, reviewType) {
124
+ const args = ['--model', model, subcommand, identifier];
125
+ if (reviewType) {
126
+ args.push('--type', reviewType);
127
+ }
128
+ return {
129
+ command: 'consult',
130
+ args,
131
+ };
132
+ }
133
+ /**
134
+ * Run parallel 3-way consultation
135
+ */
136
+ export async function runParallelConsultation(config, context) {
137
+ const { subcommand, identifier, cwd, timeout = DEFAULT_TIMEOUT, dryRun } = context;
138
+ const { models, type: reviewType, parallel = true } = config;
139
+ if (dryRun) {
140
+ console.log(chalk.yellow(`[consultation] [DRY RUN] Would run ${models.length}-way consultation:`));
141
+ for (const model of models) {
142
+ const { command, args } = buildConsultCommand(model, subcommand, identifier, reviewType);
143
+ console.log(chalk.yellow(` ${command} ${args.join(' ')}`));
144
+ }
145
+ return models.map(model => ({
146
+ model,
147
+ verdict: 'APPROVE',
148
+ summary: '[DRY RUN] Simulated approval',
149
+ }));
150
+ }
151
+ console.log(chalk.blue(`[consultation] Running ${models.length}-way parallel consultation...`));
152
+ const startTime = Date.now();
153
+ // Build commands for each model
154
+ const consultations = models.map(model => {
155
+ const { command, args } = buildConsultCommand(model, subcommand, identifier, reviewType);
156
+ console.log(chalk.blue(`[consultation] Starting ${model}...`));
157
+ return {
158
+ model,
159
+ promise: runConsultation(model, command, args, { timeout, cwd }),
160
+ };
161
+ });
162
+ // Run in parallel or sequentially based on config
163
+ const results = [];
164
+ if (parallel) {
165
+ // Run all in parallel
166
+ const outputs = await Promise.all(consultations.map(c => c.promise));
167
+ for (let i = 0; i < consultations.length; i++) {
168
+ const { model } = consultations[i];
169
+ const output = outputs[i];
170
+ if (!output.success) {
171
+ console.log(chalk.yellow(`[consultation] ${model} failed: ${output.error}`));
172
+ results.push({
173
+ model,
174
+ verdict: 'APPROVE', // Default to approve on failure (lenient)
175
+ summary: `Consultation failed: ${output.error}`,
176
+ });
177
+ }
178
+ else {
179
+ const verdict = parseVerdict(output.output);
180
+ const summary = extractSummary(output.output);
181
+ const duration = Date.now() - startTime;
182
+ console.log(chalk.blue(`[consultation] ${model} completed (${duration}ms): ${verdict}`));
183
+ results.push({ model, verdict, summary });
184
+ }
185
+ }
186
+ }
187
+ else {
188
+ // Run sequentially
189
+ for (const { model, promise } of consultations) {
190
+ const output = await promise;
191
+ const duration = Date.now() - startTime;
192
+ if (!output.success) {
193
+ console.log(chalk.yellow(`[consultation] ${model} failed: ${output.error}`));
194
+ results.push({
195
+ model,
196
+ verdict: 'APPROVE',
197
+ summary: `Consultation failed: ${output.error}`,
198
+ });
199
+ }
200
+ else {
201
+ const verdict = parseVerdict(output.output);
202
+ const summary = extractSummary(output.output);
203
+ console.log(chalk.blue(`[consultation] ${model} completed (${duration}ms): ${verdict}`));
204
+ results.push({ model, verdict, summary });
205
+ }
206
+ }
207
+ }
208
+ const totalDuration = Date.now() - startTime;
209
+ console.log(chalk.blue(`[consultation] All consultations complete (${totalDuration}ms)`));
210
+ return results;
211
+ }
212
+ /**
213
+ * Run consultation loop with revision support
214
+ *
215
+ * If any model returns REQUEST_CHANGES, allows revision and re-consultation
216
+ * up to max_rounds times.
217
+ */
218
+ export async function runConsultationLoop(config, context) {
219
+ const maxRounds = config.max_rounds || 3;
220
+ let round = 1;
221
+ while (round <= maxRounds) {
222
+ console.log(chalk.blue(`[consultation] Round ${round}/${maxRounds}`));
223
+ const feedback = await runParallelConsultation(config, context);
224
+ // Check if all approved
225
+ const allApproved = feedback.every(f => f.verdict === 'APPROVE');
226
+ if (allApproved) {
227
+ console.log(chalk.green(`[consultation] All models approved!`));
228
+ return { round, feedback, allApproved: true };
229
+ }
230
+ // Some models requested changes
231
+ const changeRequests = feedback.filter(f => f.verdict === 'REQUEST_CHANGES');
232
+ console.log(chalk.yellow(`[consultation] ${changeRequests.length} model(s) requested changes:`));
233
+ for (const req of changeRequests) {
234
+ console.log(chalk.yellow(` ${req.model}: ${req.summary}`));
235
+ }
236
+ // Check if we've reached max rounds
237
+ if (round >= maxRounds) {
238
+ console.log(chalk.red(`[consultation] Max rounds (${maxRounds}) reached without full approval`));
239
+ return { round, feedback, allApproved: false };
240
+ }
241
+ // Call revision callback if provided
242
+ if (context.onRevisionNeeded) {
243
+ const shouldContinue = await context.onRevisionNeeded(feedback);
244
+ if (!shouldContinue) {
245
+ console.log(chalk.yellow(`[consultation] Revision declined, stopping consultation loop`));
246
+ return { round, feedback, allApproved: false };
247
+ }
248
+ }
249
+ else {
250
+ // No revision callback - just report and exit
251
+ console.log(chalk.yellow(`[consultation] Changes requested but no revision handler`));
252
+ return { round, feedback, allApproved: false };
253
+ }
254
+ round++;
255
+ }
256
+ // Should not reach here
257
+ return { round, feedback: [], allApproved: false };
258
+ }
259
+ /**
260
+ * Format consultation results for display
261
+ */
262
+ export function formatConsultationResults(result) {
263
+ const lines = [
264
+ `Consultation Results (Round ${result.round}):`,
265
+ result.allApproved ? chalk.green(' ✓ All models approved') : chalk.yellow(' ⚠ Not all models approved'),
266
+ '',
267
+ ];
268
+ for (const feedback of result.feedback) {
269
+ const icon = feedback.verdict === 'APPROVE' ? '✓' : '✗';
270
+ const color = feedback.verdict === 'APPROVE' ? chalk.green : chalk.yellow;
271
+ lines.push(color(` ${icon} ${feedback.model}: ${feedback.verdict}`));
272
+ if (feedback.summary) {
273
+ lines.push(` ${feedback.summary.slice(0, 100)}...`);
274
+ }
275
+ }
276
+ return lines.join('\n');
277
+ }
278
+ /**
279
+ * Check if a phase has consultation configured
280
+ */
281
+ export function hasConsultation(phaseConfig) {
282
+ return phaseConfig.consultation !== undefined &&
283
+ phaseConfig.consultation.models !== undefined &&
284
+ phaseConfig.consultation.models.length > 0;
285
+ }
286
+ /**
287
+ * Get the default consultation config for common review types
288
+ */
289
+ export function getDefaultConsultationConfig(type) {
290
+ const defaultModels = ['gemini', 'codex', 'claude'];
291
+ switch (type) {
292
+ case 'spec-review':
293
+ return {
294
+ on: 'review',
295
+ models: defaultModels,
296
+ type: 'spec-review',
297
+ parallel: true,
298
+ max_rounds: 3,
299
+ next: 'plan',
300
+ };
301
+ case 'plan-review':
302
+ return {
303
+ on: 'review',
304
+ models: defaultModels,
305
+ type: 'plan-review',
306
+ parallel: true,
307
+ max_rounds: 3,
308
+ next: 'implement',
309
+ };
310
+ case 'impl-review':
311
+ return {
312
+ on: 'complete',
313
+ models: defaultModels,
314
+ type: 'impl-review',
315
+ parallel: true,
316
+ max_rounds: 2,
317
+ next: 'defend',
318
+ };
319
+ default:
320
+ return {
321
+ on: 'review',
322
+ models: defaultModels,
323
+ type: type,
324
+ parallel: true,
325
+ max_rounds: 2,
326
+ next: '',
327
+ };
328
+ }
329
+ }
330
+ //# sourceMappingURL=consultation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consultation.js","sourceRoot":"","sources":["../../../src/commands/porch/consultation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B;;GAEG;AACH,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,YAAY;AAE5C;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,KAAa,EACb,OAAe,EACf,IAAc,EACd,UAGI,EAAE;IAEN,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YAChC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC;oBACN,MAAM;oBACN,KAAK,EAAE,gCAAgC,OAAO,IAAI;oBAClD,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC;oBACN,MAAM,EAAE,MAAM,GAAG,MAAM;oBACvB,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;oBACpD,OAAO,EAAE,IAAI,KAAK,CAAC;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,CAAC;gBACN,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,OAAO;gBAClB,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,oCAAoC;IACpC,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtF,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,qCAAqC;IACrC,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;QACpJ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2CAA2C;IAC3C,IAAI,gGAAgG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAClH,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,uDAAuD;IACvD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,YAAoB,GAAG;IACpE,gCAAgC;IAChC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,8BAA8B;IAC9B,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,+BAA+B;IAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAClF,OAAO,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAiB;IAC/C,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,KAAa,EACb,UAAkB,EAClB,UAAkB,EAClB,UAAmB;IAEnB,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAExD,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAA0B,EAC1B,OAMC;IAED,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACnF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAE7D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sCAAsC,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,CAAC;QACnG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,KAAK;YACL,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,8BAA8B;SACxC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,MAAM,+BAA+B,CAAC,CAAC,CAAC;IAEhG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,gCAAgC;IAChC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACvC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,KAAK,KAAK,CAAC,CAAC,CAAC;QAC/D,OAAO;YACL,KAAK;YACL,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,IAAI,QAAQ,EAAE,CAAC;QACb,sBAAsB;QACtB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAErE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAE1B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,KAAK,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK;oBACL,OAAO,EAAE,SAAS,EAAE,0CAA0C;oBAC9D,OAAO,EAAE,wBAAwB,MAAM,CAAC,KAAK,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAExC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,eAAe,QAAQ,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC;gBACzF,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,KAAK,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK;oBACL,OAAO,EAAE,SAAS;oBAClB,OAAO,EAAE,wBAAwB,MAAM,CAAC,KAAK,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAE9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,eAAe,QAAQ,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC;gBACzF,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,aAAa,KAAK,CAAC,CAAC,CAAC;IAE1F,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA0B,EAC1B,OAOC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,IAAI,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEhE,wBAAwB;QACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;QAEjE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAChE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAChD,CAAC;QAED,gCAAgC;QAChC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,cAAc,CAAC,MAAM,8BAA8B,CAAC,CAAC,CAAC;QAEjG,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,oCAAoC;QACpC,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,SAAS,iCAAiC,CAAC,CAAC,CAAC;YACjG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAChE,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8DAA8D,CAAC,CAAC,CAAC;gBAC1F,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YACjD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0DAA0D,CAAC,CAAC,CAAC;YACtF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,KAAK,EAAE,CAAC;IACV,CAAC;IAED,wBAAwB;IACxB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAA0B;IAClE,MAAM,KAAK,GAAa;QACtB,+BAA+B,MAAM,CAAC,KAAK,IAAI;QAC/C,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC;QACzG,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAkD;IAChF,OAAO,WAAW,CAAC,YAAY,KAAK,SAAS;QAC3C,WAAW,CAAC,YAAY,CAAC,MAAM,KAAK,SAAS;QAC7C,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAY;IACvD,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa;YAChB,OAAO;gBACL,EAAE,EAAE,QAAQ;gBACZ,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,CAAC;gBACb,IAAI,EAAE,MAAM;aACb,CAAC;QACJ,KAAK,aAAa;YAChB,OAAO;gBACL,EAAE,EAAE,QAAQ;gBACZ,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,CAAC;gBACb,IAAI,EAAE,WAAW;aAClB,CAAC;QACJ,KAAK,aAAa;YAChB,OAAO;gBACL,EAAE,EAAE,UAAU;gBACd,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,CAAC;gBACb,IAAI,EAAE,QAAQ;aACf,CAAC;QACJ;YACE,OAAO;gBACL,EAAE,EAAE,QAAQ;gBACZ,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,CAAC;gBACb,IAAI,EAAE,EAAE;aACT,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Porch - Protocol Orchestrator
3
+ *
4
+ * Generic loop orchestrator that reads protocol definitions from JSON
5
+ * and executes them with Claude. Implements the Ralph pattern: fresh
6
+ * context per iteration with state persisted to files.
7
+ */
8
+ import type { Protocol, PorchRunOptions, PorchInitOptions } from './types.js';
9
+ /**
10
+ * List available protocols
11
+ * Delegates to protocol-loader.ts for proper conversion
12
+ */
13
+ export declare function listProtocols(projectRoot?: string): string[];
14
+ /**
15
+ * Load a protocol definition
16
+ * Delegates to protocol-loader.ts which properly converts steps→substates
17
+ */
18
+ export declare function loadProtocol(name: string, projectRoot?: string): Protocol;
19
+ /**
20
+ * Initialize a new project with a protocol
21
+ */
22
+ export declare function init(protocolName: string, projectId: string, projectName: string, options?: PorchInitOptions): Promise<void>;
23
+ /**
24
+ * Run the protocol loop for a project
25
+ */
26
+ export declare function run(projectId: string, options?: PorchRunOptions): Promise<void>;
27
+ /**
28
+ * Approve a gate
29
+ */
30
+ export declare function approve(projectId: string, gateId: string): Promise<void>;
31
+ /**
32
+ * Show project status
33
+ */
34
+ export declare function status(projectId?: string): Promise<void>;
35
+ /**
36
+ * List available protocols
37
+ */
38
+ export declare function list(): Promise<void>;
39
+ /**
40
+ * Show protocol definition
41
+ */
42
+ export declare function show(protocolName: string): Promise<void>;
43
+ /**
44
+ * Show pending gates across all projects
45
+ */
46
+ export declare function pending(): Promise<void>;
47
+ /**
48
+ * Main porch entry point - handles subcommands
49
+ */
50
+ export interface PorchOptions {
51
+ subcommand: string;
52
+ args: string[];
53
+ dryRun?: boolean;
54
+ noClaude?: boolean;
55
+ pollInterval?: number;
56
+ description?: string;
57
+ worktree?: string;
58
+ }
59
+ export declare function porch(options: PorchOptions): Promise<void>;
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EACV,QAAQ,EAGR,eAAe,EACf,gBAAgB,EACjB,MAAM,YAAY,CAAC;AA+CpB;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAG5D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,CASzE;AA8MD;;GAEG;AACH,wBAAsB,IAAI,CACxB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAiBf;AAgFD;;GAEG;AACH,wBAAsB,GAAG,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAwUf;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9E;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6E9D;AAED;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB1C;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9D;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAe7C;AAyDD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEhE"}