@ariso-ai/ivan 1.0.32 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/database/migration.d.ts +2 -2
  2. package/dist/database/migration.d.ts.map +1 -1
  3. package/dist/database/migration.js.map +1 -1
  4. package/dist/database/migrations/017_create_pr_reviews_table.d.ts +3 -0
  5. package/dist/database/migrations/017_create_pr_reviews_table.d.ts.map +1 -0
  6. package/dist/database/migrations/017_create_pr_reviews_table.js +23 -0
  7. package/dist/database/migrations/017_create_pr_reviews_table.js.map +1 -0
  8. package/dist/database/migrations/index.d.ts.map +1 -1
  9. package/dist/database/migrations/index.js +3 -1
  10. package/dist/database/migrations/index.js.map +1 -1
  11. package/dist/database/types.d.ts +13 -0
  12. package/dist/database/types.d.ts.map +1 -1
  13. package/dist/index.js +39 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/learnings/csv.d.ts +3 -0
  16. package/dist/learnings/csv.d.ts.map +1 -0
  17. package/dist/learnings/csv.js +51 -0
  18. package/dist/learnings/csv.js.map +1 -0
  19. package/dist/learnings/database.d.ts.map +1 -1
  20. package/dist/learnings/database.js.map +1 -1
  21. package/dist/learnings/import-learnings-command.d.ts +7 -0
  22. package/dist/learnings/import-learnings-command.d.ts.map +1 -0
  23. package/dist/learnings/import-learnings-command.js +165 -0
  24. package/dist/learnings/import-learnings-command.js.map +1 -0
  25. package/dist/services/address-executor.d.ts.map +1 -1
  26. package/dist/services/address-executor.js.map +1 -1
  27. package/dist/services/claude-executor.d.ts.map +1 -1
  28. package/dist/services/claude-executor.js +6 -0
  29. package/dist/services/claude-executor.js.map +1 -1
  30. package/dist/services/git-interfaces.d.ts.map +1 -1
  31. package/dist/services/openai-service.d.ts +6 -0
  32. package/dist/services/openai-service.d.ts.map +1 -1
  33. package/dist/services/openai-service.js +75 -0
  34. package/dist/services/openai-service.js.map +1 -1
  35. package/dist/services/pr-service-cli.d.ts.map +1 -1
  36. package/dist/services/pr-service-cli.js.map +1 -1
  37. package/dist/services/pr-service-pat.d.ts.map +1 -1
  38. package/dist/services/pr-service-pat.js.map +1 -1
  39. package/dist/services/review-executor.d.ts +12 -2
  40. package/dist/services/review-executor.d.ts.map +1 -1
  41. package/dist/services/review-executor.js +289 -113
  42. package/dist/services/review-executor.js.map +1 -1
  43. package/dist/web-server.d.ts +1 -0
  44. package/dist/web-server.d.ts.map +1 -1
  45. package/dist/web-server.js +393 -200
  46. package/dist/web-server.js.map +1 -1
  47. package/package.json +1 -1
@@ -1,159 +1,335 @@
1
+ import { randomUUID } from 'crypto';
1
2
  import { execSync } from 'child_process';
