bitfab 0.64.5 → 0.64.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -51,7 +51,7 @@ var __version__, __packageName__;
51
51
  var init_version_generated = __esm({
52
52
  "src/version.generated.ts"() {
53
53
  "use strict";
54
- __version__ = "0.64.5";
54
+ __version__ = "0.64.7";
55
55
  __packageName__ = "bitfab";
56
56
  }
57
57
  });
@@ -2904,7 +2904,7 @@ var init_http = __esm({
2904
2904
  * Start a replay session by fetching historical traces.
2905
2905
  * Blocking call - creates an experiment and returns lightweight item references.
2906
2906
  */
2907
- async startReplay(traceFunctionKey, limit, traceIds, name, codeChangeDescription, codeChangeFiles, includeDbBranchLease, experimentGroupId, datasetIds, graderIds, dbBranchSettings, attempts, includeOriginalMetadata, onlyWithAssertions, skipAssertionJudging, experimentalSelectiveReplay, notes, metadata, dryRun) {
2907
+ async startReplay(traceFunctionKey, limit, traceIds, name, codeChangeDescription, codeChangeFiles, includeDbBranchLease, experimentGroupId, datasetIds, graderIds, dbBranchSettings, attempts, includeOriginalMetadata, onlyWithAssertions, skipAssertionJudging, experimentalSelectiveReplay, notes, metadata, dryRun, invocation) {
2908
2908
  const payload = { traceFunctionKey };
2909
2909
  if (experimentalSelectiveReplay !== void 0) {
2910
2910
  payload.experimentalSelectiveReplay = experimentalSelectiveReplay;
@@ -2965,6 +2965,9 @@ var init_http = __esm({
2965
2965
  if (dryRun) {
2966
2966
  payload.dryRun = true;
2967
2967
  }
2968
+ if (invocation !== void 0) {
2969
+ payload.invocation = invocation;
2970
+ }
2968
2971
  const git = await resolvedGitState();
2969
2972
  if (git && !isEmptyGitState(git)) {
2970
2973
  payload.git = git;
@@ -3760,6 +3763,113 @@ var init_replayInterrupt = __esm({
3760
3763
  }
3761
3764
  });
3762
3765
 
3766
+ // src/replayInvocation.ts
3767
+ function replayEnvironment() {
3768
+ if (readEnv(REPLAY_EXECUTION_TARGET_ENV) === HOSTED_EXECUTION_TARGET) {
3769
+ return "cloud_replay";
3770
+ }
3771
+ if (CI_TRUE_VALUES.has((readEnv(CI_ENV) ?? "").toLowerCase())) {
3772
+ return "ci";
3773
+ }
3774
+ if (CI_PRESENCE_ENV_VARS.some((name) => (readEnv(name) ?? "") !== "")) {
3775
+ return "ci";
3776
+ }
3777
+ return "local";
3778
+ }
3779
+ function flagScalar(value) {
3780
+ if (typeof value === "string") {
3781
+ return value.slice(0, MAX_FLAG_STRING_LENGTH);
3782
+ }
3783
+ if (typeof value === "number") {
3784
+ return Number.isFinite(value) ? value : void 0;
3785
+ }
3786
+ if (typeof value === "boolean" || value === null) {
3787
+ return value;
3788
+ }
3789
+ return void 0;
3790
+ }
3791
+ function flagValue(value) {
3792
+ if (Array.isArray(value)) {
3793
+ const items = value.slice(0, MAX_FLAG_LIST_LENGTH).map(flagScalar);
3794
+ return items.every((item) => item !== void 0) ? items : true;
3795
+ }
3796
+ const scalar = flagScalar(value);
3797
+ return scalar === void 0 ? true : scalar;
3798
+ }
3799
+ function optionFlagName(option) {
3800
+ return OPTION_FLAG_NAMES[option] ?? option.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
3801
+ }
3802
+ function metadataKeys(value) {
3803
+ const keys = Array.isArray(value) ? value.map((pair) => String(pair).split("=")[0]) : typeof value === "object" && value !== null ? Object.keys(value) : void 0;
3804
+ return keys === void 0 ? true : [...new Set(keys)].sort();
3805
+ }
3806
+ function invocationFlags(entries) {
3807
+ const flags = {};
3808
+ const seen = /* @__PURE__ */ new Set();
3809
+ for (const [name, value] of entries) {
3810
+ if (seen.size >= MAX_FLAGS) {
3811
+ break;
3812
+ }
3813
+ if (value === void 0 || seen.has(name) || name.length === 0 || name.length > MAX_FLAG_NAME_LENGTH || SECRET_FLAG_NAME.test(name)) {
3814
+ continue;
3815
+ }
3816
+ flags[name] = flagValue(
3817
+ name === METADATA_FLAG ? metadataKeys(value) : value
3818
+ );
3819
+ seen.add(name);
3820
+ }
3821
+ return flags;
3822
+ }
3823
+ function buildReplayInvocation(entries = []) {
3824
+ return {
3825
+ flags: invocationFlags(entries),
3826
+ sdk: { language: "typescript", version: __version__ },
3827
+ environment: replayEnvironment()
3828
+ };
3829
+ }
3830
+ function safeReplayInvocation(build) {
3831
+ try {
3832
+ return build();
3833
+ } catch {
3834
+ return void 0;
3835
+ }
3836
+ }
3837
+ function cliFlags(options) {
3838
+ return options?.[CLI_FLAGS];
3839
+ }
3840
+ var REPLAY_EXECUTION_TARGET_ENV, HOSTED_EXECUTION_TARGET, CI_ENV, CI_TRUE_VALUES, CI_PRESENCE_ENV_VARS, MAX_FLAGS, MAX_FLAG_NAME_LENGTH, MAX_FLAG_STRING_LENGTH, MAX_FLAG_LIST_LENGTH, SECRET_FLAG_NAME, CLI_FLAGS, METADATA_FLAG, OPTION_FLAG_NAMES;
3841
+ var init_replayInvocation = __esm({
3842
+ "src/replayInvocation.ts"() {
3843
+ "use strict";
3844
+ init_constants();
3845
+ init_readEnv();
3846
+ REPLAY_EXECUTION_TARGET_ENV = "BITFAB_REPLAY_EXECUTION_TARGET";
3847
+ HOSTED_EXECUTION_TARGET = "hosted";
3848
+ CI_ENV = "CI";
3849
+ CI_TRUE_VALUES = /* @__PURE__ */ new Set(["true", "1"]);
3850
+ CI_PRESENCE_ENV_VARS = [
3851
+ "GITHUB_ACTIONS",
3852
+ "GITLAB_CI",
3853
+ "CIRCLECI",
3854
+ "BUILDKITE",
3855
+ "JENKINS_URL",
3856
+ "TF_BUILD"
3857
+ ];
3858
+ MAX_FLAGS = 100;
3859
+ MAX_FLAG_NAME_LENGTH = 100;
3860
+ MAX_FLAG_STRING_LENGTH = 1e3;
3861
+ MAX_FLAG_LIST_LENGTH = 100;
3862
+ SECRET_FLAG_NAME = /key|token|secret|password/i;
3863
+ CLI_FLAGS = /* @__PURE__ */ Symbol("bitfab.replayCliFlags");
3864
+ METADATA_FLAG = "metadata";
3865
+ OPTION_FLAG_NAMES = {
3866
+ maxConcurrency: "concurrency",
3867
+ datasetId: "dataset-ids",
3868
+ datasetIds: "dataset-ids"
3869
+ };
3870
+ }
3871
+ });
3872
+
3763
3873
  // src/selectiveReplay.ts
3764
3874
  function replayNodeKey(node) {
3765
3875
  return JSON.stringify([node.traceFunctionKey, node.spanName]);
@@ -4189,6 +4299,16 @@ function resolveDbBranchSettings(dbBranch) {
4189
4299
  };
4190
4300
  return Object.keys(settings).length === 0 ? void 0 : settings;
4191
4301
  }
4302
+ function explicitReplayOptions(options) {
4303
+ var _a;
4304
+ const explicit = {};
4305
+ for (const name of REPLAY_OPTION_NAMES) {
4306
+ if (options?.[name] !== void 0) {
4307
+ explicit[_a = optionFlagName(name)] ?? (explicit[_a] = options[name]);
4308
+ }
4309
+ }
4310
+ return explicit;
4311
+ }
4192
4312
  function reportReplayProgress(progress) {
4193
4313
  const stderr = typeof process !== "undefined" ? process.stderr : void 0;
4194
4314
  if (!stderr) {
@@ -4700,7 +4820,12 @@ async function replay(httpClient, serviceUrl, traceFunctionKey, fn, options, reg
4700
4820
  options?.experimentalSelectiveReplay,
4701
4821
  options?.notes,
4702
4822
  options?.metadata,
4703
- options?.dryRun === true
4823
+ options?.dryRun === true,
4824
+ safeReplayInvocation(
4825
+ () => buildReplayInvocation(
4826
+ Object.entries(cliFlags(options) ?? explicitReplayOptions(options))
4827
+ )
4828
+ )
4704
4829
  );
4705
4830
  if (started.items.length === 0) {
4706
4831
  try {
@@ -5092,7 +5217,7 @@ async function writeReplayResultFile(result) {
5092
5217
  }
5093
5218
  }
5094
5219
  }
5095
- var REPLAY_PERSISTENCE_TIMEOUT_MS, MAX_REPLAY_ATTEMPTS, RESUME_CONFLICTING_OPTIONS, CARRIED_OVER_ERROR, BITFAB_PROGRESS_PREFIX, ReplayError, DbBranchReplayError, JUDGE_ASSERTIONS_DEPRECATION_WARNING;
5220
+ var REPLAY_PERSISTENCE_TIMEOUT_MS, MAX_REPLAY_ATTEMPTS, RESUME_CONFLICTING_OPTIONS, CARRIED_OVER_ERROR, REPLAY_OPTION_NAMES, BITFAB_PROGRESS_PREFIX, ReplayError, DbBranchReplayError, JUDGE_ASSERTIONS_DEPRECATION_WARNING;
5096
5221
  var init_replay = __esm({
5097
5222
  "src/replay.ts"() {
5098
5223
  "use strict";
@@ -5105,6 +5230,7 @@ var init_replay = __esm({
5105
5230
  init_replayContext();
5106
5231
  init_replayHeartbeat();
5107
5232
  init_replayInterrupt();
5233
+ init_replayInvocation();
5108
5234
  init_selectiveReplayRuntime();
5109
5235
  init_serialize();
5110
5236
  init_warnOnce();
@@ -5122,6 +5248,37 @@ var init_replay = __esm({
5122
5248
  "experimentalSelectiveReplay"
5123
5249
  ];
5124
5250
  CARRIED_OVER_ERROR = "This item errored in an earlier run of this experiment, before it was resumed.";
5251
+ REPLAY_OPTION_NAMES = [
5252
+ "experimentalSelectiveReplay",
5253
+ "limit",
5254
+ "attempts",
5255
+ "traceIds",
5256
+ "name",
5257
+ "notes",
5258
+ "metadata",
5259
+ "maxConcurrency",
5260
+ "codeChangeDescription",
5261
+ "codeChangeFiles",
5262
+ "mock",
5263
+ "mockOverride",
5264
+ "dbBranch",
5265
+ "experimentGroupId",
5266
+ "datasetId",
5267
+ "datasetIds",
5268
+ "graderIds",
5269
+ "onlyWithAssertions",
5270
+ "skipAssertionJudging",
5271
+ "judgeAssertions",
5272
+ "adaptInputs",
5273
+ "dryRun",
5274
+ "onItemFinish",
5275
+ "onProgress",
5276
+ "onItemStart",
5277
+ "onExperimentStart",
5278
+ "onInterrupt",
5279
+ "resume",
5280
+ "force"
5281
+ ];
5125
5282
  BITFAB_PROGRESS_PREFIX = "@@bitfab:progress ";
5126
5283
  ReplayError = class extends BitfabError {
5127
5284
  constructor(message, items, experimentId, experimentUrl, cause) {
@@ -11972,6 +12129,7 @@ init_replay();
11972
12129
  init_errors();
11973
12130
  init_replay();
11974
12131
  init_replayInterrupt();
12132
+ init_replayInvocation();
11975
12133
  init_warnOnce();
11976
12134
  function defineReplayRegistry(registry) {
11977
12135
  validateReplayRegistry(registry);