@cyanautomation/kaseki-agent 1.55.0 → 1.56.0
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/dist/artifact-metadata.d.ts.map +1 -1
- package/dist/artifact-metadata.js +15 -0
- package/dist/artifact-metadata.js.map +1 -1
- package/dist/github-app-token.js +9 -125
- package/dist/github-app-token.js.map +1 -1
- package/dist/github-utils.d.ts +64 -0
- package/dist/github-utils.d.ts.map +1 -0
- package/dist/github-utils.js +310 -0
- package/dist/github-utils.js.map +1 -0
- package/dist/idempotency-store.d.ts +9 -5
- package/dist/idempotency-store.d.ts.map +1 -1
- package/dist/idempotency-store.js +138 -46
- package/dist/idempotency-store.js.map +1 -1
- package/dist/job-persistence-manager.d.ts +6 -8
- package/dist/job-persistence-manager.d.ts.map +1 -1
- package/dist/job-persistence-manager.js +48 -58
- package/dist/job-persistence-manager.js.map +1 -1
- package/dist/job-scheduler.d.ts +4 -1
- package/dist/job-scheduler.d.ts.map +1 -1
- package/dist/job-scheduler.js +92 -35
- package/dist/job-scheduler.js.map +1 -1
- package/dist/kaseki-api/service-bootstrapper.d.ts.map +1 -1
- package/dist/kaseki-api/service-bootstrapper.js +7 -2
- package/dist/kaseki-api/service-bootstrapper.js.map +1 -1
- package/dist/kaseki-api-routes.d.ts.map +1 -1
- package/dist/kaseki-api-routes.js +124 -47
- package/dist/kaseki-api-routes.js.map +1 -1
- package/dist/kaseki-api-types.d.ts +28 -0
- package/dist/kaseki-api-types.d.ts.map +1 -1
- package/dist/kaseki-api-types.js +9 -0
- package/dist/kaseki-api-types.js.map +1 -1
- package/dist/kaseki-api-web.d.ts.map +1 -1
- package/dist/kaseki-api-web.js +388 -2
- package/dist/kaseki-api-web.js.map +1 -1
- package/dist/lib/goal-setting-feedback.d.ts +81 -0
- package/dist/lib/goal-setting-feedback.d.ts.map +1 -0
- package/dist/lib/goal-setting-feedback.js +181 -0
- package/dist/lib/goal-setting-feedback.js.map +1 -0
- package/dist/routes/github-issues-routes.d.ts +33 -0
- package/dist/routes/github-issues-routes.d.ts.map +1 -0
- package/dist/routes/github-issues-routes.js +99 -0
- package/dist/routes/github-issues-routes.js.map +1 -0
- package/dist/types/goal-setting.d.ts +86 -0
- package/dist/types/goal-setting.d.ts.map +1 -0
- package/dist/types/goal-setting.js +64 -0
- package/dist/types/goal-setting.js.map +1 -0
- package/dist/utils/failure-artifact-writer.d.ts.map +1 -1
- package/dist/utils/failure-artifact-writer.js +7 -6
- package/dist/utils/failure-artifact-writer.js.map +1 -1
- package/dist/utils/file-helpers.d.ts +9 -7
- package/dist/utils/file-helpers.d.ts.map +1 -1
- package/dist/utils/file-helpers.js +120 -83
- package/dist/utils/file-helpers.js.map +1 -1
- package/kaseki-agent.sh +1162 -169
- package/package.json +1 -1
- package/scripts/analyze-goal-feedback.js +287 -0
- package/scripts/collect-feedback.js +167 -0
- package/scripts/generate-inspect-report.js +8 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-metadata.d.ts","sourceRoot":"","sources":["../src/artifact-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,0BAA0B,EAAwB,MAAM,oBAAoB,CAAC;AAEtF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,
|
|
1
|
+
{"version":3,"file":"artifact-metadata.d.ts","sourceRoot":"","sources":["../src/artifact-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,0BAA0B,EAAwB,MAAM,oBAAoB,CAAC;AAEtF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAsYjF,CAAC"}
|
|
@@ -104,6 +104,21 @@ export const ARTIFACT_METADATA_REGISTRY = {
|
|
|
104
104
|
availability: ArtifactAvailability.CONDITIONAL,
|
|
105
105
|
sizeHint: 'medium',
|
|
106
106
|
},
|
|
107
|
+
'scouting-validation-errors.jsonl': {
|
|
108
|
+
name: 'scouting-validation-errors.jsonl',
|
|
109
|
+
contentType: 'application/x-jsonl',
|
|
110
|
+
description: 'Structured scouting artifact validation failures with field-level expected/actual details and suggestions',
|
|
111
|
+
availability: ArtifactAvailability.CONDITIONAL,
|
|
112
|
+
triageOrder: 8,
|
|
113
|
+
sizeHint: 'small',
|
|
114
|
+
},
|
|
115
|
+
'scouting-validation-summary.txt': {
|
|
116
|
+
name: 'scouting-validation-summary.txt',
|
|
117
|
+
contentType: 'text/plain',
|
|
118
|
+
description: 'Concise summary of the latest scouting artifact validation result',
|
|
119
|
+
availability: ArtifactAvailability.CONDITIONAL,
|
|
120
|
+
sizeHint: 'small',
|
|
121
|
+
},
|
|
107
122
|
'goal-check.json': {
|
|
108
123
|
name: 'goal-check.json',
|
|
109
124
|
contentType: 'application/json',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-metadata.js","sourceRoot":"","sources":["../src/artifact-metadata.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"artifact-metadata.js","sourceRoot":"","sources":["../src/artifact-metadata.ts"],"names":[],"mappings":"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"}
|
package/dist/github-app-token.js
CHANGED
|
@@ -13,145 +13,29 @@
|
|
|
13
13
|
* }
|
|
14
14
|
*/
|
|
15
15
|
import fs from 'fs';
|
|
16
|
-
import
|
|
17
|
-
import https from 'https';
|
|
18
|
-
import { validateGitHubAppPrivateKey } from './github-app-private-key.js';
|
|
16
|
+
import { generateGitHubAppToken } from './github-utils.js';
|
|
19
17
|
const APP_ID = process.argv[2];
|
|
20
18
|
const PRIVATE_KEY_FILE = process.argv[3];
|
|
21
19
|
const OWNER = process.argv[4];
|
|
22
20
|
const REPO = process.argv[5];
|
|
23
|
-
function loadAndValidatePrivateKey(privateKeyFile) {
|
|
24
|
-
const validation = validateGitHubAppPrivateKey(fs.readFileSync(privateKeyFile, 'utf8'));
|
|
25
|
-
if (!validation.ok || !validation.normalized) {
|
|
26
|
-
const message = validation.remediation
|
|
27
|
-
? `${validation.error} ${validation.remediation}`
|
|
28
|
-
: validation.error;
|
|
29
|
-
throw new Error(message || 'GitHub App private key is not valid.');
|
|
30
|
-
}
|
|
31
|
-
return crypto.createPrivateKey(validation.normalized);
|
|
32
|
-
}
|
|
33
|
-
async function generateJWT(appId, privateKey) {
|
|
34
|
-
const now = Math.floor(Date.now() / 1000);
|
|
35
|
-
const iat = now - 60; // account for clock skew
|
|
36
|
-
const exp = now + 10 * 60; // 10 minutes
|
|
37
|
-
const header = {
|
|
38
|
-
alg: 'RS256',
|
|
39
|
-
typ: 'JWT',
|
|
40
|
-
};
|
|
41
|
-
const payload = {
|
|
42
|
-
iss: appId,
|
|
43
|
-
iat,
|
|
44
|
-
exp,
|
|
45
|
-
};
|
|
46
|
-
const headerBase64 = Buffer.from(JSON.stringify(header)).toString('base64url');
|
|
47
|
-
const payloadBase64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
|
|
48
|
-
const message = `${headerBase64}.${payloadBase64}`;
|
|
49
|
-
// Sign with RSA-SHA256
|
|
50
|
-
const signer = crypto.createSign('RSA-SHA256');
|
|
51
|
-
signer.update(message);
|
|
52
|
-
signer.end();
|
|
53
|
-
const signature = signer.sign(privateKey, 'base64url');
|
|
54
|
-
return `${message}.${signature}`;
|
|
55
|
-
}
|
|
56
|
-
async function getInstallationId(jwt, owner, repo) {
|
|
57
|
-
return new Promise((resolve, reject) => {
|
|
58
|
-
const options = {
|
|
59
|
-
hostname: 'api.github.com',
|
|
60
|
-
path: `/repos/${owner}/${repo}/installation`,
|
|
61
|
-
method: 'GET',
|
|
62
|
-
headers: {
|
|
63
|
-
'Authorization': `Bearer ${jwt}`,
|
|
64
|
-
'Accept': 'application/vnd.github.machine-man-preview+json',
|
|
65
|
-
'User-Agent': 'Kaseki-Agent',
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
const req = https.request(options, (res) => {
|
|
69
|
-
let data = '';
|
|
70
|
-
res.on('data', (chunk) => {
|
|
71
|
-
data += chunk;
|
|
72
|
-
});
|
|
73
|
-
res.on('end', () => {
|
|
74
|
-
if (res.statusCode !== 200) {
|
|
75
|
-
reject(new Error(`Failed to get installation ID: ${res.statusCode} ${data}`));
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
try {
|
|
79
|
-
const json = JSON.parse(data);
|
|
80
|
-
resolve(json.id);
|
|
81
|
-
}
|
|
82
|
-
catch (e) {
|
|
83
|
-
reject(new Error(`Failed to parse installation response: ${e instanceof Error ? e.message : String(e)}`));
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
req.on('error', reject);
|
|
89
|
-
req.end();
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
async function getAccessToken(jwt, installationId) {
|
|
93
|
-
return new Promise((resolve, reject) => {
|
|
94
|
-
const options = {
|
|
95
|
-
hostname: 'api.github.com',
|
|
96
|
-
path: `/app/installations/${installationId}/access_tokens`,
|
|
97
|
-
method: 'POST',
|
|
98
|
-
headers: {
|
|
99
|
-
'Authorization': `Bearer ${jwt}`,
|
|
100
|
-
'Accept': 'application/vnd.github.machine-man-preview+json',
|
|
101
|
-
'User-Agent': 'Kaseki-Agent',
|
|
102
|
-
'Content-Length': '0',
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
const req = https.request(options, (res) => {
|
|
106
|
-
let data = '';
|
|
107
|
-
res.on('data', (chunk) => {
|
|
108
|
-
data += chunk;
|
|
109
|
-
});
|
|
110
|
-
res.on('end', () => {
|
|
111
|
-
if (res.statusCode !== 201) {
|
|
112
|
-
reject(new Error(`Failed to get access token: ${res.statusCode} ${data}`));
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
try {
|
|
116
|
-
const json = JSON.parse(data);
|
|
117
|
-
resolve({
|
|
118
|
-
token: json.token,
|
|
119
|
-
expires_at: json.expires_at,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
catch (e) {
|
|
123
|
-
reject(new Error(`Failed to parse token response: ${e instanceof Error ? e.message : String(e)}`));
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
req.on('error', reject);
|
|
129
|
-
req.end();
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
21
|
async function main() {
|
|
133
22
|
if (!APP_ID || !PRIVATE_KEY_FILE || !OWNER || !REPO) {
|
|
134
23
|
console.error('Usage: node github-app-token.js <app-id> <private-key-file> <owner> <repo>');
|
|
135
24
|
process.exit(1);
|
|
136
25
|
}
|
|
137
26
|
try {
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
// Generate JWT
|
|
141
|
-
const jwt = await generateJWT(APP_ID, privateKey);
|
|
142
|
-
// Get installation ID
|
|
143
|
-
const installationId = await getInstallationId(jwt, OWNER, REPO);
|
|
144
|
-
// Get access token
|
|
145
|
-
const tokenData = await getAccessToken(jwt, installationId);
|
|
27
|
+
const privateKeyContent = fs.readFileSync(PRIVATE_KEY_FILE, 'utf8');
|
|
28
|
+
const tokenData = await generateGitHubAppToken(OWNER, REPO, APP_ID, privateKeyContent);
|
|
146
29
|
// Output result as JSON
|
|
147
30
|
console.log(JSON.stringify(tokenData));
|
|
31
|
+
if (tokenData.error) {
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
148
34
|
}
|
|
149
35
|
catch (error) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
};
|
|
154
|
-
console.log(JSON.stringify(result));
|
|
36
|
+
console.log(JSON.stringify({
|
|
37
|
+
error: error instanceof Error ? error.message : String(error)
|
|
38
|
+
}));
|
|
155
39
|
process.exit(1);
|
|
156
40
|
}
|
|
157
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-app-token.js","sourceRoot":"","sources":["../src/github-app-token.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,
|
|
1
|
+
{"version":3,"file":"github-app-token.js","sourceRoot":"","sources":["../src/github-app-token.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/B,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE7B,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CACX,4EAA4E,CAC7E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,iBAAiB,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAEvF,wBAAwB;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub API Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides helper functions for interacting with GitHub API:
|
|
5
|
+
* - Token generation using GitHub App authentication
|
|
6
|
+
* - URL parsing and validation
|
|
7
|
+
* - Issue fetching with filtering
|
|
8
|
+
*/
|
|
9
|
+
interface GitHubIssue {
|
|
10
|
+
number: number;
|
|
11
|
+
title: string;
|
|
12
|
+
body: string | null;
|
|
13
|
+
url: string;
|
|
14
|
+
created_at: string;
|
|
15
|
+
state: string;
|
|
16
|
+
labels: Array<{
|
|
17
|
+
name: string;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
interface TokenResult {
|
|
21
|
+
token?: string;
|
|
22
|
+
expires_at?: string;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
interface ParsedGitHubUrl {
|
|
26
|
+
owner: string;
|
|
27
|
+
repo: string;
|
|
28
|
+
isValid: boolean;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parse a GitHub URL and extract owner/repo
|
|
33
|
+
* Accepts formats like:
|
|
34
|
+
* - https://github.com/owner/repo
|
|
35
|
+
* - https://github.com/owner/repo.git
|
|
36
|
+
* - owner/repo (shorthand)
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseGitHubUrl(urlOrShorthand: string): ParsedGitHubUrl;
|
|
39
|
+
/**
|
|
40
|
+
* Generate a GitHub App access token
|
|
41
|
+
*
|
|
42
|
+
* Loads GitHub App credentials from host secrets:
|
|
43
|
+
* - github_app_id
|
|
44
|
+
* - github_app_private_key
|
|
45
|
+
*
|
|
46
|
+
* Returns token, expires_at, and error fields
|
|
47
|
+
*/
|
|
48
|
+
export declare function generateGitHubAppToken(owner: string, repo: string, overrideAppId?: string, overridePrivateKey?: string): Promise<TokenResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Fetch GitHub issues from a repository with filtering
|
|
51
|
+
*
|
|
52
|
+
* @param owner - GitHub repository owner
|
|
53
|
+
* @param repo - GitHub repository name
|
|
54
|
+
* @param token - GitHub API access token
|
|
55
|
+
* @param options - Filtering options
|
|
56
|
+
* @returns Array of issues matching the criteria
|
|
57
|
+
*/
|
|
58
|
+
export declare function fetchGitHubIssues(owner: string, repo: string, token: string, options?: {
|
|
59
|
+
labels?: string[];
|
|
60
|
+
limit?: number;
|
|
61
|
+
state?: 'open' | 'closed' | 'all';
|
|
62
|
+
}): Promise<GitHubIssue[]>;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=github-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-utils.d.ts","sourceRoot":"","sources":["../src/github-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgCH,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjC;AAED,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CAsEtE;AA2JD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,EACtB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,WAAW,CAAC,CAoCtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CAC9B,GACL,OAAO,CAAC,WAAW,EAAE,CAAC,CA8DxB"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub API Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides helper functions for interacting with GitHub API:
|
|
5
|
+
* - Token generation using GitHub App authentication
|
|
6
|
+
* - URL parsing and validation
|
|
7
|
+
* - Issue fetching with filtering
|
|
8
|
+
*/
|
|
9
|
+
import crypto from 'crypto';
|
|
10
|
+
import https from 'https';
|
|
11
|
+
import { validateGitHubAppPrivateKey } from './github-app-private-key.js';
|
|
12
|
+
import { readHostSecret } from './secrets/host-secrets-reader.js';
|
|
13
|
+
import { createLogger } from './logger.js';
|
|
14
|
+
const logger = createLogger('github-utils');
|
|
15
|
+
/**
|
|
16
|
+
* Parse a GitHub URL and extract owner/repo
|
|
17
|
+
* Accepts formats like:
|
|
18
|
+
* - https://github.com/owner/repo
|
|
19
|
+
* - https://github.com/owner/repo.git
|
|
20
|
+
* - owner/repo (shorthand)
|
|
21
|
+
*/
|
|
22
|
+
export function parseGitHubUrl(urlOrShorthand) {
|
|
23
|
+
if (!urlOrShorthand || typeof urlOrShorthand !== 'string') {
|
|
24
|
+
return {
|
|
25
|
+
owner: '',
|
|
26
|
+
repo: '',
|
|
27
|
+
isValid: false,
|
|
28
|
+
error: 'URL is required and must be a string',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const trimmed = urlOrShorthand.trim();
|
|
32
|
+
// Try shorthand format first (owner/repo)
|
|
33
|
+
if (!trimmed.startsWith('http')) {
|
|
34
|
+
const parts = trimmed.split('/');
|
|
35
|
+
if (parts.length === 2 && parts[0] && parts[1]) {
|
|
36
|
+
return {
|
|
37
|
+
owner: parts[0],
|
|
38
|
+
repo: parts[1],
|
|
39
|
+
isValid: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
owner: '',
|
|
44
|
+
repo: '',
|
|
45
|
+
isValid: false,
|
|
46
|
+
error: 'Invalid shorthand format. Use "owner/repo" or full GitHub URL',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Parse full URL
|
|
50
|
+
try {
|
|
51
|
+
const url = new URL(trimmed);
|
|
52
|
+
if (url.hostname !== 'github.com') {
|
|
53
|
+
return {
|
|
54
|
+
owner: '',
|
|
55
|
+
repo: '',
|
|
56
|
+
isValid: false,
|
|
57
|
+
error: 'Only github.com URLs are supported',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const parts = url.pathname.split('/').filter((p) => p);
|
|
61
|
+
if (parts.length < 2) {
|
|
62
|
+
return {
|
|
63
|
+
owner: '',
|
|
64
|
+
repo: '',
|
|
65
|
+
isValid: false,
|
|
66
|
+
error: 'URL must contain owner/repo path',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const owner = parts[0];
|
|
70
|
+
const repo = parts[1].replace(/\.git$/, '');
|
|
71
|
+
return {
|
|
72
|
+
owner,
|
|
73
|
+
repo,
|
|
74
|
+
isValid: true,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
return {
|
|
79
|
+
owner: '',
|
|
80
|
+
repo: '',
|
|
81
|
+
isValid: false,
|
|
82
|
+
error: `Invalid URL: ${e instanceof Error ? e.message : String(e)}`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Load and validate a GitHub App private key from disk
|
|
88
|
+
*/
|
|
89
|
+
function loadAndValidatePrivateKey(privateKeyContent) {
|
|
90
|
+
const validation = validateGitHubAppPrivateKey(privateKeyContent);
|
|
91
|
+
if (!validation.ok || !validation.normalized) {
|
|
92
|
+
const message = validation.remediation
|
|
93
|
+
? `${validation.error} ${validation.remediation}`
|
|
94
|
+
: validation.error;
|
|
95
|
+
throw new Error(message || 'GitHub App private key is not valid.');
|
|
96
|
+
}
|
|
97
|
+
return crypto.createPrivateKey(validation.normalized);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Generate a JWT for GitHub App authentication
|
|
101
|
+
*/
|
|
102
|
+
async function generateJWT(appId, privateKey) {
|
|
103
|
+
const now = Math.floor(Date.now() / 1000);
|
|
104
|
+
const iat = now - 60; // account for clock skew
|
|
105
|
+
const exp = now + 10 * 60; // 10 minutes
|
|
106
|
+
const header = {
|
|
107
|
+
alg: 'RS256',
|
|
108
|
+
typ: 'JWT',
|
|
109
|
+
};
|
|
110
|
+
const payload = {
|
|
111
|
+
iss: appId,
|
|
112
|
+
iat,
|
|
113
|
+
exp,
|
|
114
|
+
};
|
|
115
|
+
const headerBase64 = Buffer.from(JSON.stringify(header)).toString('base64url');
|
|
116
|
+
const payloadBase64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
|
|
117
|
+
const message = `${headerBase64}.${payloadBase64}`;
|
|
118
|
+
// Sign with RSA-SHA256
|
|
119
|
+
const signer = crypto.createSign('RSA-SHA256');
|
|
120
|
+
signer.update(message);
|
|
121
|
+
signer.end();
|
|
122
|
+
const signature = signer.sign(privateKey, 'base64url');
|
|
123
|
+
return `${message}.${signature}`;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the GitHub App installation ID for a repository
|
|
127
|
+
*/
|
|
128
|
+
async function getInstallationId(jwt, owner, repo) {
|
|
129
|
+
return new Promise((resolve, reject) => {
|
|
130
|
+
const options = {
|
|
131
|
+
hostname: 'api.github.com',
|
|
132
|
+
path: `/repos/${owner}/${repo}/installation`,
|
|
133
|
+
method: 'GET',
|
|
134
|
+
headers: {
|
|
135
|
+
'Authorization': `Bearer ${jwt}`,
|
|
136
|
+
'Accept': 'application/vnd.github.machine-man-preview+json',
|
|
137
|
+
'User-Agent': 'Kaseki-Agent',
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
const req = https.request(options, (res) => {
|
|
141
|
+
let data = '';
|
|
142
|
+
res.on('data', (chunk) => {
|
|
143
|
+
data += chunk;
|
|
144
|
+
});
|
|
145
|
+
res.on('end', () => {
|
|
146
|
+
if (res.statusCode !== 200) {
|
|
147
|
+
reject(new Error(`Failed to get installation ID: ${res.statusCode} ${data}`));
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
try {
|
|
151
|
+
const json = JSON.parse(data);
|
|
152
|
+
resolve(json.id);
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
reject(new Error(`Failed to parse installation response: ${e instanceof Error ? e.message : String(e)}`));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
req.on('error', reject);
|
|
161
|
+
req.end();
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get a GitHub App installation access token
|
|
166
|
+
*/
|
|
167
|
+
async function getAccessToken(jwt, installationId) {
|
|
168
|
+
return new Promise((resolve, reject) => {
|
|
169
|
+
const options = {
|
|
170
|
+
hostname: 'api.github.com',
|
|
171
|
+
path: `/app/installations/${installationId}/access_tokens`,
|
|
172
|
+
method: 'POST',
|
|
173
|
+
headers: {
|
|
174
|
+
'Authorization': `Bearer ${jwt}`,
|
|
175
|
+
'Accept': 'application/vnd.github.machine-man-preview+json',
|
|
176
|
+
'User-Agent': 'Kaseki-Agent',
|
|
177
|
+
'Content-Length': '0',
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
const req = https.request(options, (res) => {
|
|
181
|
+
let data = '';
|
|
182
|
+
res.on('data', (chunk) => {
|
|
183
|
+
data += chunk;
|
|
184
|
+
});
|
|
185
|
+
res.on('end', () => {
|
|
186
|
+
if (res.statusCode !== 201) {
|
|
187
|
+
reject(new Error(`Failed to get access token: ${res.statusCode} ${data}`));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
try {
|
|
191
|
+
const json = JSON.parse(data);
|
|
192
|
+
resolve({
|
|
193
|
+
token: json.token,
|
|
194
|
+
expires_at: json.expires_at,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
reject(new Error(`Failed to parse token response: ${e instanceof Error ? e.message : String(e)}`));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
req.on('error', reject);
|
|
204
|
+
req.end();
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Generate a GitHub App access token
|
|
209
|
+
*
|
|
210
|
+
* Loads GitHub App credentials from host secrets:
|
|
211
|
+
* - github_app_id
|
|
212
|
+
* - github_app_private_key
|
|
213
|
+
*
|
|
214
|
+
* Returns token, expires_at, and error fields
|
|
215
|
+
*/
|
|
216
|
+
export async function generateGitHubAppToken(owner, repo, overrideAppId, overridePrivateKey) {
|
|
217
|
+
try {
|
|
218
|
+
const appId = overrideAppId || readHostSecret('github_app_id');
|
|
219
|
+
if (!appId) {
|
|
220
|
+
return {
|
|
221
|
+
error: 'GitHub App ID not found. Configure GITHUB_APP_ID_FILE or .kaseki/secrets/github_app_id',
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const privateKeyContent = overridePrivateKey || readHostSecret('github_app_private_key');
|
|
225
|
+
if (!privateKeyContent) {
|
|
226
|
+
return {
|
|
227
|
+
error: 'GitHub App private key not found. Configure GITHUB_APP_PRIVATE_KEY_FILE or .kaseki/secrets/github_app_private_key',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// Load and validate private key
|
|
231
|
+
const privateKey = loadAndValidatePrivateKey(privateKeyContent);
|
|
232
|
+
// Generate JWT
|
|
233
|
+
const jwt = await generateJWT(appId, privateKey);
|
|
234
|
+
// Get installation ID
|
|
235
|
+
const installationId = await getInstallationId(jwt, owner, repo);
|
|
236
|
+
// Get access token
|
|
237
|
+
const tokenData = await getAccessToken(jwt, installationId);
|
|
238
|
+
return tokenData;
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
242
|
+
logger.error(`Failed to generate GitHub App token: ${errorMessage}`);
|
|
243
|
+
return {
|
|
244
|
+
error: errorMessage,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Fetch GitHub issues from a repository with filtering
|
|
250
|
+
*
|
|
251
|
+
* @param owner - GitHub repository owner
|
|
252
|
+
* @param repo - GitHub repository name
|
|
253
|
+
* @param token - GitHub API access token
|
|
254
|
+
* @param options - Filtering options
|
|
255
|
+
* @returns Array of issues matching the criteria
|
|
256
|
+
*/
|
|
257
|
+
export async function fetchGitHubIssues(owner, repo, token, options = {}) {
|
|
258
|
+
const { labels = [], limit = 5, state = 'open' } = options;
|
|
259
|
+
return new Promise((resolve, reject) => {
|
|
260
|
+
// Build query parameters
|
|
261
|
+
const params = new URLSearchParams();
|
|
262
|
+
params.append('state', state);
|
|
263
|
+
params.append('sort', 'created');
|
|
264
|
+
params.append('direction', 'desc');
|
|
265
|
+
params.append('per_page', String(Math.min(limit, 100))); // GitHub max 100
|
|
266
|
+
if (labels.length > 0) {
|
|
267
|
+
params.append('labels', labels.join(','));
|
|
268
|
+
}
|
|
269
|
+
const path = `/repos/${owner}/${repo}/issues?${params.toString()}`;
|
|
270
|
+
const options_https = {
|
|
271
|
+
hostname: 'api.github.com',
|
|
272
|
+
path,
|
|
273
|
+
method: 'GET',
|
|
274
|
+
headers: {
|
|
275
|
+
'Authorization': `token ${token}`,
|
|
276
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
277
|
+
'User-Agent': 'Kaseki-Agent',
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
const req = https.request(options_https, (res) => {
|
|
281
|
+
let data = '';
|
|
282
|
+
res.on('data', (chunk) => {
|
|
283
|
+
data += chunk;
|
|
284
|
+
});
|
|
285
|
+
res.on('end', () => {
|
|
286
|
+
if (res.statusCode !== 200) {
|
|
287
|
+
const errorMsg = `GitHub API error: ${res.statusCode}`;
|
|
288
|
+
logger.error(errorMsg);
|
|
289
|
+
reject(new Error(errorMsg));
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
try {
|
|
293
|
+
const issues = JSON.parse(data);
|
|
294
|
+
// Return only the first `limit` issues
|
|
295
|
+
resolve(issues.slice(0, limit));
|
|
296
|
+
}
|
|
297
|
+
catch (e) {
|
|
298
|
+
reject(new Error(`Failed to parse issues response: ${e instanceof Error ? e.message : String(e)}`));
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
req.on('error', (err) => {
|
|
304
|
+
logger.error(`GitHub API request failed: ${err.message}`);
|
|
305
|
+
reject(err);
|
|
306
|
+
});
|
|
307
|
+
req.end();
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=github-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-utils.js","sourceRoot":"","sources":["../src/github-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AA+C5C;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,cAAsB;IACnD,IAAI,CAAC,cAAc,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO;YACL,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sCAAsC;SAC9C,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;IAEtC,0CAA0C;IAC1C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACd,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+DAA+D;SACvE,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAE7B,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAClC,OAAO;gBACL,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oCAAoC;aAC5C,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO;gBACL,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,kCAAkC;aAC1C,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE5C,OAAO;YACL,KAAK;YACL,IAAI;YACJ,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,gBAAgB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SACpE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAAC,iBAAyB;IAC1D,MAAM,UAAU,GAAG,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;IAElE,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW;YACpC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,WAAW,EAAE;YACjD,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,sCAAsC,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,UAA4B;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,yBAAyB;IAC/C,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,aAAa;IAExC,MAAM,MAAM,GAAc;QACxB,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,KAAK;KACX,CAAC;IAEF,MAAM,OAAO,GAAe;QAC1B,GAAG,EAAE,KAAK;QACV,GAAG;QACH,GAAG;KACJ,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/E,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,GAAG,YAAY,IAAI,aAAa,EAAE,CAAC;IAEnD,uBAAuB;IACvB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,EAAE,CAAC;IAEb,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACvD,OAAO,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,KAAa,EAAE,IAAY;IACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,UAAU,KAAK,IAAI,IAAI,eAAe;YAC5C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,GAAG,EAAE;gBAChC,QAAQ,EAAE,iDAAiD;gBAC3D,YAAY,EAAE,cAAc;aAC7B;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,MAAM,CACJ,IAAI,KAAK,CACP,kCAAkC,GAAG,CAAC,UAAU,IAAI,IAAI,EAAE,CAC3D,CACF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC;wBACH,MAAM,IAAI,GAA2B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACtD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,CACJ,IAAI,KAAK,CACP,0CACE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAC3C,EAAE,CACH,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,GAAW,EACX,cAAsB;IAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,sBAAsB,cAAc,gBAAgB;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,GAAG,EAAE;gBAChC,QAAQ,EAAE,iDAAiD;gBAC3D,YAAY,EAAE,cAAc;gBAC5B,gBAAgB,EAAE,GAAG;aACtB;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,MAAM,CACJ,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,CACnE,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC;wBACH,MAAM,IAAI,GAAwB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACnD,OAAO,CAAC;4BACN,KAAK,EAAE,IAAI,CAAC,KAAK;4BACjB,UAAU,EAAE,IAAI,CAAC,UAAU;yBAC5B,CAAC,CAAC;oBACL,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,CACJ,IAAI,KAAK,CACP,mCACE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAC3C,EAAE,CACH,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAa,EACb,IAAY,EACZ,aAAsB,EACtB,kBAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,KAAK,EAAE,wFAAwF;aAChG,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GAAG,kBAAkB,IAAI,cAAc,CAAC,wBAAwB,CAAC,CAAC;QACzF,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO;gBACL,KAAK,EAAE,mHAAmH;aAC3H,CAAC;QACJ,CAAC;QAED,gCAAgC;QAChC,MAAM,UAAU,GAAG,yBAAyB,CAAC,iBAAiB,CAAC,CAAC;QAEhE,eAAe;QACf,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAEjD,sBAAsB;QACtB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAEjE,mBAAmB;QACnB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAE5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,wCAAwC,YAAY,EAAE,CAAC,CAAC;QACrE,OAAO;YACL,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,IAAY,EACZ,KAAa,EACb,UAII,EAAE;IAEN,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,yBAAyB;QACzB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;QAE1E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,KAAK,IAAI,IAAI,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QAEnE,MAAM,aAAa,GAAG;YACpB,QAAQ,EAAE,gBAAgB;YAC1B,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,eAAe,EAAE,SAAS,KAAK,EAAE;gBACjC,QAAQ,EAAE,gCAAgC;gBAC1C,YAAY,EAAE,cAAc;aAC7B;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;YAC/C,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,MAAM,QAAQ,GAAG,qBAAqB,GAAG,CAAC,UAAU,EAAE,CAAC;oBACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACvB,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC;wBACH,MAAM,MAAM,GAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC/C,uCAAuC;wBACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;oBAClC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,CACJ,IAAI,KAAK,CACP,oCACE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAC3C,EAAE,CACH,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC"}
|