File size: 1,416 Bytes
b6cd280
38fb424
 
0b3cd21
 
 
 
 
 
881b356
48a8015
 
 
 
 
 
 
881b356
4c8dfec
 
 
 
881b356
4c8dfec
 
 
 
 
 
881b356
 
 
 
 
 
 
 
b6cd280
10be466
4c8dfec
10be466
52c3560
0b3cd21
4c8dfec
881b356
 
4c8dfec
 
38fb424
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { StateSchema } from "@langchain/langgraph";
import { z } from "zod";

export const FileRankingSchema = z.object({
  filePath: z.string(),
  importance: z.number().int().min(1).max(5),
  reasoning: z.string(),
});

export const CandidateFindingSchema = z.object({
  title: z.string(),
  description: z.string(),
  recommendation: z.string(),
  severity: z.enum(["high", "medium", "low"]),
  codeSnippet: z.string(),
});

export const LocatedFindingSchema = CandidateFindingSchema.extend({
  location: z.string(),
  path: z.string(),
});

export const JudgeReviewSchema = z.object({
  review: z.string(),
  isFalsePositive: z.boolean(),
  confidence: z.number(),
  exploitablePaths: z.array(z.string()),
});

export const FindingSchema = LocatedFindingSchema.extend({
  judgeReview: z.object({
    review: z.string(),
    confidence: z.number(),
    exploitablePaths: z.array(z.string()),
  }),
});

export const AuditorState = new StateSchema({
  repoPath: z.string().default(""),
  scope: z.array(z.string()).default([]),
  docs: z.array(z.string()).default([]),
  fileTree: z.string().default(""),
  fileRankings: z.array(FileRankingSchema).default([]),
  repoContext: z.string().default(""),
  candidateFindings: z.array(LocatedFindingSchema).default([]),
  judgeReviews: z.array(JudgeReviewSchema).default([]),
  findings: z.array(FindingSchema).default([]),
  reflectionCount: z.number().default(0),
});