@bradtaylorsf/alpha-loop 1.0.0 → 1.0.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.
- package/README.md +34 -4
- package/dist/cli.js +36 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/history.js +196 -93
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.js +75 -34
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/resume.d.ts +8 -0
- package/dist/commands/resume.js +391 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/review.d.ts +8 -0
- package/dist/commands/review.js +521 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.js +2 -2
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/sync.d.ts +25 -3
- package/dist/commands/sync.js +191 -44
- package/dist/commands/sync.js.map +1 -1
- package/dist/lib/agent.d.ts +4 -0
- package/dist/lib/agent.js +43 -11
- package/dist/lib/agent.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.js +2 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/github.d.ts +5 -0
- package/dist/lib/github.js +22 -2
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/pipeline.js +19 -11
- package/dist/lib/pipeline.js.map +1 -1
- package/dist/lib/session.js +25 -5
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/verify.js +18 -13
- package/dist/lib/verify.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/init.js
CHANGED
|
@@ -1,45 +1,35 @@
|
|
|
1
|
-
import { existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { detectRepo } from '../lib/config.js';
|
|
1
|
+
import { existsSync, writeFileSync, readFileSync, mkdirSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { detectRepo, loadConfig } from '../lib/config.js';
|
|
4
4
|
import { exec } from '../lib/shell.js';
|
|
5
5
|
import { log } from '../lib/logger.js';
|
|
6
6
|
import { syncAgentAssets } from './sync.js';
|
|
7
7
|
/**
|
|
8
8
|
* Find the templates directory shipped with alpha-loop.
|
|
9
9
|
* Works whether running from src/ (tsx) or dist/ (compiled) or as an npm package.
|
|
10
|
+
*
|
|
11
|
+
* Uses the resolved path of the CLI entrypoint (process.argv[1]) to locate the
|
|
12
|
+
* package root, following symlinks so globally-installed npm packages resolve correctly.
|
|
10
13
|
*/
|
|
11
14
|
function findTemplatesDir() {
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const candidates = [];
|
|
17
|
-
// Walk up from script location
|
|
18
|
-
if (scriptDir) {
|
|
19
|
-
let dir = scriptDir;
|
|
20
|
-
for (let i = 0; i < 5; i++) {
|
|
21
|
-
candidates.push(join(dir, 'templates'));
|
|
22
|
-
const parent = join(dir, '..');
|
|
23
|
-
if (parent === dir)
|
|
24
|
-
break;
|
|
25
|
-
dir = parent;
|
|
26
|
-
}
|
|
15
|
+
// Resolve symlinks (npm global installs are symlinked from bin/ to the actual package)
|
|
16
|
+
let startDir;
|
|
17
|
+
try {
|
|
18
|
+
startDir = dirname(realpathSync(process.argv[1]));
|
|
27
19
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (process.argv[1]) {
|
|
31
|
-
let dir = join(process.argv[1], '..');
|
|
32
|
-
for (let i = 0; i < 5; i++) {
|
|
33
|
-
candidates.push(join(dir, 'templates'));
|
|
34
|
-
const parent = join(dir, '..');
|
|
35
|
-
if (parent === dir)
|
|
36
|
-
break;
|
|
37
|
-
dir = parent;
|
|
38
|
-
}
|
|
20
|
+
catch {
|
|
21
|
+
startDir = process.cwd();
|
|
39
22
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
23
|
+
// Walk up from the entrypoint to find templates/
|
|
24
|
+
let dir = startDir;
|
|
25
|
+
for (let i = 0; i < 5; i++) {
|
|
26
|
+
const candidate = join(dir, 'templates');
|
|
27
|
+
if (existsSync(candidate))
|
|
28
|
+
return candidate;
|
|
29
|
+
const parent = dirname(dir);
|
|
30
|
+
if (parent === dir)
|
|
31
|
+
break;
|
|
32
|
+
dir = parent;
|
|
43
33
|
}
|
|
44
34
|
return null;
|
|
45
35
|
}
|
|
@@ -115,6 +105,7 @@ body:
|
|
|
115
105
|
function configTemplate(repo) {
|
|
116
106
|
return `# Alpha Loop configuration
|
|
117
107
|
repo: ${repo}
|
|
108
|
+
project: 0 # GitHub Project number (find it in your project URL)
|
|
118
109
|
model: opus
|
|
119
110
|
review_model: opus
|
|
120
111
|
label: ready
|
|
@@ -124,6 +115,12 @@ dev_command: pnpm dev
|
|
|
124
115
|
port: 3000
|
|
125
116
|
auto_merge: true
|
|
126
117
|
|
|
118
|
+
# Coding harnesses to sync skills/agents to (run 'alpha-loop sync' after changes)
|
|
119
|
+
# See full list: https://github.com/nicepkg/playwright-cli
|
|
120
|
+
harnesses:
|
|
121
|
+
- claude-code
|
|
122
|
+
- codex
|
|
123
|
+
|
|
127
124
|
# Safety limits (0 = unlimited)
|
|
128
125
|
max_issues: 20
|
|
129
126
|
max_session_duration: 7200 # 2 hours in seconds
|
|
@@ -136,6 +133,41 @@ function copyDir(src, dest) {
|
|
|
136
133
|
mkdirSync(dest, { recursive: true });
|
|
137
134
|
exec(`cp -R "${src}/"* "${dest}/" 2>/dev/null || true`);
|
|
138
135
|
}
|
|
136
|
+
const GITIGNORE_ENTRIES = [
|
|
137
|
+
'# Alpha-loop ephemeral data (not shared)',
|
|
138
|
+
'.alpha-loop/sessions/',
|
|
139
|
+
'.alpha-loop/auth/',
|
|
140
|
+
'.worktrees/',
|
|
141
|
+
];
|
|
142
|
+
/**
|
|
143
|
+
* Ensure .gitignore tracks learnings but ignores sessions, auth, and worktrees.
|
|
144
|
+
* Also removes stale entries that previously ignored learnings.
|
|
145
|
+
*/
|
|
146
|
+
function ensureGitignore() {
|
|
147
|
+
const gitignorePath = '.gitignore';
|
|
148
|
+
let content = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';
|
|
149
|
+
let changed = false;
|
|
150
|
+
// Remove old entry that ignored learnings (they should be tracked now)
|
|
151
|
+
if (content.includes('.alpha-loop/learnings/')) {
|
|
152
|
+
content = content
|
|
153
|
+
.split('\n')
|
|
154
|
+
.filter((line) => line.trim() !== '.alpha-loop/learnings/')
|
|
155
|
+
.join('\n');
|
|
156
|
+
changed = true;
|
|
157
|
+
log.info('Removed .alpha-loop/learnings/ from .gitignore (learnings are now tracked)');
|
|
158
|
+
}
|
|
159
|
+
// Add required ignore entries
|
|
160
|
+
const missing = GITIGNORE_ENTRIES.filter((entry) => !content.includes(entry));
|
|
161
|
+
if (missing.length > 0) {
|
|
162
|
+
const suffix = (content.endsWith('\n') || content === '') ? '' : '\n';
|
|
163
|
+
content += suffix + missing.join('\n') + '\n';
|
|
164
|
+
changed = true;
|
|
165
|
+
}
|
|
166
|
+
if (changed) {
|
|
167
|
+
writeFileSync(gitignorePath, content);
|
|
168
|
+
log.success('Updated .gitignore for alpha-loop');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
139
171
|
export function initCommand() {
|
|
140
172
|
// Create config if it doesn't exist
|
|
141
173
|
if (existsSync(CONFIG_FILE)) {
|
|
@@ -154,6 +186,11 @@ export function initCommand() {
|
|
|
154
186
|
log.success(`Created ${CONFIG_FILE}`);
|
|
155
187
|
}
|
|
156
188
|
// Everything below is idempotent — safe to re-run
|
|
189
|
+
// Ensure .gitignore has the right alpha-loop entries:
|
|
190
|
+
// - Track learnings (team-shared knowledge)
|
|
191
|
+
// - Ignore sessions (local logs, screenshots, ephemeral data)
|
|
192
|
+
// - Ignore auth (browser state with credentials)
|
|
193
|
+
ensureGitignore();
|
|
157
194
|
// Install playwright-cli skills if playwright-cli is available
|
|
158
195
|
const which = exec('which playwright-cli');
|
|
159
196
|
if (which.exitCode === 0) {
|
|
@@ -232,8 +269,12 @@ export function initCommand() {
|
|
|
232
269
|
writeFileSync(templateFile, ISSUE_TEMPLATE);
|
|
233
270
|
log.success('Created GitHub issue template: .github/ISSUE_TEMPLATE/agent-ready.yml');
|
|
234
271
|
}
|
|
235
|
-
// Sync agent assets
|
|
236
|
-
const
|
|
272
|
+
// Sync agent assets to all configured harnesses (default to claude-code + codex on first init)
|
|
273
|
+
const initConfig = loadConfig();
|
|
274
|
+
const initHarnesses = initConfig.harnesses.length > 0
|
|
275
|
+
? initConfig.harnesses
|
|
276
|
+
: ['claude-code', 'codex'];
|
|
277
|
+
const syncResult = syncAgentAssets(initHarnesses);
|
|
237
278
|
if (syncResult.synced) {
|
|
238
279
|
log.success('Agent assets synced across .claude/ and .agents/');
|
|
239
280
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resume Command — pick up stranded work from a crashed or hung loop session.
|
|
3
|
+
*
|
|
4
|
+
* Finds local branches matching agent/issue-* that have commits ahead of
|
|
5
|
+
* origin/<baseBranch> but no corresponding open PR, then pushes, reviews,
|
|
6
|
+
* and opens a PR for each one. Also updates the session PR if one exists.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { loadConfig } from '../lib/config.js';
|
|
11
|
+
import { log } from '../lib/logger.js';
|
|
12
|
+
import { exec } from '../lib/shell.js';
|
|
13
|
+
import { spawnAgent } from '../lib/agent.js';
|
|
14
|
+
import { buildReviewPrompt } from '../lib/prompts.js';
|
|
15
|
+
import { labelIssue, commentIssue, createPR, updateProjectStatus, } from '../lib/github.js';
|
|
16
|
+
/**
|
|
17
|
+
* Find local branches matching agent/issue-* that have no open PR and have
|
|
18
|
+
* commits ahead of the remote base branch.
|
|
19
|
+
*/
|
|
20
|
+
function findStrandedBranches(baseBranch, filterIssue) {
|
|
21
|
+
const listResult = exec('git branch --list "agent/issue-*"');
|
|
22
|
+
if (listResult.exitCode !== 0 || !listResult.stdout.trim()) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
const branches = listResult.stdout
|
|
26
|
+
.split('\n')
|
|
27
|
+
.map((b) => b.trim().replace(/^\*\s*/, ''))
|
|
28
|
+
.filter(Boolean);
|
|
29
|
+
const stranded = [];
|
|
30
|
+
for (const branch of branches) {
|
|
31
|
+
// Parse issue number from branch name
|
|
32
|
+
const match = branch.match(/^agent\/issue-(\d+)$/);
|
|
33
|
+
if (!match)
|
|
34
|
+
continue;
|
|
35
|
+
const issueNum = parseInt(match[1], 10);
|
|
36
|
+
// Apply --issue filter if provided
|
|
37
|
+
if (filterIssue !== undefined && issueNum !== filterIssue)
|
|
38
|
+
continue;
|
|
39
|
+
// Check if there are commits ahead of the base branch
|
|
40
|
+
const aheadResult = exec(`git log "origin/${baseBranch}..${branch}" --oneline`);
|
|
41
|
+
if (aheadResult.exitCode !== 0 || !aheadResult.stdout.trim()) {
|
|
42
|
+
// No commits ahead — not stranded
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const commits = aheadResult.stdout
|
|
46
|
+
.split('\n')
|
|
47
|
+
.map((l) => l.trim())
|
|
48
|
+
.filter(Boolean);
|
|
49
|
+
// Get files changed relative to base branch
|
|
50
|
+
const filesResult = exec(`git diff --name-only "origin/${baseBranch}...${branch}"`);
|
|
51
|
+
const filesChanged = filesResult.exitCode === 0
|
|
52
|
+
? filesResult.stdout.split('\n').map((l) => l.trim()).filter(Boolean)
|
|
53
|
+
: [];
|
|
54
|
+
stranded.push({ branch, issueNum, commits, filesChanged });
|
|
55
|
+
}
|
|
56
|
+
return stranded;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Return true if an open PR already exists for the given branch.
|
|
60
|
+
*/
|
|
61
|
+
function prExists(repo, branch) {
|
|
62
|
+
const result = exec(`gh pr list --repo "${repo}" --head "${branch}" --state open --json number --limit 1`);
|
|
63
|
+
if (result.exitCode !== 0)
|
|
64
|
+
return false;
|
|
65
|
+
try {
|
|
66
|
+
const prs = JSON.parse(result.stdout);
|
|
67
|
+
return prs.length > 0;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Fetch the issue title from GitHub.
|
|
75
|
+
*/
|
|
76
|
+
function getIssueTitle(repo, issueNum) {
|
|
77
|
+
const result = exec(`gh issue view ${issueNum} --repo "${repo}" --json title`);
|
|
78
|
+
if (result.exitCode !== 0)
|
|
79
|
+
return `Issue #${issueNum}`;
|
|
80
|
+
try {
|
|
81
|
+
const data = JSON.parse(result.stdout);
|
|
82
|
+
return data.title;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return `Issue #${issueNum}`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the diff between the base branch and the given branch.
|
|
90
|
+
*/
|
|
91
|
+
function getBranchDiff(baseBranch, branch) {
|
|
92
|
+
const result = exec(`git diff "origin/${baseBranch}...${branch}"`);
|
|
93
|
+
if (result.exitCode !== 0)
|
|
94
|
+
return '';
|
|
95
|
+
// Cap at 50k chars to avoid bloating the review prompt
|
|
96
|
+
const MAX = 50_000;
|
|
97
|
+
if (result.stdout.length > MAX) {
|
|
98
|
+
return result.stdout.slice(0, MAX) + '\n... (diff truncated)';
|
|
99
|
+
}
|
|
100
|
+
return result.stdout;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Print what was found for a stranded branch.
|
|
104
|
+
*/
|
|
105
|
+
function printStrandedSummary(item) {
|
|
106
|
+
log.step(`Found stranded branch: ${item.branch}`);
|
|
107
|
+
log.info(` Issue: #${item.issueNum}`);
|
|
108
|
+
log.info(` Commits: ${item.commits.length}`);
|
|
109
|
+
for (const commit of item.commits) {
|
|
110
|
+
log.info(` ${commit}`);
|
|
111
|
+
}
|
|
112
|
+
log.info(` Files changed: ${item.filesChanged.length}`);
|
|
113
|
+
for (const file of item.filesChanged.slice(0, 10)) {
|
|
114
|
+
log.info(` ${file}`);
|
|
115
|
+
}
|
|
116
|
+
if (item.filesChanged.length > 10) {
|
|
117
|
+
log.info(` ... and ${item.filesChanged.length - 10} more`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resume a single stranded branch — push, review, open PR, update labels.
|
|
122
|
+
*/
|
|
123
|
+
async function resumeBranch(item, config) {
|
|
124
|
+
const { branch, issueNum } = item;
|
|
125
|
+
const repo = config.repo;
|
|
126
|
+
const baseBranch = config.baseBranch;
|
|
127
|
+
const title = getIssueTitle(repo, issueNum);
|
|
128
|
+
log.step(`Resuming issue #${issueNum}: ${title}`);
|
|
129
|
+
// Push the branch so createPR can work with it.
|
|
130
|
+
// createPR also pushes internally, but we do it first here for explicit
|
|
131
|
+
// feedback and to fail fast if the push is going to be a problem.
|
|
132
|
+
log.info(`Pushing ${branch} to origin...`);
|
|
133
|
+
const pushResult = exec(`git push -u origin "${branch}"`);
|
|
134
|
+
if (pushResult.exitCode !== 0) {
|
|
135
|
+
log.warn(`Push failed: ${pushResult.stderr}. Attempting force push...`);
|
|
136
|
+
const forceResult = exec(`git push -u origin "${branch}" --force`);
|
|
137
|
+
if (forceResult.exitCode !== 0) {
|
|
138
|
+
log.error(`Could not push ${branch}: ${forceResult.stderr}`);
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Run code review
|
|
143
|
+
let reviewOutput = '';
|
|
144
|
+
if (!config.skipReview) {
|
|
145
|
+
log.step(`Running code review for #${issueNum}...`);
|
|
146
|
+
const diff = getBranchDiff(baseBranch, branch);
|
|
147
|
+
// buildReviewPrompt expects body and baseBranch; we pass the diff as body
|
|
148
|
+
// context so the reviewer can see the changes inline.
|
|
149
|
+
const reviewPrompt = buildReviewPrompt({
|
|
150
|
+
issueNum,
|
|
151
|
+
title,
|
|
152
|
+
body: diff ? `## Diff\n\`\`\`diff\n${diff}\n\`\`\`` : '(no diff available)',
|
|
153
|
+
baseBranch,
|
|
154
|
+
});
|
|
155
|
+
// Determine the cwd for the review — use the repo root (git toplevel).
|
|
156
|
+
const toplevelResult = exec('git rev-parse --show-toplevel');
|
|
157
|
+
const cwd = toplevelResult.exitCode === 0 ? toplevelResult.stdout : process.cwd();
|
|
158
|
+
// Switch to the branch so the agent can run git commands against it.
|
|
159
|
+
exec(`git checkout "${branch}"`);
|
|
160
|
+
const reviewResult = await spawnAgent({
|
|
161
|
+
agent: 'claude',
|
|
162
|
+
model: config.reviewModel,
|
|
163
|
+
prompt: reviewPrompt,
|
|
164
|
+
cwd,
|
|
165
|
+
verbose: config.verbose,
|
|
166
|
+
timeout: 10 * 60 * 1000, // 10 minutes for a review
|
|
167
|
+
maxTurns: 20,
|
|
168
|
+
});
|
|
169
|
+
reviewOutput = reviewResult.output;
|
|
170
|
+
if (reviewResult.exitCode !== 0) {
|
|
171
|
+
log.warn(`Review agent exited with code ${reviewResult.exitCode}`);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
log.success(`Review complete for #${issueNum}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Build PR body
|
|
178
|
+
const prBody = reviewOutput
|
|
179
|
+
? `## Code Review\n\n${reviewOutput}`
|
|
180
|
+
: `Resumes stranded work for issue #${issueNum}.`;
|
|
181
|
+
// Create PR (createPR handles push internally as well; that is idempotent)
|
|
182
|
+
log.step(`Creating PR for #${issueNum}...`);
|
|
183
|
+
let prUrl;
|
|
184
|
+
try {
|
|
185
|
+
prUrl = createPR({
|
|
186
|
+
repo,
|
|
187
|
+
base: baseBranch,
|
|
188
|
+
head: branch,
|
|
189
|
+
title: `feat: ${title} (closes #${issueNum})`,
|
|
190
|
+
body: prBody,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
log.error(`Failed to create PR for #${issueNum}: ${String(err)}`);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
log.success(`PR created: ${prUrl}`);
|
|
198
|
+
// Update issue labels: add in-review, remove in-progress
|
|
199
|
+
labelIssue(repo, issueNum, 'in-review', 'in-progress');
|
|
200
|
+
// Update project board status to Done
|
|
201
|
+
if (config.project && config.project > 0) {
|
|
202
|
+
updateProjectStatus(repo, config.project, config.repoOwner, issueNum, 'Done');
|
|
203
|
+
}
|
|
204
|
+
// Comment on the issue with the PR link
|
|
205
|
+
commentIssue(repo, issueNum, `Resumed by alpha-loop. PR ready for review: ${prUrl}`);
|
|
206
|
+
return { issueNum, prUrl, title };
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Find the session directory that an issue belongs to.
|
|
210
|
+
* Checks for result files first, then falls back to log files, then most recent session.
|
|
211
|
+
*/
|
|
212
|
+
function findSessionForIssue(issueNum) {
|
|
213
|
+
const sessionsRoot = join(process.cwd(), '.alpha-loop', 'sessions');
|
|
214
|
+
if (!existsSync(sessionsRoot))
|
|
215
|
+
return null;
|
|
216
|
+
// Walk all session directories, sorted newest first
|
|
217
|
+
const sessionDirs = [];
|
|
218
|
+
for (const a of readdirSync(sessionsRoot)) {
|
|
219
|
+
const aDir = join(sessionsRoot, a);
|
|
220
|
+
try {
|
|
221
|
+
for (const b of readdirSync(aDir)) {
|
|
222
|
+
sessionDirs.push({ dir: join(aDir, b), name: `${a}/${b}` });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch { /* not a directory */ }
|
|
226
|
+
}
|
|
227
|
+
sessionDirs.sort((a, b) => b.name.localeCompare(a.name));
|
|
228
|
+
// First: look for a session with logs for this issue (the crashed session)
|
|
229
|
+
for (const s of sessionDirs) {
|
|
230
|
+
const logsDir = join(s.dir, 'logs');
|
|
231
|
+
if (existsSync(logsDir)) {
|
|
232
|
+
const hasLogs = readdirSync(logsDir).some((f) => f.startsWith(`issue-${issueNum}`));
|
|
233
|
+
if (hasLogs)
|
|
234
|
+
return { sessionDir: s.dir, sessionName: s.name };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Fallback: most recent session
|
|
238
|
+
if (sessionDirs.length > 0)
|
|
239
|
+
return { sessionDir: sessionDirs[0].dir, sessionName: sessionDirs[0].name };
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Save a result file to the session directory and update the session PR.
|
|
244
|
+
*/
|
|
245
|
+
function saveResumedResult(sessionDir, result) {
|
|
246
|
+
const filePath = join(sessionDir, `result-${result.issueNum}.json`);
|
|
247
|
+
writeFileSync(filePath, JSON.stringify(result, null, 2) + '\n');
|
|
248
|
+
log.info(`Session result saved: ${filePath}`);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Find and update the session PR with current results.
|
|
252
|
+
*/
|
|
253
|
+
function updateSessionPR(repo, sessionName, sessionDir, baseBranch) {
|
|
254
|
+
// Find the session branch
|
|
255
|
+
const sessionBranch = sessionName;
|
|
256
|
+
// Find the PR for this session branch
|
|
257
|
+
const prResult = exec(`gh pr list --repo "${repo}" --head "${sessionBranch}" --state open --json number,url --limit 1`);
|
|
258
|
+
if (prResult.exitCode !== 0 || !prResult.stdout.trim()) {
|
|
259
|
+
log.info('No session PR found to update');
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
let prData;
|
|
263
|
+
try {
|
|
264
|
+
prData = JSON.parse(prResult.stdout);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (prData.length === 0)
|
|
270
|
+
return;
|
|
271
|
+
const prNumber = prData[0].number;
|
|
272
|
+
const prUrl = prData[0].url;
|
|
273
|
+
// Read all result files from the session directory
|
|
274
|
+
const resultFiles = readdirSync(sessionDir)
|
|
275
|
+
.filter((f) => f.startsWith('result-') && f.endsWith('.json'))
|
|
276
|
+
.sort();
|
|
277
|
+
const results = [];
|
|
278
|
+
for (const f of resultFiles) {
|
|
279
|
+
try {
|
|
280
|
+
const content = readFileSync(join(sessionDir, f), 'utf-8');
|
|
281
|
+
results.push(JSON.parse(content));
|
|
282
|
+
}
|
|
283
|
+
catch { /* skip invalid */ }
|
|
284
|
+
}
|
|
285
|
+
if (results.length === 0)
|
|
286
|
+
return;
|
|
287
|
+
const successCount = results.filter((r) => r.status === 'success').length;
|
|
288
|
+
const totalDuration = results.reduce((sum, r) => sum + r.duration, 0);
|
|
289
|
+
const title = `Session: ${sessionName} — ${successCount}/${results.length} succeeded`;
|
|
290
|
+
const body = `## Session Summary
|
|
291
|
+
|
|
292
|
+
**Branch:** ${sessionBranch}
|
|
293
|
+
**Issues processed:** ${results.length} (${successCount} succeeded, ${results.length - successCount} failed)
|
|
294
|
+
**Total duration:** ${Math.round(totalDuration / 60)} minutes
|
|
295
|
+
**Updated:** ${new Date().toISOString()}
|
|
296
|
+
|
|
297
|
+
### Issues
|
|
298
|
+
${results.map((r) => `- #${r.issueNum}: ${r.title} — ${r.status === 'success' ? 'SUCCESS' : 'FAILURE'}${r.prUrl ? ` ([PR](${r.prUrl}))` : ''}`).join('\n')}
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
This PR collects all changes from this session for final review before merging to ${baseBranch}.
|
|
302
|
+
|
|
303
|
+
*Automated by alpha-loop*`;
|
|
304
|
+
exec(`gh pr edit ${prNumber} --repo "${repo}" --title ${JSON.stringify(title)}`);
|
|
305
|
+
// Use --body-file to avoid escaping issues
|
|
306
|
+
const { tmpdir } = require('node:os');
|
|
307
|
+
const bodyFile = join(tmpdir(), `alpha-loop-session-pr-${Date.now()}`);
|
|
308
|
+
writeFileSync(bodyFile, body, 'utf-8');
|
|
309
|
+
exec(`gh pr edit ${prNumber} --repo "${repo}" --body-file "${bodyFile}"`);
|
|
310
|
+
try {
|
|
311
|
+
require('node:fs').unlinkSync(bodyFile);
|
|
312
|
+
}
|
|
313
|
+
catch { /* cleanup */ }
|
|
314
|
+
log.success(`Session PR updated: ${prUrl}`);
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Main entry point for `alpha-loop resume`.
|
|
318
|
+
*/
|
|
319
|
+
export async function resumeCommand(options) {
|
|
320
|
+
const config = loadConfig();
|
|
321
|
+
if (!config.repo) {
|
|
322
|
+
log.error('No repo configured. Set `repo` in .alpha-loop.yaml or the REPO env var.');
|
|
323
|
+
process.exit(1);
|
|
324
|
+
}
|
|
325
|
+
const filterIssue = options.issue ? parseInt(options.issue, 10) : undefined;
|
|
326
|
+
if (options.issue && isNaN(filterIssue)) {
|
|
327
|
+
log.error(`Invalid issue number: ${options.issue}`);
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
log.step('Scanning for stranded branches...');
|
|
331
|
+
// Find local branches with unpushed/unreviewed work
|
|
332
|
+
const stranded = findStrandedBranches(config.baseBranch, filterIssue);
|
|
333
|
+
// Filter out branches that already have an open PR
|
|
334
|
+
const withoutPR = stranded.filter((item) => !prExists(config.repo, item.branch));
|
|
335
|
+
if (withoutPR.length === 0) {
|
|
336
|
+
if (stranded.length > 0) {
|
|
337
|
+
log.info('All stranded branches already have open PRs — nothing to resume.');
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
log.info('No stranded branches found — nothing to resume.');
|
|
341
|
+
}
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
log.info(`Found ${withoutPR.length} stranded branch(es) without a PR:`);
|
|
345
|
+
for (const item of withoutPR) {
|
|
346
|
+
printStrandedSummary(item);
|
|
347
|
+
}
|
|
348
|
+
// Process each stranded branch
|
|
349
|
+
const results = [];
|
|
350
|
+
const failed = [];
|
|
351
|
+
for (const item of withoutPR) {
|
|
352
|
+
const result = await resumeBranch(item, config);
|
|
353
|
+
if (result) {
|
|
354
|
+
results.push(result);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
failed.push(item.issueNum);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Save results to session and update session PR
|
|
361
|
+
for (const r of results) {
|
|
362
|
+
const session = findSessionForIssue(r.issueNum);
|
|
363
|
+
if (session) {
|
|
364
|
+
const pipelineResult = {
|
|
365
|
+
issueNum: r.issueNum,
|
|
366
|
+
title: r.title,
|
|
367
|
+
status: 'success',
|
|
368
|
+
prUrl: r.prUrl,
|
|
369
|
+
testsPassing: true,
|
|
370
|
+
verifyPassing: false, // verification was skipped/crashed
|
|
371
|
+
duration: 0,
|
|
372
|
+
filesChanged: 0,
|
|
373
|
+
};
|
|
374
|
+
saveResumedResult(session.sessionDir, pipelineResult);
|
|
375
|
+
updateSessionPR(config.repo, session.sessionName, session.sessionDir, config.baseBranch);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Print summary
|
|
379
|
+
console.error('');
|
|
380
|
+
log.step('Resume summary');
|
|
381
|
+
if (results.length > 0) {
|
|
382
|
+
log.success(`Resumed ${results.length} issue(s):`);
|
|
383
|
+
for (const r of results) {
|
|
384
|
+
log.info(` #${r.issueNum} -> ${r.prUrl}`);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (failed.length > 0) {
|
|
388
|
+
log.warn(`Failed to resume ${failed.length} issue(s): ${failed.map((n) => `#${n}`).join(', ')}`);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACL,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAe1B;;;GAGG;AACH,SAAS,oBAAoB,CAAC,UAAkB,EAAE,WAAoB;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM;SAC/B,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SAC1C,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,sCAAsC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAExC,mCAAmC;QACnC,IAAI,WAAW,KAAK,SAAS,IAAI,QAAQ,KAAK,WAAW;YAAE,SAAS;QAEpE,sDAAsD;QACtD,MAAM,WAAW,GAAG,IAAI,CACtB,mBAAmB,UAAU,KAAK,MAAM,aAAa,CACtD,CAAC;QACF,IAAI,WAAW,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7D,kCAAkC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM;aAC/B,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnB,4CAA4C;QAC5C,MAAM,WAAW,GAAG,IAAI,CACtB,gCAAgC,UAAU,MAAM,MAAM,GAAG,CAC1D,CAAC;QACF,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,KAAK,CAAC;YAC7C,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACrE,CAAC,CAAC,EAAE,CAAC;QAEP,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAY,EAAE,MAAc;IAC5C,MAAM,MAAM,GAAG,IAAI,CACjB,sBAAsB,IAAI,aAAa,MAAM,wCAAwC,CACtF,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAA8B,CAAC;QACnE,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY,EAAE,QAAgB;IACnD,MAAM,MAAM,GAAG,IAAI,CACjB,iBAAiB,QAAQ,YAAY,IAAI,gBAAgB,CAC1D,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,UAAU,QAAQ,EAAE,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAsB,CAAC;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,QAAQ,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,UAAkB,EAAE,MAAc;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,UAAU,MAAM,MAAM,GAAG,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,uDAAuD;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,wBAAwB,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAoB;IAChD,GAAG,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,IAAoB,EACpB,MAAqC;IAErC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAErC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,GAAG,CAAC,IAAI,CAAC,mBAAmB,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;IAElD,gDAAgD;IAChD,wEAAwE;IACxE,kEAAkE;IAClE,GAAG,CAAC,IAAI,CAAC,WAAW,MAAM,eAAe,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,MAAM,GAAG,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,gBAAgB,UAAU,CAAC,MAAM,4BAA4B,CAAC,CAAC;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,MAAM,WAAW,CAAC,CAAC;QACnE,IAAI,WAAW,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,KAAK,CAAC,kBAAkB,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,4BAA4B,QAAQ,KAAK,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAE/C,0EAA0E;QAC1E,sDAAsD;QACtD,MAAM,YAAY,GAAG,iBAAiB,CAAC;YACrC,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,wBAAwB,IAAI,UAAU,CAAC,CAAC,CAAC,qBAAqB;YAC3E,UAAU;SACX,CAAC,CAAC;QAEH,uEAAuE;QACvE,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAElF,qEAAqE;QACrE,IAAI,CAAC,iBAAiB,MAAM,GAAG,CAAC,CAAC;QAEjC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC;YACpC,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,MAAM,CAAC,WAAW;YACzB,MAAM,EAAE,YAAY;YACpB,GAAG;YACH,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,0BAA0B;YACnD,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;QAEH,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;QAEnC,IAAI,YAAY,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,iCAAiC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,OAAO,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,MAAM,GAAG,YAAY;QACzB,CAAC,CAAC,qBAAqB,YAAY,EAAE;QACrC,CAAC,CAAC,oCAAoC,QAAQ,GAAG,CAAC;IAEpD,2EAA2E;IAC3E,GAAG,CAAC,IAAI,CAAC,oBAAoB,QAAQ,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,QAAQ,CAAC;YACf,IAAI;YACJ,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,SAAS,KAAK,aAAa,QAAQ,GAAG;YAC7C,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,4BAA4B,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;IAEpC,yDAAyD;IACzD,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAEvD,sCAAsC;IACtC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACzC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IAED,wCAAwC;IACxC,YAAY,CACV,IAAI,EACJ,QAAQ,EACR,+CAA+C,KAAK,EAAE,CACvD,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,oDAAoD;IACpD,MAAM,WAAW,GAAyC,EAAE,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACnC,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzD,2EAA2E;IAC3E,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC;YACpF,IAAI,OAAO;gBAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAExG,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,UAAkB,EAClB,MAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,MAAM,CAAC,QAAQ,OAAO,CAAC,CAAC;IACpE,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,IAAY,EACZ,WAAmB,EACnB,UAAkB,EAClB,UAAkB;IAElB,0BAA0B;IAC1B,MAAM,aAAa,GAAG,WAAW,CAAC;IAElC,sCAAsC;IACtC,MAAM,QAAQ,GAAG,IAAI,CACnB,sBAAsB,IAAI,aAAa,aAAa,4CAA4C,CACjG,CAAC;IACF,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,IAAI,MAA8C,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEhC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAE5B,mDAAmD;IACnD,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC7D,IAAI,EAAE,CAAC;IAEV,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEtE,MAAM,KAAK,GAAG,YAAY,WAAW,MAAM,YAAY,IAAI,OAAO,CAAC,MAAM,YAAY,CAAC;IACtF,MAAM,IAAI,GAAG;;cAED,aAAa;wBACH,OAAO,CAAC,MAAM,KAAK,YAAY,eAAe,OAAO,CAAC,MAAM,GAAG,YAAY;sBAC7E,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC;eACrC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;EAGrC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;oFAGtE,UAAU;;0BAEpE,CAAC;IAEzB,IAAI,CAAC,cAAc,QAAQ,YAAY,IAAI,aAAa,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEjF,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAA6B,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvE,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,cAAc,QAAQ,YAAY,IAAI,kBAAkB,QAAQ,GAAG,CAAC,CAAC;IAC1E,IAAI,CAAC;QAAC,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;IAExE,GAAG,CAAC,OAAO,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,GAAG,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5E,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,WAAY,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAE9C,oDAAoD;IACpD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAEtE,mDAAmD;IACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,oCAAoC,CAAC,CAAC;IACxE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAA8D,EAAE,CAAC;IAC9E,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,cAAc,GAAmB;gBACrC,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,YAAY,EAAE,IAAI;gBAClB,aAAa,EAAE,KAAK,EAAE,mCAAmC;gBACzD,QAAQ,EAAE,CAAC;gBACX,YAAY,EAAE,CAAC;aAChB,CAAC;YACF,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACtD,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE3B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,OAAO,CAAC,WAAW,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;AACH,CAAC"}
|