mobbdev 1.4.22 → 1.4.25

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.
@@ -138,10 +138,16 @@ function getSdk(client, withWrapper = defaultWrapper) {
138
138
  },
139
139
  SkillVerdictsByMd5(variables, requestHeaders, signal) {
140
140
  return withWrapper((wrappedRequestHeaders) => client.request({ document: SkillVerdictsByMd5Document, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "SkillVerdictsByMd5", "query", variables);
141
+ },
142
+ LogMvsEvent(variables, requestHeaders, signal) {
143
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: LogMvsEventDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "LogMvsEvent", "mutation", variables);
144
+ },
145
+ getMvsProject(variables, requestHeaders, signal) {
146
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetMvsProjectDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getMvsProject", "mutation", variables);
141
147
  }
142
148
  };
143
149
  }
144
- var AiBlameInferenceType, FixQuestionInputType, Language, ManifestAction, Effort_To_Apply_Fix_Enum, Fix_Rating_Tag_Enum, Fix_Report_State_Enum, Fix_State_Enum, IssueLanguage_Enum, IssueType_Enum, Pr_Status_Enum, Project_Role_Type_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, defaultWrapper;
150
+ var AiBlameInferenceType, FixQuestionInputType, Language, ManifestAction, Effort_To_Apply_Fix_Enum, Fix_Rating_Tag_Enum, Fix_Report_State_Enum, Fix_State_Enum, IssueLanguage_Enum, IssueType_Enum, Pr_Status_Enum, Project_Role_Type_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, defaultWrapper;
145
151
  var init_client_generates = __esm({
146
152
  "src/features/analysis/scm/generates/client_generates.ts"() {
147
153
  "use strict";
@@ -1077,7 +1083,7 @@ var init_client_generates = __esm({
1077
1083
  }
1078
1084
  `;
1079
1085
  SubmitVulnerabilityReportDocument = `
1080
- mutation SubmitVulnerabilityReport($fixReportId: String!, $repoUrl: String!, $reference: String!, $projectId: String!, $scanSource: String!, $sha: String, $experimentalEnabled: Boolean, $vulnerabilityReportFileName: String, $pullRequest: Int, $isFullScan: Boolean, $scanContext: String!, $fileCount: Int) {
1086
+ mutation SubmitVulnerabilityReport($fixReportId: String!, $repoUrl: String!, $reference: String!, $projectId: String!, $scanSource: String!, $sha: String, $experimentalEnabled: Boolean, $vulnerabilityReportFileName: String, $pullRequest: Int, $isFullScan: Boolean, $scanContext: String!, $fileCount: Int, $computerName: String, $computerUser: String, $clientVersion: String) {
1081
1087
  submitVulnerabilityReport(
1082
1088
  fixReportId: $fixReportId
1083
1089
  repoUrl: $repoUrl
@@ -1091,6 +1097,9 @@ var init_client_generates = __esm({
1091
1097
  scanSource: $scanSource
1092
1098
  scanContext: $scanContext
1093
1099
  fileCount: $fileCount
1100
+ computerName: $computerName
1101
+ computerUser: $computerUser
1102
+ clientVersion: $clientVersion
1094
1103
  ) {
1095
1104
  __typename
1096
1105
  ... on VulnerabilityReport {
@@ -1365,6 +1374,29 @@ var init_client_generates = __esm({
1365
1374
  scannedAt
1366
1375
  }
1367
1376
  }
1377
+ }
1378
+ `;
1379
+ LogMvsEventDocument = `
1380
+ mutation LogMvsEvent($eventType: String!, $fixReportId: String, $projectId: String, $repoUrl: String, $riskCount: Int, $computerName: String, $computerUser: String, $clientVersion: String) {
1381
+ logMvsEvent(
1382
+ eventType: $eventType
1383
+ fixReportId: $fixReportId
1384
+ projectId: $projectId
1385
+ repoUrl: $repoUrl
1386
+ riskCount: $riskCount
1387
+ computerName: $computerName
1388
+ computerUser: $computerUser
1389
+ clientVersion: $clientVersion
1390
+ ) {
1391
+ status
1392
+ }
1393
+ }
1394
+ `;
1395
+ GetMvsProjectDocument = `
1396
+ mutation getMvsProject($organizationId: String!) {
1397
+ getMvsProject(organizationId: $organizationId) {
1398
+ projectId
1399
+ }
1368
1400
  }
1369
1401
  `;
1370
1402
  defaultWrapper = (action, _operationName, _operationType, _variables) => action();
@@ -4494,7 +4526,6 @@ var CliError = class extends Error {
4494
4526
 
4495
4527
  // src/commands/AuthManager.ts
4496
4528
  import crypto from "crypto";
4497
- import os from "os";
4498
4529
  import Debug10 from "debug";
4499
4530
  import open from "open";
4500
4531
 
@@ -5441,6 +5472,48 @@ var languages = {
5441
5472
  init_client_generates();
5442
5473
  import { z as z11 } from "zod";
5443
5474
 
5475
+ // src/features/analysis/scm/shared/src/storedQuestionData/cpp/index.ts
5476
+ init_client_generates();
5477
+
5478
+ // src/features/analysis/scm/shared/src/storedQuestionData/cpp/commandInjection.ts
5479
+ var commandInjection = {
5480
+ isUnixShellCommandPart: {
5481
+ content: () => "Is the input data interpolated into a shell command (not the program name or shell structure)?",
5482
+ description: () => `\`system()\` / \`popen()\` hand the whole string to \`/bin/sh -c\`. Answer **yes** when the input is *data* placed into a fixed command, for example:
5483
+
5484
+ - \`sprintf(cmd, "grep %s file.txt", input); system(cmd);\`
5485
+ - \`sprintf(cmd, "ping -c 5 %s", input); system(cmd);\`
5486
+
5487
+ Answer **no** (the input is not plain data) when the input is:
5488
+
5489
+ 1. The program/executable itself:
5490
+ - \`system(input);\`
5491
+ - \`sprintf(cmd, "%s -x", input);\`
5492
+ 2. A command after a pipe or redirect:
5493
+ - \`sprintf(cmd, "cat file.txt | %s", input);\`
5494
+ 3. A part of a non-Unix or cross-platform shell command.
5495
+ 4. A part of embedded code in another language:
5496
+ - \`sprintf(cmd, "php -r \\"echo '%s';\\"", input);\`
5497
+ - \`sprintf(cmd, "awk '%s' file", input);\`
5498
+ 5. A flag/option that controls a tool's behaviour:
5499
+ - \`sprintf(cmd, "git --upload-pack %s", input);\``,
5500
+ guidance: () => "If yes and the command can run without a shell, it is rewritten to a no-shell argument-vector call (`posix_spawn`); if it needs the shell, the tainted argument is escaped in place so the shell keeps working. If the answer is no (the input controls the program or shell structure), there is no safe automatic rewrite, so the fix is withheld and the sink is left for manual review."
5501
+ },
5502
+ executableLocationPath: {
5503
+ content: () => "What is the absolute path of the directory containing the executable?",
5504
+ description: () => `When \`system()\` is rewritten to an \`execv()\` argument-vector call, the program is run by its path with **no \`$PATH\` search**, so a relative program name (e.g. \`tail\`) cannot be resolved and a poisoned \`PATH\` cannot be used to run a look-alike binary.
5505
+
5506
+ Provide the absolute directory that contains the executable (e.g. \`/usr/bin\`); the fix prepends it to the bare program name to form an absolute path.`,
5507
+ guidance: () => "Only asked when the program name in the command has no `/`. A program that is already an absolute or relative path (contains `/`) is used as written."
5508
+ }
5509
+ };
5510
+
5511
+ // src/features/analysis/scm/shared/src/storedQuestionData/cpp/index.ts
5512
+ var vulnerabilities11 = {
5513
+ ["CMDi" /* CmDi */]: commandInjection
5514
+ };
5515
+ var cpp_default = vulnerabilities11;
5516
+
5444
5517
  // src/features/analysis/scm/shared/src/storedQuestionData/csharp/index.ts
5445
5518
  init_client_generates();
5446
5519
 
@@ -5737,7 +5810,7 @@ var xxe = {
5737
5810
  };
5738
5811
 
5739
5812
  // src/features/analysis/scm/shared/src/storedQuestionData/csharp/index.ts
5740
- var vulnerabilities11 = {
5813
+ var vulnerabilities12 = {
5741
5814
  ["LOG_FORGING" /* LogForging */]: logForging,
5742
5815
  ["SSRF" /* Ssrf */]: ssrf2,
5743
5816
  ["XXE" /* Xxe */]: xxe,
@@ -5758,7 +5831,7 @@ var vulnerabilities11 = {
5758
5831
  ["SQL_Injection" /* SqlInjection */]: sqlInjection2,
5759
5832
  ["REQUEST_PARAMETERS_BOUND_VIA_INPUT" /* RequestParametersBoundViaInput */]: requestParametersBoundViaInput
5760
5833
  };
5761
- var csharp_default2 = vulnerabilities11;
5834
+ var csharp_default2 = vulnerabilities12;
5762
5835
 
5763
5836
  // src/features/analysis/scm/shared/src/storedQuestionData/go/index.ts
5764
5837
  init_client_generates();
@@ -5791,18 +5864,18 @@ var websocketMissingOriginCheck = {
5791
5864
  };
5792
5865
 
5793
5866
  // src/features/analysis/scm/shared/src/storedQuestionData/go/index.ts
5794
- var vulnerabilities12 = {
5867
+ var vulnerabilities13 = {
5795
5868
  ["LOG_FORGING" /* LogForging */]: logForging2,
5796
5869
  ["MISSING_SSL_MINVERSION" /* MissingSslMinversion */]: missingSslMinversion,
5797
5870
  ["WEBSOCKET_MISSING_ORIGIN_CHECK" /* WebsocketMissingOriginCheck */]: websocketMissingOriginCheck
5798
5871
  };
5799
- var go_default2 = vulnerabilities12;
5872
+ var go_default2 = vulnerabilities13;
5800
5873
 
5801
5874
  // src/features/analysis/scm/shared/src/storedQuestionData/java/index.ts
5802
5875
  init_client_generates();
5803
5876
 
5804
5877
  // src/features/analysis/scm/shared/src/storedQuestionData/java/commandInjection.ts
5805
- var commandInjection = {
5878
+ var commandInjection2 = {
5806
5879
  isUnixShellCommandPart: {
5807
5880
  content: () => "Is the input part of Unix shell command?",
5808
5881
  description: () => `For example:
@@ -6256,10 +6329,10 @@ var xxe2 = {
6256
6329
  };
6257
6330
 
6258
6331
  // src/features/analysis/scm/shared/src/storedQuestionData/java/index.ts
6259
- var vulnerabilities13 = {
6332
+ var vulnerabilities14 = {
6260
6333
  ["SQL_Injection" /* SqlInjection */]: sqlInjection3,
6261
6334
  ["CMDi_relative_path_command" /* CmDiRelativePathCommand */]: relativePathCommand,
6262
- ["CMDi" /* CmDi */]: commandInjection,
6335
+ ["CMDi" /* CmDi */]: commandInjection2,
6263
6336
  ["CONFUSING_NAMING" /* ConfusingNaming */]: confusingNaming,
6264
6337
  ["ERROR_CONDTION_WITHOUT_ACTION" /* ErrorCondtionWithoutAction */]: errorConditionWithoutAction,
6265
6338
  ["XXE" /* Xxe */]: xxe2,
@@ -6284,7 +6357,7 @@ var vulnerabilities13 = {
6284
6357
  ["ERRONEOUS_STRING_COMPARE" /* ErroneousStringCompare */]: erroneousStringCompare,
6285
6358
  ["DUPLICATED_STRINGS" /* DuplicatedStrings */]: duplicatedStrings
6286
6359
  };
6287
- var java_default2 = vulnerabilities13;
6360
+ var java_default2 = vulnerabilities14;
6288
6361
 
6289
6362
  // src/features/analysis/scm/shared/src/storedQuestionData/js/index.ts
6290
6363
  init_client_generates();
@@ -6299,7 +6372,7 @@ var csrf2 = {
6299
6372
  };
6300
6373
 
6301
6374
  // src/features/analysis/scm/shared/src/storedQuestionData/js/commandInjection.ts
6302
- var commandInjection2 = {
6375
+ var commandInjection3 = {
6303
6376
  isCommandExecutable: {
6304
6377
  content: () => "Commands can be intrinsically unsafe if they call out to other executables or run arbitary code",
6305
6378
  description: () => `Does the command fall into one of the following categories:
@@ -6613,8 +6686,8 @@ var xss3 = {
6613
6686
  };
6614
6687
 
6615
6688
  // src/features/analysis/scm/shared/src/storedQuestionData/js/index.ts
6616
- var vulnerabilities14 = {
6617
- ["CMDi" /* CmDi */]: commandInjection2,
6689
+ var vulnerabilities15 = {
6690
+ ["CMDi" /* CmDi */]: commandInjection3,
6618
6691
  ["GRAPHQL_DEPTH_LIMIT" /* GraphqlDepthLimit */]: graphqlDepthLimit,
6619
6692
  ["INSECURE_RANDOMNESS" /* InsecureRandomness */]: insecureRandomness2,
6620
6693
  ["SSRF" /* Ssrf */]: ssrf4,
@@ -6636,7 +6709,7 @@ var vulnerabilities14 = {
6636
6709
  ["HARDCODED_DOMAIN_IN_HTML" /* HardcodedDomainInHtml */]: hardcodedDomainInHtml,
6637
6710
  ["CSRF" /* Csrf */]: csrf2
6638
6711
  };
6639
- var js_default = vulnerabilities14;
6712
+ var js_default = vulnerabilities15;
6640
6713
 
6641
6714
  // src/features/analysis/scm/shared/src/storedQuestionData/python/index.ts
6642
6715
  init_client_generates();
@@ -6710,7 +6783,7 @@ var uncheckedLoopCondition3 = {
6710
6783
  };
6711
6784
 
6712
6785
  // src/features/analysis/scm/shared/src/storedQuestionData/python/index.ts
6713
- var vulnerabilities15 = {
6786
+ var vulnerabilities16 = {
6714
6787
  ["CSRF" /* Csrf */]: csrf2,
6715
6788
  ["LOG_FORGING" /* LogForging */]: logForging5,
6716
6789
  ["OPEN_REDIRECT" /* OpenRedirect */]: openRedirect3,
@@ -6719,7 +6792,7 @@ var vulnerabilities15 = {
6719
6792
  ["MISSING_ENCODING_FILE_OPEN" /* MissingEncodingFileOpen */]: missingEncoding,
6720
6793
  ["SSRF" /* Ssrf */]: ssrf5
6721
6794
  };
6722
- var python_default2 = vulnerabilities15;
6795
+ var python_default2 = vulnerabilities16;
6723
6796
 
6724
6797
  // src/features/analysis/scm/shared/src/storedQuestionData/xml/index.ts
6725
6798
  init_client_generates();
@@ -6736,10 +6809,10 @@ A value too high will cause performance issues up to and including denial of ser
6736
6809
  };
6737
6810
 
6738
6811
  // src/features/analysis/scm/shared/src/storedQuestionData/xml/index.ts
6739
- var vulnerabilities16 = {
6812
+ var vulnerabilities17 = {
6740
6813
  ["WEAK_XML_SCHEMA_UNBOUNDED_OCCURRENCES" /* WeakXmlSchemaUnboundedOccurrences */]: unboundedOccurrences
6741
6814
  };
6742
- var xml_default2 = vulnerabilities16;
6815
+ var xml_default2 = vulnerabilities17;
6743
6816
 
6744
6817
  // src/features/analysis/scm/shared/src/storedQuestionData/yaml/index.ts
6745
6818
  init_client_generates();
@@ -6772,12 +6845,12 @@ var writableFilesystemService = {
6772
6845
  };
6773
6846
 
6774
6847
  // src/features/analysis/scm/shared/src/storedQuestionData/yaml/index.ts
6775
- var vulnerabilities17 = {
6848
+ var vulnerabilities18 = {
6776
6849
  ["PORT_ALL_INTERFACES" /* PortAllInterfaces */]: portAllInterfaces,
6777
6850
  ["WRITABLE_FILESYSTEM_SERVICE" /* WritableFilesystemService */]: writableFilesystemService,
6778
6851
  ["NO_NEW_PRIVILEGES" /* NoNewPrivileges */]: noNewPrivileges
6779
6852
  };
6780
- var yaml_default = vulnerabilities17;
6853
+ var yaml_default = vulnerabilities18;
6781
6854
 
6782
6855
  // src/features/analysis/scm/shared/src/storedQuestionData/index.ts
6783
6856
  var StoredQuestionDataItemZ = z11.object({
@@ -6792,6 +6865,7 @@ var languages2 = {
6792
6865
  ["CSharp" /* CSharp */]: csharp_default2,
6793
6866
  ["Python" /* Python */]: python_default2,
6794
6867
  ["Go" /* Go */]: go_default2,
6868
+ ["Cpp" /* Cpp */]: cpp_default,
6795
6869
  ["YAML" /* Yaml */]: yaml_default
6796
6870
  };
6797
6871
 
@@ -7842,16 +7916,42 @@ var URL_REFRESH_MS = 20 * 60 * 1e3;
7842
7916
  var debug10 = Debug9("mobbdev:tracy-batch-upload");
7843
7917
 
7844
7918
  // src/mcp/services/types.ts
7845
- function buildLoginUrl(baseUrl, loginId, hostname, context) {
7919
+ import os from "os";
7920
+ function buildLoginUrl(baseUrl, loginId, machine, context) {
7846
7921
  const url = new URL(`${baseUrl}/${loginId}`);
7847
- url.searchParams.set("hostname", hostname);
7848
- url.searchParams.set("trigger", context.trigger);
7849
- url.searchParams.set("source", context.source);
7850
- if (context.ide) {
7851
- url.searchParams.set("ide", context.ide);
7922
+ url.searchParams.set("hostname", machine.hostname);
7923
+ if (machine.computerUser) {
7924
+ url.searchParams.set("computerUser", machine.computerUser);
7925
+ }
7926
+ if (machine.clientVersion) {
7927
+ url.searchParams.set("clientVersion", machine.clientVersion);
7928
+ }
7929
+ if (context) {
7930
+ url.searchParams.set("trigger", context.trigger);
7931
+ url.searchParams.set("source", context.source);
7932
+ if (context.ide) {
7933
+ url.searchParams.set("ide", context.ide);
7934
+ }
7852
7935
  }
7853
7936
  return url.toString();
7854
7937
  }
7938
+ function getComputerUser() {
7939
+ try {
7940
+ return os.userInfo().username || void 0;
7941
+ } catch {
7942
+ return void 0;
7943
+ }
7944
+ }
7945
+ function getLoginMachineInfo() {
7946
+ return {
7947
+ hostname: os.hostname(),
7948
+ computerUser: getComputerUser(),
7949
+ clientVersion: packageJson.version
7950
+ };
7951
+ }
7952
+ function buildLoginBrowserUrl(baseUrl, loginId, context) {
7953
+ return buildLoginUrl(baseUrl, loginId, getLoginMachineInfo(), context);
7954
+ }
7855
7955
 
7856
7956
  // src/utils/ConfigStoreService.ts
7857
7957
  import Configstore from "configstore";
@@ -8014,7 +8114,11 @@ var _AuthManager = class _AuthManager {
8014
8114
  publicKey: this.publicKey.export({ format: "pem", type: "pkcs1" }).toString()
8015
8115
  });
8016
8116
  const webLoginUrl = `${this.resolvedWebAppUrl}${loginPath || "/cli-login"}`;
8017
- const browserUrl = loginContext ? buildLoginUrl(webLoginUrl, this.loginId, os.hostname(), loginContext) : `${webLoginUrl}/${this.loginId}?hostname=${os.hostname()}`;
8117
+ const browserUrl = buildLoginBrowserUrl(
8118
+ webLoginUrl,
8119
+ this.loginId,
8120
+ loginContext
8121
+ );
8018
8122
  this.currentBrowserUrl = browserUrl;
8019
8123
  return browserUrl;
8020
8124
  } catch (error) {
package/dist/index.mjs CHANGED
@@ -138,10 +138,16 @@ function getSdk(client, withWrapper = defaultWrapper) {
138
138
  },
139
139
  SkillVerdictsByMd5(variables, requestHeaders, signal) {
140
140
  return withWrapper((wrappedRequestHeaders) => client.request({ document: SkillVerdictsByMd5Document, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "SkillVerdictsByMd5", "query", variables);
141
+ },
142
+ LogMvsEvent(variables, requestHeaders, signal) {
143
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: LogMvsEventDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "LogMvsEvent", "mutation", variables);
144
+ },
145
+ getMvsProject(variables, requestHeaders, signal) {
146
+ return withWrapper((wrappedRequestHeaders) => client.request({ document: GetMvsProjectDocument, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), "getMvsProject", "mutation", variables);
141
147
  }
142
148
  };
143
149
  }
144
- var AiBlameInferenceType, FixQuestionInputType, Language, ManifestAction, Effort_To_Apply_Fix_Enum, Fix_Rating_Tag_Enum, Fix_Report_State_Enum, Fix_State_Enum, IssueLanguage_Enum, IssueType_Enum, Pr_Status_Enum, Project_Role_Type_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, defaultWrapper;
150
+ var AiBlameInferenceType, FixQuestionInputType, Language, ManifestAction, Effort_To_Apply_Fix_Enum, Fix_Rating_Tag_Enum, Fix_Report_State_Enum, Fix_State_Enum, IssueLanguage_Enum, IssueType_Enum, Pr_Status_Enum, Project_Role_Type_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, defaultWrapper;
145
151
  var init_client_generates = __esm({
146
152
  "src/features/analysis/scm/generates/client_generates.ts"() {
147
153
  "use strict";
@@ -1077,7 +1083,7 @@ var init_client_generates = __esm({
1077
1083
  }
1078
1084
  `;
1079
1085
  SubmitVulnerabilityReportDocument = `
1080
- mutation SubmitVulnerabilityReport($fixReportId: String!, $repoUrl: String!, $reference: String!, $projectId: String!, $scanSource: String!, $sha: String, $experimentalEnabled: Boolean, $vulnerabilityReportFileName: String, $pullRequest: Int, $isFullScan: Boolean, $scanContext: String!, $fileCount: Int) {
1086
+ mutation SubmitVulnerabilityReport($fixReportId: String!, $repoUrl: String!, $reference: String!, $projectId: String!, $scanSource: String!, $sha: String, $experimentalEnabled: Boolean, $vulnerabilityReportFileName: String, $pullRequest: Int, $isFullScan: Boolean, $scanContext: String!, $fileCount: Int, $computerName: String, $computerUser: String, $clientVersion: String) {
1081
1087
  submitVulnerabilityReport(
1082
1088
  fixReportId: $fixReportId
1083
1089
  repoUrl: $repoUrl
@@ -1091,6 +1097,9 @@ var init_client_generates = __esm({
1091
1097
  scanSource: $scanSource
1092
1098
  scanContext: $scanContext
1093
1099
  fileCount: $fileCount
1100
+ computerName: $computerName
1101
+ computerUser: $computerUser
1102
+ clientVersion: $clientVersion
1094
1103
  ) {
1095
1104
  __typename
1096
1105
  ... on VulnerabilityReport {
@@ -1365,6 +1374,29 @@ var init_client_generates = __esm({
1365
1374
  scannedAt
1366
1375
  }
1367
1376
  }
1377
+ }
1378
+ `;
1379
+ LogMvsEventDocument = `
1380
+ mutation LogMvsEvent($eventType: String!, $fixReportId: String, $projectId: String, $repoUrl: String, $riskCount: Int, $computerName: String, $computerUser: String, $clientVersion: String) {
1381
+ logMvsEvent(
1382
+ eventType: $eventType
1383
+ fixReportId: $fixReportId
1384
+ projectId: $projectId
1385
+ repoUrl: $repoUrl
1386
+ riskCount: $riskCount
1387
+ computerName: $computerName
1388
+ computerUser: $computerUser
1389
+ clientVersion: $clientVersion
1390
+ ) {
1391
+ status
1392
+ }
1393
+ }
1394
+ `;
1395
+ GetMvsProjectDocument = `
1396
+ mutation getMvsProject($organizationId: String!) {
1397
+ getMvsProject(organizationId: $organizationId) {
1398
+ projectId
1399
+ }
1368
1400
  }
1369
1401
  `;
1370
1402
  defaultWrapper = (action, _operationName, _operationType, _variables) => action();
@@ -5233,6 +5265,48 @@ var languages = {
5233
5265
  init_client_generates();
5234
5266
  import { z as z4 } from "zod";
5235
5267
 
5268
+ // src/features/analysis/scm/shared/src/storedQuestionData/cpp/index.ts
5269
+ init_client_generates();
5270
+
5271
+ // src/features/analysis/scm/shared/src/storedQuestionData/cpp/commandInjection.ts
5272
+ var commandInjection = {
5273
+ isUnixShellCommandPart: {
5274
+ content: () => "Is the input data interpolated into a shell command (not the program name or shell structure)?",
5275
+ description: () => `\`system()\` / \`popen()\` hand the whole string to \`/bin/sh -c\`. Answer **yes** when the input is *data* placed into a fixed command, for example:
5276
+
5277
+ - \`sprintf(cmd, "grep %s file.txt", input); system(cmd);\`
5278
+ - \`sprintf(cmd, "ping -c 5 %s", input); system(cmd);\`
5279
+
5280
+ Answer **no** (the input is not plain data) when the input is:
5281
+
5282
+ 1. The program/executable itself:
5283
+ - \`system(input);\`
5284
+ - \`sprintf(cmd, "%s -x", input);\`
5285
+ 2. A command after a pipe or redirect:
5286
+ - \`sprintf(cmd, "cat file.txt | %s", input);\`
5287
+ 3. A part of a non-Unix or cross-platform shell command.
5288
+ 4. A part of embedded code in another language:
5289
+ - \`sprintf(cmd, "php -r \\"echo '%s';\\"", input);\`
5290
+ - \`sprintf(cmd, "awk '%s' file", input);\`
5291
+ 5. A flag/option that controls a tool's behaviour:
5292
+ - \`sprintf(cmd, "git --upload-pack %s", input);\``,
5293
+ guidance: () => "If yes and the command can run without a shell, it is rewritten to a no-shell argument-vector call (`posix_spawn`); if it needs the shell, the tainted argument is escaped in place so the shell keeps working. If the answer is no (the input controls the program or shell structure), there is no safe automatic rewrite, so the fix is withheld and the sink is left for manual review."
5294
+ },
5295
+ executableLocationPath: {
5296
+ content: () => "What is the absolute path of the directory containing the executable?",
5297
+ description: () => `When \`system()\` is rewritten to an \`execv()\` argument-vector call, the program is run by its path with **no \`$PATH\` search**, so a relative program name (e.g. \`tail\`) cannot be resolved and a poisoned \`PATH\` cannot be used to run a look-alike binary.
5298
+
5299
+ Provide the absolute directory that contains the executable (e.g. \`/usr/bin\`); the fix prepends it to the bare program name to form an absolute path.`,
5300
+ guidance: () => "Only asked when the program name in the command has no `/`. A program that is already an absolute or relative path (contains `/`) is used as written."
5301
+ }
5302
+ };
5303
+
5304
+ // src/features/analysis/scm/shared/src/storedQuestionData/cpp/index.ts
5305
+ var vulnerabilities11 = {
5306
+ ["CMDi" /* CmDi */]: commandInjection
5307
+ };
5308
+ var cpp_default = vulnerabilities11;
5309
+
5236
5310
  // src/features/analysis/scm/shared/src/storedQuestionData/csharp/index.ts
5237
5311
  init_client_generates();
5238
5312
 
@@ -5529,7 +5603,7 @@ var xxe = {
5529
5603
  };
5530
5604
 
5531
5605
  // src/features/analysis/scm/shared/src/storedQuestionData/csharp/index.ts
5532
- var vulnerabilities11 = {
5606
+ var vulnerabilities12 = {
5533
5607
  ["LOG_FORGING" /* LogForging */]: logForging,
5534
5608
  ["SSRF" /* Ssrf */]: ssrf2,
5535
5609
  ["XXE" /* Xxe */]: xxe,
@@ -5550,7 +5624,7 @@ var vulnerabilities11 = {
5550
5624
  ["SQL_Injection" /* SqlInjection */]: sqlInjection2,
5551
5625
  ["REQUEST_PARAMETERS_BOUND_VIA_INPUT" /* RequestParametersBoundViaInput */]: requestParametersBoundViaInput
5552
5626
  };
5553
- var csharp_default2 = vulnerabilities11;
5627
+ var csharp_default2 = vulnerabilities12;
5554
5628
 
5555
5629
  // src/features/analysis/scm/shared/src/storedQuestionData/go/index.ts
5556
5630
  init_client_generates();
@@ -5583,18 +5657,18 @@ var websocketMissingOriginCheck = {
5583
5657
  };
5584
5658
 
5585
5659
  // src/features/analysis/scm/shared/src/storedQuestionData/go/index.ts
5586
- var vulnerabilities12 = {
5660
+ var vulnerabilities13 = {
5587
5661
  ["LOG_FORGING" /* LogForging */]: logForging2,
5588
5662
  ["MISSING_SSL_MINVERSION" /* MissingSslMinversion */]: missingSslMinversion,
5589
5663
  ["WEBSOCKET_MISSING_ORIGIN_CHECK" /* WebsocketMissingOriginCheck */]: websocketMissingOriginCheck
5590
5664
  };
5591
- var go_default2 = vulnerabilities12;
5665
+ var go_default2 = vulnerabilities13;
5592
5666
 
5593
5667
  // src/features/analysis/scm/shared/src/storedQuestionData/java/index.ts
5594
5668
  init_client_generates();
5595
5669
 
5596
5670
  // src/features/analysis/scm/shared/src/storedQuestionData/java/commandInjection.ts
5597
- var commandInjection = {
5671
+ var commandInjection2 = {
5598
5672
  isUnixShellCommandPart: {
5599
5673
  content: () => "Is the input part of Unix shell command?",
5600
5674
  description: () => `For example:
@@ -6048,10 +6122,10 @@ var xxe2 = {
6048
6122
  };
6049
6123
 
6050
6124
  // src/features/analysis/scm/shared/src/storedQuestionData/java/index.ts
6051
- var vulnerabilities13 = {
6125
+ var vulnerabilities14 = {
6052
6126
  ["SQL_Injection" /* SqlInjection */]: sqlInjection3,
6053
6127
  ["CMDi_relative_path_command" /* CmDiRelativePathCommand */]: relativePathCommand,
6054
- ["CMDi" /* CmDi */]: commandInjection,
6128
+ ["CMDi" /* CmDi */]: commandInjection2,
6055
6129
  ["CONFUSING_NAMING" /* ConfusingNaming */]: confusingNaming,
6056
6130
  ["ERROR_CONDTION_WITHOUT_ACTION" /* ErrorCondtionWithoutAction */]: errorConditionWithoutAction,
6057
6131
  ["XXE" /* Xxe */]: xxe2,
@@ -6076,7 +6150,7 @@ var vulnerabilities13 = {
6076
6150
  ["ERRONEOUS_STRING_COMPARE" /* ErroneousStringCompare */]: erroneousStringCompare,
6077
6151
  ["DUPLICATED_STRINGS" /* DuplicatedStrings */]: duplicatedStrings
6078
6152
  };
6079
- var java_default2 = vulnerabilities13;
6153
+ var java_default2 = vulnerabilities14;
6080
6154
 
6081
6155
  // src/features/analysis/scm/shared/src/storedQuestionData/js/index.ts
6082
6156
  init_client_generates();
@@ -6091,7 +6165,7 @@ var csrf2 = {
6091
6165
  };
6092
6166
 
6093
6167
  // src/features/analysis/scm/shared/src/storedQuestionData/js/commandInjection.ts
6094
- var commandInjection2 = {
6168
+ var commandInjection3 = {
6095
6169
  isCommandExecutable: {
6096
6170
  content: () => "Commands can be intrinsically unsafe if they call out to other executables or run arbitary code",
6097
6171
  description: () => `Does the command fall into one of the following categories:
@@ -6405,8 +6479,8 @@ var xss3 = {
6405
6479
  };
6406
6480
 
6407
6481
  // src/features/analysis/scm/shared/src/storedQuestionData/js/index.ts
6408
- var vulnerabilities14 = {
6409
- ["CMDi" /* CmDi */]: commandInjection2,
6482
+ var vulnerabilities15 = {
6483
+ ["CMDi" /* CmDi */]: commandInjection3,
6410
6484
  ["GRAPHQL_DEPTH_LIMIT" /* GraphqlDepthLimit */]: graphqlDepthLimit,
6411
6485
  ["INSECURE_RANDOMNESS" /* InsecureRandomness */]: insecureRandomness2,
6412
6486
  ["SSRF" /* Ssrf */]: ssrf4,
@@ -6428,7 +6502,7 @@ var vulnerabilities14 = {
6428
6502
  ["HARDCODED_DOMAIN_IN_HTML" /* HardcodedDomainInHtml */]: hardcodedDomainInHtml,
6429
6503
  ["CSRF" /* Csrf */]: csrf2
6430
6504
  };
6431
- var js_default = vulnerabilities14;
6505
+ var js_default = vulnerabilities15;
6432
6506
 
6433
6507
  // src/features/analysis/scm/shared/src/storedQuestionData/python/index.ts
6434
6508
  init_client_generates();
@@ -6502,7 +6576,7 @@ var uncheckedLoopCondition3 = {
6502
6576
  };
6503
6577
 
6504
6578
  // src/features/analysis/scm/shared/src/storedQuestionData/python/index.ts
6505
- var vulnerabilities15 = {
6579
+ var vulnerabilities16 = {
6506
6580
  ["CSRF" /* Csrf */]: csrf2,
6507
6581
  ["LOG_FORGING" /* LogForging */]: logForging5,
6508
6582
  ["OPEN_REDIRECT" /* OpenRedirect */]: openRedirect3,
@@ -6511,7 +6585,7 @@ var vulnerabilities15 = {
6511
6585
  ["MISSING_ENCODING_FILE_OPEN" /* MissingEncodingFileOpen */]: missingEncoding,
6512
6586
  ["SSRF" /* Ssrf */]: ssrf5
6513
6587
  };
6514
- var python_default2 = vulnerabilities15;
6588
+ var python_default2 = vulnerabilities16;
6515
6589
 
6516
6590
  // src/features/analysis/scm/shared/src/storedQuestionData/xml/index.ts
6517
6591
  init_client_generates();
@@ -6528,10 +6602,10 @@ A value too high will cause performance issues up to and including denial of ser
6528
6602
  };
6529
6603
 
6530
6604
  // src/features/analysis/scm/shared/src/storedQuestionData/xml/index.ts
6531
- var vulnerabilities16 = {
6605
+ var vulnerabilities17 = {
6532
6606
  ["WEAK_XML_SCHEMA_UNBOUNDED_OCCURRENCES" /* WeakXmlSchemaUnboundedOccurrences */]: unboundedOccurrences
6533
6607
  };
6534
- var xml_default2 = vulnerabilities16;
6608
+ var xml_default2 = vulnerabilities17;
6535
6609
 
6536
6610
  // src/features/analysis/scm/shared/src/storedQuestionData/yaml/index.ts
6537
6611
  init_client_generates();
@@ -6564,12 +6638,12 @@ var writableFilesystemService = {
6564
6638
  };
6565
6639
 
6566
6640
  // src/features/analysis/scm/shared/src/storedQuestionData/yaml/index.ts
6567
- var vulnerabilities17 = {
6641
+ var vulnerabilities18 = {
6568
6642
  ["PORT_ALL_INTERFACES" /* PortAllInterfaces */]: portAllInterfaces,
6569
6643
  ["WRITABLE_FILESYSTEM_SERVICE" /* WritableFilesystemService */]: writableFilesystemService,
6570
6644
  ["NO_NEW_PRIVILEGES" /* NoNewPrivileges */]: noNewPrivileges
6571
6645
  };
6572
- var yaml_default = vulnerabilities17;
6646
+ var yaml_default = vulnerabilities18;
6573
6647
 
6574
6648
  // src/features/analysis/scm/shared/src/storedQuestionData/index.ts
6575
6649
  var StoredQuestionDataItemZ = z4.object({
@@ -6584,6 +6658,7 @@ var languages2 = {
6584
6658
  ["CSharp" /* CSharp */]: csharp_default2,
6585
6659
  ["Python" /* Python */]: python_default2,
6586
6660
  ["Go" /* Go */]: go_default2,
6661
+ ["Cpp" /* Cpp */]: cpp_default,
6587
6662
  ["YAML" /* Yaml */]: yaml_default
6588
6663
  };
6589
6664
  var storedQuestionData_default = languages2;
@@ -9598,48 +9673,65 @@ function getGithubSdk(params = {}) {
9598
9673
  return false;
9599
9674
  }
9600
9675
  },
9601
- async getGithubRepoList() {
9676
+ async listAuthenticatedUserReposPage(params2) {
9677
+ const {
9678
+ sort = { field: "updated", order: "desc" },
9679
+ perPage = 10,
9680
+ page = 1
9681
+ } = params2;
9682
+ const githubSort = sort.field === "name" ? "full_name" : sort.field === "created" ? "created" : "updated";
9602
9683
  try {
9603
- const allRepos = [];
9604
- let page = 1;
9605
- const perPage = 100;
9606
- let hasMore = true;
9607
- while (hasMore) {
9608
- const githubRepos = await octokit.request(GET_USER_REPOS, {
9609
- sort: "updated",
9610
- per_page: perPage,
9611
- page
9612
- });
9613
- for (const repo of githubRepos.data) {
9614
- allRepos.push({
9615
- repoName: repo.name,
9616
- repoUrl: repo.html_url,
9617
- repoOwner: repo.owner.login,
9618
- repoLanguages: repo.language ? [repo.language] : [],
9619
- repoIsPublic: !repo.private,
9620
- repoUpdatedAt: repo.updated_at
9621
- });
9622
- }
9623
- hasMore = githubRepos.data.length >= perPage;
9624
- page++;
9625
- }
9626
- return allRepos;
9684
+ const githubRepos = await octokit.request(GET_USER_REPOS, {
9685
+ sort: githubSort,
9686
+ direction: sort.order,
9687
+ per_page: perPage,
9688
+ page
9689
+ });
9690
+ const items = githubRepos.data.map((repo) => ({
9691
+ repoName: repo.name,
9692
+ repoUrl: repo.html_url,
9693
+ repoOwner: repo.owner.login,
9694
+ repoLanguages: repo.language ? [repo.language] : [],
9695
+ repoIsPublic: !repo.private,
9696
+ repoUpdatedAt: repo.updated_at
9697
+ }));
9698
+ return {
9699
+ items,
9700
+ hasMore: githubRepos.data.length >= perPage
9701
+ };
9627
9702
  } catch (e) {
9628
9703
  if (e instanceof RequestError && e.status === 401) {
9629
9704
  console.warn(
9630
9705
  "GitHub API returned 401 Unauthorized when listing repos - token may be expired or lack repo scope"
9631
9706
  );
9632
- return [];
9707
+ return { items: [], hasMore: false };
9633
9708
  }
9634
9709
  if (e instanceof RequestError && e.status === 404) {
9635
9710
  console.warn(
9636
9711
  "GitHub API returned 404 Not Found when listing repos - user may not exist"
9637
9712
  );
9638
- return [];
9713
+ return { items: [], hasMore: false };
9639
9714
  }
9640
9715
  throw e;
9641
9716
  }
9642
9717
  },
9718
+ async getGithubRepoList() {
9719
+ const allRepos = [];
9720
+ let page = 1;
9721
+ const perPage = 100;
9722
+ let hasMore = true;
9723
+ while (hasMore) {
9724
+ const pageResult = await this.listAuthenticatedUserReposPage({
9725
+ sort: { field: "updated", order: "desc" },
9726
+ perPage,
9727
+ page
9728
+ });
9729
+ allRepos.push(...pageResult.items);
9730
+ hasMore = pageResult.hasMore;
9731
+ page++;
9732
+ }
9733
+ return allRepos;
9734
+ },
9643
9735
  async getGithubRepoDefaultBranch(repoUrl) {
9644
9736
  const { owner, repo } = parseGithubOwnerAndRepo(repoUrl);
9645
9737
  const repos = await octokit.rest.repos.get({ repo, owner });
@@ -10699,23 +10791,25 @@ var GithubSCMLib = class extends SCMLib {
10699
10791
  });
10700
10792
  }
10701
10793
  /**
10702
- * Override searchRepos to use GitHub's Search API for efficient pagination.
10703
- * This is much faster than fetching all repos and filtering in-memory.
10704
- *
10705
- * Note: GitHub Search API doesn't support sorting by name, so when name sorting
10706
- * is requested, we fall back to fetching all repos and sorting in-memory.
10794
+ * Override searchRepos for efficient server-side pagination.
10795
+ * - With scmOrg: GitHub Search API (`org:…`)
10796
+ * - Without scmOrg: paginated `GET /user/repos`
10797
+ * - Name sort: in-memory over full list
10707
10798
  */
10708
10799
  async searchRepos(params) {
10709
10800
  this._validateAccessToken();
10710
10801
  const sort = params.sort || { field: "updated", order: "desc" };
10711
- if (!params.scmOrg || sort.field === "name") {
10802
+ if (sort.field === "name") {
10712
10803
  return this.searchReposInMemory(params);
10713
10804
  }
10805
+ if (!params.scmOrg) {
10806
+ return this.searchReposWithUserReposApi(params);
10807
+ }
10714
10808
  return this.searchReposWithApi(params);
10715
10809
  }
10716
10810
  /**
10717
10811
  * Search repos by fetching all and sorting/paginating in-memory.
10718
- * Used when name sorting is requested or no organization is provided.
10812
+ * Used only when name sorting is requested.
10719
10813
  */
10720
10814
  async searchReposInMemory(params) {
10721
10815
  const repos = await this.getRepoList(params.scmOrg);
@@ -10743,6 +10837,24 @@ var GithubSCMLib = class extends SCMLib {
10743
10837
  hasMore: nextOffset < sortedRepos.length
10744
10838
  };
10745
10839
  }
10840
+ /**
10841
+ * Paginated repo list for authenticated user when no GitHub org is configured.
10842
+ */
10843
+ async searchReposWithUserReposApi(params) {
10844
+ const page = parseCursorSafe(params.cursor, 1);
10845
+ const perPage = params.limit || 10;
10846
+ const sort = params.sort || { field: "updated", order: "desc" };
10847
+ const pageResult = await this.githubSdk.listAuthenticatedUserReposPage({
10848
+ sort,
10849
+ perPage,
10850
+ page
10851
+ });
10852
+ return {
10853
+ results: pageResult.items,
10854
+ nextCursor: pageResult.hasMore ? String(page + 1) : void 0,
10855
+ hasMore: pageResult.hasMore
10856
+ };
10857
+ }
10746
10858
  /**
10747
10859
  * Search repos using GitHub Search API for efficient server-side pagination.
10748
10860
  * Only supports date-based sorting (updated/created).
@@ -13124,7 +13236,6 @@ import { z as z31 } from "zod";
13124
13236
 
13125
13237
  // src/commands/AuthManager.ts
13126
13238
  import crypto from "crypto";
13127
- import os3 from "os";
13128
13239
  import Debug11 from "debug";
13129
13240
  import open from "open";
13130
13241
 
@@ -15143,6 +15254,7 @@ async function prepareAndSendTracyRecords(client, rawRecords, workingDir, option
15143
15254
  }
15144
15255
 
15145
15256
  // src/mcp/services/types.ts
15257
+ import os3 from "os";
15146
15258
  function detectIDE() {
15147
15259
  const env3 = process.env;
15148
15260
  if (env3["CURSOR_TRACE_ID"] || env3["CURSOR_SESSION_ID"]) return "cursor";
@@ -15163,16 +15275,41 @@ function createMcpLoginContext(trigger) {
15163
15275
  ide: detectIDE()
15164
15276
  };
15165
15277
  }
15166
- function buildLoginUrl(baseUrl, loginId, hostname, context) {
15278
+ function buildLoginUrl(baseUrl, loginId, machine, context) {
15167
15279
  const url = new URL(`${baseUrl}/${loginId}`);
15168
- url.searchParams.set("hostname", hostname);
15169
- url.searchParams.set("trigger", context.trigger);
15170
- url.searchParams.set("source", context.source);
15171
- if (context.ide) {
15172
- url.searchParams.set("ide", context.ide);
15280
+ url.searchParams.set("hostname", machine.hostname);
15281
+ if (machine.computerUser) {
15282
+ url.searchParams.set("computerUser", machine.computerUser);
15283
+ }
15284
+ if (machine.clientVersion) {
15285
+ url.searchParams.set("clientVersion", machine.clientVersion);
15286
+ }
15287
+ if (context) {
15288
+ url.searchParams.set("trigger", context.trigger);
15289
+ url.searchParams.set("source", context.source);
15290
+ if (context.ide) {
15291
+ url.searchParams.set("ide", context.ide);
15292
+ }
15173
15293
  }
15174
15294
  return url.toString();
15175
15295
  }
15296
+ function getComputerUser() {
15297
+ try {
15298
+ return os3.userInfo().username || void 0;
15299
+ } catch {
15300
+ return void 0;
15301
+ }
15302
+ }
15303
+ function getLoginMachineInfo() {
15304
+ return {
15305
+ hostname: os3.hostname(),
15306
+ computerUser: getComputerUser(),
15307
+ clientVersion: packageJson.version
15308
+ };
15309
+ }
15310
+ function buildLoginBrowserUrl(baseUrl, loginId, context) {
15311
+ return buildLoginUrl(baseUrl, loginId, getLoginMachineInfo(), context);
15312
+ }
15176
15313
 
15177
15314
  // src/commands/AuthManager.ts
15178
15315
  var debug12 = Debug11("mobbdev:auth");
@@ -15317,7 +15454,11 @@ var _AuthManager = class _AuthManager {
15317
15454
  publicKey: this.publicKey.export({ format: "pem", type: "pkcs1" }).toString()
15318
15455
  });
15319
15456
  const webLoginUrl = `${this.resolvedWebAppUrl}${loginPath || "/cli-login"}`;
15320
- const browserUrl = loginContext ? buildLoginUrl(webLoginUrl, this.loginId, os3.hostname(), loginContext) : `${webLoginUrl}/${this.loginId}?hostname=${os3.hostname()}`;
15457
+ const browserUrl = buildLoginBrowserUrl(
15458
+ webLoginUrl,
15459
+ this.loginId,
15460
+ loginContext
15461
+ );
15321
15462
  this.currentBrowserUrl = browserUrl;
15322
15463
  return browserUrl;
15323
15464
  } catch (error) {
@@ -16355,8 +16496,8 @@ if (typeof __filename !== "undefined") {
16355
16496
  }
16356
16497
  var costumeRequire = createRequire(moduleUrl);
16357
16498
  var getCheckmarxPath = () => {
16358
- const os17 = type();
16359
- const cxFileName = os17 === "Windows_NT" ? "cx.exe" : "cx";
16499
+ const os19 = type();
16500
+ const cxFileName = os19 === "Windows_NT" ? "cx.exe" : "cx";
16360
16501
  try {
16361
16502
  return costumeRequire.resolve(`.bin/${cxFileName}`);
16362
16503
  } catch (e) {
@@ -19641,7 +19782,7 @@ function createLogger(config2) {
19641
19782
 
19642
19783
  // src/features/claude_code/hook_logger.ts
19643
19784
  var DD_RUM_TOKEN = true ? "pubf59c0182545bfb4c299175119f1abf9b" : "";
19644
- var CLI_VERSION = true ? "1.4.22" : "unknown";
19785
+ var CLI_VERSION = true ? "1.4.25" : "unknown";
19645
19786
  var NAMESPACE = "mobbdev-claude-code-hook-logs";
19646
19787
  var claudeCodeVersion;
19647
19788
  function buildDdTags() {
@@ -21166,7 +21307,7 @@ var logDebug = (message, data) => logger2.log(message, "debug", data);
21166
21307
  var log = logger2.log.bind(logger2);
21167
21308
 
21168
21309
  // src/mcp/services/McpGQLClient.ts
21169
- import crypto2 from "crypto";
21310
+ import os9 from "os";
21170
21311
  init_client_generates();
21171
21312
  init_configs();
21172
21313
 
@@ -21548,85 +21689,20 @@ var McpGQLClient = class extends GQLClient {
21548
21689
  if (!userEmail) {
21549
21690
  throw new Error("User email not found");
21550
21691
  }
21551
- const shortEmailHash = crypto2.createHash("sha256").update(userEmail).digest("hex").slice(0, 8).toUpperCase();
21552
- const projectName = `MCP Scans ${shortEmailHash}`;
21553
- logDebug("[GraphQL] Calling getLastOrgAndNamedProject query", {
21554
- projectName
21555
- });
21556
- const orgAndProjectRes = await this._clientSdk.getLastOrgAndNamedProject({
21557
- email: userEmail,
21558
- projectName
21559
- });
21560
- logDebug("[GraphQL] getLastOrgAndNamedProject successful", {
21561
- result: orgAndProjectRes
21562
- });
21563
- if (!orgAndProjectRes.user?.[0]?.userOrganizationsAndUserOrganizationRoles?.[0]?.organization?.id) {
21692
+ const orgRes = await this._clientSdk.getLastOrg({ email: userEmail });
21693
+ const organizationId = orgRes.user?.[0]?.userOrganizationsAndUserOrganizationRoles?.[0]?.organization?.id;
21694
+ if (!organizationId) {
21564
21695
  throw new Error(
21565
- `The user with email:${userEmail} is not associated with any organization`
21696
+ `The user with email:${userEmail} is not associated with any organization`
21566
21697
  );
21567
21698
  }
21568
- const organization = orgAndProjectRes.user?.[0]?.userOrganizationsAndUserOrganizationRoles?.[0]?.organization;
21569
- const projectId = organization?.projects?.[0]?.id;
21570
- if (projectId) {
21571
- logDebug("[GraphQL] Found existing project", {
21572
- projectId,
21573
- projectName
21574
- });
21575
- return projectId;
21576
- }
21577
- logDebug("[GraphQL] Project not found, creating new project", {
21578
- organizationId: organization.id,
21579
- projectName
21580
- });
21581
- try {
21582
- const createdProject = await this._clientSdk.CreateProject({
21583
- organizationId: organization.id,
21584
- projectName
21585
- });
21586
- logDebug("[GraphQL] CreateProject successful", {
21587
- result: createdProject
21588
- });
21589
- return createdProject.createProject.projectId;
21590
- } catch (createError) {
21591
- const errorMessage3 = createError instanceof Error ? createError.message : String(createError);
21592
- const isConstraintViolation = errorMessage3.includes(
21593
- "duplicate key value violates unique constraint"
21594
- ) && errorMessage3.includes("project_name_organization_id_key");
21595
- if (isConstraintViolation) {
21596
- logDebug(
21597
- "[GraphQL] Project creation failed due to constraint violation, retrying fetch",
21598
- {
21599
- organizationId: organization.id,
21600
- projectName,
21601
- error: errorMessage3
21602
- }
21603
- );
21604
- const retryOrgAndProjectRes = await this._clientSdk.getLastOrgAndNamedProject({
21605
- email: userEmail,
21606
- projectName
21607
- });
21608
- const retryProjectId = retryOrgAndProjectRes.user?.[0]?.userOrganizationsAndUserOrganizationRoles?.[0]?.organization?.projects?.[0]?.id;
21609
- if (retryProjectId) {
21610
- logDebug(
21611
- "[GraphQL] Successfully found existing project after constraint violation",
21612
- {
21613
- projectId: retryProjectId,
21614
- projectName
21615
- }
21616
- );
21617
- return retryProjectId;
21618
- }
21619
- logError(
21620
- "[GraphQL] Failed to find project even after constraint violation retry",
21621
- {
21622
- organizationId: organization.id,
21623
- projectName,
21624
- retryResult: retryOrgAndProjectRes
21625
- }
21626
- );
21627
- }
21628
- throw createError;
21699
+ const mvsRes = await this._clientSdk.getMvsProject({ organizationId });
21700
+ const projectId = mvsRes.getMvsProject?.projectId;
21701
+ if (!projectId) {
21702
+ throw new Error("Failed to resolve the MVS project");
21629
21703
  }
21704
+ logDebug("[GraphQL] Resolved MVS project", { projectId });
21705
+ return projectId;
21630
21706
  } catch (e) {
21631
21707
  logError("[GraphQL] getProjectId failed", {
21632
21708
  error: e,
@@ -21723,6 +21799,26 @@ var McpGQLClient = class extends GQLClient {
21723
21799
  logDebug("[GraphQL] No auto-applied fixes to update status");
21724
21800
  }
21725
21801
  }
21802
+ /** Best-effort: a telemetry failure must never break a scan/fix, so errors are swallowed. */
21803
+ async logMvsEvent(params) {
21804
+ try {
21805
+ await this._clientSdk.LogMvsEvent({
21806
+ eventType: params.eventType,
21807
+ fixReportId: params.fixReportId ?? null,
21808
+ projectId: params.projectId ?? null,
21809
+ repoUrl: params.repoUrl ?? null,
21810
+ riskCount: params.riskCount ?? null,
21811
+ computerName: os9.hostname(),
21812
+ computerUser: getComputerUser() ?? null,
21813
+ clientVersion: packageJson.version
21814
+ });
21815
+ } catch (error) {
21816
+ logDebug("[GraphQL] logMvsEvent failed (ignored)", {
21817
+ eventType: params.eventType,
21818
+ error: error.message
21819
+ });
21820
+ }
21821
+ }
21726
21822
  async getMvsAutoFixSettings() {
21727
21823
  try {
21728
21824
  const envOverride = process.env["MVS_AUTO_FIX"];
@@ -21996,7 +22092,7 @@ async function createAuthenticatedMcpGQLClient({
21996
22092
  // src/mcp/services/McpUsageService/host.ts
21997
22093
  import { execSync as execSync2 } from "child_process";
21998
22094
  import fs15 from "fs";
21999
- import os9 from "os";
22095
+ import os10 from "os";
22000
22096
  import path25 from "path";
22001
22097
  var IDEs = ["cursor", "windsurf", "webstorm", "vscode", "claude"];
22002
22098
  var runCommand = (cmd) => {
@@ -22011,7 +22107,7 @@ var gitInfo = {
22011
22107
  email: runCommand("git config user.email")
22012
22108
  };
22013
22109
  var getClaudeWorkspacePaths = () => {
22014
- const home = os9.homedir();
22110
+ const home = os10.homedir();
22015
22111
  const claudeIdePath = path25.join(home, ".claude", "ide");
22016
22112
  const workspacePaths = [];
22017
22113
  if (!fs15.existsSync(claudeIdePath)) {
@@ -22040,7 +22136,7 @@ var getClaudeWorkspacePaths = () => {
22040
22136
  return workspacePaths;
22041
22137
  };
22042
22138
  var getMCPConfigPaths = (hostName) => {
22043
- const home = os9.homedir();
22139
+ const home = os10.homedir();
22044
22140
  const currentDir = process.env["WORKSPACE_FOLDER_PATHS"] || process.env["PWD"] || process.cwd();
22045
22141
  switch (hostName.toLowerCase()) {
22046
22142
  case "cursor":
@@ -22130,7 +22226,7 @@ var readMCPConfig = (hostName) => {
22130
22226
  };
22131
22227
  var getRunningProcesses = () => {
22132
22228
  try {
22133
- return os9.platform() === "win32" ? execSync2("tasklist", { encoding: "utf8" }) : execSync2("ps aux", { encoding: "utf8" });
22229
+ return os10.platform() === "win32" ? execSync2("tasklist", { encoding: "utf8" }) : execSync2("ps aux", { encoding: "utf8" });
22134
22230
  } catch {
22135
22231
  return "";
22136
22232
  }
@@ -22205,7 +22301,7 @@ var versionCommands = {
22205
22301
  }
22206
22302
  };
22207
22303
  var getProcessInfo = (pid) => {
22208
- const platform2 = os9.platform();
22304
+ const platform2 = os10.platform();
22209
22305
  try {
22210
22306
  if (platform2 === "linux" || platform2 === "darwin") {
22211
22307
  const output = execSync2(`ps -o pid=,ppid=,comm= -p ${pid}`, {
@@ -22324,7 +22420,7 @@ var getHostInfo = (additionalMcpList) => {
22324
22420
  const config2 = allConfigs[ide] || null;
22325
22421
  const ideName = ide.charAt(0).toUpperCase() + ide.slice(1) || "Unknown";
22326
22422
  let ideVersion = "Unknown";
22327
- const platform2 = os9.platform();
22423
+ const platform2 = os10.platform();
22328
22424
  const cmds = versionCommands[ideName]?.[platform2] ?? [];
22329
22425
  for (const cmd of cmds) {
22330
22426
  try {
@@ -22357,14 +22453,14 @@ var getHostInfo = (additionalMcpList) => {
22357
22453
 
22358
22454
  // src/mcp/services/McpUsageService/McpUsageService.ts
22359
22455
  import fetch6 from "node-fetch";
22360
- import os11 from "os";
22456
+ import os12 from "os";
22361
22457
  import { v4 as uuidv42, v5 as uuidv5 } from "uuid";
22362
22458
  init_configs();
22363
22459
 
22364
22460
  // src/mcp/services/McpUsageService/system.ts
22365
22461
  init_configs();
22366
22462
  import fs16 from "fs";
22367
- import os10 from "os";
22463
+ import os11 from "os";
22368
22464
  import path26 from "path";
22369
22465
  var MAX_DEPTH = 2;
22370
22466
  var patterns = ["mcp", "claude"];
@@ -22399,8 +22495,8 @@ var searchDir = async (dir, depth = 0) => {
22399
22495
  };
22400
22496
  var findSystemMCPConfigs = async () => {
22401
22497
  try {
22402
- const home = os10.homedir();
22403
- const platform2 = os10.platform();
22498
+ const home = os11.homedir();
22499
+ const platform2 = os11.platform();
22404
22500
  const knownDirs = platform2 === "win32" ? [
22405
22501
  path26.join(home, ".cursor"),
22406
22502
  path26.join(home, "Documents"),
@@ -22472,7 +22568,7 @@ var McpUsageService = class {
22472
22568
  generateHostId() {
22473
22569
  const stored = configStore.get(this.configKey);
22474
22570
  if (stored?.mcpHostId) return stored.mcpHostId;
22475
- const interfaces = os11.networkInterfaces();
22571
+ const interfaces = os12.networkInterfaces();
22476
22572
  const macs = [];
22477
22573
  for (const iface of Object.values(interfaces)) {
22478
22574
  if (!iface) continue;
@@ -22480,7 +22576,7 @@ var McpUsageService = class {
22480
22576
  if (net.mac && net.mac !== "00:00:00:00:00:00") macs.push(net.mac);
22481
22577
  }
22482
22578
  }
22483
- const macString = macs.length ? macs.sort().join(",") : `${os11.hostname()}-${uuidv42()}`;
22579
+ const macString = macs.length ? macs.sort().join(",") : `${os12.hostname()}-${uuidv42()}`;
22484
22580
  const hostId = uuidv5(macString, uuidv5.DNS);
22485
22581
  logDebug("[UsageService] Generated new host ID", { hostId });
22486
22582
  return hostId;
@@ -22503,7 +22599,7 @@ var McpUsageService = class {
22503
22599
  mcpHostId,
22504
22600
  organizationId,
22505
22601
  mcpVersion: packageJson.version,
22506
- mcpOsName: os11.platform(),
22602
+ mcpOsName: os12.platform(),
22507
22603
  mcps: JSON.stringify(mcps),
22508
22604
  status,
22509
22605
  userName: user.name,
@@ -24824,7 +24920,7 @@ For a complete security audit workflow, use the \`full-security-audit\` prompt.
24824
24920
 
24825
24921
  // src/mcp/services/McpDetectionService/CursorMcpDetectionService.ts
24826
24922
  import * as fs19 from "fs";
24827
- import * as os13 from "os";
24923
+ import * as os14 from "os";
24828
24924
  import * as path28 from "path";
24829
24925
 
24830
24926
  // src/mcp/services/McpDetectionService/BaseMcpDetectionService.ts
@@ -24835,11 +24931,11 @@ import * as path27 from "path";
24835
24931
 
24836
24932
  // src/mcp/services/McpDetectionService/McpDetectionServiceUtils.ts
24837
24933
  import * as fs17 from "fs";
24838
- import * as os12 from "os";
24934
+ import * as os13 from "os";
24839
24935
 
24840
24936
  // src/mcp/services/McpDetectionService/VscodeMcpDetectionService.ts
24841
24937
  import * as fs20 from "fs";
24842
- import * as os14 from "os";
24938
+ import * as os15 from "os";
24843
24939
  import * as path29 from "path";
24844
24940
 
24845
24941
  // src/mcp/tools/checkForNewAvailableFixes/CheckForNewAvailableFixesTool.ts
@@ -27545,6 +27641,7 @@ var PatchApplicationService = class {
27545
27641
  // src/mcp/services/ScanFiles.ts
27546
27642
  init_client_generates();
27547
27643
  init_GitService();
27644
+ import os16 from "os";
27548
27645
  init_configs();
27549
27646
 
27550
27647
  // src/mcp/services/FileOperations.ts
@@ -27818,7 +27915,12 @@ var executeSecurityScan = async ({
27818
27915
  isFullScan: !!isAllDetectionRulesScan,
27819
27916
  sha,
27820
27917
  scanContext,
27821
- fileCount
27918
+ fileCount,
27919
+ // MVS device attribution: a developer appears in the MVS Developers grid
27920
+ // from scanning alone (no fresh login needed).
27921
+ computerName: os16.hostname(),
27922
+ computerUser: getComputerUser(),
27923
+ clientVersion: packageJson.version
27822
27924
  };
27823
27925
  logInfo(`[${scanContext}] Submitting vulnerability report`);
27824
27926
  logDebug(`[${scanContext}] Submit vulnerability report variables`, {
@@ -28943,6 +29045,7 @@ var _ScanAndFixVulnerabilitiesService = class _ScanAndFixVulnerabilitiesService
28943
29045
  isExpired: this.storedFixReportId ? this.isFixReportIdExpired() : null
28944
29046
  });
28945
29047
  let fixReportId = this.storedFixReportId;
29048
+ let didScan = false;
28946
29049
  if (!fixReportId || isRescan || this.isFixReportIdExpired()) {
28947
29050
  logInfo("Scanning files");
28948
29051
  this.reset();
@@ -28954,6 +29057,7 @@ var _ScanAndFixVulnerabilitiesService = class _ScanAndFixVulnerabilitiesService
28954
29057
  scanContext: ScanContext.USER_REQUEST
28955
29058
  });
28956
29059
  fixReportId = scanResult.fixReportId;
29060
+ didScan = true;
28957
29061
  } else {
28958
29062
  logInfo("Using stored fixReportId");
28959
29063
  }
@@ -28966,6 +29070,23 @@ var _ScanAndFixVulnerabilitiesService = class _ScanAndFixVulnerabilitiesService
28966
29070
  limit: effectiveLimit
28967
29071
  });
28968
29072
  logInfo(`Found ${fixes.totalCount} fixes`);
29073
+ if (fixReportId && effectiveOffset === 0 && fixes.totalCount > 0) {
29074
+ if (didScan) {
29075
+ await this.gqlClient.logMvsEvent({
29076
+ eventType: "RISK_DETECTED",
29077
+ fixReportId,
29078
+ riskCount: fixes.totalCount
29079
+ });
29080
+ }
29081
+ await this.gqlClient.logMvsEvent({
29082
+ eventType: "FIXES_VIEWED",
29083
+ fixReportId,
29084
+ // Count of fixes shown, so the Event Log row mirrors Fixable Issues
29085
+ // Detected ("N issues"). Not summed into the Fixable Issues KPI,
29086
+ // which only counts RISK_DETECTED.
29087
+ riskCount: fixes.totalCount
29088
+ });
29089
+ }
28969
29090
  if (fixes.totalCount > 0) {
28970
29091
  this.storedFixReportId = fixReportId;
28971
29092
  this.fixReportIdTimestamp = Date.now();
@@ -29762,18 +29883,18 @@ async function getGrpcClient(port, csrf3) {
29762
29883
 
29763
29884
  // src/features/codeium_intellij/parse_intellij_logs.ts
29764
29885
  import fs27 from "fs";
29765
- import os15 from "os";
29886
+ import os17 from "os";
29766
29887
  import path35 from "path";
29767
29888
  function getLogsDir() {
29768
29889
  if (process.platform === "darwin") {
29769
- return path35.join(os15.homedir(), "Library/Logs/JetBrains");
29890
+ return path35.join(os17.homedir(), "Library/Logs/JetBrains");
29770
29891
  } else if (process.platform === "win32") {
29771
29892
  return path35.join(
29772
- process.env["LOCALAPPDATA"] || path35.join(os15.homedir(), "AppData/Local"),
29893
+ process.env["LOCALAPPDATA"] || path35.join(os17.homedir(), "AppData/Local"),
29773
29894
  "JetBrains"
29774
29895
  );
29775
29896
  } else {
29776
- return path35.join(os15.homedir(), ".cache/JetBrains");
29897
+ return path35.join(os17.homedir(), ".cache/JetBrains");
29777
29898
  }
29778
29899
  }
29779
29900
  function parseIdeLogDir(ideLogDir) {
@@ -29996,11 +30117,11 @@ function processChatStepCodeAction(step) {
29996
30117
 
29997
30118
  // src/features/codeium_intellij/install_hook.ts
29998
30119
  import fsPromises5 from "fs/promises";
29999
- import os16 from "os";
30120
+ import os18 from "os";
30000
30121
  import path36 from "path";
30001
30122
  import chalk14 from "chalk";
30002
30123
  function getCodeiumHooksPath() {
30003
- return path36.join(os16.homedir(), ".codeium", "hooks.json");
30124
+ return path36.join(os18.homedir(), ".codeium", "hooks.json");
30004
30125
  }
30005
30126
  async function readCodeiumHooks() {
30006
30127
  const hooksPath = getCodeiumHooksPath();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobbdev",
3
- "version": "1.4.22",
3
+ "version": "1.4.25",
4
4
  "description": "Automated secure code remediation tool",
5
5
  "repository": "git+https://github.com/mobb-dev/bugsy.git",
6
6
  "main": "dist/index.mjs",