mobbdev 1.4.68 → 1.5.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.
@@ -34,6 +34,18 @@ function getSdk(client, withWrapper = defaultWrapper) {
34
34
  getAnalysisSubscription(variables, requestHeaders, signal) {
35
35
  return withWrapper((wrappedRequestHeaders) => client.request({ document: GetAnalysisSubscriptionDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getAnalysisSubscription", "subscription", variables);
36
36
  },
37
+ GetOrganizationId(variables, requestHeaders, signal) {
38
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetOrganizationIdDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "GetOrganizationId", "query", variables);
39
+ },
40
+ UpdateOrgScanPolicy(variables, requestHeaders, signal) {
41
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: UpdateOrgScanPolicyDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "UpdateOrgScanPolicy", "mutation", variables);
42
+ },
43
+ GetReportFindingRuleIds(variables, requestHeaders, signal) {
44
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetReportFindingRuleIdsDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "GetReportFindingRuleIds", "query", variables);
45
+ },
46
+ getGateVerdict(variables, requestHeaders, signal) {
47
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetGateVerdictDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getGateVerdict", "query", variables);
48
+ },
37
49
  getAnalysis(variables, requestHeaders, signal) {
38
50
  return withWrapper((wrappedRequestHeaders) => client.request({ document: GetAnalysisDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getAnalysis", "query", variables);
39
51
  },
@@ -150,7 +162,7 @@ function getSdk(client, withWrapper = defaultWrapper) {
150
162
  }
151
163
  };
152
164
  }
153
- var AiBlameInferenceType, FixQuestionInputType, Language, ManifestAction, Effort_To_Apply_Fix_Enum, Fix_Rating_Tag_Enum, Fix_Report_State_Enum, Fix_State_Enum, IssueLanguage_Enum, Pr_Status_Enum, Project_Role_Type_Enum, Scan_Source_Enum, Vulnerability_Report_Issue_Category_Enum, Vulnerability_Report_Issue_State_Enum, Vulnerability_Report_Issue_Tag_Enum, Vulnerability_Report_Vendor_Enum, Vulnerability_Severity_Enum, FixDetailsFragmentDoc, FixReportSummaryFieldsFragmentDoc, MeDocument, GetLastOrgAndNamedProjectDocument, GetLastOrgDocument, GetEncryptedApiTokenDocument, FixReportStateDocument, GetVulnerabilityReportPathsDocument, GetAnalysisSubscriptionDocument, GetAnalysisDocument, GetFixesDocument, GetVulByNodesMetadataDocument, GetFalsePositiveDocument, UpdateScmTokenDocument, UploadS3BucketInfoDocument, GetTracyDiffUploadUrlDocument, AnalyzeCommitForExtensionAiBlameDocument, GetAiBlameInferenceDocument, GetAiBlameAttributionPromptDocument, GetPromptSummaryDocument, UploadAiBlameInferencesInitDocument, FinalizeAiBlameInferencesUploadDocument, UploadTracyRecordsDocument, GetTracyRawDataUploadUrlDocument, DigestVulnerabilityReportDocument, SubmitVulnerabilityReportDocument, CreateCommunityUserDocument, CreateCliLoginDocument, PerformCliLoginDocument, SetQuarantineEnabledDocument, CreateProjectDocument, ValidateRepoUrlDocument, GitReferenceDocument, AutoPrAnalysisDocument, GetFixWithAnswersDocument, GetFixReportsByRepoUrlDocument, GetReportFixesDocument, GetLatestReportByRepoUrlDocument, UpdateDownloadedFixDataDocument, GetUserMvsAutoFixDocument, StreamBlameAiAnalysisRequestsDocument, StreamCommitBlameRequestsDocument, ScanSkillDocument, SkillVerdictsByMd5Document, LogMvsEventDocument, GetMvsProjectDocument, IssueTypesDocument, defaultWrapper;
165
+ var AiBlameInferenceType, FixQuestionInputType, Language, ManifestAction, Effort_To_Apply_Fix_Enum, Fix_Rating_Tag_Enum, Fix_Report_State_Enum, Fix_State_Enum, IssueLanguage_Enum, Pr_Status_Enum, Project_Role_Type_Enum, Scan_Source_Enum, Vulnerability_Report_Issue_Category_Enum, Vulnerability_Report_Issue_State_Enum, Vulnerability_Report_Issue_Tag_Enum, Vulnerability_Report_Vendor_Enum, Vulnerability_Severity_Enum, FixDetailsFragmentDoc, FixReportSummaryFieldsFragmentDoc, MeDocument, GetLastOrgAndNamedProjectDocument, GetLastOrgDocument, GetEncryptedApiTokenDocument, FixReportStateDocument, GetVulnerabilityReportPathsDocument, GetAnalysisSubscriptionDocument, GetOrganizationIdDocument, UpdateOrgScanPolicyDocument, GetReportFindingRuleIdsDocument, GetGateVerdictDocument, GetAnalysisDocument, GetFixesDocument, GetVulByNodesMetadataDocument, GetFalsePositiveDocument, UpdateScmTokenDocument, UploadS3BucketInfoDocument, GetTracyDiffUploadUrlDocument, AnalyzeCommitForExtensionAiBlameDocument, GetAiBlameInferenceDocument, GetAiBlameAttributionPromptDocument, GetPromptSummaryDocument, UploadAiBlameInferencesInitDocument, FinalizeAiBlameInferencesUploadDocument, UploadTracyRecordsDocument, GetTracyRawDataUploadUrlDocument, DigestVulnerabilityReportDocument, SubmitVulnerabilityReportDocument, CreateCommunityUserDocument, CreateCliLoginDocument, PerformCliLoginDocument, SetQuarantineEnabledDocument, CreateProjectDocument, ValidateRepoUrlDocument, GitReferenceDocument, AutoPrAnalysisDocument, GetFixWithAnswersDocument, GetFixReportsByRepoUrlDocument, GetReportFixesDocument, GetLatestReportByRepoUrlDocument, UpdateDownloadedFixDataDocument, GetUserMvsAutoFixDocument, StreamBlameAiAnalysisRequestsDocument, StreamCommitBlameRequestsDocument, ScanSkillDocument, SkillVerdictsByMd5Document, LogMvsEventDocument, GetMvsProjectDocument, IssueTypesDocument, defaultWrapper;
154
166
  var init_client_generates = __esm({
155
167
  "src/features/analysis/scm/generates/client_generates.ts"() {
156
168
  "use strict";
@@ -558,6 +570,66 @@ var init_client_generates = __esm({
558
570
  state
559
571
  failReason
560
572
  }
573
+ }
574
+ `;
575
+ GetOrganizationIdDocument = `
576
+ query GetOrganizationId {
577
+ organization {
578
+ id
579
+ }
580
+ }
581
+ `;
582
+ UpdateOrgScanPolicyDocument = `
583
+ mutation UpdateOrgScanPolicy($organizationId: String!, $policyJson: String) {
584
+ updateOrganizationScanPolicy(
585
+ organizationId: $organizationId
586
+ policyJson: $policyJson
587
+ ) {
588
+ __typename
589
+ ... on ScanPolicyUpdateSuccess {
590
+ storedPolicyJson
591
+ warnings
592
+ }
593
+ ... on ScanPolicyValidationError {
594
+ error
595
+ }
596
+ }
597
+ }
598
+ `;
599
+ GetReportFindingRuleIdsDocument = `
600
+ query GetReportFindingRuleIds($fixReportId: uuid!) {
601
+ fixReport_by_pk(id: $fixReportId) {
602
+ vulnerabilityReport {
603
+ vulnerabilityReportIssues {
604
+ extraData(path: "rule_id")
605
+ }
606
+ }
607
+ }
608
+ }
609
+ `;
610
+ GetGateVerdictDocument = `
611
+ query getGateVerdict($fixReportId: String!) {
612
+ getGateVerdict(fixReportId: $fixReportId) {
613
+ __typename
614
+ ... on GateVerdictSuccess {
615
+ blocking
616
+ blockingCount
617
+ totalIssues
618
+ criticalCount
619
+ highCount
620
+ mediumCount
621
+ lowCount
622
+ unclassifiedCount
623
+ description
624
+ degraded
625
+ }
626
+ ... on GateVerdictNotReady {
627
+ state
628
+ }
629
+ ... on GateVerdictError {
630
+ error
631
+ }
632
+ }
561
633
  }
562
634
  `;
563
635
  GetAnalysisDocument = `
@@ -643,35 +715,20 @@ var init_client_generates = __esm({
643
715
  }
644
716
  `;
645
717
  GetVulByNodesMetadataDocument = `
646
- query getVulByNodesMetadata($filters: [vulnerability_report_issue_code_node_bool_exp!], $vulnerabilityReportId: uuid!) {
647
- vulnerabilityReportIssueCodeNodes: vulnerability_report_issue_code_node(
648
- order_by: {index: desc}
649
- where: {_or: $filters, vulnerabilityReportIssue: {fixId: {_is_null: false}, vulnerabilityReportId: {_eq: $vulnerabilityReportId}}}
718
+ query getVulByNodesMetadata($pathFilters: [vulnerability_report_issue_bool_exp!], $vulnerabilityReportId: uuid!) {
719
+ vulnerabilityReportIssues: vulnerability_report_issue(
720
+ where: {vulnerabilityReportId: {_eq: $vulnerabilityReportId}, _or: $pathFilters}
650
721
  ) {
651
- vulnerabilityReportIssueId
652
- path
653
- startLine
654
- vulnerabilityReportIssue {
655
- safeIssueType
656
- fixId
657
- category
658
- vulnerabilityReportIssueTags {
659
- tag: vulnerability_report_issue_tag_value
660
- }
722
+ id
723
+ safeIssueType
724
+ fixId
725
+ fpId
726
+ category
727
+ vulnerabilityReportIssueTags {
728
+ tag: vulnerability_report_issue_tag_value
661
729
  }
662
- }
663
- fixablePrVuls: vulnerability_report_issue_aggregate(
664
- where: {fixId: {_is_null: false}, vulnerabilityReportId: {_eq: $vulnerabilityReportId}, codeNodes: {_or: $filters}}
665
- ) {
666
- aggregate {
667
- count
668
- }
669
- }
670
- nonFixablePrVuls: vulnerability_report_issue_aggregate(
671
- where: {fixId: {_is_null: true}, vulnerabilityReportId: {_eq: $vulnerabilityReportId}, codeNodes: {_or: $filters}}
672
- ) {
673
- aggregate {
674
- count
730
+ codeNodesJson {
731
+ nodes
675
732
  }
676
733
  }
677
734
  totalScanVulnerabilities: vulnerability_report_issue_aggregate(
@@ -681,26 +738,6 @@ var init_client_generates = __esm({
681
738
  count
682
739
  }
683
740
  }
684
- irrelevantVulnerabilityReportIssue: vulnerability_report(
685
- where: {id: {_eq: $vulnerabilityReportId}}
686
- ) {
687
- vulnerabilityReportIssues(
688
- where: {fixId: {_is_null: true}, category: {_in: [Irrelevant, FalsePositive, Filtered]}, _not: {vulnerabilityReportIssueTags: {vulnerability_report_issue_tag_value: {_eq: SUPPRESSED}}}}
689
- ) {
690
- id
691
- safeIssueType
692
- fixId
693
- category
694
- vulnerabilityReportIssueTags {
695
- tag: vulnerability_report_issue_tag_value
696
- }
697
- codeNodes(order_by: {index: desc}, where: {_or: $filters}, limit: 1) {
698
- path
699
- startLine
700
- }
701
- fpId
702
- }
703
- }
704
741
  }
705
742
  `;
706
743
  GetFalsePositiveDocument = `
@@ -1815,7 +1852,7 @@ var init_validations = __esm({
1815
1852
 
1816
1853
  // src/features/analysis/scm/shared/src/types/types.ts
1817
1854
  import { z as z7 } from "zod";
1818
- var OrganizationScreenQueryParamsZ, ProjectPageQueryParamsZ, AnalysisPageQueryParamsZ, FixPageQueryParamsZ, IssuePageQueryParamsZ, CliLoginPageQueryParamsZ, AnalysisReportDigestedZ, IssueSharedStateZ2, ReportQueryResultZ, ReportFixesQueryFixZ, BaseVulnerabilityReportIssueZ, VulnerabilityReportIssueZ, VulnerabilityReportIssueWithCodeFilePathZ, GetReportIssuesQueryZ, FixReportByProjectZ, FixScreenQueryResultZ, FixPageQueryZ, GetReportFixesQueryZ, GetFixReportStatsQueryZ, ProjectVulnerabilityReport, GetProjectsQueryZ, ProjectPageQueryResultZ, GetProjectMembersDataZ, RepoArgsZ, scmCloudUrl, ScmType;
1855
+ var OrganizationScreenQueryParamsZ, ProjectPageQueryParamsZ, AnalysisPageQueryParamsZ, FixPageQueryParamsZ, IssuePageQueryParamsZ, CliLoginPageQueryParamsZ, AnalysisReportDigestedZ, IssueSharedStateZ2, ReportQueryResultZ, ReportFixesQueryFixZ, BaseVulnerabilityReportIssueZ, VulnerabilityReportIssueWithCodeFilePathZ, GetReportIssuesQueryZ, FixReportByProjectZ, FixScreenQueryResultZ, FixPageQueryZ, GetReportFixesQueryZ, GetFixReportStatsQueryZ, ProjectVulnerabilityReport, GetProjectsQueryZ, ProjectPageQueryResultZ, GetProjectMembersDataZ, RepoArgsZ, scmCloudUrl, ScmType;
1819
1856
  var init_types = __esm({
1820
1857
  "src/features/analysis/scm/shared/src/types/types.ts"() {
1821
1858
  "use strict";
@@ -2077,11 +2114,6 @@ var init_types = __esm({
2077
2114
  ),
2078
2115
  sharedState: VulnerabilityReportIssueSharedStateZ
2079
2116
  });
2080
- VulnerabilityReportIssueZ = BaseVulnerabilityReportIssueZ.extend(
2081
- z7.object({
2082
- codeNodes: z7.array(z7.object({ path: z7.string() }))
2083
- }).shape
2084
- );
2085
2117
  VulnerabilityReportIssueWithCodeFilePathZ = BaseVulnerabilityReportIssueZ.extend(
2086
2118
  z7.object({
2087
2119
  codeFilePath: z7.string().nullable()
@@ -4354,6 +4386,17 @@ var defaultLogger = {
4354
4386
  // src/utils/index.ts
4355
4387
  var sleep = (ms = 2e3) => new Promise((r) => setTimeout(r, ms));
4356
4388
  var CliError = class extends Error {
4389
+ constructor(message, options = {}) {
4390
+ super(message);
4391
+ /**
4392
+ * The process exit code index.ts maps this error to. Defaults to 1 (plain
4393
+ * operational error) so every existing throw keeps its behavior; 2 means the
4394
+ * gate policy blocked the run (MOBB-3810), so CI can tell "your code is
4395
+ * gated" from "the tool broke".
4396
+ */
4397
+ __publicField(this, "exitCode");
4398
+ this.exitCode = options.exitCode ?? 1;
4399
+ }
4357
4400
  };
4358
4401
 
4359
4402
  // src/commands/AuthManager.ts
@@ -4959,65 +5002,104 @@ init_client_generates();
4959
5002
  // src/features/analysis/graphql/types.ts
4960
5003
  init_client_generates();
4961
5004
  import { z as z22 } from "zod";
4962
- var VulnerabilityReportIssueCodeNodeZ = z22.object({
4963
- vulnerabilityReportIssueId: z22.string(),
5005
+ function codeNodesJsonPathFilter(path7) {
5006
+ return { codeNodesJson: { nodes: { _contains: [{ path: path7 }] } } };
5007
+ }
5008
+ var VulByNodesMetadataCodeNodeZ = z22.object({
5009
+ index: z22.number().int(),
4964
5010
  path: z22.string(),
4965
- startLine: z22.number(),
4966
- vulnerabilityReportIssue: z22.object({
4967
- fixId: z22.string(),
4968
- category: z22.enum(Vulnerability_Report_Issue_Category_Enum),
4969
- safeIssueType: z22.string(),
4970
- vulnerabilityReportIssueTags: z22.array(
4971
- z22.object({
4972
- tag: z22.enum(Vulnerability_Report_Issue_Tag_Enum)
4973
- })
4974
- )
4975
- })
4976
- });
4977
- var VulnerabilityReportIssueNoFixCodeNodeZ = z22.object({
4978
- vulnerabilityReportIssues: z22.array(
5011
+ startLine: z22.number().int(),
5012
+ endLine: z22.number().int()
5013
+ }).loose();
5014
+ var VulnerabilityReportIssueWithNodesZ = z22.object({
5015
+ id: z22.string(),
5016
+ fixId: z22.string().nullable(),
5017
+ category: z22.enum(Vulnerability_Report_Issue_Category_Enum),
5018
+ safeIssueType: z22.string(),
5019
+ fpId: z22.guid().nullable(),
5020
+ vulnerabilityReportIssueTags: z22.array(
4979
5021
  z22.object({
4980
- id: z22.string(),
4981
- fixId: z22.string().nullable(),
4982
- category: z22.enum(Vulnerability_Report_Issue_Category_Enum),
4983
- safeIssueType: z22.string(),
4984
- fpId: z22.guid().nullable(),
4985
- codeNodes: z22.array(
4986
- z22.object({
4987
- path: z22.string(),
4988
- startLine: z22.number()
4989
- })
4990
- ),
4991
- vulnerabilityReportIssueTags: z22.array(
4992
- z22.object({
4993
- tag: z22.enum(Vulnerability_Report_Issue_Tag_Enum)
4994
- })
4995
- )
5022
+ tag: z22.enum(Vulnerability_Report_Issue_Tag_Enum)
4996
5023
  })
4997
- )
5024
+ ),
5025
+ codeNodesJson: z22.object({ nodes: z22.unknown() }).nullable()
4998
5026
  });
4999
5027
  var GetVulByNodesMetadataZ = z22.object({
5000
- vulnerabilityReportIssueCodeNodes: z22.array(VulnerabilityReportIssueCodeNodeZ),
5001
- nonFixablePrVuls: z22.object({
5002
- aggregate: z22.object({
5003
- count: z22.number()
5004
- })
5005
- }),
5006
- fixablePrVuls: z22.object({
5007
- aggregate: z22.object({
5008
- count: z22.number()
5009
- })
5010
- }),
5028
+ vulnerabilityReportIssues: z22.array(VulnerabilityReportIssueWithNodesZ),
5011
5029
  totalScanVulnerabilities: z22.object({
5012
5030
  aggregate: z22.object({
5013
5031
  count: z22.number()
5014
5032
  })
5015
- }),
5016
- irrelevantVulnerabilityReportIssue: z22.array(
5017
- VulnerabilityReportIssueNoFixCodeNodeZ
5018
- )
5033
+ })
5019
5034
  });
5020
5035
 
5036
+ // src/features/analysis/graphql/matchVulByNodesMetadata.ts
5037
+ var IRRELEVANT_CATEGORIES = /* @__PURE__ */ new Set([
5038
+ "Irrelevant",
5039
+ "FalsePositive",
5040
+ "Filtered"
5041
+ ]);
5042
+ var SUPPRESSED_TAG = "SUPPRESSED";
5043
+ function nodeMatchesHunks(node, hunks) {
5044
+ return hunks.some(
5045
+ (hunk) => hunk.path === node.path && hunk.ranges.some(
5046
+ ({ startLine, endLine }) => node.startLine >= startLine && node.startLine <= endLine || node.endLine >= startLine && node.endLine <= endLine
5047
+ )
5048
+ );
5049
+ }
5050
+ function matchingNodes(issue, hunks) {
5051
+ const rawNodes = issue.codeNodesJson?.nodes;
5052
+ if (!Array.isArray(rawNodes)) {
5053
+ return [];
5054
+ }
5055
+ return rawNodes.map((rawNode) => VulByNodesMetadataCodeNodeZ.safeParse(rawNode)).filter((parsed) => parsed.success).map((parsed) => parsed.data).filter((node) => nodeMatchesHunks(node, hunks)).sort((a, b) => b.index - a.index);
5056
+ }
5057
+ function matchVulByNodesMetadata(issues, hunks) {
5058
+ const vulnerabilityReportIssueCodeNodes = [];
5059
+ let fixablePrVuls = 0;
5060
+ let nonFixablePrVuls = 0;
5061
+ const irrelevantVulnerabilityReportIssues = [];
5062
+ for (const issue of issues) {
5063
+ const nodes = matchingNodes(issue, hunks);
5064
+ const bestNode = nodes[0];
5065
+ if (issue.fixId !== null && bestNode) {
5066
+ fixablePrVuls += 1;
5067
+ vulnerabilityReportIssueCodeNodes.push({
5068
+ vulnerabilityReportIssueId: issue.id,
5069
+ path: bestNode.path,
5070
+ startLine: bestNode.startLine,
5071
+ vulnerabilityReportIssue: {
5072
+ fixId: issue.fixId,
5073
+ category: issue.category,
5074
+ safeIssueType: issue.safeIssueType,
5075
+ vulnerabilityReportIssueTags: issue.vulnerabilityReportIssueTags
5076
+ }
5077
+ });
5078
+ } else if (issue.fixId === null && bestNode) {
5079
+ nonFixablePrVuls += 1;
5080
+ }
5081
+ if (issue.fixId === null && IRRELEVANT_CATEGORIES.has(issue.category) && !issue.vulnerabilityReportIssueTags.some(
5082
+ (issueTag) => issueTag.tag === SUPPRESSED_TAG
5083
+ )) {
5084
+ irrelevantVulnerabilityReportIssues.push({
5085
+ id: issue.id,
5086
+ safeIssueType: issue.safeIssueType,
5087
+ fixId: issue.fixId,
5088
+ category: issue.category,
5089
+ vulnerabilityReportIssueTags: issue.vulnerabilityReportIssueTags,
5090
+ codeNodes: bestNode ? [{ path: bestNode.path, startLine: bestNode.startLine }] : [],
5091
+ fpId: issue.fpId
5092
+ });
5093
+ }
5094
+ }
5095
+ return {
5096
+ vulnerabilityReportIssueCodeNodes,
5097
+ fixablePrVuls,
5098
+ nonFixablePrVuls,
5099
+ irrelevantVulnerabilityReportIssues
5100
+ };
5101
+ }
5102
+
5021
5103
  // src/features/analysis/graphql/gql.ts
5022
5104
  var debug7 = Debug6("mobbdev:gql");
5023
5105
  function isAuthError(error) {
@@ -5225,44 +5307,28 @@ var GQLClient = class {
5225
5307
  hunks,
5226
5308
  vulnerabilityReportId
5227
5309
  }) {
5228
- const filters = hunks.map((hunk) => {
5229
- const filter = {
5230
- path: { _eq: hunk.path },
5231
- _or: hunk.ranges.flatMap(({ endLine, startLine }) => {
5232
- return [
5233
- { startLine: { _gte: startLine, _lte: endLine } },
5234
- { endLine: { _gte: startLine, _lte: endLine } }
5235
- ];
5236
- })
5237
- };
5238
- return filter;
5239
- });
5310
+ const pathFilters = hunks.map((hunk) => codeNodesJsonPathFilter(hunk.path));
5240
5311
  const getVulByNodesMetadataRes = await this._clientSdk.getVulByNodesMetadata({
5241
- filters: { _or: filters },
5312
+ pathFilters,
5242
5313
  vulnerabilityReportId
5243
5314
  });
5244
5315
  const parsedGetVulByNodesMetadataRes = GetVulByNodesMetadataZ.parse(
5245
5316
  getVulByNodesMetadataRes
5246
5317
  );
5247
- const uniqueVulByNodesMetadata = parsedGetVulByNodesMetadataRes.vulnerabilityReportIssueCodeNodes.reduce((acc, vulnerabilityReportIssueCodeNode) => {
5248
- if (acc[vulnerabilityReportIssueCodeNode.vulnerabilityReportIssueId]) {
5249
- return acc;
5250
- }
5251
- return {
5252
- ...acc,
5253
- [vulnerabilityReportIssueCodeNode.vulnerabilityReportIssueId]: vulnerabilityReportIssueCodeNode
5254
- };
5255
- }, {});
5256
- const nonFixablePrVuls = parsedGetVulByNodesMetadataRes.nonFixablePrVuls.aggregate.count;
5257
- const fixablePrVuls = parsedGetVulByNodesMetadataRes.fixablePrVuls.aggregate.count;
5318
+ const {
5319
+ vulnerabilityReportIssueCodeNodes,
5320
+ fixablePrVuls,
5321
+ nonFixablePrVuls,
5322
+ irrelevantVulnerabilityReportIssues
5323
+ } = matchVulByNodesMetadata(
5324
+ parsedGetVulByNodesMetadataRes.vulnerabilityReportIssues,
5325
+ hunks
5326
+ );
5258
5327
  const totalScanVulnerabilities = parsedGetVulByNodesMetadataRes.totalScanVulnerabilities.aggregate.count;
5259
5328
  const vulnerabilitiesOutsidePr = totalScanVulnerabilities - nonFixablePrVuls - fixablePrVuls;
5260
5329
  const totalPrVulnerabilities = nonFixablePrVuls + fixablePrVuls;
5261
- const irrelevantVulnerabilityReportIssues = parsedGetVulByNodesMetadataRes.irrelevantVulnerabilityReportIssue?.[0]?.vulnerabilityReportIssues ?? [];
5262
5330
  return {
5263
- vulnerabilityReportIssueCodeNodes: Object.values(
5264
- uniqueVulByNodesMetadata
5265
- ),
5331
+ vulnerabilityReportIssueCodeNodes,
5266
5332
  nonFixablePrVuls,
5267
5333
  fixablePrVuls,
5268
5334
  totalScanVulnerabilities,
@@ -5470,6 +5536,14 @@ var GQLClient = class {
5470
5536
  }
5471
5537
  return res.analysis;
5472
5538
  }
5539
+ /**
5540
+ * The gate verdict for a Mobb-scan report (MOBB-3810). The backend is the
5541
+ * only decider; the caller maps the answer onto an exit code.
5542
+ */
5543
+ async getGateVerdict(fixReportId) {
5544
+ const res = await this._clientSdk.getGateVerdict({ fixReportId });
5545
+ return res.getGateVerdict;
5546
+ }
5473
5547
  async autoPrAnalysis({
5474
5548
  analysisId,
5475
5549
  commitDirectly,