mobbdev 1.4.41 → 1.4.43
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/args/commands/upload_ai_blame.d.mts +22 -150
- package/dist/args/commands/upload_ai_blame.mjs +112 -112
- package/dist/index.mjs +386 -450
- package/package.json +11 -11
package/dist/index.mjs
CHANGED
|
@@ -1350,7 +1350,7 @@ var init_getIssueType = __esm({
|
|
|
1350
1350
|
["Unfixable" /* Unfixable */]: "Unfixable",
|
|
1351
1351
|
["Unsupported" /* Unsupported */]: "Unsupported"
|
|
1352
1352
|
};
|
|
1353
|
-
statusZ = z.
|
|
1353
|
+
statusZ = z.enum(Vulnerability_Report_Issue_State_Enum);
|
|
1354
1354
|
issueDescription = {
|
|
1355
1355
|
["AUTOGENERATED_CODE" /* AutogeneratedCode */]: "The flagged code is generated automatically by tools or frameworks as part of the build or runtime process. This categorization highlights that **the issue resides in non-manual code**, which often requires tool-specific solutions or exemptions.",
|
|
1356
1356
|
["AUXILIARY_CODE" /* AuxiliaryCode */]: "The flagged code is auxiliary or supporting code, such as configuration files, build scripts, or other non-application logic. This categorization indicates that the issue is not directly related to the application's core functionality.",
|
|
@@ -1371,7 +1371,7 @@ var init_shared = __esm({
|
|
|
1371
1371
|
"src/features/analysis/scm/shared/src/types/shared.ts"() {
|
|
1372
1372
|
"use strict";
|
|
1373
1373
|
init_client_generates();
|
|
1374
|
-
ParsedSeverityZ = z2.
|
|
1374
|
+
ParsedSeverityZ = z2.enum(Vulnerability_Severity_Enum).nullish().transform((i) => i ?? "low" /* Low */);
|
|
1375
1375
|
ScmSubmitFixRequestsZ = z2.array(
|
|
1376
1376
|
z2.object({
|
|
1377
1377
|
scmSubmitFixRequest: z2.object({
|
|
@@ -1382,7 +1382,7 @@ var init_shared = __esm({
|
|
|
1382
1382
|
targetBranchName: z2.string().default("")
|
|
1383
1383
|
}),
|
|
1384
1384
|
prUrl: z2.string().nullable(),
|
|
1385
|
-
prStatus: z2.
|
|
1385
|
+
prStatus: z2.enum(Pr_Status_Enum).nullable(),
|
|
1386
1386
|
commitUrl: z2.string().nullable(),
|
|
1387
1387
|
scmId: z2.string()
|
|
1388
1388
|
})
|
|
@@ -1405,8 +1405,8 @@ var init_fix = __esm({
|
|
|
1405
1405
|
envName: z3.string().nullable()
|
|
1406
1406
|
});
|
|
1407
1407
|
ManifestActionRequiredZ = z3.object({
|
|
1408
|
-
action: z3.
|
|
1409
|
-
language: z3.
|
|
1408
|
+
action: z3.enum(ManifestAction),
|
|
1409
|
+
language: z3.enum(Language),
|
|
1410
1410
|
lib: PackageInfoZ,
|
|
1411
1411
|
typesLib: PackageInfoZ.nullable()
|
|
1412
1412
|
});
|
|
@@ -1442,7 +1442,7 @@ var init_fix = __esm({
|
|
|
1442
1442
|
index: z3.number(),
|
|
1443
1443
|
defaultValue: z3.string(),
|
|
1444
1444
|
value: z3.string().nullable(),
|
|
1445
|
-
inputType: z3.
|
|
1445
|
+
inputType: z3.enum(FixQuestionInputType),
|
|
1446
1446
|
options: z3.array(z3.string()),
|
|
1447
1447
|
// E-2015: analyzer-served question text. default('') so a query that
|
|
1448
1448
|
// omits these still parses (-> ''), while the output type stays a required
|
|
@@ -1457,7 +1457,7 @@ var init_fix = __esm({
|
|
|
1457
1457
|
});
|
|
1458
1458
|
FixRatingZ = z3.object({
|
|
1459
1459
|
voteScore: z3.number(),
|
|
1460
|
-
fixRatingTag: z3.
|
|
1460
|
+
fixRatingTag: z3.enum(Fix_Rating_Tag_Enum).nullable().default(null),
|
|
1461
1461
|
comment: z3.string().nullable().default(null),
|
|
1462
1462
|
updatedDate: z3.string().nullable(),
|
|
1463
1463
|
user: z3.object({
|
|
@@ -1487,7 +1487,7 @@ var init_fix = __esm({
|
|
|
1487
1487
|
issueRatings: z3.array(IssueRatingZ).default([])
|
|
1488
1488
|
}).nullable();
|
|
1489
1489
|
FixSharedStateZ = z3.object({
|
|
1490
|
-
state: z3.
|
|
1490
|
+
state: z3.enum(Fix_State_Enum),
|
|
1491
1491
|
isArchived: z3.boolean(),
|
|
1492
1492
|
scmSubmitFixRequests: ScmSubmitFixRequestsZ,
|
|
1493
1493
|
fixRatings: z3.array(FixRatingZ).default([])
|
|
@@ -1501,14 +1501,14 @@ var init_fix = __esm({
|
|
|
1501
1501
|
);
|
|
1502
1502
|
FixQueryZ = z3.object({
|
|
1503
1503
|
__typename: z3.literal("fix").optional(),
|
|
1504
|
-
id: z3.
|
|
1504
|
+
id: z3.guid(),
|
|
1505
1505
|
sharedState: FixSharedStateZ,
|
|
1506
1506
|
modifiedBy: z3.string().nullable(),
|
|
1507
1507
|
gitBlameLogin: z3.string().nullable(),
|
|
1508
1508
|
safeIssueLanguage: z3.string(),
|
|
1509
1509
|
safeIssueType: z3.string(),
|
|
1510
1510
|
confidence: z3.number(),
|
|
1511
|
-
fixReportId: z3.
|
|
1511
|
+
fixReportId: z3.guid(),
|
|
1512
1512
|
isExpired: z3.boolean().default(false),
|
|
1513
1513
|
fixFiles: z3.array(
|
|
1514
1514
|
z3.object({
|
|
@@ -1516,23 +1516,23 @@ var init_fix = __esm({
|
|
|
1516
1516
|
})
|
|
1517
1517
|
),
|
|
1518
1518
|
numberOfVulnerabilityIssues: z3.number(),
|
|
1519
|
-
severityText: z3.
|
|
1519
|
+
severityText: z3.enum(Vulnerability_Severity_Enum),
|
|
1520
1520
|
vulnerabilityReportIssues: z3.array(
|
|
1521
1521
|
z3.object({
|
|
1522
1522
|
vendorIssueId: z3.string(),
|
|
1523
1523
|
issueLanguage: z3.string(),
|
|
1524
1524
|
parsedSeverity: ParsedSeverityZ,
|
|
1525
1525
|
sharedState: z3.object({
|
|
1526
|
-
id: z3.
|
|
1526
|
+
id: z3.guid(),
|
|
1527
1527
|
isArchived: z3.boolean(),
|
|
1528
|
-
ticketIntegrationId: z3.
|
|
1528
|
+
ticketIntegrationId: z3.guid().nullable()
|
|
1529
1529
|
}).nullable()
|
|
1530
1530
|
})
|
|
1531
1531
|
),
|
|
1532
1532
|
patchAndQuestions: PatchAndQuestionsZ,
|
|
1533
|
-
effortToApplyFix: z3.
|
|
1533
|
+
effortToApplyFix: z3.enum(Effort_To_Apply_Fix_Enum).nullable()
|
|
1534
1534
|
});
|
|
1535
|
-
FixPartsForFixScreenZ = FixQueryZ.
|
|
1535
|
+
FixPartsForFixScreenZ = FixQueryZ.extend(
|
|
1536
1536
|
z3.object({
|
|
1537
1537
|
vulnerabilityReportIssues: z3.array(
|
|
1538
1538
|
z3.object({
|
|
@@ -1542,7 +1542,7 @@ var init_fix = __esm({
|
|
|
1542
1542
|
sharedState: IssueSharedStateZ
|
|
1543
1543
|
})
|
|
1544
1544
|
)
|
|
1545
|
-
})
|
|
1545
|
+
}).shape
|
|
1546
1546
|
);
|
|
1547
1547
|
}
|
|
1548
1548
|
});
|
|
@@ -1556,10 +1556,10 @@ var init_analysis = __esm({
|
|
|
1556
1556
|
init_client_generates();
|
|
1557
1557
|
init_client_generates();
|
|
1558
1558
|
FixPageFixReportZ = z4.object({
|
|
1559
|
-
id: z4.
|
|
1559
|
+
id: z4.guid(),
|
|
1560
1560
|
analysisUrl: z4.string(),
|
|
1561
1561
|
createdOn: z4.string(),
|
|
1562
|
-
state: z4.
|
|
1562
|
+
state: z4.enum(Fix_Report_State_Enum),
|
|
1563
1563
|
repo: z4.object({
|
|
1564
1564
|
name: z4.string().nullable(),
|
|
1565
1565
|
originalUrl: z4.string(),
|
|
@@ -1576,12 +1576,12 @@ var init_analysis = __esm({
|
|
|
1576
1576
|
}
|
|
1577
1577
|
),
|
|
1578
1578
|
vulnerabilityReport: z4.object({
|
|
1579
|
-
id: z4.
|
|
1580
|
-
vendor: z4.
|
|
1581
|
-
computedVendor: z4.
|
|
1582
|
-
projectId: z4.
|
|
1579
|
+
id: z4.guid(),
|
|
1580
|
+
vendor: z4.enum(Vulnerability_Report_Vendor_Enum),
|
|
1581
|
+
computedVendor: z4.enum(Vulnerability_Report_Vendor_Enum),
|
|
1582
|
+
projectId: z4.guid(),
|
|
1583
1583
|
project: z4.object({
|
|
1584
|
-
organizationId: z4.
|
|
1584
|
+
organizationId: z4.guid()
|
|
1585
1585
|
})
|
|
1586
1586
|
})
|
|
1587
1587
|
});
|
|
@@ -1609,10 +1609,10 @@ var init_issue = __esm({
|
|
|
1609
1609
|
})
|
|
1610
1610
|
});
|
|
1611
1611
|
VulnerabilityReportIssueSharedStateZ = z5.object({
|
|
1612
|
-
id: z5.
|
|
1612
|
+
id: z5.guid(),
|
|
1613
1613
|
createdAt: z5.string(),
|
|
1614
1614
|
isArchived: z5.boolean(),
|
|
1615
|
-
ticketIntegrationId: z5.
|
|
1615
|
+
ticketIntegrationId: z5.guid().nullable(),
|
|
1616
1616
|
ticketIntegrations: z5.array(
|
|
1617
1617
|
z5.object({
|
|
1618
1618
|
url: z5.string()
|
|
@@ -1621,12 +1621,12 @@ var init_issue = __esm({
|
|
|
1621
1621
|
issueRatings: z5.array(VulnerabilityReportIssueRatingZ).default([])
|
|
1622
1622
|
}).nullish();
|
|
1623
1623
|
BaseIssuePartsZ = z5.object({
|
|
1624
|
-
id: z5.
|
|
1624
|
+
id: z5.guid(),
|
|
1625
1625
|
safeIssueType: z5.string(),
|
|
1626
1626
|
safeIssueLanguage: z5.string(),
|
|
1627
1627
|
createdAt: z5.string(),
|
|
1628
1628
|
parsedSeverity: ParsedSeverityZ,
|
|
1629
|
-
category: z5.
|
|
1629
|
+
category: z5.enum(Vulnerability_Report_Issue_Category_Enum),
|
|
1630
1630
|
extraData: z5.object({
|
|
1631
1631
|
missing_files: z5.string().array().nullish(),
|
|
1632
1632
|
error_files: z5.string().array().nullish(),
|
|
@@ -1634,7 +1634,7 @@ var init_issue = __esm({
|
|
|
1634
1634
|
}),
|
|
1635
1635
|
vulnerabilityReportIssueTags: z5.array(
|
|
1636
1636
|
z5.object({
|
|
1637
|
-
tag: z5.
|
|
1637
|
+
tag: z5.enum(Vulnerability_Report_Issue_Tag_Enum)
|
|
1638
1638
|
})
|
|
1639
1639
|
),
|
|
1640
1640
|
codeNodes: z5.array(
|
|
@@ -1674,7 +1674,7 @@ var init_issue = __esm({
|
|
|
1674
1674
|
})
|
|
1675
1675
|
}).nullish(),
|
|
1676
1676
|
sharedState: VulnerabilityReportIssueSharedStateZ,
|
|
1677
|
-
unfixableId: z5.
|
|
1677
|
+
unfixableId: z5.guid().nullish()
|
|
1678
1678
|
});
|
|
1679
1679
|
FalsePositivePartsZ = z5.object({
|
|
1680
1680
|
extraContext: z5.array(z5.object({ key: z5.string(), value: z5.string() })),
|
|
@@ -1684,20 +1684,20 @@ var init_issue = __esm({
|
|
|
1684
1684
|
extraContext: z5.array(z5.object({ key: z5.string(), value: z5.string() })),
|
|
1685
1685
|
fixDescription: z5.string()
|
|
1686
1686
|
});
|
|
1687
|
-
IssuePartsWithFixZ = BaseIssuePartsZ.
|
|
1687
|
+
IssuePartsWithFixZ = BaseIssuePartsZ.extend(
|
|
1688
1688
|
z5.object({
|
|
1689
1689
|
category: z5.literal("Irrelevant" /* Irrelevant */),
|
|
1690
1690
|
fix: FixPartsForFixScreenZ.nullish()
|
|
1691
|
-
})
|
|
1691
|
+
}).shape
|
|
1692
1692
|
);
|
|
1693
|
-
IssuePartsFpZ = BaseIssuePartsZ.
|
|
1693
|
+
IssuePartsFpZ = BaseIssuePartsZ.extend(
|
|
1694
1694
|
z5.object({
|
|
1695
1695
|
category: z5.literal("FalsePositive" /* FalsePositive */),
|
|
1696
|
-
fpId: z5.
|
|
1696
|
+
fpId: z5.guid(),
|
|
1697
1697
|
getFalsePositive: FalsePositivePartsZ
|
|
1698
|
-
})
|
|
1698
|
+
}).shape
|
|
1699
1699
|
);
|
|
1700
|
-
GeneralIssueZ = BaseIssuePartsZ.
|
|
1700
|
+
GeneralIssueZ = BaseIssuePartsZ.extend(
|
|
1701
1701
|
z5.object({
|
|
1702
1702
|
category: z5.union([
|
|
1703
1703
|
z5.literal("NoFix" /* NoFix */),
|
|
@@ -1707,7 +1707,7 @@ var init_issue = __esm({
|
|
|
1707
1707
|
z5.literal("Pending" /* Pending */)
|
|
1708
1708
|
]),
|
|
1709
1709
|
getUnfixable: UnfixablePartsZ.nullish()
|
|
1710
|
-
})
|
|
1710
|
+
}).shape
|
|
1711
1711
|
);
|
|
1712
1712
|
IssuePartsZ = z5.union([
|
|
1713
1713
|
IssuePartsFpZ,
|
|
@@ -1718,10 +1718,10 @@ var init_issue = __esm({
|
|
|
1718
1718
|
currentIndex: z5.number(),
|
|
1719
1719
|
totalIssues: z5.number(),
|
|
1720
1720
|
nextIssue: z5.object({
|
|
1721
|
-
id: z5.
|
|
1721
|
+
id: z5.guid()
|
|
1722
1722
|
}).nullish(),
|
|
1723
1723
|
prevIssue: z5.object({
|
|
1724
|
-
id: z5.
|
|
1724
|
+
id: z5.guid()
|
|
1725
1725
|
}).nullish()
|
|
1726
1726
|
});
|
|
1727
1727
|
GetIssueScreenDataZ = z5.object({
|
|
@@ -1805,29 +1805,29 @@ var init_types = __esm({
|
|
|
1805
1805
|
init_issue();
|
|
1806
1806
|
init_shared();
|
|
1807
1807
|
OrganizationScreenQueryParamsZ = z7.object({
|
|
1808
|
-
organizationId: z7.
|
|
1808
|
+
organizationId: z7.guid()
|
|
1809
1809
|
});
|
|
1810
1810
|
ProjectPageQueryParamsZ = z7.object({
|
|
1811
|
-
organizationId: z7.
|
|
1812
|
-
projectId: z7.
|
|
1811
|
+
organizationId: z7.guid(),
|
|
1812
|
+
projectId: z7.guid()
|
|
1813
1813
|
});
|
|
1814
1814
|
AnalysisPageQueryParamsZ = ProjectPageQueryParamsZ.extend({
|
|
1815
|
-
reportId: z7.
|
|
1815
|
+
reportId: z7.guid()
|
|
1816
1816
|
});
|
|
1817
1817
|
FixPageQueryParamsZ = AnalysisPageQueryParamsZ.extend({
|
|
1818
|
-
fixId: z7.
|
|
1818
|
+
fixId: z7.guid()
|
|
1819
1819
|
});
|
|
1820
1820
|
IssuePageQueryParamsZ = AnalysisPageQueryParamsZ.extend({
|
|
1821
|
-
issueId: z7.
|
|
1821
|
+
issueId: z7.guid()
|
|
1822
1822
|
});
|
|
1823
1823
|
CliLoginPageQueryParamsZ = z7.object({
|
|
1824
|
-
loginId: z7.
|
|
1824
|
+
loginId: z7.guid()
|
|
1825
1825
|
});
|
|
1826
1826
|
AnalysisReportDigestedZ = z7.object({
|
|
1827
|
-
id: z7.
|
|
1828
|
-
state: z7.
|
|
1827
|
+
id: z7.guid(),
|
|
1828
|
+
state: z7.enum(Fix_Report_State_Enum),
|
|
1829
1829
|
vulnerabilityReport: z7.object({
|
|
1830
|
-
reportSummaryUrl: z7.
|
|
1830
|
+
reportSummaryUrl: z7.url().nullish(),
|
|
1831
1831
|
scanDate: z7.string().nullable(),
|
|
1832
1832
|
supported: z7.object({
|
|
1833
1833
|
aggregate: z7.object({
|
|
@@ -1839,17 +1839,17 @@ var init_types = __esm({
|
|
|
1839
1839
|
count: z7.number()
|
|
1840
1840
|
})
|
|
1841
1841
|
}),
|
|
1842
|
-
vendor: z7.
|
|
1842
|
+
vendor: z7.enum(Vulnerability_Report_Vendor_Enum),
|
|
1843
1843
|
project: z7.object({
|
|
1844
|
-
organizationId: z7.
|
|
1844
|
+
organizationId: z7.guid()
|
|
1845
1845
|
})
|
|
1846
1846
|
})
|
|
1847
1847
|
});
|
|
1848
1848
|
IssueSharedStateZ2 = z7.object({
|
|
1849
|
-
id: z7.
|
|
1849
|
+
id: z7.guid(),
|
|
1850
1850
|
createdAt: z7.string(),
|
|
1851
1851
|
isArchived: z7.boolean(),
|
|
1852
|
-
ticketIntegrationId: z7.
|
|
1852
|
+
ticketIntegrationId: z7.guid().nullable(),
|
|
1853
1853
|
ticketIntegrations: z7.array(
|
|
1854
1854
|
z7.object({
|
|
1855
1855
|
url: z7.string()
|
|
@@ -1858,7 +1858,7 @@ var init_types = __esm({
|
|
|
1858
1858
|
}).nullable();
|
|
1859
1859
|
ReportQueryResultZ = z7.object({
|
|
1860
1860
|
fixReport_by_pk: z7.object({
|
|
1861
|
-
id: z7.
|
|
1861
|
+
id: z7.guid(),
|
|
1862
1862
|
analysisUrl: z7.string(),
|
|
1863
1863
|
fixesCommitted: z7.object({
|
|
1864
1864
|
aggregate: z7.object({ count: z7.number() })
|
|
@@ -1877,19 +1877,19 @@ var init_types = __esm({
|
|
|
1877
1877
|
vulnerabilitySeverities: z7.record(z7.string(), z7.number()).nullable(),
|
|
1878
1878
|
createdOn: z7.string(),
|
|
1879
1879
|
expirationOn: z7.string().nullable(),
|
|
1880
|
-
state: z7.
|
|
1880
|
+
state: z7.enum(Fix_Report_State_Enum),
|
|
1881
1881
|
failReason: z7.string().nullable(),
|
|
1882
1882
|
candidateToRerun: z7.boolean(),
|
|
1883
1883
|
fixes: z7.array(
|
|
1884
1884
|
z7.object({
|
|
1885
|
-
id: z7.
|
|
1885
|
+
id: z7.guid(),
|
|
1886
1886
|
safeIssueLanguage: z7.string(),
|
|
1887
1887
|
safeIssueType: z7.string(),
|
|
1888
1888
|
confidence: z7.number(),
|
|
1889
|
-
effortToApplyFix: z7.
|
|
1889
|
+
effortToApplyFix: z7.enum(Effort_To_Apply_Fix_Enum).nullable(),
|
|
1890
1890
|
modifiedBy: z7.string().nullable(),
|
|
1891
1891
|
gitBlameLogin: z7.string().nullable(),
|
|
1892
|
-
fixReportId: z7.
|
|
1892
|
+
fixReportId: z7.guid(),
|
|
1893
1893
|
filePaths: z7.array(
|
|
1894
1894
|
z7.object({
|
|
1895
1895
|
fileRepoRelativePath: z7.string()
|
|
@@ -1897,13 +1897,13 @@ var init_types = __esm({
|
|
|
1897
1897
|
),
|
|
1898
1898
|
sharedState: FixSharedStateZ,
|
|
1899
1899
|
numberOfVulnerabilityIssues: z7.number(),
|
|
1900
|
-
severityText: z7.
|
|
1900
|
+
severityText: z7.enum(Vulnerability_Severity_Enum),
|
|
1901
1901
|
vulnerabilityReportIssues: z7.array(
|
|
1902
1902
|
z7.object({
|
|
1903
|
-
id: z7.
|
|
1903
|
+
id: z7.guid(),
|
|
1904
1904
|
issueType: z7.string(),
|
|
1905
1905
|
issueLanguage: z7.string(),
|
|
1906
|
-
category: z7.
|
|
1906
|
+
category: z7.enum(Vulnerability_Report_Issue_Category_Enum),
|
|
1907
1907
|
sharedState: IssueSharedStateZ2
|
|
1908
1908
|
})
|
|
1909
1909
|
)
|
|
@@ -1930,19 +1930,19 @@ var init_types = __esm({
|
|
|
1930
1930
|
})
|
|
1931
1931
|
}),
|
|
1932
1932
|
vulnerabilityReport: z7.object({
|
|
1933
|
-
id: z7.
|
|
1934
|
-
reportSummaryUrl: z7.
|
|
1935
|
-
computedVendor: z7.
|
|
1936
|
-
vendor: z7.
|
|
1933
|
+
id: z7.guid(),
|
|
1934
|
+
reportSummaryUrl: z7.url().nullish(),
|
|
1935
|
+
computedVendor: z7.enum(Vulnerability_Report_Vendor_Enum).nullable(),
|
|
1936
|
+
vendor: z7.enum(Vulnerability_Report_Vendor_Enum).nullable(),
|
|
1937
1937
|
issuesWithKnownLanguage: z7.number().nullable(),
|
|
1938
1938
|
scanDate: z7.string().nullable(),
|
|
1939
|
-
vendorReportId: z7.
|
|
1940
|
-
projectId: z7.
|
|
1939
|
+
vendorReportId: z7.guid().nullable(),
|
|
1940
|
+
projectId: z7.guid(),
|
|
1941
1941
|
project: z7.object({
|
|
1942
|
-
organizationId: z7.
|
|
1942
|
+
organizationId: z7.guid()
|
|
1943
1943
|
}),
|
|
1944
1944
|
file: z7.object({
|
|
1945
|
-
id: z7.
|
|
1945
|
+
id: z7.guid(),
|
|
1946
1946
|
path: z7.string()
|
|
1947
1947
|
}).nullable(),
|
|
1948
1948
|
pending: z7.object({
|
|
@@ -1986,7 +1986,7 @@ var init_types = __esm({
|
|
|
1986
1986
|
})
|
|
1987
1987
|
}),
|
|
1988
1988
|
vulnerabilityReportIssues: z7.object({
|
|
1989
|
-
id: z7.
|
|
1989
|
+
id: z7.guid(),
|
|
1990
1990
|
extraData: z7.object({
|
|
1991
1991
|
missing_files: z7.string().array().nullish(),
|
|
1992
1992
|
large_files: z7.string().array().nullish(),
|
|
@@ -1998,21 +1998,21 @@ var init_types = __esm({
|
|
|
1998
1998
|
})
|
|
1999
1999
|
});
|
|
2000
2000
|
ReportFixesQueryFixZ = z7.object({
|
|
2001
|
-
id: z7.
|
|
2001
|
+
id: z7.guid(),
|
|
2002
2002
|
sharedState: FixSharedStateZ,
|
|
2003
2003
|
confidence: z7.number(),
|
|
2004
2004
|
gitBlameLogin: z7.string().nullable(),
|
|
2005
|
-
effortToApplyFix: z7.
|
|
2005
|
+
effortToApplyFix: z7.enum(Effort_To_Apply_Fix_Enum).nullable(),
|
|
2006
2006
|
safeIssueLanguage: z7.string(),
|
|
2007
2007
|
safeIssueType: z7.string(),
|
|
2008
|
-
fixReportId: z7.
|
|
2008
|
+
fixReportId: z7.guid(),
|
|
2009
2009
|
filePaths: z7.array(
|
|
2010
2010
|
z7.object({
|
|
2011
2011
|
fileRepoRelativePath: z7.string()
|
|
2012
2012
|
})
|
|
2013
2013
|
),
|
|
2014
2014
|
numberOfVulnerabilityIssues: z7.number(),
|
|
2015
|
-
severityText: z7.
|
|
2015
|
+
severityText: z7.enum(Vulnerability_Severity_Enum),
|
|
2016
2016
|
vulnerabilityReportIssues: z7.array(
|
|
2017
2017
|
z7.object({
|
|
2018
2018
|
issueType: z7.string(),
|
|
@@ -2022,9 +2022,9 @@ var init_types = __esm({
|
|
|
2022
2022
|
).min(1)
|
|
2023
2023
|
});
|
|
2024
2024
|
BaseVulnerabilityReportIssueZ = z7.object({
|
|
2025
|
-
id: z7.
|
|
2025
|
+
id: z7.guid(),
|
|
2026
2026
|
createdAt: z7.string(),
|
|
2027
|
-
state: z7.
|
|
2027
|
+
state: z7.enum(Vulnerability_Report_Issue_State_Enum),
|
|
2028
2028
|
safeIssueType: z7.string(),
|
|
2029
2029
|
safeIssueLanguage: z7.string(),
|
|
2030
2030
|
extraData: z7.object({
|
|
@@ -2035,7 +2035,7 @@ var init_types = __esm({
|
|
|
2035
2035
|
}),
|
|
2036
2036
|
fix: ReportFixesQueryFixZ.nullable(),
|
|
2037
2037
|
falsePositive: z7.object({
|
|
2038
|
-
id: z7.
|
|
2038
|
+
id: z7.guid()
|
|
2039
2039
|
}).nullable(),
|
|
2040
2040
|
parsedSeverity: ParsedSeverityZ,
|
|
2041
2041
|
severity: z7.string(),
|
|
@@ -2048,20 +2048,20 @@ var init_types = __esm({
|
|
|
2048
2048
|
),
|
|
2049
2049
|
sharedState: VulnerabilityReportIssueSharedStateZ
|
|
2050
2050
|
});
|
|
2051
|
-
VulnerabilityReportIssueZ = BaseVulnerabilityReportIssueZ.
|
|
2051
|
+
VulnerabilityReportIssueZ = BaseVulnerabilityReportIssueZ.extend(
|
|
2052
2052
|
z7.object({
|
|
2053
2053
|
codeNodes: z7.array(z7.object({ path: z7.string() }))
|
|
2054
|
-
})
|
|
2054
|
+
}).shape
|
|
2055
2055
|
);
|
|
2056
|
-
VulnerabilityReportIssueWithCodeFilePathZ = BaseVulnerabilityReportIssueZ.
|
|
2056
|
+
VulnerabilityReportIssueWithCodeFilePathZ = BaseVulnerabilityReportIssueZ.extend(
|
|
2057
2057
|
z7.object({
|
|
2058
2058
|
codeFilePath: z7.string().nullable()
|
|
2059
|
-
})
|
|
2059
|
+
}).shape
|
|
2060
2060
|
);
|
|
2061
2061
|
GetReportIssuesQueryZ = z7.object({
|
|
2062
2062
|
fixReport: z7.object({
|
|
2063
2063
|
vulnerabilityReport: z7.object({
|
|
2064
|
-
id: z7.
|
|
2064
|
+
id: z7.guid(),
|
|
2065
2065
|
lastIssueUpdatedAt: z7.string(),
|
|
2066
2066
|
vulnerabilityReportIssues_aggregate: z7.object({
|
|
2067
2067
|
aggregate: z7.object({ count: z7.number() })
|
|
@@ -2076,7 +2076,7 @@ var init_types = __esm({
|
|
|
2076
2076
|
project_by_pk: z7.object({
|
|
2077
2077
|
vulnerabilityReports: z7.array(
|
|
2078
2078
|
z7.object({
|
|
2079
|
-
fixReport: z7.object({ id: z7.
|
|
2079
|
+
fixReport: z7.object({ id: z7.guid() }).nullable()
|
|
2080
2080
|
})
|
|
2081
2081
|
)
|
|
2082
2082
|
})
|
|
@@ -2086,8 +2086,8 @@ var init_types = __esm({
|
|
|
2086
2086
|
fix_by_pk: FixPartsForFixScreenZ,
|
|
2087
2087
|
fixesWithSameIssueType: z7.array(
|
|
2088
2088
|
z7.object({
|
|
2089
|
-
id: z7.
|
|
2090
|
-
sharedState: z7.object({ state: z7.
|
|
2089
|
+
id: z7.guid(),
|
|
2090
|
+
sharedState: z7.object({ state: z7.enum(Fix_State_Enum) }).nullable().default({ state: "Ready" /* Ready */ })
|
|
2091
2091
|
})
|
|
2092
2092
|
),
|
|
2093
2093
|
relevantIssue: IssuePartsZ.nullish()
|
|
@@ -2124,8 +2124,8 @@ var init_types = __esm({
|
|
|
2124
2124
|
}).nullish();
|
|
2125
2125
|
GetFixReportStatsQueryZ = z7.object({
|
|
2126
2126
|
fixReport_by_pk: z7.object({
|
|
2127
|
-
id: z7.
|
|
2128
|
-
vulnerabilitySeverities: z7.
|
|
2127
|
+
id: z7.guid(),
|
|
2128
|
+
vulnerabilitySeverities: z7.partialRecord(z7.enum(Vulnerability_Severity_Enum), z7.number()).nullable(),
|
|
2129
2129
|
vulnerabilityReportIrrelevantIssuesCount: z7.object({
|
|
2130
2130
|
vulnerabilityReportIssues_aggregate: z7.object({
|
|
2131
2131
|
aggregate: z7.object({ count: z7.number() })
|
|
@@ -2134,15 +2134,16 @@ var init_types = __esm({
|
|
|
2134
2134
|
}).nullable()
|
|
2135
2135
|
});
|
|
2136
2136
|
ProjectVulnerabilityReport = z7.object({
|
|
2137
|
-
id: z7.
|
|
2137
|
+
id: z7.guid(),
|
|
2138
2138
|
name: z7.string().nullable(),
|
|
2139
|
-
vendor: z7.
|
|
2140
|
-
computedVendor: z7.
|
|
2139
|
+
vendor: z7.enum(Vulnerability_Report_Vendor_Enum).nullable(),
|
|
2140
|
+
computedVendor: z7.enum(Vulnerability_Report_Vendor_Enum).nullable(),
|
|
2141
2141
|
fixReport: z7.object({
|
|
2142
|
-
id: z7.
|
|
2142
|
+
id: z7.guid(),
|
|
2143
2143
|
createdOn: z7.string(),
|
|
2144
2144
|
issueTypes: z7.record(z7.string(), z7.number()).nullable(),
|
|
2145
|
-
|
|
2145
|
+
// reports only contain the languages actually found in the repo
|
|
2146
|
+
issueLanguages: z7.partialRecord(z7.enum(IssueLanguage_Enum), z7.number()).nullable(),
|
|
2146
2147
|
repo: z7.object({
|
|
2147
2148
|
originalUrl: z7.string(),
|
|
2148
2149
|
reference: z7.string(),
|
|
@@ -2157,7 +2158,7 @@ var init_types = __esm({
|
|
|
2157
2158
|
createdByUser: z7.object({
|
|
2158
2159
|
email: z7.string()
|
|
2159
2160
|
}).nullable(),
|
|
2160
|
-
state: z7.
|
|
2161
|
+
state: z7.enum(Fix_Report_State_Enum),
|
|
2161
2162
|
expirationOn: z7.string()
|
|
2162
2163
|
})
|
|
2163
2164
|
});
|
|
@@ -2166,7 +2167,7 @@ var init_types = __esm({
|
|
|
2166
2167
|
id: z7.string(),
|
|
2167
2168
|
projects: z7.array(
|
|
2168
2169
|
z7.object({
|
|
2169
|
-
id: z7.
|
|
2170
|
+
id: z7.guid(),
|
|
2170
2171
|
name: z7.string(),
|
|
2171
2172
|
numberOfUniqueRepos: z7.number()
|
|
2172
2173
|
})
|
|
@@ -2175,16 +2176,16 @@ var init_types = __esm({
|
|
|
2175
2176
|
});
|
|
2176
2177
|
ProjectPageQueryResultZ = z7.object({
|
|
2177
2178
|
name: z7.string(),
|
|
2178
|
-
id: z7.
|
|
2179
|
+
id: z7.guid(),
|
|
2179
2180
|
isDefault: z7.boolean().default(false),
|
|
2180
|
-
organizationId: z7.
|
|
2181
|
+
organizationId: z7.guid(),
|
|
2181
2182
|
vulnerabilityReports: z7.array(ProjectVulnerabilityReport),
|
|
2182
2183
|
autoPrIncludeAiFixes: z7.preprocess(
|
|
2183
2184
|
(val) => val === null || val === void 0 ? false : val,
|
|
2184
2185
|
z7.boolean()
|
|
2185
2186
|
),
|
|
2186
2187
|
projectIssueTypeSettings: z7.array(
|
|
2187
|
-
IssueTypeSettingZ.
|
|
2188
|
+
IssueTypeSettingZ.extend(z7.object({ id: z7.string() }).shape)
|
|
2188
2189
|
)
|
|
2189
2190
|
});
|
|
2190
2191
|
GetProjectMembersDataZ = z7.object({
|
|
@@ -2195,21 +2196,21 @@ var init_types = __esm({
|
|
|
2195
2196
|
z7.object({
|
|
2196
2197
|
projectToRole: z7.object({
|
|
2197
2198
|
projectRole: z7.object({
|
|
2198
|
-
type: z7.
|
|
2199
|
+
type: z7.enum(Project_Role_Type_Enum)
|
|
2199
2200
|
})
|
|
2200
2201
|
}),
|
|
2201
2202
|
user: z7.object({
|
|
2202
|
-
id: z7.
|
|
2203
|
+
id: z7.guid(),
|
|
2203
2204
|
picture: z7.string().nullable().optional(),
|
|
2204
2205
|
name: z7.string().nullish(),
|
|
2205
|
-
email: z7.
|
|
2206
|
+
email: z7.email()
|
|
2206
2207
|
})
|
|
2207
2208
|
})
|
|
2208
2209
|
)
|
|
2209
2210
|
})
|
|
2210
2211
|
});
|
|
2211
2212
|
RepoArgsZ = z7.object({
|
|
2212
|
-
originalUrl: z7.
|
|
2213
|
+
originalUrl: z7.url(),
|
|
2213
2214
|
branch: z7.string(),
|
|
2214
2215
|
commitSha: z7.string()
|
|
2215
2216
|
});
|
|
@@ -2914,8 +2915,8 @@ var init_gitBlameTypes = __esm({
|
|
|
2914
2915
|
userEmail: z14.string().optional()
|
|
2915
2916
|
});
|
|
2916
2917
|
VulnerabilityAttributionMessageZ = z14.object({
|
|
2917
|
-
fixReportId: z14.
|
|
2918
|
-
vulnerabilityAttributionRequestId: z14.
|
|
2918
|
+
fixReportId: z14.guid(),
|
|
2919
|
+
vulnerabilityAttributionRequestId: z14.guid(),
|
|
2919
2920
|
userEmail: z14.string()
|
|
2920
2921
|
});
|
|
2921
2922
|
}
|
|
@@ -4256,6 +4257,12 @@ var contextLogger = {
|
|
|
4256
4257
|
}
|
|
4257
4258
|
};
|
|
4258
4259
|
|
|
4260
|
+
// src/features/analysis/scm/constants.ts
|
|
4261
|
+
var MOBB_ICON_IMG = "https://app.mobb.ai/gh-action/Logo_Rounded_Icon.svg";
|
|
4262
|
+
var MAX_BRANCHES_FETCH = 1e3;
|
|
4263
|
+
var MAX_ACTIVE_BRANCHES_SCAN = 250;
|
|
4264
|
+
var REPORT_DEFAULT_FILE_NAME = "report.json";
|
|
4265
|
+
|
|
4259
4266
|
// src/features/analysis/scm/errors.ts
|
|
4260
4267
|
var InvalidAccessTokenError = class extends Error {
|
|
4261
4268
|
constructor(m, scmType) {
|
|
@@ -4541,7 +4548,7 @@ var scmTypeToScmLibScmType = {
|
|
|
4541
4548
|
var GetReferenceResultZ = z9.object({
|
|
4542
4549
|
date: z9.date().optional(),
|
|
4543
4550
|
sha: z9.string(),
|
|
4544
|
-
type: z9.
|
|
4551
|
+
type: z9.enum(ReferenceType)
|
|
4545
4552
|
});
|
|
4546
4553
|
|
|
4547
4554
|
// src/features/analysis/scm/utils/scm.ts
|
|
@@ -4688,7 +4695,7 @@ function shouldValidateUrl(repoUrl) {
|
|
|
4688
4695
|
return repoUrl && isUrlHasPath(repoUrl);
|
|
4689
4696
|
}
|
|
4690
4697
|
function isBrokerUrl(url) {
|
|
4691
|
-
return z10.
|
|
4698
|
+
return z10.guid().safeParse(new URL(url).host).success;
|
|
4692
4699
|
}
|
|
4693
4700
|
function buildAuthorizedRepoUrl(args) {
|
|
4694
4701
|
const { url, username, password } = args;
|
|
@@ -4724,7 +4731,7 @@ function getCloudScmLibTypeFromUrl(url) {
|
|
|
4724
4731
|
return void 0;
|
|
4725
4732
|
}
|
|
4726
4733
|
function getScmLibTypeFromScmType(scmType) {
|
|
4727
|
-
const parsedScmType = z10.
|
|
4734
|
+
const parsedScmType = z10.enum(ScmType).parse(scmType);
|
|
4728
4735
|
return scmTypeToScmLibScmType[parsedScmType];
|
|
4729
4736
|
}
|
|
4730
4737
|
function getScmConfig({
|
|
@@ -5378,19 +5385,7 @@ async function getAdoSdk(params) {
|
|
|
5378
5385
|
const defaultBranch = repository.defaultBranch?.replace("refs/heads/", "");
|
|
5379
5386
|
const byEmail = /* @__PURE__ */ new Map();
|
|
5380
5387
|
const PAGE = 100;
|
|
5381
|
-
|
|
5382
|
-
while (true) {
|
|
5383
|
-
const page = await git.getCommits(
|
|
5384
|
-
repo,
|
|
5385
|
-
{
|
|
5386
|
-
fromDate: since,
|
|
5387
|
-
itemVersion: defaultBranch ? { version: defaultBranch } : void 0,
|
|
5388
|
-
$top: PAGE,
|
|
5389
|
-
$skip: skip
|
|
5390
|
-
},
|
|
5391
|
-
projectName
|
|
5392
|
-
);
|
|
5393
|
-
if (!page || page.length === 0) break;
|
|
5388
|
+
const accumulate = (page) => {
|
|
5394
5389
|
for (const c of page) {
|
|
5395
5390
|
const email = c.author?.email;
|
|
5396
5391
|
if (!email) continue;
|
|
@@ -5407,8 +5402,51 @@ async function getAdoSdk(params) {
|
|
|
5407
5402
|
});
|
|
5408
5403
|
}
|
|
5409
5404
|
}
|
|
5410
|
-
|
|
5411
|
-
|
|
5405
|
+
};
|
|
5406
|
+
const walk = async (branch) => {
|
|
5407
|
+
let skip = 0;
|
|
5408
|
+
let hasMore = true;
|
|
5409
|
+
while (hasMore) {
|
|
5410
|
+
const page = await git.getCommits(
|
|
5411
|
+
repo,
|
|
5412
|
+
{
|
|
5413
|
+
fromDate: since,
|
|
5414
|
+
itemVersion: branch ? { version: branch } : void 0,
|
|
5415
|
+
$top: PAGE,
|
|
5416
|
+
$skip: skip
|
|
5417
|
+
},
|
|
5418
|
+
projectName
|
|
5419
|
+
);
|
|
5420
|
+
const count = page?.length ?? 0;
|
|
5421
|
+
if (count > 0) {
|
|
5422
|
+
accumulate(page);
|
|
5423
|
+
}
|
|
5424
|
+
hasMore = count === PAGE;
|
|
5425
|
+
skip += PAGE;
|
|
5426
|
+
}
|
|
5427
|
+
};
|
|
5428
|
+
await walk(defaultBranch);
|
|
5429
|
+
try {
|
|
5430
|
+
const sinceMs = new Date(since).getTime();
|
|
5431
|
+
const branches = await git.getBranches(repo, projectName);
|
|
5432
|
+
const active = (branches ?? []).filter(
|
|
5433
|
+
(b) => !!b.name && b.name !== defaultBranch && !!b.commit?.committer?.date && b.commit.committer.date.getTime() >= sinceMs
|
|
5434
|
+
).sort(
|
|
5435
|
+
(a, b) => (b.commit?.committer?.date?.getTime() ?? 0) - (a.commit?.committer?.date?.getTime() ?? 0)
|
|
5436
|
+
).map((b) => b.name);
|
|
5437
|
+
if (active.length > MAX_ACTIVE_BRANCHES_SCAN) {
|
|
5438
|
+
console.warn(
|
|
5439
|
+
`[ADO] active-branch scan hit cap (${MAX_ACTIVE_BRANCHES_SCAN}) for ${repoUrl}; some branches skipped`
|
|
5440
|
+
);
|
|
5441
|
+
}
|
|
5442
|
+
for (const branch of active.slice(0, MAX_ACTIVE_BRANCHES_SCAN)) {
|
|
5443
|
+
await walk(branch);
|
|
5444
|
+
}
|
|
5445
|
+
} catch (err) {
|
|
5446
|
+
console.warn(
|
|
5447
|
+
`[ADO] all-branch author scan failed for ${repoUrl}; using default-branch count`,
|
|
5448
|
+
err instanceof Error ? err.message : String(err)
|
|
5449
|
+
);
|
|
5412
5450
|
}
|
|
5413
5451
|
return [...byEmail.values()];
|
|
5414
5452
|
},
|
|
@@ -6443,7 +6481,7 @@ function getBitbucketSdk(params) {
|
|
|
6443
6481
|
async getDownloadUrl({ url, sha }) {
|
|
6444
6482
|
this.getReferenceData({ ref: sha, url });
|
|
6445
6483
|
const repoRes = await this.getRepo({ repoUrl: url });
|
|
6446
|
-
const parsedRepoUrl = z16.
|
|
6484
|
+
const parsedRepoUrl = z16.url().parse(repoRes.links?.html?.href);
|
|
6447
6485
|
return `${parsedRepoUrl}/get/${sha}.zip`;
|
|
6448
6486
|
},
|
|
6449
6487
|
async getPullRequest(params2) {
|
|
@@ -6553,49 +6591,93 @@ function getBitbucketSdk(params) {
|
|
|
6553
6591
|
async streamRecentCommitAuthors(params2) {
|
|
6554
6592
|
const sinceMs = new Date(params2.since).getTime();
|
|
6555
6593
|
const byKey = /* @__PURE__ */ new Map();
|
|
6556
|
-
let page = 1;
|
|
6557
6594
|
const HARD_PAGE_CEILING = 1e4;
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6595
|
+
const walkRef = async (include) => {
|
|
6596
|
+
let page = 1;
|
|
6597
|
+
while (page <= HARD_PAGE_CEILING) {
|
|
6598
|
+
const res = await bitbucketClient.repositories.listCommits({
|
|
6599
|
+
repo_slug: params2.repo_slug,
|
|
6600
|
+
workspace: params2.workspace,
|
|
6601
|
+
page: String(page),
|
|
6602
|
+
pagelen: 100,
|
|
6603
|
+
...include ? { include } : {}
|
|
6604
|
+
});
|
|
6605
|
+
const data = res.data;
|
|
6606
|
+
const commits = data?.values ?? [];
|
|
6607
|
+
if (commits.length === 0) break;
|
|
6608
|
+
let sawInWindow = false;
|
|
6609
|
+
for (const commit of commits) {
|
|
6610
|
+
const record = commit;
|
|
6611
|
+
const dateStr = record["date"];
|
|
6612
|
+
if (dateStr && new Date(dateStr).getTime() < sinceMs) {
|
|
6613
|
+
continue;
|
|
6614
|
+
}
|
|
6615
|
+
sawInWindow = true;
|
|
6616
|
+
const author = record["author"];
|
|
6617
|
+
if (!author?.raw) continue;
|
|
6618
|
+
const match = author.raw.match(/^(.+?)\s*<([^>]+)>/);
|
|
6619
|
+
if (!match) continue;
|
|
6620
|
+
const [, name, email] = match;
|
|
6621
|
+
if (!email) continue;
|
|
6622
|
+
const externalId = author.user?.account_id ?? null;
|
|
6623
|
+
const date = dateStr ?? params2.since;
|
|
6624
|
+
const key = externalId ?? email.toLowerCase();
|
|
6625
|
+
const prev = byKey.get(key);
|
|
6626
|
+
if (!prev || new Date(date).getTime() > new Date(prev.date).getTime()) {
|
|
6627
|
+
byKey.set(key, {
|
|
6628
|
+
email: email.toLowerCase(),
|
|
6629
|
+
name: name.trim() || null,
|
|
6630
|
+
date,
|
|
6631
|
+
externalId,
|
|
6632
|
+
isBot: false
|
|
6633
|
+
});
|
|
6634
|
+
}
|
|
6574
6635
|
}
|
|
6575
|
-
sawInWindow
|
|
6576
|
-
|
|
6577
|
-
|
|
6578
|
-
|
|
6579
|
-
|
|
6580
|
-
|
|
6581
|
-
|
|
6582
|
-
|
|
6583
|
-
|
|
6584
|
-
|
|
6585
|
-
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6636
|
+
if (!sawInWindow) break;
|
|
6637
|
+
if (!data?.next) break;
|
|
6638
|
+
page++;
|
|
6639
|
+
}
|
|
6640
|
+
};
|
|
6641
|
+
await walkRef(void 0);
|
|
6642
|
+
try {
|
|
6643
|
+
const branches = [];
|
|
6644
|
+
let bpage = 1;
|
|
6645
|
+
let bdone = false;
|
|
6646
|
+
while (!bdone && branches.length < MAX_ACTIVE_BRANCHES_SCAN) {
|
|
6647
|
+
const branchRes = await bitbucketClient.refs.listBranches({
|
|
6648
|
+
repo_slug: params2.repo_slug,
|
|
6649
|
+
workspace: params2.workspace,
|
|
6650
|
+
pagelen: 100,
|
|
6651
|
+
page: String(bpage),
|
|
6652
|
+
sort: "-target.date"
|
|
6653
|
+
});
|
|
6654
|
+
const vals = branchRes.data.values ?? [];
|
|
6655
|
+
if (vals.length === 0) break;
|
|
6656
|
+
for (const b of vals) {
|
|
6657
|
+
const d = b.target?.date;
|
|
6658
|
+
if (!d || new Date(d).getTime() < sinceMs) {
|
|
6659
|
+
bdone = true;
|
|
6660
|
+
break;
|
|
6661
|
+
}
|
|
6662
|
+
if (b.name) branches.push(b.name);
|
|
6663
|
+
if (branches.length >= MAX_ACTIVE_BRANCHES_SCAN) break;
|
|
6594
6664
|
}
|
|
6665
|
+
if (!branchRes.data.next) break;
|
|
6666
|
+
bpage++;
|
|
6595
6667
|
}
|
|
6596
|
-
if (
|
|
6597
|
-
|
|
6598
|
-
|
|
6668
|
+
if (branches.length >= MAX_ACTIVE_BRANCHES_SCAN) {
|
|
6669
|
+
console.warn(
|
|
6670
|
+
`[Bitbucket] active-branch scan hit cap (${MAX_ACTIVE_BRANCHES_SCAN}) for ${params2.workspace}/${params2.repo_slug}; some branches skipped`
|
|
6671
|
+
);
|
|
6672
|
+
}
|
|
6673
|
+
for (const branch of branches) {
|
|
6674
|
+
await walkRef(branch);
|
|
6675
|
+
}
|
|
6676
|
+
} catch (err) {
|
|
6677
|
+
console.warn(
|
|
6678
|
+
`[Bitbucket] all-branch author scan failed for ${params2.workspace}/${params2.repo_slug}; using main-branch count`,
|
|
6679
|
+
err instanceof Error ? err.message : String(err)
|
|
6680
|
+
);
|
|
6599
6681
|
}
|
|
6600
6682
|
return [...byKey.values()];
|
|
6601
6683
|
},
|
|
@@ -7088,11 +7170,6 @@ var BitbucketSCMLib = class extends SCMLib {
|
|
|
7088
7170
|
}
|
|
7089
7171
|
};
|
|
7090
7172
|
|
|
7091
|
-
// src/features/analysis/scm/constants.ts
|
|
7092
|
-
var MOBB_ICON_IMG = "https://app.mobb.ai/gh-action/Logo_Rounded_Icon.svg";
|
|
7093
|
-
var MAX_BRANCHES_FETCH = 1e3;
|
|
7094
|
-
var REPORT_DEFAULT_FILE_NAME = "report.json";
|
|
7095
|
-
|
|
7096
7173
|
// src/features/analysis/scm/index.ts
|
|
7097
7174
|
init_env();
|
|
7098
7175
|
|
|
@@ -7404,6 +7481,25 @@ async function executeBatchGraphQL(octokit, owner, repo, config2) {
|
|
|
7404
7481
|
});
|
|
7405
7482
|
return result;
|
|
7406
7483
|
}
|
|
7484
|
+
var RECENT_BRANCHES_QUERY = `
|
|
7485
|
+
query ($owner: String!, $repo: String!, $cursor: String) {
|
|
7486
|
+
repository(owner: $owner, name: $repo) {
|
|
7487
|
+
defaultBranchRef { name }
|
|
7488
|
+
refs(
|
|
7489
|
+
refPrefix: "refs/heads/"
|
|
7490
|
+
first: 100
|
|
7491
|
+
after: $cursor
|
|
7492
|
+
orderBy: { field: TAG_COMMIT_DATE, direction: DESC }
|
|
7493
|
+
) {
|
|
7494
|
+
pageInfo { hasNextPage endCursor }
|
|
7495
|
+
nodes {
|
|
7496
|
+
name
|
|
7497
|
+
target { ... on Commit { committedDate } }
|
|
7498
|
+
}
|
|
7499
|
+
}
|
|
7500
|
+
}
|
|
7501
|
+
}
|
|
7502
|
+
`;
|
|
7407
7503
|
function getGithubSdk(params = {}) {
|
|
7408
7504
|
const octokit = getOctoKit(params);
|
|
7409
7505
|
async function openPrWithFiles(params2) {
|
|
@@ -7872,21 +7968,14 @@ function getGithubSdk(params = {}) {
|
|
|
7872
7968
|
// commit volume, and the walk is uncapped so the 90-day count is exact even
|
|
7873
7969
|
// for a repo with hundreds of thousands of commits.
|
|
7874
7970
|
async streamRecentCommitAuthors(params2) {
|
|
7971
|
+
const { owner, repo, since } = params2;
|
|
7875
7972
|
const byAuthor = /* @__PURE__ */ new Map();
|
|
7876
|
-
|
|
7877
|
-
octokit.rest.repos.listCommits,
|
|
7878
|
-
{
|
|
7879
|
-
owner: params2.owner,
|
|
7880
|
-
repo: params2.repo,
|
|
7881
|
-
since: params2.since,
|
|
7882
|
-
per_page: 100
|
|
7883
|
-
}
|
|
7884
|
-
)) {
|
|
7973
|
+
const accumulate = (data) => {
|
|
7885
7974
|
for (const c of data) {
|
|
7886
7975
|
const email = c.commit?.author?.email;
|
|
7887
7976
|
if (!email) continue;
|
|
7888
7977
|
const externalId = c.author?.id != null ? String(c.author.id) : null;
|
|
7889
|
-
const date = c.commit?.committer?.date ?? c.commit?.author?.date ??
|
|
7978
|
+
const date = c.commit?.committer?.date ?? c.commit?.author?.date ?? since;
|
|
7890
7979
|
const key = externalId ?? email.toLowerCase();
|
|
7891
7980
|
const prev = byAuthor.get(key);
|
|
7892
7981
|
if (!prev || new Date(date).getTime() > new Date(prev.date).getTime()) {
|
|
@@ -7899,6 +7988,64 @@ function getGithubSdk(params = {}) {
|
|
|
7899
7988
|
});
|
|
7900
7989
|
}
|
|
7901
7990
|
}
|
|
7991
|
+
};
|
|
7992
|
+
const walkBranch = async (branch) => {
|
|
7993
|
+
for await (const { data } of octokit.paginate.iterator(
|
|
7994
|
+
octokit.rest.repos.listCommits,
|
|
7995
|
+
{
|
|
7996
|
+
owner,
|
|
7997
|
+
repo,
|
|
7998
|
+
since,
|
|
7999
|
+
per_page: 100,
|
|
8000
|
+
...branch ? { sha: branch } : {}
|
|
8001
|
+
}
|
|
8002
|
+
)) {
|
|
8003
|
+
accumulate(data);
|
|
8004
|
+
}
|
|
8005
|
+
};
|
|
8006
|
+
await walkBranch(void 0);
|
|
8007
|
+
try {
|
|
8008
|
+
const sinceMs = new Date(since).getTime();
|
|
8009
|
+
const activeBranches = [];
|
|
8010
|
+
let cursor = null;
|
|
8011
|
+
let defaultBranch = null;
|
|
8012
|
+
let done = false;
|
|
8013
|
+
while (!done && activeBranches.length < MAX_ACTIVE_BRANCHES_SCAN) {
|
|
8014
|
+
const resp = await octokit.graphql(
|
|
8015
|
+
RECENT_BRANCHES_QUERY,
|
|
8016
|
+
{ owner, repo, cursor }
|
|
8017
|
+
);
|
|
8018
|
+
defaultBranch = defaultBranch ?? resp.repository?.defaultBranchRef?.name ?? null;
|
|
8019
|
+
const refs = resp.repository?.refs;
|
|
8020
|
+
if (!refs) break;
|
|
8021
|
+
for (const node of refs.nodes) {
|
|
8022
|
+
const committedDate = node.target?.committedDate;
|
|
8023
|
+
if (committedDate && new Date(committedDate).getTime() < sinceMs) {
|
|
8024
|
+
done = true;
|
|
8025
|
+
break;
|
|
8026
|
+
}
|
|
8027
|
+
if (!committedDate) continue;
|
|
8028
|
+
if (node.name !== defaultBranch) {
|
|
8029
|
+
activeBranches.push(node.name);
|
|
8030
|
+
}
|
|
8031
|
+
if (activeBranches.length >= MAX_ACTIVE_BRANCHES_SCAN) break;
|
|
8032
|
+
}
|
|
8033
|
+
if (!refs.pageInfo.hasNextPage) break;
|
|
8034
|
+
cursor = refs.pageInfo.endCursor;
|
|
8035
|
+
}
|
|
8036
|
+
if (activeBranches.length >= MAX_ACTIVE_BRANCHES_SCAN) {
|
|
8037
|
+
console.warn(
|
|
8038
|
+
`[GitHub] active-branch scan hit cap (${MAX_ACTIVE_BRANCHES_SCAN}) for ${owner}/${repo}; some branches skipped`
|
|
8039
|
+
);
|
|
8040
|
+
}
|
|
8041
|
+
for (const branch of activeBranches) {
|
|
8042
|
+
await walkBranch(branch);
|
|
8043
|
+
}
|
|
8044
|
+
} catch (err) {
|
|
8045
|
+
console.warn(
|
|
8046
|
+
`[GitHub] all-branch author scan failed for ${owner}/${repo}; using default-branch count`,
|
|
8047
|
+
err instanceof Error ? err.message : String(err)
|
|
8048
|
+
);
|
|
7902
8049
|
}
|
|
7903
8050
|
return [...byAuthor.values()];
|
|
7904
8051
|
},
|
|
@@ -8127,19 +8274,6 @@ function getGithubSdk(params = {}) {
|
|
|
8127
8274
|
cache?.set(getProfileParams.username, data);
|
|
8128
8275
|
return data;
|
|
8129
8276
|
},
|
|
8130
|
-
async getLatestRepoCommitByAuthor(params2) {
|
|
8131
|
-
try {
|
|
8132
|
-
const { data } = await octokit.rest.repos.listCommits({
|
|
8133
|
-
owner: params2.owner,
|
|
8134
|
-
repo: params2.repo,
|
|
8135
|
-
author: params2.author,
|
|
8136
|
-
per_page: 1
|
|
8137
|
-
});
|
|
8138
|
-
return data[0] ?? null;
|
|
8139
|
-
} catch {
|
|
8140
|
-
return null;
|
|
8141
|
-
}
|
|
8142
|
-
},
|
|
8143
8277
|
async getAuthenticatedUser() {
|
|
8144
8278
|
try {
|
|
8145
8279
|
const { data } = await octokit.rest.users.getAuthenticated();
|
|
@@ -8157,49 +8291,6 @@ function getGithubSdk(params = {}) {
|
|
|
8157
8291
|
} catch {
|
|
8158
8292
|
return [];
|
|
8159
8293
|
}
|
|
8160
|
-
},
|
|
8161
|
-
async getEmailFromPublicEvents(params2) {
|
|
8162
|
-
try {
|
|
8163
|
-
const { data: events } = await octokit.rest.activity.listPublicEventsForUser({
|
|
8164
|
-
username: params2.username,
|
|
8165
|
-
per_page: 30
|
|
8166
|
-
});
|
|
8167
|
-
let fallback = null;
|
|
8168
|
-
for (const event of events) {
|
|
8169
|
-
if (event.type !== "PushEvent") continue;
|
|
8170
|
-
const payload = event.payload;
|
|
8171
|
-
if (!payload.commits) continue;
|
|
8172
|
-
for (const commit of payload.commits) {
|
|
8173
|
-
const email = commit.author?.email;
|
|
8174
|
-
if (!email) continue;
|
|
8175
|
-
if (!email.includes("noreply")) return email;
|
|
8176
|
-
if (!fallback) fallback = email;
|
|
8177
|
-
}
|
|
8178
|
-
}
|
|
8179
|
-
return fallback;
|
|
8180
|
-
} catch {
|
|
8181
|
-
return null;
|
|
8182
|
-
}
|
|
8183
|
-
},
|
|
8184
|
-
async getEmailFromCommitSearch(params2) {
|
|
8185
|
-
try {
|
|
8186
|
-
const { data } = await octokit.rest.search.commits({
|
|
8187
|
-
q: `author:${params2.username}`,
|
|
8188
|
-
sort: "author-date",
|
|
8189
|
-
order: "desc",
|
|
8190
|
-
per_page: 5
|
|
8191
|
-
});
|
|
8192
|
-
let fallback = null;
|
|
8193
|
-
for (const item of data.items) {
|
|
8194
|
-
const email = item.commit?.author?.email;
|
|
8195
|
-
if (!email) continue;
|
|
8196
|
-
if (!email.includes("noreply")) return email;
|
|
8197
|
-
if (!fallback) fallback = email;
|
|
8198
|
-
}
|
|
8199
|
-
return fallback;
|
|
8200
|
-
} catch {
|
|
8201
|
-
return null;
|
|
8202
|
-
}
|
|
8203
8294
|
}
|
|
8204
8295
|
};
|
|
8205
8296
|
}
|
|
@@ -8411,24 +8502,18 @@ var GithubSCMLib = class extends SCMLib {
|
|
|
8411
8502
|
const enriched = await Promise.all(
|
|
8412
8503
|
collaborators.map(
|
|
8413
8504
|
(c) => enrichLimit(async () => {
|
|
8414
|
-
let
|
|
8505
|
+
let email = c.email ?? null;
|
|
8415
8506
|
let displayName = c.login ?? null;
|
|
8416
|
-
|
|
8417
|
-
|
|
8418
|
-
profileEmail = authUserPrimaryEmail;
|
|
8419
|
-
emailSource = "authenticated_user";
|
|
8507
|
+
if (!email && authUser && authUserPrimaryEmail && c.id === authUser.id) {
|
|
8508
|
+
email = authUserPrimaryEmail;
|
|
8420
8509
|
}
|
|
8421
|
-
const isRealEmail = (e) => e && !e.includes("noreply");
|
|
8422
|
-
let noreplyFallback = null;
|
|
8423
|
-
let noreplySource = "";
|
|
8424
8510
|
if (c.login) {
|
|
8425
8511
|
try {
|
|
8426
8512
|
const profile = await this.githubSdk.getUserProfile({
|
|
8427
8513
|
username: c.login
|
|
8428
8514
|
});
|
|
8429
8515
|
if (profile.email) {
|
|
8430
|
-
|
|
8431
|
-
emailSource = "user_profile";
|
|
8516
|
+
email = profile.email;
|
|
8432
8517
|
}
|
|
8433
8518
|
displayName = profile.name ?? displayName;
|
|
8434
8519
|
} catch (err) {
|
|
@@ -8437,112 +8522,12 @@ var GithubSCMLib = class extends SCMLib {
|
|
|
8437
8522
|
error: err instanceof Error ? err.message : String(err)
|
|
8438
8523
|
});
|
|
8439
8524
|
}
|
|
8440
|
-
if (!isRealEmail(profileEmail)) {
|
|
8441
|
-
if (profileEmail && !noreplyFallback) {
|
|
8442
|
-
noreplyFallback = profileEmail;
|
|
8443
|
-
noreplySource = emailSource;
|
|
8444
|
-
}
|
|
8445
|
-
try {
|
|
8446
|
-
const commit = await this.githubSdk.getLatestRepoCommitByAuthor(
|
|
8447
|
-
{
|
|
8448
|
-
owner,
|
|
8449
|
-
repo,
|
|
8450
|
-
author: c.login
|
|
8451
|
-
}
|
|
8452
|
-
);
|
|
8453
|
-
const commitAuthor = commit?.commit?.author;
|
|
8454
|
-
const commitEmail = commitAuthor?.email;
|
|
8455
|
-
if (commitAuthor?.name && displayName === c.login) {
|
|
8456
|
-
displayName = commitAuthor.name;
|
|
8457
|
-
}
|
|
8458
|
-
if (commitEmail) {
|
|
8459
|
-
if (isRealEmail(commitEmail)) {
|
|
8460
|
-
profileEmail = commitEmail;
|
|
8461
|
-
emailSource = "commit_author";
|
|
8462
|
-
} else if (!noreplyFallback) {
|
|
8463
|
-
noreplyFallback = commitEmail;
|
|
8464
|
-
noreplySource = "commit_noreply";
|
|
8465
|
-
}
|
|
8466
|
-
}
|
|
8467
|
-
} catch (err) {
|
|
8468
|
-
contextLogger.warn(
|
|
8469
|
-
"[GitHub] getLatestRepoCommitByAuthor failed",
|
|
8470
|
-
{
|
|
8471
|
-
username: c.login,
|
|
8472
|
-
owner,
|
|
8473
|
-
repo,
|
|
8474
|
-
error: err instanceof Error ? err.message : String(err)
|
|
8475
|
-
}
|
|
8476
|
-
);
|
|
8477
|
-
}
|
|
8478
|
-
}
|
|
8479
|
-
if (!isRealEmail(profileEmail)) {
|
|
8480
|
-
try {
|
|
8481
|
-
const eventEmail = await this.githubSdk.getEmailFromPublicEvents({
|
|
8482
|
-
username: c.login
|
|
8483
|
-
});
|
|
8484
|
-
if (eventEmail) {
|
|
8485
|
-
if (isRealEmail(eventEmail)) {
|
|
8486
|
-
profileEmail = eventEmail;
|
|
8487
|
-
emailSource = "public_events";
|
|
8488
|
-
} else if (!noreplyFallback) {
|
|
8489
|
-
noreplyFallback = eventEmail;
|
|
8490
|
-
noreplySource = "events_noreply";
|
|
8491
|
-
}
|
|
8492
|
-
}
|
|
8493
|
-
} catch (err) {
|
|
8494
|
-
contextLogger.warn("[GitHub] getEmailFromPublicEvents failed", {
|
|
8495
|
-
username: c.login,
|
|
8496
|
-
error: err instanceof Error ? err.message : String(err)
|
|
8497
|
-
});
|
|
8498
|
-
}
|
|
8499
|
-
}
|
|
8500
|
-
if (!isRealEmail(profileEmail)) {
|
|
8501
|
-
try {
|
|
8502
|
-
const searchEmail = await this.githubSdk.getEmailFromCommitSearch({
|
|
8503
|
-
username: c.login
|
|
8504
|
-
});
|
|
8505
|
-
if (searchEmail) {
|
|
8506
|
-
if (isRealEmail(searchEmail)) {
|
|
8507
|
-
profileEmail = searchEmail;
|
|
8508
|
-
emailSource = "commit_search";
|
|
8509
|
-
} else if (!noreplyFallback) {
|
|
8510
|
-
noreplyFallback = searchEmail;
|
|
8511
|
-
noreplySource = "search_noreply";
|
|
8512
|
-
}
|
|
8513
|
-
}
|
|
8514
|
-
} catch (err) {
|
|
8515
|
-
contextLogger.warn("[GitHub] getEmailFromCommitSearch failed", {
|
|
8516
|
-
username: c.login,
|
|
8517
|
-
error: err instanceof Error ? err.message : String(err)
|
|
8518
|
-
});
|
|
8519
|
-
}
|
|
8520
|
-
}
|
|
8521
|
-
if (!isRealEmail(profileEmail) && noreplyFallback) {
|
|
8522
|
-
profileEmail = noreplyFallback;
|
|
8523
|
-
emailSource = noreplySource;
|
|
8524
|
-
}
|
|
8525
|
-
}
|
|
8526
|
-
if (profileEmail) {
|
|
8527
|
-
contextLogger.info("[GitHub] Resolved contributor email", {
|
|
8528
|
-
username: c.login,
|
|
8529
|
-
emailSource
|
|
8530
|
-
});
|
|
8531
|
-
} else {
|
|
8532
|
-
contextLogger.debug("[GitHub] No email resolved for contributor", {
|
|
8533
|
-
username: c.login
|
|
8534
|
-
});
|
|
8535
8525
|
}
|
|
8536
|
-
contextLogger.info("[GitHub] Contributor resolved", {
|
|
8537
|
-
username: c.login,
|
|
8538
|
-
profileName: displayName,
|
|
8539
|
-
displayNameIsNull: displayName === null
|
|
8540
|
-
});
|
|
8541
8526
|
return {
|
|
8542
8527
|
externalId: String(c.id),
|
|
8543
8528
|
username: c.login ?? null,
|
|
8544
8529
|
displayName,
|
|
8545
|
-
email
|
|
8530
|
+
email,
|
|
8546
8531
|
accessLevel: c.role_name ?? null
|
|
8547
8532
|
};
|
|
8548
8533
|
})
|
|
@@ -9587,6 +9572,7 @@ async function getGitlabRecentCommitAuthors({
|
|
|
9587
9572
|
while (hasMore) {
|
|
9588
9573
|
const response = await api2.Commits.all(projectPath, {
|
|
9589
9574
|
since,
|
|
9575
|
+
all: true,
|
|
9590
9576
|
perPage,
|
|
9591
9577
|
page,
|
|
9592
9578
|
showExpanded: true
|
|
@@ -9752,19 +9738,6 @@ async function listGitlabProjectMembers({
|
|
|
9752
9738
|
}
|
|
9753
9739
|
return projectMembers;
|
|
9754
9740
|
}
|
|
9755
|
-
async function getGitlabUserPublicEmail({
|
|
9756
|
-
repoUrl,
|
|
9757
|
-
accessToken,
|
|
9758
|
-
userId
|
|
9759
|
-
}) {
|
|
9760
|
-
try {
|
|
9761
|
-
const api2 = getGitBeaker({ url: repoUrl, gitlabAuthToken: accessToken });
|
|
9762
|
-
const user = await api2.Users.show(userId);
|
|
9763
|
-
return user["public_email"];
|
|
9764
|
-
} catch {
|
|
9765
|
-
return null;
|
|
9766
|
-
}
|
|
9767
|
-
}
|
|
9768
9741
|
async function listGitlabRepoContributors({
|
|
9769
9742
|
repoUrl,
|
|
9770
9743
|
accessToken
|
|
@@ -9796,7 +9769,6 @@ async function getGitlabAuthenticatedUser({
|
|
|
9796
9769
|
}
|
|
9797
9770
|
|
|
9798
9771
|
// src/features/analysis/scm/gitlab/GitlabSCMLib.ts
|
|
9799
|
-
import pLimit5 from "p-limit";
|
|
9800
9772
|
init_client_generates();
|
|
9801
9773
|
var GitlabSCMLib = class extends SCMLib {
|
|
9802
9774
|
constructor(url, accessToken, scmOrg) {
|
|
@@ -10197,65 +10169,27 @@ var GitlabSCMLib = class extends SCMLib {
|
|
|
10197
10169
|
memberCount: members.length,
|
|
10198
10170
|
repoContributorCount: repoContributors.length
|
|
10199
10171
|
});
|
|
10200
|
-
const
|
|
10201
|
-
|
|
10202
|
-
|
|
10203
|
-
|
|
10204
|
-
|
|
10205
|
-
|
|
10206
|
-
|
|
10207
|
-
|
|
10208
|
-
|
|
10209
|
-
|
|
10210
|
-
|
|
10211
|
-
|
|
10212
|
-
|
|
10213
|
-
|
|
10214
|
-
|
|
10215
|
-
|
|
10216
|
-
|
|
10217
|
-
|
|
10218
|
-
|
|
10219
|
-
|
|
10220
|
-
|
|
10221
|
-
userId: m.id,
|
|
10222
|
-
error: err instanceof Error ? err.message : String(err)
|
|
10223
|
-
});
|
|
10224
|
-
}
|
|
10225
|
-
}
|
|
10226
|
-
if (!email && m.username) {
|
|
10227
|
-
const match = repoContributors.find(
|
|
10228
|
-
(rc) => rc.name?.toLowerCase() === m.username?.toLowerCase() || rc.name?.toLowerCase() === m.name?.toLowerCase()
|
|
10229
|
-
);
|
|
10230
|
-
if (match?.email) {
|
|
10231
|
-
email = match.email;
|
|
10232
|
-
emailSource = match.email.includes("noreply") ? "commit_noreply" : "commit_author";
|
|
10233
|
-
} else {
|
|
10234
|
-
contextLogger.debug(
|
|
10235
|
-
"[GitLab] No commit author match for member",
|
|
10236
|
-
{
|
|
10237
|
-
username: m.username,
|
|
10238
|
-
displayName: m.name
|
|
10239
|
-
}
|
|
10240
|
-
);
|
|
10241
|
-
}
|
|
10242
|
-
}
|
|
10243
|
-
if (email) {
|
|
10244
|
-
contextLogger.info("[GitLab] Resolved contributor email", {
|
|
10245
|
-
username: m.username,
|
|
10246
|
-
emailSource
|
|
10247
|
-
});
|
|
10248
|
-
}
|
|
10249
|
-
return {
|
|
10250
|
-
externalId: String(m.id),
|
|
10251
|
-
username: m.username ?? null,
|
|
10252
|
-
displayName: m.name ?? null,
|
|
10253
|
-
email,
|
|
10254
|
-
accessLevel: m.access_level != null ? String(m.access_level) : null
|
|
10255
|
-
};
|
|
10256
|
-
})
|
|
10257
|
-
)
|
|
10258
|
-
);
|
|
10172
|
+
const enriched = members.map((m) => {
|
|
10173
|
+
let email = null;
|
|
10174
|
+
if (authUser?.email && authUser.id === m.id) {
|
|
10175
|
+
email = authUser.email;
|
|
10176
|
+
}
|
|
10177
|
+
if (!email && m.username) {
|
|
10178
|
+
const match = repoContributors.find(
|
|
10179
|
+
(rc) => rc.name?.toLowerCase() === m.username?.toLowerCase() || rc.name?.toLowerCase() === m.name?.toLowerCase()
|
|
10180
|
+
);
|
|
10181
|
+
if (match?.email) {
|
|
10182
|
+
email = match.email;
|
|
10183
|
+
}
|
|
10184
|
+
}
|
|
10185
|
+
return {
|
|
10186
|
+
externalId: String(m.id),
|
|
10187
|
+
username: m.username ?? null,
|
|
10188
|
+
displayName: m.name ?? null,
|
|
10189
|
+
email,
|
|
10190
|
+
accessLevel: m.access_level != null ? String(m.access_level) : null
|
|
10191
|
+
};
|
|
10192
|
+
});
|
|
10259
10193
|
if (enriched.length === 0 && repoContributors.length > 0) {
|
|
10260
10194
|
return repoContributors.filter((rc) => rc.email || rc.name).map((rc) => ({
|
|
10261
10195
|
// Synthetic key namespaced away from real numeric member ids so a
|
|
@@ -10434,7 +10368,7 @@ async function createScmLib({ url, accessToken, scmType, scmOrg }, {
|
|
|
10434
10368
|
if (e instanceof InvalidRepoUrlError && url) {
|
|
10435
10369
|
throw new RepoNoTokenAccessError(
|
|
10436
10370
|
"no access to repo",
|
|
10437
|
-
scmLibScmTypeToScmType[z20.
|
|
10371
|
+
scmLibScmTypeToScmType[z20.enum(ScmLibScmType).parse(scmType)]
|
|
10438
10372
|
);
|
|
10439
10373
|
}
|
|
10440
10374
|
console.error(`error validating scm: ${scmType} `, e);
|
|
@@ -11640,11 +11574,11 @@ var VulnerabilityReportIssueCodeNodeZ = z22.object({
|
|
|
11640
11574
|
startLine: z22.number(),
|
|
11641
11575
|
vulnerabilityReportIssue: z22.object({
|
|
11642
11576
|
fixId: z22.string(),
|
|
11643
|
-
category: z22.
|
|
11577
|
+
category: z22.enum(Vulnerability_Report_Issue_Category_Enum),
|
|
11644
11578
|
safeIssueType: z22.string(),
|
|
11645
11579
|
vulnerabilityReportIssueTags: z22.array(
|
|
11646
11580
|
z22.object({
|
|
11647
|
-
tag: z22.
|
|
11581
|
+
tag: z22.enum(Vulnerability_Report_Issue_Tag_Enum)
|
|
11648
11582
|
})
|
|
11649
11583
|
)
|
|
11650
11584
|
})
|
|
@@ -11654,9 +11588,9 @@ var VulnerabilityReportIssueNoFixCodeNodeZ = z22.object({
|
|
|
11654
11588
|
z22.object({
|
|
11655
11589
|
id: z22.string(),
|
|
11656
11590
|
fixId: z22.string().nullable(),
|
|
11657
|
-
category: z22.
|
|
11591
|
+
category: z22.enum(Vulnerability_Report_Issue_Category_Enum),
|
|
11658
11592
|
safeIssueType: z22.string(),
|
|
11659
|
-
fpId: z22.
|
|
11593
|
+
fpId: z22.guid().nullable(),
|
|
11660
11594
|
codeNodes: z22.array(
|
|
11661
11595
|
z22.object({
|
|
11662
11596
|
path: z22.string(),
|
|
@@ -11665,7 +11599,7 @@ var VulnerabilityReportIssueNoFixCodeNodeZ = z22.object({
|
|
|
11665
11599
|
),
|
|
11666
11600
|
vulnerabilityReportIssueTags: z22.array(
|
|
11667
11601
|
z22.object({
|
|
11668
|
-
tag: z22.
|
|
11602
|
+
tag: z22.enum(Vulnerability_Report_Issue_Tag_Enum)
|
|
11669
11603
|
})
|
|
11670
11604
|
)
|
|
11671
11605
|
})
|
|
@@ -13859,8 +13793,8 @@ function buildFixCommentBody({
|
|
|
13859
13793
|
const title = `# ${MobbIconMarkdown} ${issueType} fix is ready`;
|
|
13860
13794
|
const validFixParseRes = z24.object({
|
|
13861
13795
|
patchAndQuestions: PatchAndQuestionsZ,
|
|
13862
|
-
safeIssueLanguage: z24.
|
|
13863
|
-
severityText: z24.
|
|
13796
|
+
safeIssueLanguage: z24.enum(IssueLanguage_Enum),
|
|
13797
|
+
severityText: z24.enum(Vulnerability_Severity_Enum),
|
|
13864
13798
|
safeIssueType: SafeIssueTypeStringZ
|
|
13865
13799
|
}).safeParse(fix);
|
|
13866
13800
|
if (!validFixParseRes.success) {
|
|
@@ -15540,7 +15474,7 @@ async function waitForAnaysisAndReviewPr({
|
|
|
15540
15474
|
polling
|
|
15541
15475
|
}) {
|
|
15542
15476
|
const params = z27.object({
|
|
15543
|
-
repo: z27.
|
|
15477
|
+
repo: z27.url(),
|
|
15544
15478
|
githubActionToken: z27.string()
|
|
15545
15479
|
}).parse({ repo, githubActionToken });
|
|
15546
15480
|
const scm = await createScmLib(
|
|
@@ -15559,7 +15493,7 @@ async function waitForAnaysisAndReviewPr({
|
|
|
15559
15493
|
analysisId: analysisId2,
|
|
15560
15494
|
gqlClient,
|
|
15561
15495
|
scm,
|
|
15562
|
-
scanner: z27.
|
|
15496
|
+
scanner: z27.enum(SCANNERS).parse(scanner)
|
|
15563
15497
|
});
|
|
15564
15498
|
};
|
|
15565
15499
|
if (polling) {
|
|
@@ -15893,10 +15827,10 @@ Example:
|
|
|
15893
15827
|
throw new CliError(formattedErrorMessage);
|
|
15894
15828
|
}
|
|
15895
15829
|
var UrlZ = z28.string({
|
|
15896
|
-
|
|
15830
|
+
error: (issue) => issue.code === "invalid_type" ? `is not a valid ${Object.values(ScmType).join("/ ")} URL` : void 0
|
|
15897
15831
|
});
|
|
15898
15832
|
function validateOrganizationId(organizationId) {
|
|
15899
|
-
const orgIdValidation = z28.
|
|
15833
|
+
const orgIdValidation = z28.guid().nullish().safeParse(organizationId);
|
|
15900
15834
|
if (!orgIdValidation.success) {
|
|
15901
15835
|
throw new CliError(`organizationId: ${organizationId} is not a valid UUID`);
|
|
15902
15836
|
}
|
|
@@ -16040,7 +15974,7 @@ import path15 from "path";
|
|
|
16040
15974
|
import { createHash } from "crypto";
|
|
16041
15975
|
import path13 from "path";
|
|
16042
15976
|
import AdmZip3 from "adm-zip";
|
|
16043
|
-
import
|
|
15977
|
+
import pLimit5 from "p-limit";
|
|
16044
15978
|
var SANITIZE_CONCURRENCY = 5;
|
|
16045
15979
|
function md5Hex(data) {
|
|
16046
15980
|
return createHash("md5").update(typeof data === "string" ? Buffer.from(data, "utf-8") : data).digest("hex");
|
|
@@ -16052,7 +15986,7 @@ async function sanitizeFileContent(content) {
|
|
|
16052
15986
|
return sanitizedData;
|
|
16053
15987
|
}
|
|
16054
15988
|
async function processContextFiles(regularFiles, skillGroups) {
|
|
16055
|
-
const limit =
|
|
15989
|
+
const limit = pLimit5(SANITIZE_CONCURRENCY);
|
|
16056
15990
|
const processedFiles = await Promise.all(
|
|
16057
15991
|
regularFiles.map(
|
|
16058
15992
|
(entry) => limit(async () => {
|
|
@@ -17513,7 +17447,7 @@ import { promisify } from "util";
|
|
|
17513
17447
|
|
|
17514
17448
|
// src/features/analysis/context_file_uploader.ts
|
|
17515
17449
|
import { setTimeout as sleep3 } from "timers/promises";
|
|
17516
|
-
import
|
|
17450
|
+
import pLimit6 from "p-limit";
|
|
17517
17451
|
init_client_generates();
|
|
17518
17452
|
var UPLOAD_CONCURRENCY = 5;
|
|
17519
17453
|
var UPLOAD_MAX_ATTEMPTS = 2;
|
|
@@ -17555,7 +17489,7 @@ async function uploadContextRecords(opts) {
|
|
|
17555
17489
|
const uploadedSkillGroups = [];
|
|
17556
17490
|
const failedFiles = [];
|
|
17557
17491
|
const failedSkillGroups = [];
|
|
17558
|
-
const limit =
|
|
17492
|
+
const limit = pLimit6(UPLOAD_CONCURRENCY);
|
|
17559
17493
|
const extraFields = {
|
|
17560
17494
|
...repositoryUrl !== void 0 && { repositoryUrl },
|
|
17561
17495
|
...branch !== void 0 && { branch },
|
|
@@ -18043,7 +17977,7 @@ function createLogger(config2) {
|
|
|
18043
17977
|
|
|
18044
17978
|
// src/features/claude_code/hook_logger.ts
|
|
18045
17979
|
var DD_RUM_TOKEN = true ? "pubf59c0182545bfb4c299175119f1abf9b" : "";
|
|
18046
|
-
var CLI_VERSION = true ? "1.4.
|
|
17980
|
+
var CLI_VERSION = true ? "1.4.43" : "unknown";
|
|
18047
17981
|
var NAMESPACE = "mobbdev-claude-code-hook-logs";
|
|
18048
17982
|
var claudeCodeVersion;
|
|
18049
17983
|
function buildDdTags() {
|
|
@@ -19579,26 +19513,26 @@ var ScanAndFixVulnerabilitiesToolSchema = z29.object({
|
|
|
19579
19513
|
path: z29.string()
|
|
19580
19514
|
});
|
|
19581
19515
|
var VulnerabilityReportIssueTagSchema = z29.object({
|
|
19582
|
-
vulnerability_report_issue_tag_value: z29.
|
|
19516
|
+
vulnerability_report_issue_tag_value: z29.enum(
|
|
19583
19517
|
Vulnerability_Report_Issue_Tag_Enum
|
|
19584
19518
|
)
|
|
19585
19519
|
});
|
|
19586
19520
|
var VulnerabilityReportIssueSchema = z29.object({
|
|
19587
19521
|
category: z29.any().optional().nullable(),
|
|
19588
19522
|
parsedIssueType: SafeIssueTypeStringZ.nullable().optional(),
|
|
19589
|
-
parsedSeverity: z29.
|
|
19523
|
+
parsedSeverity: z29.enum(Vulnerability_Severity_Enum).nullable().optional(),
|
|
19590
19524
|
vulnerabilityReportIssueTags: z29.array(VulnerabilityReportIssueTagSchema)
|
|
19591
19525
|
});
|
|
19592
19526
|
var SharedStateSchema = z29.object({
|
|
19593
19527
|
__typename: z29.literal("fix_shared_state").optional(),
|
|
19594
|
-
id: z29.any(),
|
|
19528
|
+
id: z29.any().optional(),
|
|
19595
19529
|
// GraphQL uses `any` type for UUID
|
|
19596
19530
|
downloadedBy: z29.array(z29.any().nullable()).optional().nullable()
|
|
19597
19531
|
});
|
|
19598
19532
|
var UnstructuredFixExtraContextSchema = z29.object({
|
|
19599
19533
|
__typename: z29.literal("UnstructuredFixExtraContext").optional(),
|
|
19600
19534
|
key: z29.string(),
|
|
19601
|
-
value: z29.any()
|
|
19535
|
+
value: z29.any().optional()
|
|
19602
19536
|
// GraphQL JSON type
|
|
19603
19537
|
});
|
|
19604
19538
|
var FixExtraContextResponseSchema = z29.object({
|
|
@@ -19612,7 +19546,7 @@ var FixQuestionSchema = z29.object({
|
|
|
19612
19546
|
name: z29.string(),
|
|
19613
19547
|
defaultValue: z29.string(),
|
|
19614
19548
|
value: z29.string().nullable().optional(),
|
|
19615
|
-
inputType: z29.
|
|
19549
|
+
inputType: z29.enum(FixQuestionInputType),
|
|
19616
19550
|
options: z29.array(z29.string()),
|
|
19617
19551
|
index: z29.number(),
|
|
19618
19552
|
// E-2015: analyzer-served question text. default('') so a query that omits it
|
|
@@ -19635,7 +19569,7 @@ var GetFixNoFixErrorSchema = z29.object({
|
|
|
19635
19569
|
var PatchAndQuestionsSchema = z29.union([FixDataSchema, GetFixNoFixErrorSchema]);
|
|
19636
19570
|
var McpFixSchema = z29.object({
|
|
19637
19571
|
__typename: z29.literal("fix").optional(),
|
|
19638
|
-
id: z29.any(),
|
|
19572
|
+
id: z29.any().optional(),
|
|
19639
19573
|
// GraphQL uses `any` type for UUID
|
|
19640
19574
|
confidence: z29.number(),
|
|
19641
19575
|
safeIssueType: z29.string().nullable(),
|
|
@@ -19670,13 +19604,13 @@ var RepoSchema = z29.object({
|
|
|
19670
19604
|
originalUrl: z29.string()
|
|
19671
19605
|
});
|
|
19672
19606
|
var ProjectSchema = z29.object({
|
|
19673
|
-
id: z29.any(),
|
|
19607
|
+
id: z29.any().optional(),
|
|
19674
19608
|
// GraphQL uses `any` type for UUID
|
|
19675
|
-
organizationId: z29.any()
|
|
19609
|
+
organizationId: z29.any().optional()
|
|
19676
19610
|
// GraphQL uses `any` type for UUID
|
|
19677
19611
|
});
|
|
19678
19612
|
var VulnerabilityReportSchema = z29.object({
|
|
19679
|
-
scanDate: z29.any().
|
|
19613
|
+
scanDate: z29.any().nullish(),
|
|
19680
19614
|
// GraphQL uses `any` type for timestamp
|
|
19681
19615
|
vendor: z29.string(),
|
|
19682
19616
|
// GraphQL generates as string, not enum
|
|
@@ -19688,12 +19622,12 @@ var VulnerabilityReportSchema = z29.object({
|
|
|
19688
19622
|
});
|
|
19689
19623
|
var FixReportSummarySchema = z29.object({
|
|
19690
19624
|
__typename: z29.literal("fixReport").optional(),
|
|
19691
|
-
id: z29.any(),
|
|
19625
|
+
id: z29.any().optional(),
|
|
19692
19626
|
// GraphQL uses `any` type for UUID
|
|
19693
|
-
createdOn: z29.any(),
|
|
19627
|
+
createdOn: z29.any().optional(),
|
|
19694
19628
|
// GraphQL uses `any` type for timestamp
|
|
19695
19629
|
repo: RepoSchema.nullable(),
|
|
19696
|
-
issueTypes: z29.any().
|
|
19630
|
+
issueTypes: z29.any().nullish(),
|
|
19697
19631
|
// GraphQL uses `any` type for JSON
|
|
19698
19632
|
CRITICAL: FixAggregateSchema,
|
|
19699
19633
|
HIGH: FixAggregateSchema,
|
|
@@ -19708,9 +19642,9 @@ var FixReportSummarySchema = z29.object({
|
|
|
19708
19642
|
});
|
|
19709
19643
|
var ExpiredReportSchema = z29.object({
|
|
19710
19644
|
__typename: z29.literal("fixReport").optional(),
|
|
19711
|
-
id: z29.any(),
|
|
19645
|
+
id: z29.any().optional(),
|
|
19712
19646
|
// GraphQL uses `any` type for UUID
|
|
19713
|
-
expirationOn: z29.any().
|
|
19647
|
+
expirationOn: z29.any().nullish()
|
|
19714
19648
|
// GraphQL uses `any` type for timestamp
|
|
19715
19649
|
});
|
|
19716
19650
|
var GetLatestReportByRepoUrlResponseSchema = z29.object({
|
|
@@ -21559,9 +21493,10 @@ var BasePrompt = class {
|
|
|
21559
21493
|
return this.argumentsValidationSchema.parse(argsToValidate);
|
|
21560
21494
|
} catch (error) {
|
|
21561
21495
|
if (error instanceof z30.ZodError) {
|
|
21562
|
-
const errorDetails = error.
|
|
21496
|
+
const errorDetails = error.issues.map((e) => {
|
|
21563
21497
|
const fieldPath = e.path.length > 0 ? e.path.join(".") : "root";
|
|
21564
|
-
const
|
|
21498
|
+
const isMissing = e.code === "invalid_type" && e.message.endsWith("received undefined");
|
|
21499
|
+
const message = isMissing ? `Missing required argument '${fieldPath}'` : `Invalid value for '${fieldPath}': ${e.message}`;
|
|
21565
21500
|
return message;
|
|
21566
21501
|
});
|
|
21567
21502
|
const errorMessage3 = `Invalid arguments: ${errorDetails.join(", ")}`;
|
|
@@ -23309,9 +23244,10 @@ var BaseTool = class {
|
|
|
23309
23244
|
return this.inputValidationSchema.parse(args);
|
|
23310
23245
|
} catch (error) {
|
|
23311
23246
|
if (error instanceof z36.ZodError) {
|
|
23312
|
-
const errorDetails = error.
|
|
23247
|
+
const errorDetails = error.issues.map((e) => {
|
|
23313
23248
|
const fieldPath = e.path.length > 0 ? e.path.join(".") : "root";
|
|
23314
|
-
const
|
|
23249
|
+
const isMissing = e.code === "invalid_type" && e.message.endsWith("received undefined");
|
|
23250
|
+
const message = isMissing ? `Missing required parameter '${fieldPath}'` : `Invalid value for '${fieldPath}': ${e.message}`;
|
|
23315
23251
|
return message;
|
|
23316
23252
|
});
|
|
23317
23253
|
const errorMessage3 = `Invalid arguments: ${errorDetails.join(", ")}`;
|