@cluesmith/codev 1.6.2 → 2.0.0-rc.10

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 (121) hide show
  1. package/bin/porch.js +12 -0
  2. package/dist/agent-farm/cli.d.ts.map +1 -1
  3. package/dist/agent-farm/cli.js +25 -14
  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 +20 -0
  10. package/dist/agent-farm/commands/kickoff.d.ts.map +1 -0
  11. package/dist/agent-farm/commands/kickoff.js +273 -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 +30 -96
  15. package/dist/agent-farm/commands/spawn.js.map +1 -1
  16. package/dist/agent-farm/commands/start.d.ts.map +1 -1
  17. package/dist/agent-farm/commands/start.js +8 -50
  18. package/dist/agent-farm/commands/start.js.map +1 -1
  19. package/dist/agent-farm/servers/dashboard-server.js +0 -14
  20. package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
  21. package/dist/agent-farm/state.d.ts +0 -10
  22. package/dist/agent-farm/state.d.ts.map +1 -1
  23. package/dist/agent-farm/state.js +0 -24
  24. package/dist/agent-farm/state.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +17 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/commands/adopt.d.ts.map +1 -1
  29. package/dist/commands/adopt.js +17 -1
  30. package/dist/commands/adopt.js.map +1 -1
  31. package/dist/commands/consult/index.d.ts.map +1 -1
  32. package/dist/commands/consult/index.js +2 -1
  33. package/dist/commands/consult/index.js.map +1 -1
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +17 -1
  36. package/dist/commands/init.js.map +1 -1
  37. package/dist/commands/porch/checks.d.ts +29 -0
  38. package/dist/commands/porch/checks.d.ts.map +1 -0
  39. package/dist/commands/porch/checks.js +141 -0
  40. package/dist/commands/porch/checks.js.map +1 -0
  41. package/dist/commands/porch/claude.d.ts +29 -0
  42. package/dist/commands/porch/claude.d.ts.map +1 -0
  43. package/dist/commands/porch/claude.js +79 -0
  44. package/dist/commands/porch/claude.js.map +1 -0
  45. package/dist/commands/porch/index.d.ts +38 -0
  46. package/dist/commands/porch/index.d.ts.map +1 -0
  47. package/dist/commands/porch/index.js +524 -0
  48. package/dist/commands/porch/index.js.map +1 -0
  49. package/dist/commands/porch/plan.d.ts +60 -0
  50. package/dist/commands/porch/plan.d.ts.map +1 -0
  51. package/dist/commands/porch/plan.js +162 -0
  52. package/dist/commands/porch/plan.js.map +1 -0
  53. package/dist/commands/porch/prompts.d.ts +19 -0
  54. package/dist/commands/porch/prompts.d.ts.map +1 -0
  55. package/dist/commands/porch/prompts.js +259 -0
  56. package/dist/commands/porch/prompts.js.map +1 -0
  57. package/dist/commands/porch/protocol.d.ts +57 -0
  58. package/dist/commands/porch/protocol.d.ts.map +1 -0
  59. package/dist/commands/porch/protocol.js +250 -0
  60. package/dist/commands/porch/protocol.js.map +1 -0
  61. package/dist/commands/porch/repl.d.ts +33 -0
  62. package/dist/commands/porch/repl.d.ts.map +1 -0
  63. package/dist/commands/porch/repl.js +206 -0
  64. package/dist/commands/porch/repl.js.map +1 -0
  65. package/dist/commands/porch/run.d.ts +15 -0
  66. package/dist/commands/porch/run.d.ts.map +1 -0
  67. package/dist/commands/porch/run.js +551 -0
  68. package/dist/commands/porch/run.js.map +1 -0
  69. package/dist/commands/porch/signals.d.ts +35 -0
  70. package/dist/commands/porch/signals.d.ts.map +1 -0
  71. package/dist/commands/porch/signals.js +76 -0
  72. package/dist/commands/porch/signals.js.map +1 -0
  73. package/dist/commands/porch/state.d.ts +40 -0
  74. package/dist/commands/porch/state.d.ts.map +1 -0
  75. package/dist/commands/porch/state.js +153 -0
  76. package/dist/commands/porch/state.js.map +1 -0
  77. package/dist/commands/porch/types.d.ts +124 -0
  78. package/dist/commands/porch/types.d.ts.map +1 -0
  79. package/dist/commands/porch/types.js +8 -0
  80. package/dist/commands/porch/types.js.map +1 -0
  81. package/dist/commands/update.d.ts.map +1 -1
  82. package/dist/commands/update.js +19 -0
  83. package/dist/commands/update.js.map +1 -1
  84. package/dist/lib/scaffold.d.ts +24 -0
  85. package/dist/lib/scaffold.d.ts.map +1 -1
  86. package/dist/lib/scaffold.js +78 -0
  87. package/dist/lib/scaffold.js.map +1 -1
  88. package/package.json +6 -2
  89. package/skeleton/porch/prompts/defend.md +103 -0
  90. package/skeleton/porch/prompts/diagnose.md +70 -0
  91. package/skeleton/porch/prompts/evaluate.md +132 -0
  92. package/skeleton/porch/prompts/fix.md +59 -0
  93. package/skeleton/porch/prompts/implement.md +79 -0
  94. package/skeleton/porch/prompts/plan.md +74 -0
  95. package/skeleton/porch/prompts/pr.md +84 -0
  96. package/skeleton/porch/prompts/review.md +179 -0
  97. package/skeleton/porch/prompts/specify.md +53 -0
  98. package/skeleton/porch/prompts/test.md +63 -0
  99. package/skeleton/porch/prompts/understand.md +61 -0
  100. package/skeleton/porch/prompts/verify.md +58 -0
  101. package/skeleton/protocols/bugfix/protocol.json +127 -0
  102. package/skeleton/protocols/protocol-schema.json +237 -0
  103. package/skeleton/protocols/spider/prompts/defend.md +215 -0
  104. package/skeleton/protocols/spider/prompts/evaluate.md +241 -0
  105. package/skeleton/protocols/spider/prompts/implement.md +149 -0
  106. package/skeleton/protocols/spider/prompts/plan.md +214 -0
  107. package/skeleton/protocols/spider/prompts/review.md +217 -0
  108. package/skeleton/protocols/spider/prompts/specify.md +174 -0
  109. package/skeleton/protocols/spider/protocol.json +136 -0
  110. package/skeleton/protocols/spider/templates/plan.md +14 -0
  111. package/skeleton/protocols/tick/protocol.json +151 -0
  112. package/skeleton/roles/architect.md +40 -48
  113. package/skeleton/roles/builder.md +152 -29
  114. package/templates/dashboard/index.html +0 -27
  115. package/templates/dashboard/js/utils.js +0 -86
  116. package/dist/agent-farm/commands/rename.d.ts +0 -13
  117. package/dist/agent-farm/commands/rename.d.ts.map +0 -1
  118. package/dist/agent-farm/commands/rename.js +0 -33
  119. package/dist/agent-farm/commands/rename.js.map +0 -1
  120. package/templates/dashboard/css/activity.css +0 -151
  121. package/templates/dashboard/js/activity.js +0 -112
