@coana-tech/cli 14.12.124 → 14.12.126

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/cli.mjs CHANGED
@@ -205058,6 +205058,9 @@ var CLILogger = class {
205058
205058
  // Spinner registers itself as wrapper in order to suspend spinning when logging -- default to the empty wrapper
205059
205059
  wrapper = (cb) => cb();
205060
205060
  finished = false;
205061
+ // Buffer for storing logs before MainProcessTransport is added (used in socket mode)
205062
+ streamBuffer = [];
205063
+ bufferingForStream = false;
205061
205064
  initWinstonLogger(debug, logFilePath) {
205062
205065
  if (this.logger instanceof import_winston.Logger) {
205063
205066
  return;
@@ -205124,20 +205127,43 @@ var CLILogger = class {
205124
205127
  setWrapper(wrapper) {
205125
205128
  this.wrapper = wrapper;
205126
205129
  }
205130
+ /**
205131
+ * Enable buffering of logs for later streaming via MainProcessTransport.
205132
+ * Call this early (before initialize()) when in socket mode.
205133
+ * Buffered logs will be flushed when addTransport() is called.
205134
+ */
205135
+ enableStreamBuffering() {
205136
+ this.bufferingForStream = true;
205137
+ }
205138
+ bufferLog(level, message2, meta) {
205139
+ if (this.bufferingForStream) {
205140
+ this.streamBuffer.push({
205141
+ level,
205142
+ message: message2,
205143
+ meta,
205144
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
205145
+ });
205146
+ }
205147
+ }
205127
205148
  info(message2, ...meta) {
205149
+ this.bufferLog("info", message2, meta);
205128
205150
  this.wrapper(() => this.logger.info(message2, ...meta));
205129
205151
  }
205130
205152
  file(message2, ...meta) {
205131
205153
  if (this.logger instanceof Console) return;
205154
+ this.bufferLog("file", message2, meta);
205132
205155
  this.wrapper(() => this.logger.log("file", message2, ...meta));
205133
205156
  }
205134
205157
  debug(message2, ...meta) {
205158
+ this.bufferLog("debug", message2, meta);
205135
205159
  this.wrapper(() => this.logger.debug(message2, ...meta));
205136
205160
  }
205137
205161
  warn(message2, ...meta) {
205162
+ this.bufferLog("warn", message2, meta);
205138
205163
  this.wrapper(() => this.logger.warn(message2, ...meta));
205139
205164
  }
205140
205165
  error(message2, ...meta) {
205166
+ this.bufferLog("error", message2, meta);
205141
205167
  this.wrapper(() => this.logger.error(message2, ...meta));
205142
205168
  }
205143
205169
  isDebugEnabled() {
@@ -205155,13 +205181,37 @@ var CLILogger = class {
205155
205181
  /**
205156
205182
  * Add a transport to the main process logger.
205157
205183
  * Used to add the MainProcessTransport so main process logs are sent to backend.
205184
+ * If buffering was enabled, buffered logs will be flushed to the new transport.
205158
205185
  *
205159
205186
  * @param transport - The transport to add
205160
205187
  */
205161
205188
  addTransport(transport) {
205162
205189
  if (this.logger instanceof import_winston.Logger) {
205163
205190
  this.logger.add(transport);
205191
+ if (this.bufferingForStream) {
205192
+ this.flushBufferToTransport(transport);
205193
+ }
205194
+ }
205195
+ }
205196
+ flushBufferToTransport(transport) {
205197
+ for (const entry of this.streamBuffer) {
205198
+ try {
205199
+ const fullMessage = entry.meta.length > 0 ? `${entry.message} ${entry.meta.map((m4) => typeof m4 === "object" ? JSON.stringify(m4) : String(m4)).join(" ")}` : entry.message;
205200
+ transport.log?.(
205201
+ {
205202
+ level: entry.level,
205203
+ message: fullMessage,
205204
+ timestamp: entry.timestamp
205205
+ },
205206
+ () => {
205207
+ }
205208
+ );
205209
+ } catch (error) {
205210
+ console.error("Error flushing buffered log entry:", error);
205211
+ }
205164
205212
  }
205213
+ this.streamBuffer = [];
205214
+ this.bufferingForStream = false;
205165
205215
  }
205166
205216
  /**
205167
205217
  * End the logger instance and return a promise
@@ -231701,6 +231751,9 @@ var CLILogger2 = class {
231701
231751
  // Spinner registers itself as wrapper in order to suspend spinning when logging -- default to the empty wrapper
231702
231752
  wrapper = (cb) => cb();
231703
231753
  finished = false;
231754
+ // Buffer for storing logs before MainProcessTransport is added (used in socket mode)
231755
+ streamBuffer = [];
231756
+ bufferingForStream = false;
231704
231757
  initWinstonLogger(debug, logFilePath) {
231705
231758
  if (this.logger instanceof import_winston2.Logger) {
231706
231759
  return;
@@ -231757,21 +231810,44 @@ var CLILogger2 = class {
231757
231810
  setWrapper(wrapper) {
231758
231811
  this.wrapper = wrapper;
231759
231812
  }
231813
+ /**
231814
+ * Enable buffering of logs for later streaming via MainProcessTransport.
231815
+ * Call this early (before initialize()) when in socket mode.
231816
+ * Buffered logs will be flushed when addTransport() is called.
231817
+ */
231818
+ enableStreamBuffering() {
231819
+ this.bufferingForStream = true;
231820
+ }
231821
+ bufferLog(level, message2, meta) {
231822
+ if (this.bufferingForStream) {
231823
+ this.streamBuffer.push({
231824
+ level,
231825
+ message: message2,
231826
+ meta,
231827
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
231828
+ });
231829
+ }
231830
+ }
231760
231831
  info(message2, ...meta) {
231832
+ this.bufferLog("info", message2, meta);
231761
231833
  this.wrapper(() => this.logger.info(message2, ...meta));
231762
231834
  }
231763
231835
  file(message2, ...meta) {
231764
231836
  if (this.logger instanceof Console2)
231765
231837
  return;
231838
+ this.bufferLog("file", message2, meta);
231766
231839
  this.wrapper(() => this.logger.log("file", message2, ...meta));
231767
231840
  }
231768
231841
  debug(message2, ...meta) {
231842
+ this.bufferLog("debug", message2, meta);
231769
231843
  this.wrapper(() => this.logger.debug(message2, ...meta));
231770
231844
  }
231771
231845
  warn(message2, ...meta) {
231846
+ this.bufferLog("warn", message2, meta);
231772
231847
  this.wrapper(() => this.logger.warn(message2, ...meta));
231773
231848
  }
231774
231849
  error(message2, ...meta) {
231850
+ this.bufferLog("error", message2, meta);
231775
231851
  this.wrapper(() => this.logger.error(message2, ...meta));
231776
231852
  }
231777
231853
  isDebugEnabled() {
@@ -231789,14 +231865,35 @@ var CLILogger2 = class {
231789
231865
  /**
231790
231866
  * Add a transport to the main process logger.
231791
231867
  * Used to add the MainProcessTransport so main process logs are sent to backend.
231868
+ * If buffering was enabled, buffered logs will be flushed to the new transport.
231792
231869
  *
231793
231870
  * @param transport - The transport to add
231794
231871
  */
231795
231872
  addTransport(transport) {
231796
231873
  if (this.logger instanceof import_winston2.Logger) {
231797
231874
  this.logger.add(transport);
231875
+ if (this.bufferingForStream) {
231876
+ this.flushBufferToTransport(transport);
231877
+ }
231798
231878
  }
231799
231879
  }
231880
+ flushBufferToTransport(transport) {
231881
+ for (const entry of this.streamBuffer) {
231882
+ try {
231883
+ const fullMessage = entry.meta.length > 0 ? `${entry.message} ${entry.meta.map((m4) => typeof m4 === "object" ? JSON.stringify(m4) : String(m4)).join(" ")}` : entry.message;
231884
+ transport.log?.({
231885
+ level: entry.level,
231886
+ message: fullMessage,
231887
+ timestamp: entry.timestamp
231888
+ }, () => {
231889
+ });
231890
+ } catch (error) {
231891
+ console.error("Error flushing buffered log entry:", error);
231892
+ }
231893
+ }
231894
+ this.streamBuffer = [];
231895
+ this.bufferingForStream = false;
231896
+ }
231800
231897
  /**
231801
231898
  * End the logger instance and return a promise
231802
231899
  * that resolves when the logger is finished.
@@ -251019,7 +251116,7 @@ async function onlineScan(dependencyTree, apiKey, timeout) {
251019
251116
  }
251020
251117
 
251021
251118
  // dist/version.js
251022
- var version3 = "14.12.124";
251119
+ var version3 = "14.12.126";
251023
251120
 
251024
251121
  // dist/cli-core.js
251025
251122
  var { mapValues, omit, partition, pickBy: pickBy2 } = import_lodash15.default;
@@ -251142,6 +251239,9 @@ var CliCore = class {
251142
251239
  const tmpDir = await createTmpDirectory("coana-cli-");
251143
251240
  this.coanaLogPath = join30(tmpDir, "coana-log.txt");
251144
251241
  this.coanaSocketPath = join30(tmpDir, "coana.sock");
251242
+ if (this.options.socketMode) {
251243
+ logger.enableStreamBuffering();
251244
+ }
251145
251245
  logger.initWinstonLogger(this.options.debug, this.coanaLogPath);
251146
251246
  logger.silent = this.options.silent;
251147
251247
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coana-tech/cli",
3
- "version": "14.12.124",
3
+ "version": "14.12.126",
4
4
  "description": "Coana CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -75753,6 +75753,9 @@ var CLILogger = class {
75753
75753
  // Spinner registers itself as wrapper in order to suspend spinning when logging -- default to the empty wrapper
75754
75754
  wrapper = (cb) => cb();
75755
75755
  finished = false;
75756
+ // Buffer for storing logs before MainProcessTransport is added (used in socket mode)
75757
+ streamBuffer = [];
75758
+ bufferingForStream = false;
75756
75759
  initWinstonLogger(debug, logFilePath) {
75757
75760
  if (this.logger instanceof import_winston.Logger) {
75758
75761
  return;
@@ -75819,20 +75822,43 @@ var CLILogger = class {
75819
75822
  setWrapper(wrapper) {
75820
75823
  this.wrapper = wrapper;
75821
75824
  }
75825
+ /**
75826
+ * Enable buffering of logs for later streaming via MainProcessTransport.
75827
+ * Call this early (before initialize()) when in socket mode.
75828
+ * Buffered logs will be flushed when addTransport() is called.
75829
+ */
75830
+ enableStreamBuffering() {
75831
+ this.bufferingForStream = true;
75832
+ }
75833
+ bufferLog(level, message, meta) {
75834
+ if (this.bufferingForStream) {
75835
+ this.streamBuffer.push({
75836
+ level,
75837
+ message,
75838
+ meta,
75839
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
75840
+ });
75841
+ }
75842
+ }
75822
75843
  info(message, ...meta) {
75844
+ this.bufferLog("info", message, meta);
75823
75845
  this.wrapper(() => this.logger.info(message, ...meta));
75824
75846
  }
75825
75847
  file(message, ...meta) {
75826
75848
  if (this.logger instanceof Console) return;
75849
+ this.bufferLog("file", message, meta);
75827
75850
  this.wrapper(() => this.logger.log("file", message, ...meta));
75828
75851
  }
75829
75852
  debug(message, ...meta) {
75853
+ this.bufferLog("debug", message, meta);
75830
75854
  this.wrapper(() => this.logger.debug(message, ...meta));
75831
75855
  }
75832
75856
  warn(message, ...meta) {
75857
+ this.bufferLog("warn", message, meta);
75833
75858
  this.wrapper(() => this.logger.warn(message, ...meta));
75834
75859
  }
75835
75860
  error(message, ...meta) {
75861
+ this.bufferLog("error", message, meta);
75836
75862
  this.wrapper(() => this.logger.error(message, ...meta));
75837
75863
  }
75838
75864
  isDebugEnabled() {
@@ -75850,14 +75876,38 @@ var CLILogger = class {
75850
75876
  /**
75851
75877
  * Add a transport to the main process logger.
75852
75878
  * Used to add the MainProcessTransport so main process logs are sent to backend.
75879
+ * If buffering was enabled, buffered logs will be flushed to the new transport.
75853
75880
  *
75854
75881
  * @param transport - The transport to add
75855
75882
  */
75856
75883
  addTransport(transport) {
75857
75884
  if (this.logger instanceof import_winston.Logger) {
75858
75885
  this.logger.add(transport);
75886
+ if (this.bufferingForStream) {
75887
+ this.flushBufferToTransport(transport);
75888
+ }
75859
75889
  }
75860
75890
  }
75891
+ flushBufferToTransport(transport) {
75892
+ for (const entry of this.streamBuffer) {
75893
+ try {
75894
+ const fullMessage = entry.meta.length > 0 ? `${entry.message} ${entry.meta.map((m) => typeof m === "object" ? JSON.stringify(m) : String(m)).join(" ")}` : entry.message;
75895
+ transport.log?.(
75896
+ {
75897
+ level: entry.level,
75898
+ message: fullMessage,
75899
+ timestamp: entry.timestamp
75900
+ },
75901
+ () => {
75902
+ }
75903
+ );
75904
+ } catch (error) {
75905
+ console.error("Error flushing buffered log entry:", error);
75906
+ }
75907
+ }
75908
+ this.streamBuffer = [];
75909
+ this.bufferingForStream = false;
75910
+ }
75861
75911
  /**
75862
75912
  * End the logger instance and return a promise
75863
75913
  * that resolves when the logger is finished.
@@ -88276,6 +88326,7 @@ var ToolPathResolver = class {
88276
88326
 
88277
88327
  // dist/whole-program-code-aware-vulnerability-scanner/code-aware-vulnerability-scanner.js
88278
88328
  var import_lodash13 = __toESM(require_lodash(), 1);
88329
+ import { readFileSync as readFileSync3 } from "fs";
88279
88330
  import { resolve as resolve17 } from "path";
88280
88331
 
88281
88332
  // dist/whole-program-code-aware-vulnerability-scanner/dotnet/dotnet-code-aware-vulnerability-scanner.js
@@ -110415,7 +110466,7 @@ async function runJellyAnalysis(mainProjectRoot, projectRoot, jellyOptions, reac
110415
110466
  ${getExcludes(mainProjectRoot, projectRoot, reachabilityAnalysisOptions)}
110416
110467
  --diagnostics-json ${diagnosticsFile}
110417
110468
  --max-indirections=${jellyOptions.maxIndirections}
110418
- ${!!jellyOptions.includePackages?.length && ["--include-packages", ...jellyOptions.includePackages]}
110469
+ ${!!jellyOptions.includePackages && jellyOptions.includePackages.length ? ["--include-packages", ...jellyOptions.includePackages] : ["--ignore-dependencies"]}
110419
110470
  ${jellyOptions.approx && "--approx"}
110420
110471
  ${logFile ? ["--logfile", logFile] : []}
110421
110472
  --callstacks-json ${callStackFile}
@@ -110484,7 +110535,7 @@ async function runJellyImportReachabilityAnalysis(mainProjectRoot, projectRoot,
110484
110535
  const reachableModulesFile = resolve14(tmpFolder, "reachable-modules.json");
110485
110536
  const jellyCmd = cmdt`${await getNodeExecutable(ToolPathResolver.nodeExecutablePath)} --max-old-space-size=${options.memoryLimitInMB}
110486
110537
  ${ToolPathResolver.jellyPath} --basedir ${mainProjectRoot} --modules-only
110487
- ${!!includePackages.length && ["--include-packages", ...includePackages]}
110538
+ ${includePackages.length ? ["--include-packages", ...includePackages] : ["--ignore-dependencies"]}
110488
110539
  ${getExcludes(mainProjectRoot, projectRoot, options)}
110489
110540
  --reachable-json ${reachableModulesFile}
110490
110541
  ${options.entryPoints ?? projectRoot}`;
@@ -111524,7 +111575,7 @@ async function analyzePackages(ecosystem, packages, vulnerability, options) {
111524
111575
  default:
111525
111576
  throw new Error(`Analyze dependency chain not implemented for ${ecosystem}.`);
111526
111577
  }
111527
- return { analysis: { name: analysisName, version: await getVersion(analysisName) }, result };
111578
+ return { analysis: { name: analysisName, version: getVersion(analysisName) }, result };
111528
111579
  }
111529
111580
  async function analyzeAlreadyInstalledPackages(ecosystem, packages, vulnerability, options) {
111530
111581
  let analysisName;
@@ -111557,7 +111608,7 @@ async function analyzeAlreadyInstalledPackages(ecosystem, packages, vulnerabilit
111557
111608
  default:
111558
111609
  throw new Error(`analyzePackageRegistryPackage is not implemented for ${ecosystem}.`);
111559
111610
  }
111560
- return { analysis: { name: analysisName, version: await getCurrentCommitHash(analysisName.toLowerCase()) }, result };
111611
+ return { analysis: { name: analysisName, version: getCurrentCommitHash(analysisName.toLowerCase()) }, result };
111561
111612
  }
111562
111613
  async function runWithJSHeuristics(cb) {
111563
111614
  const orderedHeuristics = [heuristics.ALL_PACKAGES];
@@ -111569,8 +111620,15 @@ async function runWithJSHeuristics(cb) {
111569
111620
  }
111570
111621
  return result;
111571
111622
  }
111572
- async function getCurrentCommitHash(project) {
111573
- return (await runCommandResolveStdOut2("git rev-parse HEAD", resolve17(COANA_REPOS_PATH(), project))).trim();
111623
+ function getCurrentCommitHash(project) {
111624
+ const headShaPath = resolve17(COANA_REPOS_PATH(), project, "HEAD_SHA");
111625
+ try {
111626
+ const content = readFileSync3(headShaPath, "utf-8").trim();
111627
+ const colonIndex = content.indexOf(":");
111628
+ return colonIndex !== -1 ? content.slice(colonIndex + 1) : content;
111629
+ } catch {
111630
+ return "unknown";
111631
+ }
111574
111632
  }
111575
111633
  function detectedOccurrencesFromAPMatches(matches, pathPrefixToRemove) {
111576
111634
  for (const match2 of Object.values(matches))
@@ -111606,9 +111664,9 @@ function getStacksFromAccPaths(matches, { vulnerabilityAccessPaths }) {
111606
111664
  stacks: relevantStacks
111607
111665
  };
111608
111666
  }
111609
- async function getVersion(analysisName) {
111667
+ function getVersion(analysisName) {
111610
111668
  if (analysisName === "Jelly")
111611
- return await getCurrentCommitHash(analysisName.toLowerCase());
111669
+ return getCurrentCommitHash(analysisName.toLowerCase());
111612
111670
  return "N/A";
111613
111671
  }
111614
111672