devharness 0.9.3 → 0.9.5
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/build/block-events.d.ts +42 -0
- package/build/block-events.d.ts.map +1 -0
- package/build/block-events.js +67 -0
- package/build/block-events.js.map +1 -0
- package/build/block-events.test.d.ts +2 -0
- package/build/block-events.test.d.ts.map +1 -0
- package/build/block-events.test.js +131 -0
- package/build/block-events.test.js.map +1 -0
- package/build/command-recorder.d.ts +2 -0
- package/build/command-recorder.d.ts.map +1 -1
- package/build/command-recorder.js +4 -0
- package/build/command-recorder.js.map +1 -1
- package/build/config.d.ts +9 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +10 -0
- package/build/config.js.map +1 -1
- package/build/dashboard/dashboard-hub.js +2 -2
- package/build/dashboard/dashboard-hub.js.map +1 -1
- package/build/github/gh-cli.d.ts +41 -0
- package/build/github/gh-cli.d.ts.map +1 -0
- package/build/github/gh-cli.js +147 -0
- package/build/github/gh-cli.js.map +1 -0
- package/build/github/gh-cli.test.d.ts +2 -0
- package/build/github/gh-cli.test.d.ts.map +1 -0
- package/build/github/gh-cli.test.js +145 -0
- package/build/github/gh-cli.test.js.map +1 -0
- package/build/github/gh-issues.d.ts +105 -0
- package/build/github/gh-issues.d.ts.map +1 -0
- package/build/github/gh-issues.js +199 -0
- package/build/github/gh-issues.js.map +1 -0
- package/build/github/gh-issues.test.d.ts +2 -0
- package/build/github/gh-issues.test.d.ts.map +1 -0
- package/build/github/gh-issues.test.js +118 -0
- package/build/github/gh-issues.test.js.map +1 -0
- package/build/github/issue-actions.d.ts +34 -0
- package/build/github/issue-actions.d.ts.map +1 -0
- package/build/github/issue-actions.js +530 -0
- package/build/github/issue-actions.js.map +1 -0
- package/build/github/issue-actions.test.d.ts +2 -0
- package/build/github/issue-actions.test.d.ts.map +1 -0
- package/build/github/issue-actions.test.js +555 -0
- package/build/github/issue-actions.test.js.map +1 -0
- package/build/github/issue-body.d.ts +179 -0
- package/build/github/issue-body.d.ts.map +1 -0
- package/build/github/issue-body.js +181 -0
- package/build/github/issue-body.js.map +1 -0
- package/build/github/issue-body.test.d.ts +2 -0
- package/build/github/issue-body.test.d.ts.map +1 -0
- package/build/github/issue-body.test.js +157 -0
- package/build/github/issue-body.test.js.map +1 -0
- package/build/helpers/paths.d.ts +7 -0
- package/build/helpers/paths.d.ts.map +1 -1
- package/build/helpers/paths.js +10 -1
- package/build/helpers/paths.js.map +1 -1
- package/build/index.js +37 -3
- package/build/index.js.map +1 -1
- package/build/issue-tracker.d.ts +30 -0
- package/build/issue-tracker.d.ts.map +1 -1
- package/build/issue-tracker.js +91 -1
- package/build/issue-tracker.js.map +1 -1
- package/build/issue-tracker.test.js +76 -1
- package/build/issue-tracker.test.js.map +1 -1
- package/build/server-block-cleanup.test.d.ts +2 -0
- package/build/server-block-cleanup.test.d.ts.map +1 -0
- package/build/server-block-cleanup.test.js +143 -0
- package/build/server-block-cleanup.test.js.map +1 -0
- package/build/server-manager.d.ts +8 -0
- package/build/server-manager.d.ts.map +1 -1
- package/build/server-manager.js +49 -0
- package/build/server-manager.js.map +1 -1
- package/build/startup-gate.d.ts +29 -0
- package/build/startup-gate.d.ts.map +1 -0
- package/build/startup-gate.js +49 -0
- package/build/startup-gate.js.map +1 -0
- package/build/startup-gate.test.d.ts +2 -0
- package/build/startup-gate.test.d.ts.map +1 -0
- package/build/startup-gate.test.js +73 -0
- package/build/startup-gate.test.js.map +1 -0
- package/build/tool-response.d.ts +29 -0
- package/build/tool-response.d.ts.map +1 -1
- package/build/tool-response.js +46 -1
- package/build/tool-response.js.map +1 -1
- package/build/tools/assert-tools.d.ts +3 -3
- package/build/tools/breakpoint-tools.d.ts +3 -3
- package/build/tools/config-tools.d.ts +3 -3
- package/build/tools/console-tools.d.ts +9 -9
- package/build/tools/content-tools.d.ts +3 -3
- package/build/tools/input-tools.d.ts +9 -9
- package/build/tools/issues-tools.d.ts +32 -8
- package/build/tools/issues-tools.d.ts.map +1 -1
- package/build/tools/issues-tools.js +55 -5
- package/build/tools/issues-tools.js.map +1 -1
- package/build/tools/page-tools.d.ts +3 -3
- package/build/tools/replay-sequence-reload.test.js +23 -7
- package/build/tools/replay-sequence-reload.test.js.map +1 -1
- package/build/tools/replay-tools.d.ts +9 -9
- package/build/tools/request-tools.d.ts +3 -3
- package/build/tools/server-tools.d.ts +9 -9
- package/build/tools/storage-tools.d.ts +3 -3
- package/build/tools/wait-tools.d.ts +6 -6
- package/docs/instructions.md +26 -1
- package/docs/messages.md +264 -0
- package/package.json +1 -1
- package/plugin/skills/devharness/SKILL.md +18 -1
- package/plugin/skills/devharness/references/tool-categories.md +8 -1
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The GitHub actions on the `issues` tool.
|
|
3
|
+
*
|
|
4
|
+
* Only `publish` and `sync` touch the network; `link` never does. Everything
|
|
5
|
+
* here is written so that failing offline costs nothing: reads happen first,
|
|
6
|
+
* local writes second, upstream writes last, and any gh failure aborts before
|
|
7
|
+
* the first local mutation.
|
|
8
|
+
*/
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { promises as fsp } from 'fs';
|
|
11
|
+
import { createSuccessResponse, createErrorResponse } from '../messages.js';
|
|
12
|
+
import { GhError, ghDetail } from './gh-cli.js';
|
|
13
|
+
import { ghRepoName, ghExistingLabels, ghCreateLabel, ghCreateIssue, ghViewIssue, ghListIssues, ghEditBody, ghAddComment, ghCloseIssue, ghCurrentUser, markComment, commentGithubId, stripLocalMarker, bodyHash, classifySync, resolveStatus, unionLabels, closedReasonFrom, } from './gh-issues.js';
|
|
14
|
+
import { emitSequenceBlock, stripSequenceBlocks, findSequenceBlock, parseRemoteSequence, auditSequence, } from './issue-body.js';
|
|
15
|
+
import { getIssue, getIssues, addIssue, addIssueComment, updateIssueFields, findIssueByGithub, updateIssueCommentText, getIssueSequencesDir, generateSequenceFilename, updateIssueSequenceFile, completedStatusFor, } from '../issue-tracker.js';
|
|
16
|
+
import { getProjectDir } from '../helpers/paths.js';
|
|
17
|
+
/** GitHub's hard cap is 65536; leave room for the marker and fence. */
|
|
18
|
+
const MAX_BODY_CHARS = 65_000;
|
|
19
|
+
/** Every handler funnels gh failures through here, so one taxonomy covers all. */
|
|
20
|
+
export function ghErrorResponse(err) {
|
|
21
|
+
if (!(err instanceof GhError))
|
|
22
|
+
throw err;
|
|
23
|
+
switch (err.code) {
|
|
24
|
+
case 'GH_NOT_INSTALLED':
|
|
25
|
+
return createErrorResponse('ISSUES_GH_NOT_INSTALLED');
|
|
26
|
+
case 'GH_NOT_AUTHENTICATED':
|
|
27
|
+
return createErrorResponse('ISSUES_GH_NOT_AUTHENTICATED');
|
|
28
|
+
case 'GH_NO_REPO':
|
|
29
|
+
return createErrorResponse('ISSUES_GH_NO_REPO', { cwd: getProjectDir() });
|
|
30
|
+
case 'GH_TIMEOUT':
|
|
31
|
+
return createErrorResponse('ISSUES_GH_TIMEOUT', {
|
|
32
|
+
command: err.args.slice(0, 2).join(' '),
|
|
33
|
+
timeoutSeconds: 20,
|
|
34
|
+
});
|
|
35
|
+
default:
|
|
36
|
+
return createErrorResponse('ISSUES_GH_FAILED', {
|
|
37
|
+
command: err.args.slice(0, 2).join(' '),
|
|
38
|
+
detail: ghDetail(err),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function readSequence(issue) {
|
|
43
|
+
if (!issue.sequenceFile)
|
|
44
|
+
return null;
|
|
45
|
+
try {
|
|
46
|
+
const raw = await fsp.readFile(join(getIssueSequencesDir(), issue.sequenceFile), 'utf-8');
|
|
47
|
+
return JSON.parse(raw);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** The local body as it is compared, hashed, and pushed: sequence blocks and
|
|
54
|
+
* the upstream-only marker removed. */
|
|
55
|
+
function localProse(issue) {
|
|
56
|
+
return stripLocalMarker(stripSequenceBlocks(issue.body)).trim();
|
|
57
|
+
}
|
|
58
|
+
/** Same normalisation for a body that came down from GitHub. */
|
|
59
|
+
function remoteProse(body) {
|
|
60
|
+
return stripLocalMarker(stripSequenceBlocks(body)).trim();
|
|
61
|
+
}
|
|
62
|
+
/** The body as it goes to GitHub: local prose, then the sequence, then a
|
|
63
|
+
* marker that identifies the issue if the local stamp is ever lost. */
|
|
64
|
+
function buildPublishBody(issue, sequence) {
|
|
65
|
+
const parts = [localProse(issue)];
|
|
66
|
+
if (sequence)
|
|
67
|
+
parts.push(emitSequenceBlock(sequence));
|
|
68
|
+
parts.push(`<!-- devharness: local #${issue.id} -->`);
|
|
69
|
+
return parts.filter(Boolean).join('\n\n');
|
|
70
|
+
}
|
|
71
|
+
/** Fold remote comments into the local timeline without duplicating. A local
|
|
72
|
+
* comment stamped with a gh id claims that id; an unstamped local comment
|
|
73
|
+
* with identical text claims the first unclaimed remote comment that matches
|
|
74
|
+
* (it was pushed before its id could be recorded) and is stamped now.
|
|
75
|
+
* Whatever remains is genuinely new and is appended. */
|
|
76
|
+
async function reconcileComments(issueId, remoteComments) {
|
|
77
|
+
const issue = (await getIssue(issueId));
|
|
78
|
+
const seen = new Set(issue.comments.map(c => commentGithubId(c.text)).filter((v) => v !== null));
|
|
79
|
+
let added = 0, stamped = 0;
|
|
80
|
+
for (const remote of remoteComments) {
|
|
81
|
+
if (!remote.id || seen.has(remote.id))
|
|
82
|
+
continue;
|
|
83
|
+
seen.add(remote.id);
|
|
84
|
+
const match = issue.comments.find(c => commentGithubId(c.text) === null && c.text.trim() === remote.body.trim());
|
|
85
|
+
if (match) {
|
|
86
|
+
match.text = markComment(remote.id, match.text);
|
|
87
|
+
await updateIssueCommentText(issueId, match.timestamp, match.text);
|
|
88
|
+
stamped++;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
await addIssueComment(issueId, markComment(remote.id, remote.body));
|
|
92
|
+
added++;
|
|
93
|
+
}
|
|
94
|
+
return { added, stamped };
|
|
95
|
+
}
|
|
96
|
+
// =============================================================================
|
|
97
|
+
// publish
|
|
98
|
+
// =============================================================================
|
|
99
|
+
export async function handlePublish(args, deps = {}) {
|
|
100
|
+
if (args.id === undefined)
|
|
101
|
+
return createErrorResponse('MISSING_PARAMETER', { parameter: 'id', action: 'publish' });
|
|
102
|
+
const issue = await getIssue(args.id);
|
|
103
|
+
if (!issue)
|
|
104
|
+
return createErrorResponse('ISSUES_NOT_FOUND', { id: args.id, message: 'Nothing to publish.' });
|
|
105
|
+
if (issue.github !== undefined) {
|
|
106
|
+
return createErrorResponse('ISSUES_PUBLISH_ALREADY_LINKED', {
|
|
107
|
+
type: issue.type, id: issue.id, number: issue.github, repo: issue.githubRepo ?? 'GitHub',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const repo = await ghRepoName(args.repo, deps.runOpts);
|
|
112
|
+
const sequence = await readSequence(issue);
|
|
113
|
+
const body = buildPublishBody(issue, sequence);
|
|
114
|
+
if (body.length > MAX_BODY_CHARS) {
|
|
115
|
+
const sequenceLength = sequence ? emitSequenceBlock(sequence).length : 0;
|
|
116
|
+
return createErrorResponse('ISSUES_PUBLISH_TOO_LARGE', {
|
|
117
|
+
bodyLength: body.length, limit: MAX_BODY_CHARS, sequenceLength: sequenceLength || undefined,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const existing = await ghExistingLabels(args.repo, deps.runOpts);
|
|
121
|
+
const missing = issue.labels.filter(l => !existing.has(l));
|
|
122
|
+
if (!args.confirm) {
|
|
123
|
+
const response = createSuccessResponse('ISSUES_PUBLISH_DRAFT', {
|
|
124
|
+
type: issue.type, id: issue.id, repo, title: issue.title,
|
|
125
|
+
labels: issue.labels.length > 0 ? issue.labels.join(', ') : '(none)',
|
|
126
|
+
labelsToCreate: missing.length > 0 ? missing.join(', ') : undefined,
|
|
127
|
+
draftBody: body,
|
|
128
|
+
});
|
|
129
|
+
response._meta = {
|
|
130
|
+
tool: 'issues', action: 'publish', timestamp: Date.now(),
|
|
131
|
+
github: { action: 'publish', repo, posted: false },
|
|
132
|
+
};
|
|
133
|
+
return response;
|
|
134
|
+
}
|
|
135
|
+
for (const label of missing)
|
|
136
|
+
await ghCreateLabel(label, args.repo, deps.runOpts);
|
|
137
|
+
const created = await ghCreateIssue({ title: issue.title, body, labels: issue.labels, repo: args.repo }, deps.runOpts);
|
|
138
|
+
if (created.number === null) {
|
|
139
|
+
return createErrorResponse('ISSUES_PUBLISH_STAMP_FAILED', {
|
|
140
|
+
type: issue.type, id: issue.id, url: created.url, number: '<see the URL>',
|
|
141
|
+
reason: 'gh did not print a parseable issue number',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Upstream first, stamp second: a failure here is recoverable, the
|
|
145
|
+
// reverse order is not.
|
|
146
|
+
const now = new Date();
|
|
147
|
+
try {
|
|
148
|
+
await updateIssueFields(issue.id, {
|
|
149
|
+
github: created.number,
|
|
150
|
+
githubRepo: repo,
|
|
151
|
+
githubSyncedAt: now,
|
|
152
|
+
githubBodyHash: bodyHash(localProse(issue)),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
return createErrorResponse('ISSUES_PUBLISH_STAMP_FAILED', {
|
|
157
|
+
type: issue.type, id: issue.id, url: created.url, number: created.number,
|
|
158
|
+
reason: err.message,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
let commentsPushed = 0;
|
|
162
|
+
for (const comment of issue.comments) {
|
|
163
|
+
if (commentGithubId(comment.text))
|
|
164
|
+
continue;
|
|
165
|
+
await ghAddComment(created.number, comment.text, args.repo, deps.runOpts);
|
|
166
|
+
commentsPushed++;
|
|
167
|
+
}
|
|
168
|
+
if (commentsPushed > 0) {
|
|
169
|
+
// gh does not return the new comment ids; re-read the issue so the
|
|
170
|
+
// pushed comments get stamped and are never pushed twice.
|
|
171
|
+
const refreshed = await ghViewIssue(created.number, args.repo, deps.runOpts);
|
|
172
|
+
await reconcileComments(issue.id, refreshed.comments);
|
|
173
|
+
}
|
|
174
|
+
const response = createSuccessResponse('ISSUES_PUBLISHED', {
|
|
175
|
+
type: issue.type, id: issue.id, number: created.number, url: created.url, repo,
|
|
176
|
+
labelsCreated: missing.length > 0 ? missing.join(', ') : undefined,
|
|
177
|
+
commentsPushed: commentsPushed || undefined,
|
|
178
|
+
});
|
|
179
|
+
response._meta = {
|
|
180
|
+
tool: 'issues', action: 'publish', timestamp: Date.now(),
|
|
181
|
+
github: { action: 'publish', repo, number: created.number, url: created.url, posted: true },
|
|
182
|
+
};
|
|
183
|
+
return response;
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
return ghErrorResponse(err);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// =============================================================================
|
|
190
|
+
// link
|
|
191
|
+
// =============================================================================
|
|
192
|
+
export async function handleLink(args) {
|
|
193
|
+
if (args.id === undefined)
|
|
194
|
+
return createErrorResponse('MISSING_PARAMETER', { parameter: 'id', action: 'link' });
|
|
195
|
+
if (args.github === undefined)
|
|
196
|
+
return createErrorResponse('MISSING_PARAMETER', { parameter: 'github', action: 'link' });
|
|
197
|
+
const issue = await getIssue(args.id);
|
|
198
|
+
if (!issue)
|
|
199
|
+
return createErrorResponse('ISSUES_NOT_FOUND', { id: args.id, message: 'Nothing to link.' });
|
|
200
|
+
await updateIssueFields(issue.id, { github: args.github, githubRepo: args.repo ?? issue.githubRepo });
|
|
201
|
+
const response = createSuccessResponse('ISSUES_LINKED', {
|
|
202
|
+
type: issue.type, id: issue.id, number: args.github, repo: args.repo ?? issue.githubRepo ?? 'GitHub',
|
|
203
|
+
});
|
|
204
|
+
response._meta = {
|
|
205
|
+
tool: 'issues', action: 'link', timestamp: Date.now(),
|
|
206
|
+
github: { action: 'link', number: args.github, repo: args.repo ?? issue.githubRepo },
|
|
207
|
+
};
|
|
208
|
+
return response;
|
|
209
|
+
}
|
|
210
|
+
// =============================================================================
|
|
211
|
+
// import
|
|
212
|
+
// =============================================================================
|
|
213
|
+
function inferType(labels) {
|
|
214
|
+
return labels.some(l => /^(bug|defect|regression)$/i.test(l)) ? 'bug' : 'feature';
|
|
215
|
+
}
|
|
216
|
+
export async function handleImport(args, deps = {}) {
|
|
217
|
+
if (args.github === undefined)
|
|
218
|
+
return createErrorResponse('MISSING_PARAMETER', { parameter: 'github', action: 'import' });
|
|
219
|
+
try {
|
|
220
|
+
const repo = await ghRepoName(args.repo, deps.runOpts);
|
|
221
|
+
const existing = await findIssueByGithub(args.github, repo);
|
|
222
|
+
if (existing) {
|
|
223
|
+
return createSuccessResponse('ISSUES_IMPORT_EXISTS', {
|
|
224
|
+
repo, number: args.github, type: existing.type, id: existing.id, status: existing.status,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
const remote = await ghViewIssue(args.github, args.repo, deps.runOpts);
|
|
228
|
+
const type = args.type ?? inferType(remote.labels);
|
|
229
|
+
const closed = remote.state === 'CLOSED';
|
|
230
|
+
const body = remoteProse(remote.body);
|
|
231
|
+
// acknowledged, never pending: a pending bug blocks every other tool, so
|
|
232
|
+
// importing must not wedge the toolchain.
|
|
233
|
+
const created = await addIssue({
|
|
234
|
+
type,
|
|
235
|
+
title: remote.title,
|
|
236
|
+
body,
|
|
237
|
+
labels: remote.labels,
|
|
238
|
+
initialStatus: closed ? completedStatusFor(type) : 'acknowledged',
|
|
239
|
+
recordingName: 'github',
|
|
240
|
+
});
|
|
241
|
+
const now = new Date();
|
|
242
|
+
await updateIssueFields(created.id, {
|
|
243
|
+
github: remote.number,
|
|
244
|
+
githubRepo: repo,
|
|
245
|
+
githubSyncedAt: now,
|
|
246
|
+
githubBodyHash: bodyHash(body),
|
|
247
|
+
closedReason: closed ? closedReasonFrom(remote.stateReason) : undefined,
|
|
248
|
+
resolvedAt: closed ? now : undefined,
|
|
249
|
+
});
|
|
250
|
+
for (const comment of remote.comments) {
|
|
251
|
+
await addIssueComment(created.id, markComment(comment.id, comment.body));
|
|
252
|
+
}
|
|
253
|
+
const response = createSuccessResponse('ISSUES_IMPORTED', {
|
|
254
|
+
repo, number: remote.number, type, id: created.id, title: remote.title,
|
|
255
|
+
status: closed ? completedStatusFor(type) : 'acknowledged',
|
|
256
|
+
sequenceFound: findSequenceBlock(remote.body) ? true : undefined,
|
|
257
|
+
});
|
|
258
|
+
response._meta = {
|
|
259
|
+
tool: 'issues', action: 'import', timestamp: Date.now(),
|
|
260
|
+
github: { action: 'import', repo, number: remote.number, url: remote.url },
|
|
261
|
+
};
|
|
262
|
+
return response;
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
return ghErrorResponse(err);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Reconcile status, independent of whether the body moved.
|
|
270
|
+
*
|
|
271
|
+
* These are separate concerns: an issue closed locally but still open
|
|
272
|
+
* upstream needs closing whatever its body says. Folding this into the body
|
|
273
|
+
* classification loses the pending close the moment a body sync marks the
|
|
274
|
+
* issue as up to date.
|
|
275
|
+
*/
|
|
276
|
+
async function applyStatus(issue, remote, repo, now, confirm, opts) {
|
|
277
|
+
const status = resolveStatus(issue, remote, now);
|
|
278
|
+
if (status.closeUpstream) {
|
|
279
|
+
if (!confirm)
|
|
280
|
+
return { pendingConfirm: `close #${issue.github} upstream` };
|
|
281
|
+
await ghCloseIssue(issue.github, status.closeUpstream, repo, opts);
|
|
282
|
+
await updateIssueFields(issue.id, { closedReason: status.closeUpstream });
|
|
283
|
+
return { detail: 'closed upstream' };
|
|
284
|
+
}
|
|
285
|
+
if (status.status || status.closedReason !== issue.closedReason) {
|
|
286
|
+
await updateIssueFields(issue.id, {
|
|
287
|
+
status: status.status ?? issue.status,
|
|
288
|
+
closedReason: status.closedReason,
|
|
289
|
+
resolvedAt: status.reopened ? undefined : (status.resolvedAt ?? issue.resolvedAt),
|
|
290
|
+
});
|
|
291
|
+
if (status.reopened)
|
|
292
|
+
return { detail: 'reopened' };
|
|
293
|
+
if (status.status)
|
|
294
|
+
return { detail: `status ${status.status}` };
|
|
295
|
+
}
|
|
296
|
+
return {};
|
|
297
|
+
}
|
|
298
|
+
async function applyPull(issue, remote, now) {
|
|
299
|
+
const body = remoteProse(remote.body);
|
|
300
|
+
await updateIssueFields(issue.id, {
|
|
301
|
+
body,
|
|
302
|
+
title: remote.title || issue.title,
|
|
303
|
+
labels: unionLabels(issue.labels, remote.labels),
|
|
304
|
+
githubSyncedAt: now,
|
|
305
|
+
githubBodyHash: bodyHash(body),
|
|
306
|
+
});
|
|
307
|
+
const { added } = await reconcileComments(issue.id, remote.comments);
|
|
308
|
+
const bits = ['body'];
|
|
309
|
+
if (added > 0)
|
|
310
|
+
bits.push(`${added} comment(s)`);
|
|
311
|
+
return `pulled ${bits.join(', ')}`;
|
|
312
|
+
}
|
|
313
|
+
/** Push unstamped local comments up, claiming any that are already upstream
|
|
314
|
+
* first (a previous push may have posted one and died before its id was
|
|
315
|
+
* stored). Returns how many were actually posted. */
|
|
316
|
+
async function pushComments(issueId, github, repo, opts) {
|
|
317
|
+
const before = (await getIssue(issueId));
|
|
318
|
+
if (!before.comments.some(c => commentGithubId(c.text) === null))
|
|
319
|
+
return 0;
|
|
320
|
+
const remote = await ghViewIssue(github, repo, opts);
|
|
321
|
+
await reconcileComments(issueId, remote.comments);
|
|
322
|
+
let pushed = 0;
|
|
323
|
+
for (const comment of (await getIssue(issueId)).comments) {
|
|
324
|
+
if (commentGithubId(comment.text))
|
|
325
|
+
continue;
|
|
326
|
+
await ghAddComment(github, comment.text, repo, opts);
|
|
327
|
+
pushed++;
|
|
328
|
+
}
|
|
329
|
+
if (pushed > 0) {
|
|
330
|
+
// gh does not return the new comment ids; re-read the issue so the
|
|
331
|
+
// pushed comments get stamped and are never pushed twice.
|
|
332
|
+
const refreshed = await ghViewIssue(github, repo, opts);
|
|
333
|
+
await reconcileComments(issueId, refreshed.comments);
|
|
334
|
+
}
|
|
335
|
+
return pushed;
|
|
336
|
+
}
|
|
337
|
+
async function applyPush(issue, repo, now, opts) {
|
|
338
|
+
const sequence = await readSequence(issue);
|
|
339
|
+
const prose = localProse(issue);
|
|
340
|
+
await ghEditBody(issue.github, buildPublishBody(issue, sequence), repo, opts);
|
|
341
|
+
const pushed = await pushComments(issue.id, issue.github, repo, opts);
|
|
342
|
+
await updateIssueFields(issue.id, { githubSyncedAt: now, githubBodyHash: bodyHash(prose) });
|
|
343
|
+
const bits = ['body'];
|
|
344
|
+
if (pushed > 0)
|
|
345
|
+
bits.push(`${pushed} comment(s)`);
|
|
346
|
+
return `pushed ${bits.join(', ')}`;
|
|
347
|
+
}
|
|
348
|
+
export async function handleSync(args, deps = {}) {
|
|
349
|
+
try {
|
|
350
|
+
const repo = await ghRepoName(args.repo, deps.runOpts);
|
|
351
|
+
const all = await getIssues({ includeCompleted: true });
|
|
352
|
+
// Scoped to one repo: a stamped issue must match it, and a bare
|
|
353
|
+
// `github: N` stamp belongs to the repo gh infers for this project,
|
|
354
|
+
// never to an explicit override - otherwise an override sweeps every
|
|
355
|
+
// linked issue and can adopt a stranger's issue with the same number.
|
|
356
|
+
const linked = all.filter(i => i.github !== undefined
|
|
357
|
+
&& (args.id === undefined || i.id === args.id)
|
|
358
|
+
&& (i.githubRepo ? i.githubRepo === repo : args.repo === undefined));
|
|
359
|
+
if (linked.length === 0)
|
|
360
|
+
return createSuccessResponse('ISSUES_SYNC_NOTHING_LINKED');
|
|
361
|
+
const summaries = await ghListIssues(args.repo, deps.runOpts);
|
|
362
|
+
const byNumber = new Map(summaries.map(s => [s.number, s]));
|
|
363
|
+
const now = new Date();
|
|
364
|
+
const outcomes = [];
|
|
365
|
+
const conflicts = [];
|
|
366
|
+
const pendingConfirm = [];
|
|
367
|
+
for (const issue of linked) {
|
|
368
|
+
const summary = byNumber.get(issue.github);
|
|
369
|
+
const prose = localProse(issue);
|
|
370
|
+
const classification = classifySync(issue, summary, prose);
|
|
371
|
+
// An explicit --take overrides the classification for this issue only.
|
|
372
|
+
let action = classification.action;
|
|
373
|
+
if (args.take && args.id !== undefined)
|
|
374
|
+
action = args.take === 'local' ? 'push' : 'pull';
|
|
375
|
+
if (action === 'missing-upstream') {
|
|
376
|
+
outcomes.push({ id: issue.id, number: issue.github, action: 'missing upstream' });
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
if (action === 'conflict') {
|
|
380
|
+
conflicts.push({ id: issue.id, number: issue.github });
|
|
381
|
+
outcomes.push({ id: issue.id, number: issue.github, action: 'CONFLICT - both sides changed, nothing written' });
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
// Status first, and for every issue - including ones whose body is
|
|
385
|
+
// already up to date, which is where a pending close would otherwise
|
|
386
|
+
// be dropped and never retried.
|
|
387
|
+
const statusResult = await applyStatus(issue, summary, args.repo, now, args.confirm === true, deps.runOpts);
|
|
388
|
+
if (statusResult.pendingConfirm)
|
|
389
|
+
pendingConfirm.push(statusResult.pendingConfirm);
|
|
390
|
+
const details = [];
|
|
391
|
+
if (statusResult.detail)
|
|
392
|
+
details.push(statusResult.detail);
|
|
393
|
+
if (action !== 'none') {
|
|
394
|
+
const fresh = (await getIssue(issue.id));
|
|
395
|
+
if (action === 'pull') {
|
|
396
|
+
const remote = await ghViewIssue(issue.github, args.repo, deps.runOpts);
|
|
397
|
+
details.push(await applyPull(fresh, remote, now));
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
details.push(await applyPush(fresh, args.repo, now, deps.runOpts));
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Comments are timeline additions, not part of the body hash, so a new
|
|
404
|
+
// local comment must push even when the body classifies as unchanged
|
|
405
|
+
// (push already sent them; pull only claimed or imported).
|
|
406
|
+
if (action !== 'push') {
|
|
407
|
+
const pushed = await pushComments(issue.id, issue.github, args.repo, deps.runOpts);
|
|
408
|
+
if (pushed > 0)
|
|
409
|
+
details.push(`pushed ${pushed} comment(s)`);
|
|
410
|
+
}
|
|
411
|
+
outcomes.push({
|
|
412
|
+
id: issue.id, number: issue.github,
|
|
413
|
+
action: details.length > 0 ? details.join(', ') : 'up to date',
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
const response = createSuccessResponse('ISSUES_SYNC_RESULT', {
|
|
417
|
+
repo,
|
|
418
|
+
checked: linked.length,
|
|
419
|
+
results: outcomes.map(o => `- #${o.id} (${repo}#${o.number}): ${o.action}`).join('\n'),
|
|
420
|
+
conflictCount: conflicts.length || undefined,
|
|
421
|
+
pendingConfirm: pendingConfirm.length > 0 ? pendingConfirm.join(', ') : undefined,
|
|
422
|
+
});
|
|
423
|
+
response._meta = {
|
|
424
|
+
tool: 'issues', action: 'sync', timestamp: Date.now(),
|
|
425
|
+
github: {
|
|
426
|
+
action: 'sync', repo,
|
|
427
|
+
changed: outcomes.map(o => ({ id: o.id, number: o.number, action: o.action })),
|
|
428
|
+
conflicts,
|
|
429
|
+
},
|
|
430
|
+
};
|
|
431
|
+
return response;
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
return ghErrorResponse(err);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// =============================================================================
|
|
438
|
+
// pullSequence
|
|
439
|
+
// =============================================================================
|
|
440
|
+
export async function handlePullSequence(args, deps = {}) {
|
|
441
|
+
if (args.id === undefined)
|
|
442
|
+
return createErrorResponse('MISSING_PARAMETER', { parameter: 'id', action: 'pullSequence' });
|
|
443
|
+
const issue = await getIssue(args.id);
|
|
444
|
+
if (!issue)
|
|
445
|
+
return createErrorResponse('ISSUES_NOT_FOUND', { id: args.id, message: 'Nothing to pull into.' });
|
|
446
|
+
if (issue.github === undefined) {
|
|
447
|
+
return createErrorResponse('ISSUES_PUBLISH_ALREADY_LINKED', {
|
|
448
|
+
type: issue.type, id: issue.id, number: 0, repo: 'no upstream issue - link or publish it first',
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
try {
|
|
452
|
+
const remote = await ghViewIssue(issue.github, args.repo ?? issue.githubRepo, deps.runOpts);
|
|
453
|
+
const source = args.fromComment !== undefined ? `comment ${args.fromComment}` : 'the issue body';
|
|
454
|
+
const haystack = args.fromComment !== undefined
|
|
455
|
+
? remote.comments[args.fromComment - 1]?.body ?? ''
|
|
456
|
+
: remote.body;
|
|
457
|
+
const block = findSequenceBlock(haystack);
|
|
458
|
+
if (!block) {
|
|
459
|
+
const candidates = remote.comments
|
|
460
|
+
.map((c, i) => (findSequenceBlock(c.body) ? i + 1 : null))
|
|
461
|
+
.filter((v) => v !== null);
|
|
462
|
+
return createErrorResponse('ISSUES_SEQUENCE_NOT_IN_ISSUE', {
|
|
463
|
+
source, candidates: candidates.length > 0 ? candidates.join(', ') : undefined,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
const parsed = parseRemoteSequence(block.content);
|
|
467
|
+
if (!parsed.ok)
|
|
468
|
+
return createErrorResponse('ISSUES_SEQUENCE_INVALID', { source, reason: parsed.reason });
|
|
469
|
+
// A sequence written by someone else is third-party code that will drive
|
|
470
|
+
// this machine. Only the account gh is logged in as vouches for itself;
|
|
471
|
+
// anything else needs a human to read the sequence and confirm once.
|
|
472
|
+
const author = args.fromComment !== undefined
|
|
473
|
+
? remote.comments[args.fromComment - 1]?.author ?? ''
|
|
474
|
+
: remote.author;
|
|
475
|
+
if (args.confirm !== true) {
|
|
476
|
+
const viewer = await ghCurrentUser(deps.runOpts);
|
|
477
|
+
if (!author || author !== viewer) {
|
|
478
|
+
return createErrorResponse('ISSUES_SEQUENCE_FOREIGN_AUTHOR', {
|
|
479
|
+
author: author || 'an unknown account', viewer, source,
|
|
480
|
+
repo: args.repo ?? issue.githubRepo ?? 'GitHub', number: issue.github,
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
const audit = auditSequence(parsed.sequence);
|
|
485
|
+
if (audit.privileged.length > 0 && args.allowPrivilegedSteps !== true) {
|
|
486
|
+
const steps = [...parsed.sequence.commands, ...(parsed.sequence.teardown ?? [])]
|
|
487
|
+
.map((s, i) => ({ s, i }))
|
|
488
|
+
.filter(({ s }) => audit.privileged.includes(s.tool))
|
|
489
|
+
.map(({ s, i }) => `${i + 1}. ${s.tool}${s.comment ? ` - ${s.comment}` : ''}`);
|
|
490
|
+
return createErrorResponse('ISSUES_SEQUENCE_PRIVILEGED_BLOCKED', {
|
|
491
|
+
privileged: audit.privileged.join(', '), stepList: steps.join('\n'),
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
// Validate tool names before anything lands on disk. replay only checks
|
|
495
|
+
// on create/load, so a file written straight into the sequences dir
|
|
496
|
+
// would otherwise skip the backstop entirely.
|
|
497
|
+
const known = deps.knownTools?.();
|
|
498
|
+
if (known && known.length > 0) {
|
|
499
|
+
const unknown = audit.tools.filter(t => !known.includes(t) && t !== 'conditional' && t !== 'forEach');
|
|
500
|
+
if (unknown.length > 0) {
|
|
501
|
+
return createErrorResponse('ISSUES_SEQUENCE_INVALID', {
|
|
502
|
+
source, reason: `Unknown tool name(s): ${unknown.join(', ')}`,
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
// The payload's own `name` is discarded: loading a sequence evicts any
|
|
507
|
+
// same-named one already in memory, so a hostile name could delete the
|
|
508
|
+
// user's own sequence.
|
|
509
|
+
const filename = generateSequenceFilename(issue.type, issue.id, issue.title);
|
|
510
|
+
const name = filename.replace(/\.json$/, '');
|
|
511
|
+
const dir = getIssueSequencesDir();
|
|
512
|
+
await fsp.mkdir(dir, { recursive: true });
|
|
513
|
+
await fsp.writeFile(join(dir, filename), JSON.stringify({ ...parsed.sequence, name, _comment: `Pulled from ${issue.githubRepo ?? 'GitHub'}#${issue.github}` }, null, 2), 'utf-8');
|
|
514
|
+
await updateIssueSequenceFile(issue.id, filename);
|
|
515
|
+
const response = createSuccessResponse('ISSUES_SEQUENCE_PULLED', {
|
|
516
|
+
type: issue.type, id: issue.id, sequenceFile: filename, source,
|
|
517
|
+
steps: audit.steps, tools: audit.tools.join(', '),
|
|
518
|
+
privileged: audit.privileged.length > 0 ? audit.privileged.join(', ') : undefined,
|
|
519
|
+
});
|
|
520
|
+
response._meta = {
|
|
521
|
+
tool: 'issues', action: 'pullSequence', timestamp: Date.now(),
|
|
522
|
+
github: { action: 'pullSequence', number: issue.github, sequence: audit },
|
|
523
|
+
};
|
|
524
|
+
return response;
|
|
525
|
+
}
|
|
526
|
+
catch (err) {
|
|
527
|
+
return ghErrorResponse(err);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=issue-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-actions.js","sourceRoot":"","sources":["../../src/github/issue-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAqB,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EACrF,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EACrD,WAAW,EAAE,eAAe,EAAsB,gBAAgB,EAClE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,GAErE,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EACzD,mBAAmB,EAAE,aAAa,GACnC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EACpF,sBAAsB,EACtB,oBAAoB,EAAE,wBAAwB,EAAE,uBAAuB,EACpD,kBAAkB,GAEtC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,uEAAuE;AACvE,MAAM,cAAc,GAAG,MAAM,CAAC;AAkB9B,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,CAAC,CAAC,GAAG,YAAY,OAAO,CAAC;QAAE,MAAM,GAAG,CAAC;IACzC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,kBAAkB;YACrB,OAAO,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;QACxD,KAAK,sBAAsB;YACzB,OAAO,mBAAmB,CAAC,6BAA6B,CAAC,CAAC;QAC5D,KAAK,YAAY;YACf,OAAO,mBAAmB,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;QAC5E,KAAK,YAAY;YACf,OAAO,mBAAmB,CAAC,mBAAmB,EAAE;gBAC9C,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACvC,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;QACL;YACE,OAAO,mBAAmB,CAAC,kBAAkB,EAAE;gBAC7C,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACvC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC;aACtB,CAAC,CAAC;IACP,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAmB;IAC7C,IAAI,CAAC,KAAK,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;wCACwC;AACxC,SAAS,UAAU,CAAC,KAAmB;IACrC,OAAO,gBAAgB,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,gEAAgE;AAChE,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,gBAAgB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED;wEACwE;AACxE,SAAS,gBAAgB,CAAC,KAAmB,EAAE,QAAwB;IACrE,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;;;yDAIyD;AACzD,KAAK,UAAU,iBAAiB,CAC9B,OAAe,EAAE,cAAuC;IAExD,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAE,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CACxF,CAAC;IAEF,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;IAC3B,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,SAAS;QAChD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAC9E,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACnE,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QAED,MAAM,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,KAAK,EAAE,CAAC;IACV,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAsB,EAAE,OAAyB,EAAE;IACrF,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEnH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,mBAAmB,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAE5G,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,mBAAmB,CAAC,+BAA+B,EAAE;YAC1D,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ;SACzF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,OAAO,mBAAmB,CAAC,0BAA0B,EAAE;gBACrD,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,IAAI,SAAS;aAC5F,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,sBAAsB,EAAE;gBAC7D,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK;gBACxD,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ;gBACpE,cAAc,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnE,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,QAAQ,CAAC,KAAK,GAAG;gBACf,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACxD,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;aACnD,CAAC;YACF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjF,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAClF,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC5B,OAAO,mBAAmB,CAAC,6BAA6B,EAAE;gBACxD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe;gBACzE,MAAM,EAAE,2CAA2C;aACpD,CAAC,CAAC;QACL,CAAC;QAED,mEAAmE;QACnE,wBAAwB;QACxB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE;gBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,GAAG;gBACnB,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,mBAAmB,CAAC,6BAA6B,EAAE;gBACxD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM;gBACxE,MAAM,EAAG,GAAa,CAAC,OAAO;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5C,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1E,cAAc,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvB,mEAAmE;YACnE,0DAA0D;YAC1D,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7E,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,kBAAkB,EAAE;YACzD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI;YAC9E,aAAa,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAClE,cAAc,EAAE,cAAc,IAAI,SAAS;SAC5C,CAAC,CAAC;QACH,QAAQ,CAAC,KAAK,GAAG;YACf,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACxD,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;SAC5F,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAsB;IACrD,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChH,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAExH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,mBAAmB,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAEzG,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAEtG,MAAM,QAAQ,GAAG,qBAAqB,CAAC,eAAe,EAAE;QACtD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,IAAI,QAAQ;KACrG,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,GAAG;QACf,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrD,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE;KACrF,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,SAAS,SAAS,CAAC,MAAgB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAsB,EAAE,OAAyB,EAAE;IACpF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE1H,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,qBAAqB,CAAC,sBAAsB,EAAE;gBACnD,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM;aACzF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC;QACzC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEtC,yEAAyE;QACzE,0CAA0C;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;YAC7B,IAAI;YACJ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc;YACjE,aAAa,EAAE,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE;YAClC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,GAAG;YACnB,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC;YAC9B,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;YACvE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;SACrC,CAAC,CAAC;QAEH,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,iBAAiB,EAAE;YACxD,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;YACtE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc;YAC1D,aAAa,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SACjE,CAAC,CAAC;QACH,QAAQ,CAAC,KAAK,GAAG;YACf,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACvD,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;SAC3E,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAaD;;;;;;;GAOG;AACH,KAAK,UAAU,WAAW,CACxB,KAAmB,EAAE,MAAyD,EAC9E,IAAwB,EAAE,GAAS,EAAE,OAAgB,EAAE,IAAmB;IAE1E,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAEjD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,cAAc,EAAE,UAAU,KAAK,CAAC,MAAM,WAAW,EAAE,CAAC;QAC3E,MAAM,YAAY,CAAC,KAAK,CAAC,MAAO,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACpE,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC1E,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;QAChE,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE;YAChC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;YACrC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;SAClF,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACnD,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAmB,EAAE,MAAmB,EAAE,GAAS;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE;QAChC,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;QAClC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QAChD,cAAc,EAAE,GAAG;QACnB,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErE,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;IAChD,OAAO,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACrC,CAAC;AAED;;sDAEsD;AACtD,KAAK,UAAU,YAAY,CACzB,OAAe,EAAE,MAAc,EAAE,IAAwB,EAAE,IAAmB;IAE9E,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,OAAO,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAE,CAAC,QAAQ,EAAE,CAAC;QAC1D,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC;IACX,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,mEAAmE;QACnE,0DAA0D;QAC1D,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,KAAmB,EAAE,IAAwB,EAAE,GAAS,EAAE,IAAmB;IAE7E,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,UAAU,CAAC,KAAK,CAAC,MAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEvE,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE5F,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,IAAI,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC;IAClD,OAAO,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAsB,EAAE,OAAyB,EAAE;IAClF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,gEAAgE;QAChE,oEAAoE;QACpE,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC5B,CAAC,CAAC,MAAM,KAAK,SAAS;eACnB,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;eAC3C,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CACpE,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,qBAAqB,CAAC,4BAA4B,CAAC,CAAC;QAEpF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAA6B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAExF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,SAAS,GAA0C,EAAE,CAAC;QAC5D,MAAM,cAAc,GAAa,EAAE,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAE3D,uEAAuE;YACvE,IAAI,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;gBAAE,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAEzF,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YACD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC1B,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAO,EAAE,CAAC,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAO,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC,CAAC;gBACjH,SAAS;YACX,CAAC;YAED,mEAAmE;YACnE,qEAAqE;YACrE,gCAAgC;YAChC,MAAM,YAAY,GAAG,MAAM,WAAW,CACpC,KAAK,EAAE,OAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,IAAI,CAAC,OAAO,CACrE,CAAC;YACF,IAAI,YAAY,CAAC,cAAc;gBAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAElF,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,YAAY,CAAC,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE3D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAE,CAAC;gBAC1C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,MAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACzE,OAAO,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,qEAAqE;YACrE,2DAA2D;YAC3D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpF,IAAI,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,UAAU,MAAM,aAAa,CAAC,CAAC;YAC9D,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAO;gBACnC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY;aAC/D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,oBAAoB,EAAE;YAC3D,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACtF,aAAa,EAAE,SAAS,CAAC,MAAM,IAAI,SAAS;YAC5C,cAAc,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAClF,CAAC,CAAC;QACH,QAAQ,CAAC,KAAK,GAAG;YACf,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrD,MAAM,EAAE;gBACN,MAAM,EAAE,MAAM,EAAE,IAAI;gBACpB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9E,SAAS;aACV;SACF,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAsB,EACtB,OAA2D,EAAE;IAE7D,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IAExH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,mBAAmB,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC9G,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,mBAAmB,CAAC,+BAA+B,EAAE;YAC1D,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,8CAA8C;SAChG,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5F,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACjG,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS;YAC7C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE;YACnD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAEhB,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ;iBAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACzD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YAC1C,OAAO,mBAAmB,CAAC,8BAA8B,EAAE;gBACzD,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC9E,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,mBAAmB,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEzG,yEAAyE;QACzE,wEAAwE;QACxE,qEAAqE;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS;YAC3C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE;YACrD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAClB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACjC,OAAO,mBAAmB,CAAC,gCAAgC,EAAE;oBAC3D,MAAM,EAAE,MAAM,IAAI,oBAAoB,EAAE,MAAM,EAAE,MAAM;oBACtD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,IAAI,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM;iBACtE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;YACtE,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;iBAC7E,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;iBACzB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACpD,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjF,OAAO,mBAAmB,CAAC,oCAAoC,EAAE;gBAC/D,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aACpE,CAAC,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,oEAAoE;QACpE,8CAA8C;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;YACtG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,mBAAmB,CAAC,yBAAyB,EAAE;oBACpD,MAAM,EAAE,MAAM,EAAE,yBAAyB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,uEAAuE;QACvE,uEAAuE;QACvE,uBAAuB;QACvB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;QACnC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,GAAG,CAAC,SAAS,CACjB,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EACnB,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,KAAK,CAAC,UAAU,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAC9H,OAAO,CACR,CAAC;QACF,MAAM,uBAAuB,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAElD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,wBAAwB,EAAE;YAC/D,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM;YAC9D,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACjD,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAClF,CAAC,CAAC;QACH,QAAQ,CAAC,KAAK,GAAG;YACf,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YAC7D,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;SAC1E,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-actions.test.d.ts","sourceRoot":"","sources":["../../src/github/issue-actions.test.ts"],"names":[],"mappings":""}
|