@@ -0,0 +1,551 @@
1
+ /**
2
+ * porch run - Main run loop (Build-Verify design)
3
+ *
4
+ * Porch orchestrates build-verify cycles:
5
+ * 1. BUILD: Spawn Claude to create artifact
6
+ * 2. VERIFY: Run 3-way consultation (Gemini, Codex, Claude)
7
+ * 3. ITERATE: If any REQUEST_CHANGES, feed back to Claude
8
+ * 4. COMPLETE: When all APPROVE (or max iterations), commit + push + gate
9
+ */
10
+ import * as fs from 'node:fs';
11
+ import * as path from 'node:path';
12
+ import chalk from 'chalk';
13
+ import { readState, writeState, findStatusPath } from './state.js';
14
+ import { loadProtocol, getPhaseConfig, isPhased, getPhaseGate, isBuildVerify, getVerifyConfig, getMaxIterations, getOnCompleteConfig, getBuildConfig } from './protocol.js';
15
+ import { getCurrentPlanPhase } from './plan.js';
16
+ import { spawnClaude } from './claude.js';
17
+ import { runRepl } from './repl.js';
18
+ import { buildPhasePrompt } from './prompts.js';
19
+ // Runtime artifacts go in project directory, not a hidden folder
20
+ function getPorchDir(projectRoot, state) {
21
+ return path.join(projectRoot, 'codev', 'projects', `${state.id}-${state.title}`);
22
+ }
23
+ /**
24
+ * Generate output file name with phase and iteration info.
25
+ * e.g., "0074-specify-iter-1.txt" or "0074-phase_1-iter-2.txt"
26
+ *
27
+ * Uses state.iteration which is persisted and survives porch restarts.
28
+ */
29
+ function getOutputFileName(state) {
30
+ const planPhase = getCurrentPlanPhase(state.plan_phases);
31
+ // Build filename using persisted iteration from state
32
+ const parts = [state.id];
33
+ if (planPhase) {
34
+ parts.push(planPhase.id);
35
+ }
36
+ else {
37
+ parts.push(state.phase);
38
+ }
39
+ parts.push(`iter-${state.iteration}`);
40
+ return `${parts.join('-')}.txt`;
41
+ }
42
+ /**
43
+ * Main run loop for porch.
44
+ * Spawns Claude for each phase and monitors until protocol complete.
45
+ */
46
+ export async function run(projectRoot, projectId) {
47
+ const statusPath = findStatusPath(projectRoot, projectId);
48
+ if (!statusPath) {
49
+ throw new Error(`Project ${projectId} not found.\nRun 'porch init' to create a new project.`);
50
+ }
51
+ // Read initial state to get project directory
52
+ let state = readState(statusPath);
53
+ // Ensure project artifacts directory exists
54
+ const porchDir = getPorchDir(projectRoot, state);
55
+ if (!fs.existsSync(porchDir)) {
56
+ fs.mkdirSync(porchDir, { recursive: true });
57
+ }
58
+ console.log('');
59
+ console.log(chalk.bold('PORCH - Protocol Orchestrator'));
60
+ console.log(chalk.dim('Porch is the outer loop. Claude runs under porch control.'));
61
+ console.log('');
62
+ while (true) {
63
+ state = readState(statusPath);
64
+ const protocol = loadProtocol(projectRoot, state.protocol);
65
+ const phaseConfig = getPhaseConfig(protocol, state.phase);
66
+ if (!phaseConfig) {
67
+ console.log(chalk.green.bold('🎉 PROTOCOL COMPLETE'));
68
+ console.log(`\n Project ${state.id} has completed the ${state.protocol} protocol.`);
69
+ break;
70
+ }
71
+ // Check for pending gate
72
+ const gateName = getPhaseGate(protocol, state.phase);
73
+ if (gateName && state.gates[gateName]?.status === 'pending' && state.gates[gateName]?.requested_at) {
74
+ const outputPath = path.join(porchDir, `${state.id}-gate.txt`);
75
+ await handleGate(state, gateName, statusPath, projectRoot, outputPath, protocol);
76
+ continue;
77
+ }
78
+ // Handle build_verify phases
79
+ if (isBuildVerify(protocol, state.phase)) {
80
+ const maxIterations = getMaxIterations(protocol, state.phase);
81
+ // Check if we need to run VERIFY (build just completed)
82
+ if (state.build_complete) {
83
+ console.log('');
84
+ console.log(chalk.cyan(`[${state.id}] VERIFY - Iteration ${state.iteration}/${maxIterations}`));
85
+ const reviews = await runVerification(projectRoot, state, protocol);
86
+ // Get the build output file from current iteration (stored when we track it)
87
+ const currentBuildOutput = state.history.find(h => h.iteration === state.iteration)?.build_output || '';
88
+ // Update history with reviews
89
+ const existingRecord = state.history.find(h => h.iteration === state.iteration);
90
+ if (existingRecord) {
91
+ existingRecord.reviews = reviews;
92
+ }
93
+ else {
94
+ state.history.push({
95
+ iteration: state.iteration,
96
+ build_output: currentBuildOutput,
97
+ reviews,
98
+ });
99
+ }
100
+ if (allApprove(reviews)) {
101
+ console.log(chalk.green('\nAll reviewers APPROVE!'));
102
+ // Run on_complete actions (commit + push)
103
+ await runOnComplete(projectRoot, state, protocol, reviews);
104
+ // Request gate
105
+ if (gateName) {
106
+ state.gates[gateName] = { status: 'pending', requested_at: new Date().toISOString() };
107
+ }
108
+ // Reset for next phase
109
+ state.build_complete = false;
110
+ state.iteration = 1;
111
+ state.history = [];
112
+ writeState(statusPath, state);
113
+ continue;
114
+ }
115
+ // Some reviewers requested changes
116
+ console.log(chalk.yellow('\nChanges requested. Feeding back to Claude...'));
117
+ if (state.iteration >= maxIterations) {
118
+ console.log(chalk.yellow(`\nMax iterations (${maxIterations}) reached. Proceeding to gate.`));
119
+ // Run on_complete actions anyway
120
+ await runOnComplete(projectRoot, state, protocol, reviews);
121
+ // Request gate
122
+ if (gateName) {
123
+ state.gates[gateName] = { status: 'pending', requested_at: new Date().toISOString() };
124
+ }
125
+ state.build_complete = false;
126
+ state.iteration = 1;
127
+ state.history = [];
128
+ writeState(statusPath, state);
129
+ continue;
130
+ }
131
+ // Increment iteration and continue to BUILD
132
+ state.iteration++;
133
+ state.build_complete = false;
134
+ writeState(statusPath, state);
135
+ // Fall through to BUILD phase
136
+ }
137
+ // BUILD phase
138
+ console.log('');
139
+ console.log(chalk.cyan(`[${state.id}] BUILD - ${phaseConfig.name} - Iteration ${state.iteration}/${maxIterations}`));
140
+ }
141
+ // Generate output file for this iteration
142
+ const outputFileName = getOutputFileName(state);
143
+ const outputPath = path.join(porchDir, outputFileName);
144
+ // Track this build output in history (for feedback to next iteration)
145
+ if (isBuildVerify(protocol, state.phase)) {
146
+ const existingRecord = state.history.find(h => h.iteration === state.iteration);
147
+ if (existingRecord) {
148
+ existingRecord.build_output = outputPath;
149
+ }
150
+ else {
151
+ state.history.push({
152
+ iteration: state.iteration,
153
+ build_output: outputPath,
154
+ reviews: [],
155
+ });
156
+ }
157
+ writeState(statusPath, state);
158
+ }
159
+ // Build prompt for current phase (includes history file paths if iteration > 1)
160
+ const prompt = buildPhasePrompt(projectRoot, state, protocol);
161
+ // Create output file
162
+ fs.writeFileSync(outputPath, '');
163
+ console.log(chalk.dim(`Output: ${outputFileName}`));
164
+ // Show status
165
+ showStatus(state, protocol);
166
+ // Print the prompt being sent to Claude
167
+ console.log('');
168
+ console.log(chalk.cyan('═'.repeat(60)));
169
+ console.log(chalk.cyan.bold(' PROMPT TO CLAUDE'));
170
+ console.log(chalk.cyan('═'.repeat(60)));
171
+ console.log(chalk.dim(prompt.substring(0, 2000)));
172
+ if (prompt.length > 2000) {
173
+ console.log(chalk.dim(`... (${prompt.length - 2000} more chars)`));
174
+ }
175
+ console.log(chalk.cyan('═'.repeat(60)));
176
+ console.log('');
177
+ // Spawn Claude
178
+ console.log(chalk.dim('Starting Claude...'));
179
+ const claude = spawnClaude(prompt, outputPath, projectRoot);
180
+ // Run REPL while Claude works
181
+ const action = await runRepl(state, claude, outputPath, statusPath, projectRoot, protocol);
182
+ // Handle REPL result
183
+ switch (action.type) {
184
+ case 'quit':
185
+ claude.kill();
186
+ console.log(chalk.yellow('\nPorch terminated by user.'));
187
+ return;
188
+ case 'signal':
189
+ const shouldRespawn = await handleSignal(action.signal, state, statusPath, projectRoot, protocol);
190
+ if (shouldRespawn) {
191
+ console.log(chalk.dim('\nRespawning Claude for retry...'));
192
+ await sleep(1000);
193
+ }
194
+ break;
195
+ case 'claude_exit':
196
+ // For build_verify phases, ANY Claude exit = build complete
197
+ // Don't respawn - go straight to verification
198
+ if (isBuildVerify(protocol, state.phase)) {
199
+ console.log(chalk.dim('\nClaude finished. Moving to verification...'));
200
+ state.build_complete = true;
201
+ writeState(statusPath, state);
202
+ // Continue loop - will hit build_complete check and run verify
203
+ }
204
+ else if (action.exitCode !== 0) {
205
+ console.log(chalk.red(`\nClaude exited with code ${action.exitCode}`));
206
+ console.log(chalk.dim('Restarting in 3 seconds...'));
207
+ await sleep(3000);
208
+ }
209
+ break;
210
+ case 'approved':
211
+ // Gate was approved, continue to next phase
212
+ break;
213
+ case 'manual_claude':
214
+ // User wants to intervene - just continue loop to respawn
215
+ console.log(chalk.dim('\nRespawning Claude...'));
216
+ break;
217
+ }
218
+ }
219
+ }
220
+ // ============================================================================
221
+ // Verification (3-way consultation)
222
+ // ============================================================================
223
+ /**
224
+ * Run 3-way verification on the current phase artifact.
225
+ * Writes each consultation output to a file.
226
+ * Returns array of review results with file paths.
227
+ */
228
+ async function runVerification(projectRoot, state, protocol) {
229
+ const verifyConfig = getVerifyConfig(protocol, state.phase);
230
+ if (!verifyConfig) {
231
+ return []; // No verification configured
232
+ }
233
+ console.log(chalk.dim(`Running ${verifyConfig.models.length}-way consultation...`));
234
+ const porchDir = getPorchDir(projectRoot, state);
235
+ const reviews = [];
236
+ // Run consultations in parallel
237
+ const promises = verifyConfig.models.map(async (model) => {
238
+ console.log(chalk.dim(` ${model}: starting...`));
239
+ // Output file for this review
240
+ const reviewFile = path.join(porchDir, `${state.id}-${state.phase}-iter${state.iteration}-${model}.txt`);
241
+ const result = await runConsult(projectRoot, model, verifyConfig.type, state, reviewFile);
242
+ reviews.push(result);
243
+ const verdictColor = result.verdict === 'APPROVE' ? chalk.green :
244
+ result.verdict === 'COMMENT' ? chalk.blue : chalk.yellow;
245
+ console.log(` ${model}: ${verdictColor(result.verdict)}`);
246
+ });
247
+ await Promise.all(promises);
248
+ return reviews;
249
+ }
250
+ /**
251
+ * Get the consult artifact type for a phase.
252
+ */
253
+ function getConsultArtifactType(phaseId) {
254
+ switch (phaseId) {
255
+ case 'specify':
256
+ return 'spec';
257
+ case 'plan':
258
+ return 'plan';
259
+ case 'implement':
260
+ return 'plan'; // Implementation reviews the plan phase
261
+ case 'review':
262
+ return 'spec'; // Review phase reviews overall work
263
+ default:
264
+ return 'spec';
265
+ }
266
+ }
267
+ /**
268
+ * Run a single consultation.
269
+ * Writes output to file and returns result with file path.
270
+ */
271
+ const CONSULT_TIMEOUT_MS = 60 * 60 * 1000; // 1 hour
272
+ async function runConsult(projectRoot, model, reviewType, state, outputFile) {
273
+ const { spawn } = await import('node:child_process');
274
+ const artifactType = getConsultArtifactType(state.phase);
275
+ return new Promise((resolve) => {
276
+ const args = ['--model', model, '--type', reviewType, artifactType, state.id];
277
+ const proc = spawn('consult', args, {
278
+ cwd: projectRoot,
279
+ stdio: ['pipe', 'pipe', 'pipe'],
280
+ });
281
+ let output = '';
282
+ let resolved = false;
283
+ // Timeout after 1 hour
284
+ const timeout = setTimeout(() => {
285
+ if (!resolved) {
286
+ resolved = true;
287
+ proc.kill('SIGTERM');
288
+ const timeoutOutput = output + '\n\n[TIMEOUT: Consultation exceeded 1 hour limit]';
289
+ fs.writeFileSync(outputFile, timeoutOutput);
290
+ console.log(chalk.yellow(` ${model}: timeout (1 hour limit)`));
291
+ resolve({ model, verdict: 'REQUEST_CHANGES', file: outputFile });
292
+ }
293
+ }, CONSULT_TIMEOUT_MS);
294
+ proc.stdout.on('data', (data) => { output += data.toString(); });
295
+ proc.stderr.on('data', (data) => { output += data.toString(); });
296
+ proc.on('close', () => {
297
+ if (!resolved) {
298
+ resolved = true;
299
+ clearTimeout(timeout);
300
+ // Write output to file
301
+ fs.writeFileSync(outputFile, output);
302
+ // Parse verdict from output
303
+ const verdict = parseVerdict(output);
304
+ resolve({ model, verdict, file: outputFile });
305
+ }
306
+ });
307
+ proc.on('error', (err) => {
308
+ if (!resolved) {
309
+ resolved = true;
310
+ clearTimeout(timeout);
311
+ const errorOutput = `Error: ${err.message}`;
312
+ fs.writeFileSync(outputFile, errorOutput);
313
+ console.log(chalk.red(` ${model}: error - ${err.message}`));
314
+ resolve({ model, verdict: 'REQUEST_CHANGES', file: outputFile });
315
+ }
316
+ });
317
+ });
318
+ }
319
+ /**
320
+ * Parse verdict from consultation output.
321
+ *
322
+ * Looks for the verdict line in format:
323
+ * VERDICT: APPROVE
324
+ * VERDICT: REQUEST_CHANGES
325
+ * VERDICT: COMMENT
326
+ *
327
+ * Safety: If no explicit verdict found (empty output, crash, malformed),
328
+ * defaults to REQUEST_CHANGES to prevent proceeding with unverified code.
329
+ */
330
+ function parseVerdict(output) {
331
+ // Empty or very short output = something went wrong
332
+ if (!output || output.trim().length < 50) {
333
+ return 'REQUEST_CHANGES';
334
+ }
335
+ // Look for actual verdict line (not template text like "[APPROVE | REQUEST_CHANGES | COMMENT]")
336
+ // Match lines like "VERDICT: APPROVE" or "VERDICT: REQUEST_CHANGES"
337
+ const lines = output.split('\n');
338
+ for (const line of lines) {
339
+ const trimmed = line.trim().toUpperCase();
340
+ // Match "VERDICT: <value>" but NOT "VERDICT: [APPROVE | ...]"
341
+ if (trimmed.startsWith('VERDICT:') && !trimmed.includes('[')) {
342
+ if (trimmed.includes('REQUEST_CHANGES')) {
343
+ return 'REQUEST_CHANGES';
344
+ }
345
+ if (trimmed.includes('APPROVE')) {
346
+ return 'APPROVE';
347
+ }
348
+ if (trimmed.includes('COMMENT')) {
349
+ return 'COMMENT';
350
+ }
351
+ }
352
+ }
353
+ // Fallback: look anywhere in output (legacy behavior)
354
+ const upperOutput = output.toUpperCase();
355
+ if (upperOutput.includes('REQUEST_CHANGES')) {
356
+ return 'REQUEST_CHANGES';
357
+ }
358
+ if (upperOutput.includes('APPROVE')) {
359
+ return 'APPROVE';
360
+ }
361
+ // No explicit verdict = default to REQUEST_CHANGES for safety
362
+ return 'REQUEST_CHANGES';
363
+ }
364
+ /**
365
+ * Check if all reviewers approved (no REQUEST_CHANGES).
366
+ */
367
+ function allApprove(reviews) {
368
+ if (reviews.length === 0)
369
+ return true; // No verification = auto-approve
370
+ return reviews.every(r => r.verdict !== 'REQUEST_CHANGES');
371
+ }
372
+ /**
373
+ * Run on_complete actions (commit + push).
374
+ */
375
+ async function runOnComplete(projectRoot, state, protocol, reviews) {
376
+ const onComplete = getOnCompleteConfig(protocol, state.phase);
377
+ if (!onComplete)
378
+ return;
379
+ const buildConfig = getBuildConfig(protocol, state.phase);
380
+ if (!buildConfig)
381
+ return;
382
+ // Resolve artifact path
383
+ const artifact = buildConfig.artifact
384
+ .replace('${PROJECT_ID}', state.id)
385
+ .replace('${PROJECT_TITLE}', state.title);
386
+ const { exec } = await import('node:child_process');
387
+ const { promisify } = await import('node:util');
388
+ const execAsync = promisify(exec);
389
+ if (onComplete.commit) {
390
+ console.log(chalk.dim('Committing...'));
391
+ try {
392
+ // Stage artifact
393
+ await execAsync(`git add ${artifact}`, { cwd: projectRoot });
394
+ // Commit
395
+ const message = `[Spec ${state.id}] ${state.phase}: ${state.title}
396
+
397
+ Iteration ${state.iteration}
398
+ 3-way review: ${formatVerdicts(reviews)}`;
399
+ await execAsync(`git commit -m "${message}"`, { cwd: projectRoot });
400
+ console.log(chalk.green('Committed.'));
401
+ }
402
+ catch (err) {
403
+ console.log(chalk.yellow('Commit failed (may be nothing to commit).'));
404
+ }
405
+ }
406
+ if (onComplete.push) {
407
+ console.log(chalk.dim('Pushing...'));
408
+ try {
409
+ await execAsync('git push', { cwd: projectRoot });
410
+ console.log(chalk.green('Pushed.'));
411
+ }
412
+ catch (err) {
413
+ console.log(chalk.yellow('Push failed.'));
414
+ }
415
+ }
416
+ }
417
+ /**
418
+ * Format verdicts for commit message.
419
+ */
420
+ function formatVerdicts(reviews) {
421
+ return reviews
422
+ .map(r => `${r.model}=${r.verdict}`)
423
+ .join(', ') || 'N/A';
424
+ }
425
+ /**
426
+ * Display current status.
427
+ */
428
+ function showStatus(state, protocol) {
429
+ const phaseConfig = getPhaseConfig(protocol, state.phase);
430
+ console.log('');
431
+ console.log(chalk.bold(`[${state.id}] ${state.title}`));
432
+ console.log(` Phase: ${state.phase} (${phaseConfig?.name || 'unknown'})`);
433
+ if (isBuildVerify(protocol, state.phase)) {
434
+ const maxIterations = getMaxIterations(protocol, state.phase);
435
+ console.log(` Iteration: ${state.iteration}/${maxIterations}`);
436
+ }
437
+ if (isPhased(protocol, state.phase) && state.plan_phases.length > 0) {
438
+ const currentPlanPhase = getCurrentPlanPhase(state.plan_phases);
439
+ if (currentPlanPhase) {
440
+ console.log(` Plan Phase: ${currentPlanPhase.id} - ${currentPlanPhase.title}`);
441
+ }
442
+ }
443
+ console.log('');
444
+ }
445
+ /**
446
+ * Handle gate approval flow.
447
+ */
448
+ async function handleGate(state, gateName, statusPath, projectRoot, outputPath, protocol) {
449
+ console.log('');
450
+ console.log(chalk.yellow('═'.repeat(60)));
451
+ console.log(chalk.yellow.bold(` GATE: ${gateName}`));
452
+ console.log(chalk.yellow('═'.repeat(60)));
453
+ console.log('');
454
+ // Show artifact path
455
+ const artifact = getArtifactForPhase(state);
456
+ if (artifact) {
457
+ console.log(` Review: ${artifact}`);
458
+ }
459
+ console.log('');
460
+ console.log(" Type 'a' or 'approve' to approve and continue.");
461
+ console.log(" Type 'q' or 'quit' to exit.");
462
+ console.log('');
463
+ // Wait for user input
464
+ const readline = await import('node:readline');
465
+ const rl = readline.createInterface({
466
+ input: process.stdin,
467
+ output: process.stdout,
468
+ });
469
+ return new Promise((resolve) => {
470
+ const prompt = () => {
471
+ rl.question(chalk.cyan(`[${state.id}] WAITING FOR APPROVAL > `), (input) => {
472
+ const cmd = input.trim().toLowerCase();
473
+ switch (cmd) {
474
+ case 'a':
475
+ case 'approve':
476
+ state.gates[gateName].status = 'approved';
477
+ state.gates[gateName].approved_at = new Date().toISOString();
478
+ writeState(statusPath, state);
479
+ console.log(chalk.green(`\nGate ${gateName} approved.`));
480
+ rl.close();
481
+ resolve();
482
+ break;
483
+ case 'q':
484
+ case 'quit':
485
+ console.log(chalk.yellow('\nExiting without approval.'));
486
+ rl.close();
487
+ process.exit(0);
488
+ break;
489
+ default:
490
+ console.log(chalk.dim("Unknown command. Type 'a' to approve or 'q' to quit."));
491
+ prompt();
492
+ }
493
+ });
494
+ };
495
+ prompt();
496
+ });
497
+ }
498
+ /**
499
+ * Handle signal from Claude output.
500
+ * Returns true if should respawn Claude (for build-verify iteration), false otherwise.
501
+ */
502
+ async function handleSignal(signal, state, statusPath, projectRoot, protocol) {
503
+ console.log('');
504
+ switch (signal.type) {
505
+ case 'PHASE_COMPLETE':
506
+ console.log(chalk.green('Signal: PHASE_COMPLETE'));
507
+ // For build_verify phases, we'll run verification in the main loop
508
+ // Mark build as complete so main loop knows to run verify
509
+ if (isBuildVerify(protocol, state.phase)) {
510
+ state.build_complete = true;
511
+ writeState(statusPath, state);
512
+ return false; // Main loop will handle verify
513
+ }
514
+ // For non-build_verify phases, advance state directly
515
+ const { done } = await import('./index.js');
516
+ await done(projectRoot, state.id);
517
+ return false;
518
+ case 'GATE_NEEDED':
519
+ console.log(chalk.yellow('Signal: GATE_NEEDED'));
520
+ const gateName = getPhaseGate(protocol, state.phase);
521
+ if (gateName && !state.gates[gateName]) {
522
+ state.gates[gateName] = { status: 'pending', requested_at: new Date().toISOString() };
523
+ writeState(statusPath, state);
524
+ }
525
+ return false;
526
+ case 'BLOCKED':
527
+ console.log(chalk.red(`Signal: BLOCKED - ${signal.reason}`));
528
+ console.log(chalk.dim('Human intervention required.'));
529
+ return false;
530
+ }
531
+ return false;
532
+ }
533
+ /**
534
+ * Get artifact path for current phase.
535
+ */
536
+ function getArtifactForPhase(state) {
537
+ switch (state.phase) {
538
+ case 'specify':
539
+ return `codev/specs/${state.id}-${state.title}.md`;
540
+ case 'plan':
541
+ return `codev/plans/${state.id}-${state.title}.md`;
542
+ case 'review':
543
+ return `codev/reviews/${state.id}-${state.title}.md`;
544
+ default:
545
+ return null;
546
+ }
547
+ }
548
+ function sleep(ms) {
549
+ return new Promise((resolve) => setTimeout(resolve, ms));
550
+ }
551
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/porch/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5K,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,iEAAiE;AACjE,SAAS,WAAW,CAAC,WAAmB,EAAE,KAAmB;IAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AACnF,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,KAAmB;IAC5C,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEzD,sDAAsD;IACtD,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAEtC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,WAAmB,EAAE,SAAiB;IAC9D,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,wDAAwD,CAAC,CAAC;IAChG,CAAC;IAED,8CAA8C;IAC9C,IAAI,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAElC,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,IAAI,EAAE,CAAC;QACZ,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAE1D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,EAAE,sBAAsB,KAAK,CAAC,QAAQ,YAAY,CAAC,CAAC;YACrF,MAAM;QACR,CAAC;QAED,yBAAyB;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;YACnG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;YAC/D,MAAM,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACjF,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAE9D,wDAAwD;YACxD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,wBAAwB,KAAK,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC;gBAEhG,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAEpE,6EAA6E;gBAC7E,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,IAAI,EAAE,CAAC;gBAExG,8BAA8B;gBAC9B,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;gBAChF,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;wBACjB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,YAAY,EAAE,kBAAkB;wBAChC,OAAO;qBACR,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;oBAErD,0CAA0C;oBAC1C,MAAM,aAAa,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAE3D,eAAe;oBACf,IAAI,QAAQ,EAAE,CAAC;wBACb,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxF,CAAC;oBAED,uBAAuB;oBACvB,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;oBAC7B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;oBACpB,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;oBACnB,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBAC9B,SAAS;gBACX,CAAC;gBAED,mCAAmC;gBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;gBAE5E,IAAI,KAAK,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,aAAa,gCAAgC,CAAC,CAAC,CAAC;oBAE9F,iCAAiC;oBACjC,MAAM,aAAa,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAE3D,eAAe;oBACf,IAAI,QAAQ,EAAE,CAAC;wBACb,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxF,CAAC;oBAED,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;oBAC7B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;oBACpB,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;oBACnB,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBAC9B,SAAS;gBACX,CAAC;gBAED,4CAA4C;gBAC5C,KAAK,CAAC,SAAS,EAAE,CAAC;gBAClB,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC7B,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC9B,8BAA8B;YAChC,CAAC;YAED,cAAc;YACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,aAAa,WAAW,CAAC,IAAI,gBAAgB,KAAK,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC;QACvH,CAAC;QAED,0CAA0C;QAC1C,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAEvD,sEAAsE;QACtE,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;YAChF,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,YAAY,GAAG,UAAU,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBACjB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,YAAY,EAAE,UAAU;oBACxB,OAAO,EAAE,EAAE;iBACZ,CAAC,CAAC;YACL,CAAC;YACD,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,gFAAgF;QAChF,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE9D,qBAAqB;QACrB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,cAAc,EAAE,CAAC,CAAC,CAAC;QAEpD,cAAc;QACd,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE5B,wCAAwC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,eAAe;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAE5D,8BAA8B;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE3F,qBAAqB;QACrB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,MAAM,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBACzD,OAAO;YAET,KAAK,QAAQ;gBACX,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAClG,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;oBAC3D,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;gBACD,MAAM;YAER,KAAK,aAAa;gBAChB,4DAA4D;gBAC5D,8CAA8C;gBAC9C,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;oBACvE,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC5B,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBAC9B,+DAA+D;gBACjE,CAAC;qBAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;oBACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;oBACrD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;gBACD,MAAM;YAER,KAAK,UAAU;gBACb,4CAA4C;gBAC5C,MAAM;YAER,KAAK,eAAe;gBAClB,0DAA0D;gBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACjD,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E;;;;GAIG;AACH,KAAK,UAAU,eAAe,CAC5B,WAAmB,EACnB,KAAmB,EACnB,QAAkB;IAElB,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC,CAAC,6BAA6B;IAC1C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,YAAY,CAAC,MAAM,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,gCAAgC;IAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC;QAElD,8BAA8B;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,SAAS,IAAI,KAAK,MAAM,CAAC,CAAC;QAEzG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAAe;IAC7C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,CAAC,wCAAwC;QACzD,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,CAAC,oCAAoC;QACrD;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAEpD,KAAK,UAAU,UAAU,CACvB,WAAmB,EACnB,KAAa,EACb,UAAkB,EAClB,KAAmB,EACnB,UAAkB;IAElB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAErD,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE;YAClC,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,uBAAuB;QACvB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,MAAM,aAAa,GAAG,MAAM,GAAG,mDAAmD,CAAC;gBACnF,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,0BAA0B,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,uBAAuB;gBACvB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAErC,4BAA4B;gBAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;gBACrC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,WAAW,GAAG,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,aAAa,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC7D,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,YAAY,CAAC,MAAc;IAClC,oDAAoD;IACpD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACzC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,gGAAgG;IAChG,oEAAoE;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,8DAA8D;QAC9D,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7D,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACxC,OAAO,iBAAiB,CAAC;YAC3B,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5C,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,8DAA8D;IAC9D,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,OAAuB;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,iCAAiC;IACxE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,WAAmB,EACnB,KAAmB,EACnB,QAAkB,EAClB,OAAuB;IAEvB,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,wBAAwB;IACxB,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ;SAClC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;SAClC,OAAO,CAAC,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,iBAAiB;YACjB,MAAM,SAAS,CAAC,WAAW,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YAE7D,SAAS;YACT,MAAM,OAAO,GAAG,SAAS,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;;YAE3D,KAAK,CAAC,SAAS;gBACX,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAEpC,MAAM,SAAS,CAAC,kBAAkB,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAuB;IAC7C,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;SACnC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,KAAmB,EAAE,QAAkB;IACzD,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,KAAK,KAAK,WAAW,EAAE,IAAI,IAAI,SAAS,GAAG,CAAC,CAAC;IAE3E,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,gBAAgB,CAAC,EAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,KAAmB,EACnB,QAAgB,EAChB,UAAkB,EAClB,WAAmB,EACnB,UAAkB,EAClB,QAAkB;IAElB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,qBAAqB;IACrB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBACzE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAEvC,QAAQ,GAAG,EAAE,CAAC;oBACZ,KAAK,GAAG,CAAC;oBACT,KAAK,SAAS;wBACZ,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC;wBAC1C,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;wBAC7D,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;wBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,QAAQ,YAAY,CAAC,CAAC,CAAC;wBACzD,EAAE,CAAC,KAAK,EAAE,CAAC;wBACX,OAAO,EAAE,CAAC;wBACV,MAAM;oBAER,KAAK,GAAG,CAAC;oBACT,KAAK,MAAM;wBACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;wBACzD,EAAE,CAAC,KAAK,EAAE,CAAC;wBACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAChB,MAAM;oBAER;wBACE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;wBAC/E,MAAM,EAAE,CAAC;gBACb,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CACzB,MAAc,EACd,KAAmB,EACnB,UAAkB,EAClB,WAAmB,EACnB,QAAkB;IAElB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,gBAAgB;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAEnD,mEAAmE;YACnE,0DAA0D;YAC1D,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC5B,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC9B,OAAO,KAAK,CAAC,CAAC,+BAA+B;YAC/C,CAAC;YAED,sDAAsD;YACtD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;QAEf,KAAK,aAAa;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtF,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,KAAK,CAAC;QAEf,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAmB;IAC9C,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,eAAe,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;QACrD,KAAK,MAAM;YACT,OAAO,eAAe,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;QACrD,KAAK,QAAQ;YACX,OAAO,iBAAiB,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;QACvD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Signal detection for Porch
3
+ *
4
+ * Watches Claude's output file for signal markers:
5
+ * PHASE_COMPLETE - Phase work is done
6
+ * GATE_NEEDED - Human approval required
7
+ * BLOCKED: <reason> - Claude is stuck
8
+ */
9
+ export type Signal = {
10
+ type: 'PHASE_COMPLETE';
11
+ } | {
12
+ type: 'GATE_NEEDED';
13
+ } | {
14
+ type: 'BLOCKED';
15
+ reason: string;
16
+ };
17
+ export interface SignalWatcher {
18
+ /**
19
+ * Check for new signals since last check.
20
+ */
21
+ check(): Promise<Signal | null>;
22
+ /**
23
+ * Stop watching.
24
+ */
25
+ stop(): void;
26
+ }
27
+ /**
28
+ * Create a signal watcher for the given output file.
29
+ */
30
+ export declare function watchForSignal(outputPath: string): SignalWatcher;
31
+ /**
32
+ * Parse a signal from text content (one-shot check).
33
+ */
34
+ export declare function parseSignal(content: string): Signal | null;
35
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/signals.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEhC;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAmDhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB1D"}