3
+ import { writeFileSync, unlinkSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { tmpdir } from 'os';
2
6
  import chalk from 'chalk';
3
- import { randomUUID } from 'crypto';
4
7
  import { DatabaseManager } from '../database.js';
5
8
  import { ExecutorFactory } from './executor-factory.js';
9
+ import { OpenAIService } from './openai-service.js';
10
+ import { createGitManager, createRepositoryManager } from './service-factory.js';
11
+ import { queryLearnings } from '../learnings/index.js';
12
+ const REVIEW_SYSTEM_PROMPT = `You are a principal engineer helping a human reviewer understand and evaluate a pull request.
13
+
14
+ Your primary goal is to set the human reviewer up for success — not to rubber-stamp the PR, but to give them everything they need to make a confident, informed decision. Structure your output so they know exactly where to focus their attention.
15
+
16
+ Your review should:
17
+ 1. **Summarize what the PR does** — a concise description of the intent and approach, so the reviewer isn't starting cold.
18
+ 2. **Call out critical spots to check** — specific files, functions, or logic paths that carry the most risk and deserve careful human scrutiny. Explain *why* each one matters.
19
+ 3. **Flag real issues** — bugs, security holes, performance problems, or correctness failures you found. Be concrete: file name, line range, what's wrong, why it matters, how to fix it.
20
+ 4. **Note conventions and patterns** — deviations from existing codebase conventions worth discussing.
21
+ 5. **Surface anything surprising** — side effects, missing tests for tricky logic, assumptions baked into the implementation.
22
+
23
+ Severity levels: **critical** (must fix before merge), **major** (should fix), **minor** (worth discussing), **nit** (optional polish).
24
+
25
+ Be direct and specific. Reference exact file paths and line numbers. If something looks fine, say so — don't pad with generic praise.`;
26
+ // Kept as reference for the prompt contract passed to OpenAI in extractPrComments()
27
+ export const COMMENT_SYSTEM_PROMPT = `You are a principal engineer leaving inline review comments on a GitHub pull request.
28
+
29
+ You have already produced a written review summary. Your task now is to translate the actionable findings from that review into structured inline comments to post on the PR via the GitHub CLI.
30
+
31
+ For each comment you want to leave:
32
+ - Identify the exact file path and line number (use the line from the PR diff perspective)
33
+ - Write a concise, helpful comment that explains the issue and, where possible, how to fix it
34
+ - Only comment on lines that appear in the PR diff (changed lines or their immediate context)
35
+ - Skip issues that are too vague to pin to a specific location
36
+
37
+ Output a JSON array of comment objects with this shape:
38
+ [
39
+ {
40
+ "path": "src/some/file.ts",
41
+ "line": 42,
42
+ "body": "This function doesn't handle the case where X is null — if Y calls this with an uninitialized value it will throw. Consider adding a guard here."
43
+ }
44
+ ]
45
+
46
+ Return ONLY valid JSON — no prose, no markdown fences, just the raw array.`;
6
47
  export class ReviewExecutor {
7
48
  dbManager;
49
+ claudeExecutor;
50
+ repositoryManager;
51
+ openAIService;
8
52
  constructor() {
9
53
  this.dbManager = new DatabaseManager();
54
+ this.claudeExecutor = ExecutorFactory.getExecutor();
55
+ this.repositoryManager = createRepositoryManager();
56
+ this.openAIService = new OpenAIService();
10
57
  }
11
- async executeReviews(prNumbers) {
12
- const workingDir = process.cwd();
13
- console.log(chalk.blue.bold(`🔍 Reviewing ${prNumbers.length} PR(s)...`));
14
- console.log('');
15
- for (const prNumber of prNumbers) {
16
- await this.reviewPR(prNumber, workingDir);
58
+ async executeReviews(prNumbers, leaveComments = false) {
59
+ try {
60
+ await this.claudeExecutor.validateClaudeCodeInstallation();
61
+ console.log(chalk.green('✅ Claude Code SDK configured'));
62
+ const workingDir = await this.repositoryManager.getValidWorkingDirectory();
63
+ const gitManager = createGitManager(workingDir);
64
+ gitManager.validateGitHubCliInstallation();
65
+ console.log(chalk.green('✅ GitHub CLI is installed'));
66
+ gitManager.validateGitHubCliAuthentication();
67
+ console.log(chalk.green('✅ GitHub CLI is authenticated'));
68
+ const repoInfo = this.repositoryManager.getRepositoryInfo(workingDir);
69
+ console.log(chalk.blue(`📂 Working in: ${repoInfo.name}`));
17
70
  console.log('');
71
+ const repository = await this.repositoryManager.getOrCreateRepository(workingDir);
72
+ const jobUuid = randomUUID();
73
+ const jobDescription = `PR Review - ${prNumbers.map((n) => `#${n}`).join(', ')} - ${new Date().toLocaleDateString()}`;
74
+ const db = this.dbManager.getKysely();
75
+ await db
76
+ .insertInto('jobs')
77
+ .values({
78
+ uuid: jobUuid,
79
+ description: jobDescription,
80
+ created_at: new Date().toISOString(),
81
+ directory: workingDir,
82
+ repository_id: repository.id
83
+ })
84
+ .execute();
85
+ console.log(chalk.blue.bold(`📝 Starting reviews for ${prNumbers.length} PR(s)...`));
86
+ console.log('');
87
+ for (const prNumber of prNumbers) {
88
+ await this.reviewPR(prNumber, jobUuid, repository.id, workingDir, gitManager, leaveComments);
89
+ }
90
+ console.log('');
91
+ console.log(chalk.green.bold('🎉 All reviews completed!'));
92
+ }
93
+ finally {
94
+ this.dbManager.close();
95
+ this.repositoryManager.close();
18
96
  }
19
- this.dbManager.close();
20
- console.log(chalk.green.bold('✅ All reviews completed!'));
21
- console.log(chalk.gray('Run "ivan web" to view reviews in the dashboard.'));
22
97
  }
23
- async reviewPR(prNumber, workingDir) {
24
- const db = this.dbManager.getKysely();
25
- const now = new Date().toISOString();
98
+ async reviewPR(prNumber, jobUuid, repositoryId, workingDir, gitManager, leaveComments) {
99
+ console.log(chalk.blue.bold(`🔍 Reviewing PR #${prNumber}...`));
26
100
  const reviewUuid = randomUUID();
27
- console.log(chalk.blue(`📋 Reviewing PR #${prNumber}...`));
28
- // Fetch PR metadata
29
- let prUrl = null;
101
+ const db = this.dbManager.getKysely();
30
102
  let prTitle = null;
31
- let repositoryId = null;
32
- try {
33
- const prJson = execSync(`gh pr view ${prNumber} --json number,title,url`, { cwd: workingDir, encoding: 'utf-8' });
34
- const pr = JSON.parse(prJson);
35
- prUrl = pr.url;
36
- prTitle = pr.title;
37
- console.log(chalk.gray(` Title: ${prTitle}`));
38
- console.log(chalk.gray(` URL: ${prUrl}`));
39
- }
40
- catch (error) {
41
- console.error(chalk.red(`❌ Failed to fetch PR #${prNumber} metadata:`), error);
42
- }
43
- // Look up repository_id from the DB
103
+ let prUrl = null;
104
+ let prBranch = null;
44
105
  try {
45
- const remoteUrl = execSync('git config --get remote.origin.url', {
46
- cwd: workingDir,
47
- encoding: 'utf-8'
48
- }).trim();
49
- const repo = await db
50
- .selectFrom('repositories')
51
- .select('id')
52
- .where('remote_url', '=', remoteUrl)
53
- .executeTakeFirst();
54
- if (repo)
55
- repositoryId = repo.id;
106
+ const prJson = execSync(`gh pr view ${prNumber} --json number,title,url,state,headRefName`, { cwd: workingDir, encoding: 'utf-8' });
107
+ const prInfo = JSON.parse(prJson);
108
+ if (prInfo.state !== 'OPEN') {
109
+ console.log(chalk.yellow(`⚠️ PR #${prNumber} is not open (status: ${prInfo.state}), skipping`));
110
+ return;
111
+ }
112
+ prTitle = prInfo.title;
113
+ prUrl = prInfo.url;
114
+ prBranch = prInfo.headRefName;
115
+ console.log(chalk.gray(` ${prTitle} (${prBranch})`));
56
116
  }
57
- catch {
58
- // Ignore repository may not be registered
117
+ catch (err) {
118
+ console.log(chalk.red(`❌ Could not fetch PR #${prNumber}: ${err}`));
119
+ return;
59
120
  }
60
- // Create the review record as 'running'
61
- await db
62
- .insertInto('reviews')
63
- .values({
121
+ const review = {
64
122
  uuid: reviewUuid,
123
+ job_uuid: jobUuid,
65
124
  pr_number: prNumber,
66
125
  pr_url: prUrl,
67
126
  pr_title: prTitle,
127
+ status: 'not_started',
128
+ review_log: null,
129
+ review_output: null,
68
130
  repository_id: repositoryId,
69
- status: 'running',
70
- review_content: null,
71
- execution_log: null,
72
- created_at: now,
73
- updated_at: now
74
- })
131
+ created_at: new Date().toISOString()
132
+ };
133
+ await db.insertInto('pr_reviews').values(review).execute();
134
+ await db
135
+ .updateTable('pr_reviews')
136
+ .set({ status: 'active' })
137
+ .where('uuid', '=', reviewUuid)
75
138
  .execute();
76
- // Build the review prompt using the PR diff
77
- let prDiff = '';
78
- let prFiles = '';
139
+ // Create a worktree for the PR branch so Claude can read the actual code
140
+ let worktreePath = null;
79
141
  try {
80
- prDiff = execSync(`gh pr diff ${prNumber}`, {
81
- cwd: workingDir,
82
- encoding: 'utf-8',
83
- maxBuffer: 10 * 1024 * 1024
84
- });
142
+ console.log(chalk.cyan(` Creating worktree for branch: ${prBranch}`));
143
+ worktreePath = await gitManager.createWorktree(prBranch ?? '');
144
+ gitManager.switchToWorktree(worktreePath);
85
145
  }
86
- catch (error) {
87
- console.warn(chalk.yellow(` ⚠️ Could not fetch diff for PR #${prNumber}`));
146
+ catch (err) {
147
+ console.log(chalk.red(`❌ Could not create worktree for PR #${prNumber}: ${err}`));
148
+ await db
149
+ .updateTable('pr_reviews')
150
+ .set({ status: 'failed', review_log: String(err) })
151
+ .where('uuid', '=', reviewUuid)
152
+ .execute();
153
+ return;
88
154
  }
89
155
  try {
90
- prFiles = execSync(`gh pr view ${prNumber} --json files --jq '.files[].path'`, { cwd: workingDir, encoding: 'utf-8' });
91
- }
92
- catch {
93
- // Ignore
94
- }
95
- const prompt = `You are a senior software engineer performing a thorough code review of PR #${prNumber}.
156
+ const learningsSection = await this.buildLearningsSection(prNumber, prTitle, workingDir);
157
+ const reviewPrompt = `Please review PR #${prNumber}: "${prTitle}" (${prUrl}).
96
158
 
97
- ${prTitle ? `PR Title: ${prTitle}` : ''}
98
- ${prUrl ? `PR URL: ${prUrl}` : ''}
99
- ${prFiles ? `\nChanged files:\n${prFiles}` : ''}
159
+ You are currently checked out on the PR branch \`${prBranch}\`. Use your tools to read the code and understand what this PR changes. Start by running \`git log --oneline main..HEAD\` and \`git diff main...HEAD\` to see what changed, then read the relevant files to understand the full context.
100
160
 
101
- ${prDiff ? `\nDiff:\n\`\`\`diff\n${prDiff}\n\`\`\`` : 'No diff available review the PR branch directly.'}
161
+ Your review should help a human reviewer know exactly what to look at and what to watch out for. Structure it as follows:
102
162
 
103
- Please review this pull request and provide:
104
- 1. A brief summary of what the PR does
105
- 2. Potential bugs or logic errors
106
- 3. Security concerns (if any)
107
- 4. Code quality and maintainability issues
108
- 5. Suggestions for improvement
109
- 6. Overall verdict: Approve / Request Changes / Comment
163
+ 1. **What this PR does** — a concise summary of the intent and implementation approach
164
+ 2. **Critical spots to check** — specific files and functions the reviewer should scrutinize closely, with a brief explanation of why each one carries risk
165
+ 3. **Issues found** — concrete bugs, security concerns, performance problems, or correctness failures, each with file path, line range, a criticality level (trivial/low/medium/urgent/critical), and a suggested fix
166
+ 4. **Convention notes** anything that deviates from existing patterns in the codebase
167
+ 5. **Overall assessment** approve, request changes, or needs discussion
110
168
 
111
- Format your review clearly with sections and be specific about file and line references where applicable.
112
- After completing your review, output the final review as plain text starting with the line: "## Code Review: PR #${prNumber}"`;
113
- try {
114
- const executor = ExecutorFactory.getExecutor();
115
- executor.quietMode = false;
116
- const { log, lastMessage } = await executor.executeTask(prompt, workingDir);
117
- // Extract the review content from the last message or log
118
- const reviewContent = this.extractReviewContent(lastMessage, log, prNumber);
169
+ Be specific. Reference exact file paths and line numbers. If the PR looks solid in a particular area, say so briefly.${learningsSection}`;
170
+ const result = await this.claudeExecutor.executeTurn(reviewPrompt, worktreePath, {
171
+ systemPrompt: REVIEW_SYSTEM_PROMPT,
172
+ readOnly: true,
173
+ permissionMode: 'plan'
174
+ });
119
175
  await db
120
- .updateTable('reviews')
176
+ .updateTable('pr_reviews')
121
177
  .set({
122
178
  status: 'completed',
123
- review_content: reviewContent,
124
- execution_log: log,
125
- updated_at: new Date().toISOString()
179
+ review_log: result.log,
180
+ review_output: result.lastMessage
126
181
  })
127
182
  .where('uuid', '=', reviewUuid)
128
183
  .execute();
129
- console.log(chalk.green(` ✅ Review for PR #${prNumber} completed.`));
184
+ console.log(chalk.green(`✅ Review completed for PR #${prNumber}`));
185
+ if (leaveComments && result.lastMessage) {
186
+ await this.postInlineComments(prNumber, result.lastMessage, workingDir);
187
+ }
130
188
  }
131
- catch (error) {
132
- const errorMsg = error instanceof Error ? error.message : String(error);
189
+ catch (err) {
190
+ console.log(chalk.red(`❌ Review failed for PR #${prNumber}: ${err}`));
133
191
  await db
134
- .updateTable('reviews')
135
- .set({
136
- status: 'failed',
137
- execution_log: errorMsg,
138
- updated_at: new Date().toISOString()
139
- })
192
+ .updateTable('pr_reviews')
193
+ .set({ status: 'failed', review_log: String(err) })
140
194
  .where('uuid', '=', reviewUuid)
141
195
  .execute();
142
- console.error(chalk.red(` ❌ Review for PR #${prNumber} failed: ${errorMsg}`));
196
+ }
197
+ finally {
198
+ // Always clean up the worktree
199
+ if (worktreePath) {
200
+ try {
201
+ gitManager.switchToOriginalDir();
202
+ await gitManager.removeWorktree(prBranch ?? '');
203
+ }
204
+ catch (err) {
205
+ console.log(chalk.yellow(`⚠️ Could not clean up worktree: ${err}`));
206
+ }
207
+ }
143
208
  }
144
209
  }
145
- extractReviewContent(lastMessage, log, prNumber) {
146
- const marker = `## Code Review: PR #${prNumber}`;
147
- // Try to find the structured review in the last message first
148
- const inLast = lastMessage.indexOf(marker);
149
- if (inLast !== -1)
150
- return lastMessage.slice(inLast);
151
- // Fall back to scanning the execution log
152
- const inLog = log.indexOf(marker);
153
- if (inLog !== -1)
154
- return log.slice(inLog);
155
- // If Claude didn't use the marker, return the last message as-is
156
- return lastMessage || log;
210
+ /**
211
+ * Queries the repo's learnings database (.ivan/db.sqlite) with the PR title and
212
+ * changed file paths, and formats the closest matches as a prompt section.
213
+ * Returns an empty string when there is no learnings store or nothing matches.
214
+ */
215
+ async buildLearningsSection(prNumber, prTitle, workingDir) {
216
+ let queryText = prTitle ?? '';
217
+ try {
218
+ const filesJson = execSync(`gh pr view ${prNumber} --json files`, {
219
+ cwd: workingDir,
220
+ encoding: 'utf-8'
221
+ });
222
+ const files = JSON.parse(filesJson).files ?? [];
223
+ queryText = [queryText, ...files.slice(0, 50).map((f) => f.path)]
224
+ .filter(Boolean)
225
+ .join('\n');
226
+ }
227
+ catch {
228
+ // Changed-file lookup is best-effort; the title alone is still a usable query.
229
+ }
230
+ let learnings = [];
231
+ try {
232
+ learnings = await queryLearnings(workingDir, queryText, { limit: 10 });
233
+ }
234
+ catch {
235
+ // No learnings store, or it failed to open — reviews still work without it.
236
+ return '';
237
+ }
238
+ if (learnings.length === 0) {
239
+ return '';
240
+ }
241
+ console.log(chalk.cyan(` Including ${learnings.length} relevant learning(s) from past reviews`));
242
+ const formatted = learnings
243
+ .map((l) => {
244
+ const label = l.title || l.kind;
245
+ const parts = [`- [${label}] ${l.statement}`];
246
+ if (l.rationale)
247
+ parts.push(` Why: ${l.rationale}`);
248
+ if (l.applicability)
249
+ parts.push(` When: ${l.applicability}`);
250
+ if (l.source_url)
251
+ parts.push(` Source: ${l.source_url}`);
252
+ return parts.join('\n');
253
+ })
254
+ .join('\n');
255
+ return `
256
+
257
+ ## Learnings from past reviews
258
+
259
+ The following learnings were distilled from this team's past code reviews and repository history. They are the most contextually relevant to this PR. Apply them while reviewing: check whether the changes violate any of them, and cite the learning when you flag an issue based on one.
260
+
261
+ ${formatted}`;
262
+ }
263
+ async postInlineComments(prNumber, reviewOutput, workingDir) {
264
+ console.log(chalk.cyan(` Extracting inline comments for PR #${prNumber} via OpenAI...`));
265
+ let comments;
266
+ try {
267
+ comments = await this.openAIService.extractPrComments(reviewOutput, prNumber);
268
+ }
269
+ catch (err) {
270
+ console.log(chalk.yellow(`⚠️ Could not extract inline comments: ${err}`));
271
+ return;
272
+ }
273
+ if (comments.length === 0) {
274
+ console.log(chalk.gray(` No inline comments to post for PR #${prNumber}`));
275
+ return;
276
+ }
277
+ // GitHub's pull review comment API requires the head commit SHA
278
+ let commitId;
279
+ try {
280
+ const prJson = execSync(`gh pr view ${prNumber} --json headRefOid`, {
281
+ cwd: workingDir,
282
+ encoding: 'utf-8'
283
+ });
284
+ commitId = JSON.parse(prJson).headRefOid;
285
+ if (!commitId)
286
+ throw new Error('headRefOid was empty');
287
+ }
288
+ catch (err) {
289
+ console.log(chalk.yellow(`⚠️ Could not fetch PR head SHA, aborting inline comments: ${err}`));
290
+ return;
291
+ }
292
+ console.log(chalk.cyan(` Posting ${comments.length} inline comment(s) on PR #${prNumber}...`));
293
+ const CRITICALITY_EMOJI = {
294
+ trivial: '🔵',
295
+ low: '🟢',
296
+ medium: '🟡',
297
+ urgent: '🟠',
298
+ critical: '🔴'
299
+ };
300
+ let posted = 0;
301
+ let failed = 0;
302
+ for (const comment of comments) {
303
+ const emoji = CRITICALITY_EMOJI[comment.criticality] ?? '⚪';
304
+ const header = `${emoji} **${comment.criticality.charAt(0).toUpperCase() + comment.criticality.slice(1)}**`;
305
+ const fullBody = `${header}\n\n${comment.body}`;
306
+ const tmpFile = join(tmpdir(), `ivan-comment-${randomUUID()}.txt`);
307
+ try {
308
+ writeFileSync(tmpFile, fullBody, 'utf-8');
309
+ try {
310
+ execSync(`gh api repos/:owner/:repo/pulls/${prNumber}/comments --method POST` +
311
+ ` -f commit_id=${commitId}` +
312
+ ` -f path=${comment.path}` +
313
+ ` -F line=${comment.line}` +
314
+ ` -f side=RIGHT` +
315
+ ` -F body=@"${tmpFile}"`, { cwd: workingDir, encoding: 'utf-8', stdio: 'pipe' });
316
+ posted++;
317
+ }
318
+ catch (err) {
319
+ console.log(chalk.yellow(` ⚠️ Could not post inline comment for ${comment.path}:${comment.line}: ${err}`));
320
+ failed++;
321
+ }
322
+ }
323
+ finally {
324
+ try {
325
+ unlinkSync(tmpFile);
326
+ }
327
+ catch {
328
+ /* ignore */
329
+ }
330
+ }
331
+ }
332
+ console.log(chalk.green(` ✅ Posted ${posted} comment(s)${failed > 0 ? `, ${failed} failed` : ''} on PR #${prNumber}`));
157
333
  }
158
334
  }
159
335
  //# sourceMappingURL=review-executor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-executor.js","sourceRoot":"","sources":["../../src/services/review-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-executor.js","sourceRoot":"","sources":["../../src/services/review-executor.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export declare class WebServer {
8
8
  private setupRoutes;
9
9
  private getJobs;
10
10
  private getJobTasks;
11
+ private getJobReviews;
11
12
  private getMainHTML;
12
13
  start(): Promise<void>;
13
14
  stop(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"web-server.d.ts","sourceRoot":"","sources":["../src/web-server.ts"],"names":[],"mappings":"AAIA,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAa;IAQ/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,WAAW;YAWL,OAAO;YAmBP,WAAW;IAgCzB,OAAO,CAAC,WAAW;IA0YZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC"}
1
+ {"version":3,"file":"web-server.d.ts","sourceRoot":"","sources":["../src/web-server.ts"],"names":[],"mappings":"AAIA,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAa;IAQ/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,WAAW;YAYL,OAAO;YAmBP,WAAW;YAgCX,aAAa;IAgC3B,OAAO,CAAC,WAAW;IAijBZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC"}