@fern-api/fern-api-dev 5.9.0 → 5.10.0-1-g676d8dd513d

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.
Files changed (2) hide show
  1. package/cli.cjs +304 -44
  2. package/package.json +1 -1
package/cli.cjs CHANGED
@@ -58001,7 +58001,9 @@ function newRepositoryReference({ remote, owner, repo }) {
58001
58001
  repoUrl,
58002
58002
  cloneUrl,
58003
58003
  getAuthedCloneUrl: (installationToken) => {
58004
- return cloneUrl.replace("https://", `https://x-access-token:${installationToken}@`);
58004
+ const isInstallationToken = installationToken.startsWith("ghs_") || installationToken.startsWith("ghu_");
58005
+ const userPrefix = isInstallationToken ? "x-access-token:" : "";
58006
+ return cloneUrl.replace("https://", `https://${userPrefix}${installationToken}@`);
58005
58007
  }
58006
58008
  };
58007
58009
  }
@@ -291713,7 +291715,7 @@ var require_websocket = __commonJS({
291713
291715
  var http13 = require("http");
291714
291716
  var net4 = require("net");
291715
291717
  var tls2 = require("tls");
291716
- var { randomBytes: randomBytes2, createHash: createHash5 } = require("crypto");
291718
+ var { randomBytes: randomBytes2, createHash: createHash6 } = require("crypto");
291717
291719
  var { Duplex, Readable: Readable8 } = require("stream");
291718
291720
  var { URL: URL4 } = require("url");
291719
291721
  var PerMessageDeflate2 = require_permessage_deflate();
@@ -292373,7 +292375,7 @@ var require_websocket = __commonJS({
292373
292375
  abortHandshake(websocket, socket, "Invalid Upgrade header");
292374
292376
  return;
292375
292377
  }
292376
- const digest = createHash5("sha1").update(key2 + GUID).digest("base64");
292378
+ const digest = createHash6("sha1").update(key2 + GUID).digest("base64");
292377
292379
  if (res.headers["sec-websocket-accept"] !== digest) {
292378
292380
  abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
292379
292381
  return;
@@ -292740,7 +292742,7 @@ var require_websocket_server = __commonJS({
292740
292742
  var EventEmitter9 = require("events");
292741
292743
  var http13 = require("http");
292742
292744
  var { Duplex } = require("stream");
292743
- var { createHash: createHash5 } = require("crypto");
292745
+ var { createHash: createHash6 } = require("crypto");
292744
292746
  var extension4 = require_extension();
292745
292747
  var PerMessageDeflate2 = require_permessage_deflate();
292746
292748
  var subprotocol2 = require_subprotocol();
@@ -293041,7 +293043,7 @@ var require_websocket_server = __commonJS({
293041
293043
  );
293042
293044
  }
293043
293045
  if (this._state > RUNNING) return abortHandshake(socket, 503);
293044
- const digest = createHash5("sha1").update(key2 + GUID).digest("base64");
293046
+ const digest = createHash6("sha1").update(key2 + GUID).digest("base64");
293045
293047
  const headers2 = [
293046
293048
  "HTTP/1.1 101 Switching Protocols",
293047
293049
  "Upgrade: websocket",
@@ -345532,6 +345534,7 @@ var require_replay_run = __commonJS({
345532
345534
  "../../generator-cli/lib/replay/replay-run.js"(exports2) {
345533
345535
  "use strict";
345534
345536
  Object.defineProperty(exports2, "__esModule", { value: true });
345537
+ exports2.ReplayPrepareError = void 0;
345535
345538
  exports2.replayPrepare = replayPrepare;
345536
345539
  exports2.replayApply = replayApply;
345537
345540
  exports2.replayRun = replayRun;
@@ -345577,12 +345580,17 @@ var require_replay_run = __commonJS({
345577
345580
  if (!isTagMergedIntoHead(outputDir, tagSha)) {
345578
345581
  logger4?.warn(`fern-generation-base tag ${tagSha} is not reachable from HEAD \u2014 skipping divergent-merge sync. The tag likely points at an unmerged generation (PR closed without merge).`);
345579
345582
  } else {
345580
- const syncService = new replay_1.ReplayService(outputDir, { enabled: true });
345581
- await syncService.syncFromDivergentMerge(tagSha, {
345582
- cliVersion,
345583
- generatorVersions,
345584
- baseBranchHead: baseBranchHead ?? void 0
345585
- });
345583
+ try {
345584
+ const syncService = new replay_1.ReplayService(outputDir, { enabled: true });
345585
+ await syncService.syncFromDivergentMerge(tagSha, {
345586
+ cliVersion,
345587
+ generatorVersions,
345588
+ baseBranchHead: baseBranchHead ?? void 0
345589
+ });
345590
+ } catch (error50) {
345591
+ logger4?.warn("Replay divergent-merge sync failed, continuing without sync: " + String(error50));
345592
+ throw new ReplayPrepareError(String(error50), error50);
345593
+ }
345586
345594
  try {
345587
345595
  const freshLockManager = new replay_1.LockfileManager(outputDir);
345588
345596
  if (freshLockManager.exists()) {
@@ -345604,8 +345612,8 @@ var require_replay_run = __commonJS({
345604
345612
  baseBranchHead: baseBranchHead ?? void 0
345605
345613
  });
345606
345614
  } catch (error50) {
345607
- logger4?.warn("Replay failed, continuing without replay: " + String(error50));
345608
- return null;
345615
+ logger4?.warn("Replay prepare failed, continuing without replay: " + String(error50));
345616
+ throw new ReplayPrepareError(String(error50), error50);
345609
345617
  }
345610
345618
  return {
345611
345619
  _service: service,
@@ -345623,13 +345631,14 @@ var require_replay_run = __commonJS({
345623
345631
  try {
345624
345632
  report = await prepared._service.applyPreparedReplay(prepared._preparation, { stageOnly });
345625
345633
  } catch (error50) {
345626
- logger4?.warn("Replay failed, continuing without replay: " + String(error50));
345634
+ logger4?.warn("Replay apply failed, continuing without replay: " + String(error50));
345627
345635
  return {
345628
345636
  report: null,
345629
345637
  fernignoreUpdated: false,
345630
345638
  previousGenerationSha: prepared.previousGenerationSha,
345631
345639
  currentGenerationSha: prepared.currentGenerationSha,
345632
- baseBranchHead: prepared.baseBranchHead
345640
+ baseBranchHead: prepared.baseBranchHead,
345641
+ failureReason: String(error50)
345633
345642
  };
345634
345643
  }
345635
345644
  let resolvedBaseBranchHead = prepared.baseBranchHead;
@@ -345655,7 +345664,19 @@ var require_replay_run = __commonJS({
345655
345664
  };
345656
345665
  }
345657
345666
  async function replayRun(params2) {
345658
- const prepared = await replayPrepare(params2);
345667
+ let prepared;
345668
+ try {
345669
+ prepared = await replayPrepare(params2);
345670
+ } catch (error50) {
345671
+ return {
345672
+ report: null,
345673
+ fernignoreUpdated: false,
345674
+ previousGenerationSha: null,
345675
+ currentGenerationSha: null,
345676
+ baseBranchHead: null,
345677
+ failureReason: error50 instanceof ReplayPrepareError ? error50.reason : String(error50)
345678
+ };
345679
+ }
345659
345680
  if (prepared == null) {
345660
345681
  return {
345661
345682
  report: null,
@@ -345667,6 +345688,19 @@ var require_replay_run = __commonJS({
345667
345688
  }
345668
345689
  return replayApply(prepared, { stageOnly: params2.stageOnly, logger: params2.logger });
345669
345690
  }
345691
+ var ReplayPrepareError = class extends Error {
345692
+ reason;
345693
+ constructor(reason, cause) {
345694
+ super(`Replay prepare failed: ${reason}`, { cause });
345695
+ Object.setPrototypeOf(this, new.target.prototype);
345696
+ if (Error.captureStackTrace) {
345697
+ Error.captureStackTrace(this, this.constructor);
345698
+ }
345699
+ this.name = this.constructor.name;
345700
+ this.reason = reason;
345701
+ }
345702
+ };
345703
+ exports2.ReplayPrepareError = ReplayPrepareError;
345670
345704
  function isTagMergedIntoHead(cwd2, tagSha) {
345671
345705
  try {
345672
345706
  (0, child_process_1.execFileSync)("git", ["merge-base", "--is-ancestor", tagSha, "HEAD"], {
@@ -358208,6 +358242,7 @@ var require_GenerationCommitStep = __commonJS({
358208
358242
  "use strict";
358209
358243
  Object.defineProperty(exports2, "__esModule", { value: true });
358210
358244
  exports2.GenerationCommitStep = void 0;
358245
+ var child_process_1 = require("child_process");
358211
358246
  var replay_run_1 = require_replay_run();
358212
358247
  var BaseStep_1 = require_BaseStep();
358213
358248
  var GenerationCommitStep = class extends BaseStep_1.BaseStep {
@@ -358224,14 +358259,35 @@ var require_GenerationCommitStep = __commonJS({
358224
358259
  this.generatorName = generatorName;
358225
358260
  }
358226
358261
  async execute(_context) {
358227
- const prepared = await (0, replay_run_1.replayPrepare)({
358228
- outputDir: this.outputDir,
358229
- cliVersion: this.cliVersion,
358230
- generatorVersions: this.generatorVersions,
358231
- generatorName: this.generatorName,
358232
- skipApplication: this.config.skipApplication,
358233
- logger: this.logger
358234
- });
358262
+ const headBeforePrepare = tryRevParse(this.outputDir, "HEAD");
358263
+ let prepared;
358264
+ try {
358265
+ prepared = await (0, replay_run_1.replayPrepare)({
358266
+ outputDir: this.outputDir,
358267
+ cliVersion: this.cliVersion,
358268
+ generatorVersions: this.generatorVersions,
358269
+ generatorName: this.generatorName,
358270
+ skipApplication: this.config.skipApplication,
358271
+ logger: this.logger
358272
+ });
358273
+ } catch (error50) {
358274
+ const reason = error50 instanceof replay_run_1.ReplayPrepareError ? error50.reason : String(error50);
358275
+ if (headBeforePrepare != null) {
358276
+ try {
358277
+ (0, child_process_1.execFileSync)("git", ["reset", "--hard", headBeforePrepare], {
358278
+ cwd: this.outputDir,
358279
+ stdio: "pipe"
358280
+ });
358281
+ } catch {
358282
+ }
358283
+ }
358284
+ return {
358285
+ executed: true,
358286
+ success: true,
358287
+ errorMessage: reason,
358288
+ preparedReplay: null
358289
+ };
358290
+ }
358235
358291
  if (prepared == null) {
358236
358292
  return {
358237
358293
  executed: true,
@@ -358251,6 +358307,17 @@ var require_GenerationCommitStep = __commonJS({
358251
358307
  }
358252
358308
  };
358253
358309
  exports2.GenerationCommitStep = GenerationCommitStep;
358310
+ function tryRevParse(cwd2, rev) {
358311
+ try {
358312
+ return (0, child_process_1.execFileSync)("git", ["rev-parse", "--verify", rev], {
358313
+ cwd: cwd2,
358314
+ encoding: "utf-8",
358315
+ stdio: "pipe"
358316
+ }).trim();
358317
+ } catch {
358318
+ return null;
358319
+ }
358320
+ }
358254
358321
  }
358255
358322
  });
358256
358323
 
@@ -358548,8 +358615,10 @@ var require_replay_summary = __commonJS({
358548
358615
  const applied = result.patchesApplied ?? 0;
358549
358616
  const absorbed = result.patchesAbsorbed ?? 0;
358550
358617
  const unresolvedCount = result.unresolvedPatches?.length ?? 0;
358618
+ const unresolvedFiles = (result.unresolvedPatches ?? []).reduce((sum, patch5) => sum + patch5.conflictDetails.length, 0);
358551
358619
  const preserved = applied - absorbed;
358552
- logger4.debug(`Replay: flow=${result.flow}, detected=${result.patchesDetected ?? 0}, applied=${applied}, absorbed=${absorbed}, unresolved=${unresolvedCount}`);
358620
+ const replayLogicSucceeded = result.replayCrashed !== true;
358621
+ logger4.info(`[replay] flow=${result.flow ?? "unknown"} detected=${result.patchesDetected ?? 0} applied=${applied} conflicts=${result.patchesWithConflicts ?? 0} absorbed=${absorbed} repointed=${result.patchesRepointed ?? 0} content_rebased=${result.patchesContentRebased ?? 0} kept_as_user_owned=${result.patchesKeptAsUserOwned ?? 0} unresolved=${unresolvedCount} unresolved_files=${unresolvedFiles} warnings=${result.warnings?.length ?? 0} success=${replayLogicSucceeded}`);
358553
358622
  if (preserved > 0) {
358554
358623
  const absorbedNote = absorbed > 0 ? ` (some customizations now part of generated code)` : "";
358555
358624
  logger4.info(`Replay: customizations preserved${absorbedNote}`);
@@ -358557,8 +358626,29 @@ var require_replay_summary = __commonJS({
358557
358626
  logger4.info(`Replay: customizations now part of generated code`);
358558
358627
  }
358559
358628
  if (unresolvedCount > 0) {
358560
- const totalFiles = (result.unresolvedPatches ?? []).reduce((sum, patch5) => sum + patch5.conflictDetails.length, 0);
358561
- logger4.warn(`Replay: ${plural(totalFiles, "file")} ${totalFiles === 1 ? "has" : "have"} unresolved conflicts \u2014 resolve via \`fern replay resolve\``);
358629
+ const buckets = { sameLineEdit: 0, newFileBoth: 0, baseGenerationMismatch: 0, patchApplyFailed: 0, other: 0 };
358630
+ for (const patch5 of result.unresolvedPatches ?? []) {
358631
+ for (const file4 of patch5.conflictDetails) {
358632
+ switch (file4.conflictReason) {
358633
+ case "same-line-edit":
358634
+ buckets.sameLineEdit += 1;
358635
+ break;
358636
+ case "new-file-both":
358637
+ buckets.newFileBoth += 1;
358638
+ break;
358639
+ case "base-generation-mismatch":
358640
+ buckets.baseGenerationMismatch += 1;
358641
+ break;
358642
+ case "patch-apply-failed":
358643
+ buckets.patchApplyFailed += 1;
358644
+ break;
358645
+ default:
358646
+ buckets.other += 1;
358647
+ }
358648
+ }
358649
+ }
358650
+ logger4.debug(`[replay] conflict_buckets same_line_edit=${buckets.sameLineEdit} new_file_both=${buckets.newFileBoth} base_generation_mismatch=${buckets.baseGenerationMismatch} patch_apply_failed=${buckets.patchApplyFailed} other=${buckets.other}`);
358651
+ logger4.warn(`Replay: ${plural(unresolvedFiles, "file")} ${unresolvedFiles === 1 ? "has" : "have"} unresolved conflicts \u2014 resolve via \`fern replay resolve\``);
358562
358652
  for (const patch5 of result.unresolvedPatches ?? []) {
358563
358653
  logger4.warn(` "${patchDescription(patch5)}":`);
358564
358654
  for (const file4 of patch5.conflictDetails) {
@@ -358566,6 +358656,9 @@ var require_replay_summary = __commonJS({
358566
358656
  }
358567
358657
  }
358568
358658
  }
358659
+ if (result.replayCrashed === true && result.errorMessage != null) {
358660
+ logger4.warn(`Replay: ${result.errorMessage}`);
358661
+ }
358569
358662
  for (const warning of result.warnings ?? []) {
358570
358663
  logger4.warn(`Replay: ${warning}`);
358571
358664
  }
@@ -359006,6 +359099,18 @@ var require_ReplayStep = __commonJS({
359006
359099
  async execute(context3) {
359007
359100
  const generationCommit = context3.previousStepResults.generationCommit;
359008
359101
  const prepared = generationCommit?.preparedReplay;
359102
+ if (generationCommit != null && generationCommit.errorMessage != null && prepared == null) {
359103
+ return {
359104
+ executed: true,
359105
+ success: true,
359106
+ replayCrashed: true,
359107
+ errorMessage: generationCommit.errorMessage,
359108
+ flow: "normal-regeneration",
359109
+ patchesDetected: 0,
359110
+ patchesApplied: 0,
359111
+ patchesWithConflicts: 0
359112
+ };
359113
+ }
359009
359114
  if (generationCommit != null && prepared == null) {
359010
359115
  return {
359011
359116
  executed: true,
@@ -359028,6 +359133,21 @@ var require_ReplayStep = __commonJS({
359028
359133
  skipApplication: this.config.skipApplication,
359029
359134
  logger: this.logger
359030
359135
  });
359136
+ if (result.failureReason != null) {
359137
+ return {
359138
+ executed: true,
359139
+ success: true,
359140
+ replayCrashed: true,
359141
+ errorMessage: result.failureReason,
359142
+ previousGenerationSha: result.previousGenerationSha ?? void 0,
359143
+ currentGenerationSha: result.currentGenerationSha ?? void 0,
359144
+ baseBranchHead: result.baseBranchHead ?? void 0,
359145
+ flow: "normal-regeneration",
359146
+ patchesDetected: 0,
359147
+ patchesApplied: 0,
359148
+ patchesWithConflicts: 0
359149
+ };
359150
+ }
359031
359151
  if (result.report == null) {
359032
359152
  return {
359033
359153
  executed: true,
@@ -622638,7 +622758,7 @@ var AccessTokenPosthogManager = class {
622638
622758
  properties: {
622639
622759
  ...event,
622640
622760
  ...event.properties,
622641
- version: "5.9.0",
622761
+ version: "5.10.0-1-g676d8dd513d",
622642
622762
  usingAccessToken: true
622643
622763
  }
622644
622764
  });
@@ -622692,7 +622812,7 @@ var UserPosthogManager = class {
622692
622812
  distinctId: this.userId ?? await this.getPersistedDistinctId(),
622693
622813
  event: "CLI",
622694
622814
  properties: {
622695
- version: "5.9.0",
622815
+ version: "5.10.0-1-g676d8dd513d",
622696
622816
  ...event,
622697
622817
  ...event.properties,
622698
622818
  usingAccessToken: false,
@@ -628384,7 +628504,24 @@ var TaskContextAdapter = class {
628384
628504
  return false;
628385
628505
  }
628386
628506
  }
628387
- instrumentPostHogEvent(_event) {
628507
+ instrumentPostHogEvent(event) {
628508
+ try {
628509
+ if (event.command == null || event.command.length === 0) {
628510
+ return;
628511
+ }
628512
+ const eventName = event.command;
628513
+ const tags = {};
628514
+ if (event.orgId != null) {
628515
+ tags.org = event.orgId;
628516
+ }
628517
+ for (const [key2, value2] of Object.entries(event.properties ?? {})) {
628518
+ if (typeof value2 === "string" || typeof value2 === "number" || typeof value2 === "boolean" || value2 === null) {
628519
+ tags[String(key2)] = value2;
628520
+ }
628521
+ }
628522
+ this.context.telemetry.sendEvent(eventName, tags);
628523
+ } catch {
628524
+ }
628388
628525
  }
628389
628526
  formatError(error50) {
628390
628527
  if (error50 == null) {
@@ -847594,7 +847731,7 @@ var LOCAL_STORAGE_FOLDER4 = ".fern-dev";
847594
847731
  var LOGS_FOLDER_NAME = "logs";
847595
847732
  var MAX_LOGS_DIR_SIZE_BYTES = 100 * 1024 * 1024;
847596
847733
  function getCliSource() {
847597
- const version7 = "5.9.0";
847734
+ const version7 = "5.10.0-1-g676d8dd513d";
847598
847735
  return `cli@${version7}`;
847599
847736
  }
847600
847737
  var DebugLogger = class {
@@ -857762,7 +857899,7 @@ async function retryWithRateLimit({ fn: fn10, retryRateLimited, logger: logger4,
857762
857899
 
857763
857900
  // ../generation/remote-generation/remote-workspace-runner/lib/createAndStartJob.js
857764
857901
  var gzipAsync = (0, import_util19.promisify)(import_zlib5.gzip);
857765
- async function createAndStartJob({ projectConfig, workspace, organization, intermediateRepresentation, generatorInvocation, version: version7, context: context3, shouldLogS3Url, token, whitelabel, irVersionOverride, absolutePathToPreview, fiddlePreview, pushPreviewBranch, fernignorePath, skipFernignore, retryRateLimited, automationMode, autoMerge, skipIfNoDiff, loginCommand = "fern login" }) {
857902
+ async function createAndStartJob({ projectConfig, workspace, organization, intermediateRepresentation, generatorInvocation, version: version7, context: context3, shouldLogS3Url, token, whitelabel, replay, irVersionOverride, absolutePathToPreview, fiddlePreview, pushPreviewBranch, fernignorePath, skipFernignore, retryRateLimited, automationMode, autoMerge, skipIfNoDiff, loginCommand = "fern login" }) {
857766
857903
  let fernignoreContents;
857767
857904
  if (skipFernignore) {
857768
857905
  fernignoreContents = "";
@@ -857786,6 +857923,7 @@ async function createAndStartJob({ projectConfig, workspace, organization, inter
857786
857923
  shouldLogS3Url,
857787
857924
  token,
857788
857925
  whitelabel,
857926
+ replay,
857789
857927
  absolutePathToPreview,
857790
857928
  fiddlePreview,
857791
857929
  pushPreviewBranch,
@@ -858479,7 +858617,7 @@ var SourceUploader = class {
858479
858617
  };
858480
858618
 
858481
858619
  // ../generation/remote-generation/remote-workspace-runner/lib/runRemoteGenerationForGenerator.js
858482
- async function runRemoteGenerationForGenerator({ projectConfig, organization, workspace, interactiveTaskContext, generatorInvocation, version: version7, audiences, shouldLogS3Url, token, whitelabel, irVersionOverride, absolutePathToPreview, isPreview: isPreviewOverride, fiddlePreview, pushPreviewBranch, readme, fernignorePath, skipFernignore, dynamicIrOnly, retryRateLimited, requireEnvVars, automationMode, autoMerge, skipIfNoDiff, loginCommand }) {
858620
+ async function runRemoteGenerationForGenerator({ projectConfig, organization, workspace, interactiveTaskContext, generatorInvocation, version: version7, audiences, shouldLogS3Url, token, whitelabel, replay, irVersionOverride, absolutePathToPreview, isPreview: isPreviewOverride, fiddlePreview, pushPreviewBranch, readme, fernignorePath, skipFernignore, dynamicIrOnly, retryRateLimited, requireEnvVars, automationMode, autoMerge, skipIfNoDiff, loginCommand }) {
858483
858621
  const fdr = createFdrService({ token: token.value });
858484
858622
  const fdrOrigin = "https://registry-dev2.buildwithfern.com";
858485
858623
  const isAirGapped = await detectAirGappedMode(`${fdrOrigin}/health`, interactiveTaskContext.logger);
@@ -858659,6 +858797,7 @@ async function runRemoteGenerationForGenerator({ projectConfig, organization, wo
858659
858797
  shouldLogS3Url,
858660
858798
  token,
858661
858799
  whitelabel: whitelabel != null ? substituteEnvVars(whitelabel) : void 0,
858800
+ replay,
858662
858801
  irVersionOverride,
858663
858802
  absolutePathToPreview,
858664
858803
  fiddlePreview,
@@ -858821,7 +858960,7 @@ function resolveVersionFallback(resolvedVersion) {
858821
858960
  }
858822
858961
 
858823
858962
  // ../generation/remote-generation/remote-workspace-runner/lib/runRemoteGenerationForAPIWorkspace.js
858824
- async function runRemoteGenerationForAPIWorkspace({ projectConfig, organization, workspace, context: context3, generatorGroup, version: version7, shouldLogS3Url, token, whitelabel, absolutePathToPreview, isPreview, fiddlePreview, pushPreviewBranch, mode, fernignorePath, skipFernignore, dynamicIrOnly, validateWorkspace, retryRateLimited, requireEnvVars, automationMode, autoMerge, skipIfNoDiff, automation, occurrenceTracker, loginCommand }) {
858963
+ async function runRemoteGenerationForAPIWorkspace({ projectConfig, organization, workspace, context: context3, generatorGroup, version: version7, shouldLogS3Url, token, whitelabel, replay, absolutePathToPreview, isPreview, fiddlePreview, pushPreviewBranch, mode, fernignorePath, skipFernignore, dynamicIrOnly, validateWorkspace, retryRateLimited, requireEnvVars, automationMode, autoMerge, skipIfNoDiff, automation, occurrenceTracker, loginCommand }) {
858825
858964
  if (generatorGroup.generators.length === 0) {
858826
858965
  context3.logger.warn("No generators specified.");
858827
858966
  return null;
@@ -858845,6 +858984,7 @@ async function runRemoteGenerationForAPIWorkspace({ projectConfig, organization,
858845
858984
  shouldLogS3Url,
858846
858985
  token,
858847
858986
  whitelabel,
858987
+ replay,
858848
858988
  absolutePathToPreview,
858849
858989
  isPreview,
858850
858990
  fiddlePreview,
@@ -858872,7 +859012,7 @@ async function runRemoteGenerationForAPIWorkspace({ projectConfig, organization,
858872
859012
  snippetsProducedBy
858873
859013
  };
858874
859014
  }
858875
- async function generateOne({ generatorInvocation, interactiveTaskContext, projectConfig, organization, workspace, context: context3, generatorGroup, version: version7, shouldLogS3Url, token, whitelabel, absolutePathToPreview, isPreview, fiddlePreview, pushPreviewBranch, mode, fernignorePath, skipFernignore, dynamicIrOnly, validateWorkspace, retryRateLimited, requireEnvVars, automationMode, autoMerge, skipIfNoDiff, automation, generatorsYmlAbsolutePath, occurrenceTracker, loginCommand, onSnippetsProduced }) {
859015
+ async function generateOne({ generatorInvocation, interactiveTaskContext, projectConfig, organization, workspace, context: context3, generatorGroup, version: version7, shouldLogS3Url, token, whitelabel, replay, absolutePathToPreview, isPreview, fiddlePreview, pushPreviewBranch, mode, fernignorePath, skipFernignore, dynamicIrOnly, validateWorkspace, retryRateLimited, requireEnvVars, automationMode, autoMerge, skipIfNoDiff, automation, generatorsYmlAbsolutePath, occurrenceTracker, loginCommand, onSnippetsProduced }) {
858876
859016
  const startedAt = Date.now();
858877
859017
  try {
858878
859018
  const settings = getBaseOpenAPIWorkspaceSettingsFromGeneratorInvocation(generatorInvocation);
@@ -858920,6 +859060,7 @@ async function generateOne({ generatorInvocation, interactiveTaskContext, projec
858920
859060
  shouldLogS3Url,
858921
859061
  token,
858922
859062
  whitelabel,
859063
+ replay,
858923
859064
  readme: generatorInvocation.readme,
858924
859065
  irVersionOverride: generatorInvocation.irVersionOverride,
858925
859066
  absolutePathToPreview,
@@ -860247,7 +860388,7 @@ var LegacyDocsPublisher = class {
860247
860388
  previewId,
860248
860389
  disableTemplates: void 0,
860249
860390
  skipUpload,
860250
- cliVersion: "5.9.0",
860391
+ cliVersion: "5.10.0-1-g676d8dd513d",
860251
860392
  loginCommand: "fern auth login"
860252
860393
  });
860253
860394
  if (taskContext.getResult() === TaskResult.Failure) {
@@ -912760,6 +912901,88 @@ var import_os13 = __toESM(require("os"), 1);
912760
912901
  var import_path80 = __toESM(require("path"), 1);
912761
912902
  var import_tmp_promise15 = __toESM(require_tmp_promise(), 1);
912762
912903
 
912904
+ // ../generation/local-generation/local-workspace-runner/lib/buildReplayTelemetryProps.js
912905
+ var import_crypto9 = require("crypto");
912906
+ var KNOWN_CONFLICT_REASONS = [
912907
+ "same-line-edit",
912908
+ "new-file-both",
912909
+ "base-generation-mismatch",
912910
+ "patch-apply-failed"
912911
+ ];
912912
+ function isKnownConflictReason(reason) {
912913
+ return reason != null && KNOWN_CONFLICT_REASONS.includes(reason);
912914
+ }
912915
+ function buildReplayTelemetryProps(input3) {
912916
+ const { pipelineResult, generatorName, generatorVersion, cliVersion, repoUri, automationMode, autoMerge, skipIfNoDiff, hasBreakingChanges, versionArg, versionBump, replayConfigEnabled, noReplayFlag, githubMode, previewMode, durationMs } = input3;
912917
+ const replay = pipelineResult.steps.replay;
912918
+ const github = pipelineResult.steps.github;
912919
+ const unresolvedPatches = replay?.unresolvedPatches ?? [];
912920
+ const unresolvedConflictFilesCount = unresolvedPatches.reduce((sum, patch5) => sum + patch5.conflictDetails.length, 0);
912921
+ const conflictBuckets = {
912922
+ "same-line-edit": 0,
912923
+ "new-file-both": 0,
912924
+ "base-generation-mismatch": 0,
912925
+ "patch-apply-failed": 0,
912926
+ other: 0
912927
+ };
912928
+ for (const patch5 of unresolvedPatches) {
912929
+ for (const detail of patch5.conflictDetails) {
912930
+ if (isKnownConflictReason(detail.conflictReason)) {
912931
+ conflictBuckets[detail.conflictReason] += 1;
912932
+ } else {
912933
+ conflictBuckets.other += 1;
912934
+ }
912935
+ }
912936
+ }
912937
+ const replayLogicSucceeded = replay != null && replay.executed && replay.replayCrashed !== true;
912938
+ return {
912939
+ action: "pipeline_run",
912940
+ success: replayLogicSucceeded,
912941
+ executed: replay?.executed ?? false,
912942
+ flow: replay?.flow ?? null,
912943
+ replay_crashed: replay?.replayCrashed === true,
912944
+ pipeline_success: pipelineResult.success,
912945
+ pipeline_warnings_count: pipelineResult.warnings?.length ?? 0,
912946
+ replay_warnings_count: replay?.warnings?.length ?? 0,
912947
+ generator_name: generatorName,
912948
+ generator_version: generatorVersion,
912949
+ cli_version: cliVersion ?? null,
912950
+ repo_uri_hash: hashRepoUri(repoUri),
912951
+ automation_mode: automationMode,
912952
+ auto_merge_requested: autoMerge,
912953
+ auto_merge_enabled: github?.autoMergeEnabled === true,
912954
+ skip_if_no_diff: skipIfNoDiff,
912955
+ no_diff_skipped: github?.skippedNoDiff === true,
912956
+ version_arg: versionArg,
912957
+ version_bump: versionBump ?? null,
912958
+ has_breaking_changes: hasBreakingChanges,
912959
+ replay_config_enabled: replayConfigEnabled,
912960
+ no_replay_flag: noReplayFlag,
912961
+ github_mode: githubMode,
912962
+ preview_mode: previewMode,
912963
+ pr_created: github?.prNumber != null,
912964
+ pr_updated_existing: github?.updatedExistingPr === true,
912965
+ duration_ms: durationMs,
912966
+ patches_detected: replay?.patchesDetected ?? 0,
912967
+ patches_applied: replay?.patchesApplied ?? 0,
912968
+ patches_with_conflicts: replay?.patchesWithConflicts ?? 0,
912969
+ patches_absorbed: replay?.patchesAbsorbed ?? 0,
912970
+ patches_repointed: replay?.patchesRepointed ?? 0,
912971
+ patches_content_rebased: replay?.patchesContentRebased ?? 0,
912972
+ patches_kept_as_user_owned: replay?.patchesKeptAsUserOwned ?? 0,
912973
+ unresolved_patches_count: unresolvedPatches.length,
912974
+ unresolved_conflict_files_count: unresolvedConflictFilesCount,
912975
+ conflicts_same_line_edit: conflictBuckets["same-line-edit"],
912976
+ conflicts_new_file_both: conflictBuckets["new-file-both"],
912977
+ conflicts_base_generation_mismatch: conflictBuckets["base-generation-mismatch"],
912978
+ conflicts_patch_apply_failed: conflictBuckets["patch-apply-failed"],
912979
+ conflicts_other: conflictBuckets.other
912980
+ };
912981
+ }
912982
+ function hashRepoUri(uri) {
912983
+ return (0, import_crypto9.createHash)("sha256").update(uri).digest("hex").slice(0, 16);
912984
+ }
912985
+
912763
912986
  // ../generation/local-generation/local-workspace-runner/lib/getGeneratorOutputSubfolder.js
912764
912987
  function getGeneratorOutputSubfolder(generatorName) {
912765
912988
  const baseName = generatorName.split("/").pop() || "sdk";
@@ -913011,14 +913234,48 @@ generators:
913011
913234
  },
913012
913235
  generatorName: generatorInvocation.name
913013
913236
  }, pipelineLogger);
913237
+ const pipelineStart = Date.now();
913014
913238
  const pipelineResult = await pipeline6.run();
913239
+ const pipelineDurationMs = Date.now() - pipelineStart;
913015
913240
  if (pipelineResult.steps.replay != null) {
913016
913241
  (0, import_pipeline.logReplaySummary)(pipelineResult.steps.replay, {
913017
913242
  debug: (msg) => interactiveTaskContext.logger.debug(msg),
913018
- info: (msg) => interactiveTaskContext.logger.info(source_default.cyan(msg)),
913243
+ info: (msg) => {
913244
+ const isStructured = msg.startsWith("[replay] ") || msg.startsWith("[telemetry] ");
913245
+ interactiveTaskContext.logger.info(isStructured ? msg : source_default.cyan(msg));
913246
+ },
913019
913247
  warn: (msg) => interactiveTaskContext.logger.warn(source_default.yellow(msg)),
913020
913248
  error: (msg) => interactiveTaskContext.logger.error(source_default.red(msg))
913021
913249
  });
913250
+ if (!disableTelemetry) {
913251
+ try {
913252
+ const replayTelemetryProps = buildReplayTelemetryProps({
913253
+ pipelineResult,
913254
+ generatorName: generatorInvocation.name,
913255
+ generatorVersion: generatorInvocation.version,
913256
+ cliVersion: workspace.cliVersion,
913257
+ repoUri: selfhostedGithubConfig.uri,
913258
+ automationMode: automationMode === true,
913259
+ autoMerge: autoMerge === true,
913260
+ skipIfNoDiff: skipIfNoDiff === true,
913261
+ hasBreakingChanges,
913262
+ versionArg: version7 == null ? "none" : (0, import_autoversion3.isAutoVersion)(version7) ? "auto" : "explicit",
913263
+ versionBump: autoVersioningVersionBump,
913264
+ replayConfigEnabled: replay?.enabled === true,
913265
+ noReplayFlag: noReplay === true,
913266
+ githubMode: selfhostedGithubConfig.mode ?? "push",
913267
+ previewMode: selfhostedGithubConfig.previewMode === true,
913268
+ durationMs: pipelineDurationMs
913269
+ });
913270
+ interactiveTaskContext.instrumentPostHogEvent({
913271
+ command: "replay",
913272
+ properties: replayTelemetryProps
913273
+ });
913274
+ interactiveTaskContext.logger.debug(`[telemetry] replay event sent: ${JSON.stringify(replayTelemetryProps)}`);
913275
+ } catch (error50) {
913276
+ interactiveTaskContext.logger.debug(`[telemetry] failed to send replay event: ${String(error50)}`);
913277
+ }
913278
+ }
913022
913279
  }
913023
913280
  if (pipelineResult.steps.github?.skippedNoDiff) {
913024
913281
  interactiveTaskContext.logger.info(source_default.green("No changes detected \u2014 skipping PR creation"));
@@ -913881,6 +914138,7 @@ var LegacyRemoteGenerationRunner = class {
913881
914138
  skipFernignore: args.skipFernignore,
913882
914139
  absolutePathToPreview,
913883
914140
  whitelabel: void 0,
914141
+ replay: fernWorkspace.generatorsConfiguration?.replay,
913884
914142
  dynamicIrOnly: false,
913885
914143
  retryRateLimited: false,
913886
914144
  requireEnvVars: args.requireEnvVars ?? true
@@ -934690,7 +934948,7 @@ var CliContext = class _CliContext {
934690
934948
  if (false) {
934691
934949
  this.logger.error("CLI_VERSION is not defined");
934692
934950
  }
934693
- return "5.9.0";
934951
+ return "5.10.0-1-g676d8dd513d";
934694
934952
  }
934695
934953
  getCliName() {
934696
934954
  if (false) {
@@ -936628,6 +936886,7 @@ async function generateWorkspace({
936628
936886
  shouldLogS3Url,
936629
936887
  token,
936630
936888
  whitelabel: workspace.generatorsConfiguration?.whitelabel,
936889
+ replay,
936631
936890
  absolutePathToPreview,
936632
936891
  mode,
936633
936892
  fernignorePath,
@@ -947960,7 +948219,7 @@ var import_path94 = __toESM(require("path"), 1);
947960
948219
  // src/commands/docs-theme/ThemeConfigProcessor.ts
947961
948220
  init_lib6();
947962
948221
  var import_child_process12 = require("child_process");
947963
- var import_crypto9 = require("crypto");
948222
+ var import_crypto10 = require("crypto");
947964
948223
  var import_promises178 = require("fs/promises");
947965
948224
  var import_mime_types2 = __toESM(require_mime_types(), 1);
947966
948225
  var import_path93 = __toESM(require("path"), 1);
@@ -948176,7 +948435,7 @@ ${errors4.map((e8) => ` - ${e8}`).join("\n")}`,
948176
948435
  return this.uploadToCas(content5, contentType, bindPath, import_path93.default.basename(absolutePath));
948177
948436
  }
948178
948437
  async uploadToCas(content5, contentType, bindPath, label) {
948179
- const hash5 = (0, import_crypto9.createHash)("sha256").update(content5).digest("hex");
948438
+ const hash5 = (0, import_crypto10.createHash)("sha256").update(content5).digest("hex");
948180
948439
  const casUrl = `${FDR_ORIGIN}/v2/registry/content/${hash5}?orgId=${encodeURIComponent(this.orgId)}`;
948181
948440
  this.context.logger.debug(` CAS check: PUT ${casUrl} (${contentType}, ${content5.byteLength} bytes)`);
948182
948441
  let checkRes;
@@ -952048,7 +952307,7 @@ function computePreviewVersion({ previewId }) {
952048
952307
 
952049
952308
  // src/commands/sdk-preview/getPreviewId.ts
952050
952309
  var import_child_process14 = require("child_process");
952051
- var import_crypto10 = require("crypto");
952310
+ var import_crypto11 = require("crypto");
952052
952311
  var import_util71 = require("util");
952053
952312
  var execAsync2 = (0, import_util71.promisify)(import_child_process14.exec);
952054
952313
  var MAX_PREVIEW_ID_LENGTH = 40;
@@ -952072,7 +952331,7 @@ function sanitizeBranchName(branch) {
952072
952331
  return branch.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, MAX_PREVIEW_ID_LENGTH).replace(/-$/, "");
952073
952332
  }
952074
952333
  function generateRandomId() {
952075
- return (0, import_crypto10.randomBytes)(4).toString("hex");
952334
+ return (0, import_crypto11.randomBytes)(4).toString("hex");
952076
952335
  }
952077
952336
 
952078
952337
  // src/commands/sdk-preview/toPreviewPackageName.ts
@@ -952245,6 +952504,7 @@ async function sdkPreview({
952245
952504
  shouldLogS3Url: false,
952246
952505
  token,
952247
952506
  whitelabel: workspace.generatorsConfiguration?.whitelabel,
952507
+ replay: workspace.generatorsConfiguration?.replay,
952248
952508
  mode: void 0,
952249
952509
  fernignorePath: void 0,
952250
952510
  skipFernignore: false,
@@ -954384,12 +954644,12 @@ async function collectFiles(baseDirectory, relativeBase) {
954384
954644
  }
954385
954645
 
954386
954646
  // src/commands/write-translation/hash-utils.ts
954387
- var import_crypto11 = require("crypto");
954647
+ var import_crypto12 = require("crypto");
954388
954648
  var import_fs42 = require("fs");
954389
954649
  var import_promises195 = require("fs/promises");
954390
954650
  var import_path105 = __toESM(require("path"), 1);
954391
954651
  function calculateContentHash(content5) {
954392
- return (0, import_crypto11.createHash)("sha256").update(content5, "utf-8").digest("hex");
954652
+ return (0, import_crypto12.createHash)("sha256").update(content5, "utf-8").digest("hex");
954393
954653
  }
954394
954654
  async function loadHashMappings(translationsDirectory) {
954395
954655
  const hashesFilePath = import_path105.default.join(translationsDirectory, "hashes");
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "5.9.0",
2
+ "version": "5.10.0-1-g676d8dd513d",
3
3
  "repository": {
4
4
  "type": "git",
5
5
  "url": "git+https://github.com/fern-api/fern.git",