omp-fabric 1.25.6 → 1.25.8

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 (72) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +19 -21
  3. package/dist/audit/projection.d.ts.map +1 -1
  4. package/dist/chunks/{chunk-HAH64YUG.js → chunk-2C5YN36Y.js} +2 -2
  5. package/dist/chunks/chunk-2C5YN36Y.js.map +7 -0
  6. package/dist/chunks/{chunk-3BS4RMF4.js → chunk-AZBJNZS4.js} +2 -2
  7. package/dist/chunks/{chunk-EZRC24CX.js → chunk-BMSAIMFB.js} +2 -2
  8. package/dist/chunks/{chunk-63VIZJGS.js → chunk-BWLZ6VDQ.js} +2 -2
  9. package/dist/chunks/{chunk-BQG4LFAC.js → chunk-D55BFSFK.js} +2 -2
  10. package/dist/chunks/{chunk-WUPYPFAC.js → chunk-E3KTE736.js} +3 -3
  11. package/dist/chunks/{chunk-JBKYNJFN.js → chunk-FL4A542C.js} +2 -1
  12. package/dist/chunks/chunk-FL4A542C.js.map +7 -0
  13. package/dist/chunks/{chunk-REHGQCXU.js → chunk-J2BDKPO4.js} +4 -4
  14. package/dist/chunks/{chunk-3KORI7FQ.js → chunk-KLWNXXEI.js} +2 -2
  15. package/dist/chunks/{chunk-XLINRLLP.js → chunk-PIW2DEO2.js} +4 -4
  16. package/dist/chunks/{chunk-H3KRHDDF.js → chunk-QJKOPPW2.js} +2 -2
  17. package/dist/chunks/{chunk-6G25AUGA.js → chunk-UKB5RJDP.js} +4 -4
  18. package/dist/chunks/chunk-UKB5RJDP.js.map +7 -0
  19. package/dist/chunks/{chunk-GPJV2FSP.js → chunk-WX6C7N3W.js} +2 -2
  20. package/dist/chunks/{chunk-ABBGHQVX.js → chunk-YAI5SCIE.js} +2 -2
  21. package/dist/chunks/{chunk-G3ELO3QC.js → chunk-Z6TTRT6Q.js} +2 -2
  22. package/dist/compaction/hook.js +3 -3
  23. package/dist/compaction/lcm-runtime.js +4 -4
  24. package/dist/core/action-registry.js +2 -2
  25. package/dist/core/system-guidance.d.ts.map +1 -1
  26. package/dist/entropy/index.js +5 -5
  27. package/dist/fabric-runtime-state.js +72 -26
  28. package/dist/fabric-runtime-state.js.map +2 -2
  29. package/dist/host-compatibility.d.ts +1 -1
  30. package/dist/index.js +19 -15
  31. package/dist/index.js.map +2 -2
  32. package/dist/memory/discovery.js +4 -4
  33. package/dist/memory/normalize.js +3 -3
  34. package/dist/memory/search.js +4 -4
  35. package/dist/providers/memory-provider.js +6 -6
  36. package/dist/providers/omp-tools-provider.d.ts.map +1 -1
  37. package/dist/residency/host.js +6 -6
  38. package/dist/residency/omp-entry.js +6 -6
  39. package/dist/runtime/core-override-guest-types.js +1 -1
  40. package/dist/runtime/guest-types.d.ts +2 -2
  41. package/dist/runtime/guest-types.d.ts.map +1 -1
  42. package/dist/runtime/guest-types.js +1 -1
  43. package/dist/runtime/node-process-runtime.js +1 -1
  44. package/dist/runtime/quickjs-runtime.d.ts +1 -1
  45. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  46. package/dist/runtime/quickjs-runtime.js +1 -1
  47. package/dist/speculation/guest-args.d.ts.map +1 -1
  48. package/dist/speculation/scanner.js +2 -1
  49. package/dist/speculation/scanner.js.map +2 -2
  50. package/dist/type-error-guidance.d.ts.map +1 -1
  51. package/docs/audit-trace.md +1 -1
  52. package/docs/certification.md +1 -1
  53. package/docs/codemap.md +7 -8
  54. package/docs/configuration.md +1 -1
  55. package/docs/judgment.md +3 -3
  56. package/package.json +11 -11
  57. package/skills/fabric-exec/SKILL.md +4 -4
  58. package/dist/chunks/chunk-6G25AUGA.js.map +0 -7
  59. package/dist/chunks/chunk-HAH64YUG.js.map +0 -7
  60. package/dist/chunks/chunk-JBKYNJFN.js.map +0 -7
  61. /package/dist/chunks/{chunk-3BS4RMF4.js.map → chunk-AZBJNZS4.js.map} +0 -0
  62. /package/dist/chunks/{chunk-EZRC24CX.js.map → chunk-BMSAIMFB.js.map} +0 -0
  63. /package/dist/chunks/{chunk-63VIZJGS.js.map → chunk-BWLZ6VDQ.js.map} +0 -0
  64. /package/dist/chunks/{chunk-BQG4LFAC.js.map → chunk-D55BFSFK.js.map} +0 -0
  65. /package/dist/chunks/{chunk-WUPYPFAC.js.map → chunk-E3KTE736.js.map} +0 -0
  66. /package/dist/chunks/{chunk-REHGQCXU.js.map → chunk-J2BDKPO4.js.map} +0 -0
  67. /package/dist/chunks/{chunk-3KORI7FQ.js.map → chunk-KLWNXXEI.js.map} +0 -0
  68. /package/dist/chunks/{chunk-XLINRLLP.js.map → chunk-PIW2DEO2.js.map} +0 -0
  69. /package/dist/chunks/{chunk-H3KRHDDF.js.map → chunk-QJKOPPW2.js.map} +0 -0
  70. /package/dist/chunks/{chunk-GPJV2FSP.js.map → chunk-WX6C7N3W.js.map} +0 -0
  71. /package/dist/chunks/{chunk-ABBGHQVX.js.map → chunk-YAI5SCIE.js.map} +0 -0
  72. /package/dist/chunks/{chunk-G3ELO3QC.js.map → chunk-Z6TTRT6Q.js.map} +0 -0
@@ -11,8 +11,8 @@ import {
11
11
  MemoryProvider,
12
12
  actionArgNormalizer,
13
13
  uniqueDeclaredKeyForSpelling
14
- } from "./chunks/chunk-REHGQCXU.js";
15
- import "./chunks/chunk-63VIZJGS.js";
14
+ } from "./chunks/chunk-J2BDKPO4.js";
15
+ import "./chunks/chunk-BWLZ6VDQ.js";
16
16
  import "./chunks/chunk-U5FYOMG5.js";
17
17
  import {
18
18
  ApprovalController,
@@ -33,7 +33,7 @@ import {
33
33
  repairFabricGuestCode,
34
34
  resolveFabricIdentity,
35
35
  runFabricHandoffAtBoundary
36
- } from "./chunks/chunk-XLINRLLP.js";
36
+ } from "./chunks/chunk-PIW2DEO2.js";
37
37
  import "./chunks/chunk-7VIQNUPS.js";
38
38
  import {
39
39
  AgentTranscriptReader,
@@ -50,7 +50,7 @@ import {
50
50
  repairActionName,
51
51
  setActiveCompiledSurface,
52
52
  setActiveRepairCompiler
53
- } from "./chunks/chunk-3KORI7FQ.js";
53
+ } from "./chunks/chunk-KLWNXXEI.js";
54
54
  import {
55
55
  formatFabricEffectConflict
56
56
  } from "./chunks/chunk-LMAVZN7J.js";
@@ -63,8 +63,8 @@ import {
63
63
  withExclusiveFileLockAsync
64
64
  } from "./chunks/chunk-YWEXP724.js";
65
65
  import "./chunks/chunk-4A4MVZQW.js";
66
- import "./chunks/chunk-GPJV2FSP.js";
67
- import "./chunks/chunk-G3ELO3QC.js";
66
+ import "./chunks/chunk-WX6C7N3W.js";
67
+ import "./chunks/chunk-Z6TTRT6Q.js";
68
68
  import {
69
69
  FABRIC_COMPONENT_DISCOVER_EVENT,
70
70
  FABRIC_PROVIDER_DISCOVER_EVENT,
@@ -94,7 +94,7 @@ import {
94
94
  resolveAgentCwd,
95
95
  resolveOmpBinary,
96
96
  validateAgentCwdRequest
97
- } from "./chunks/chunk-ABBGHQVX.js";
97
+ } from "./chunks/chunk-YAI5SCIE.js";
98
98
  import "./chunks/chunk-VPPIJRNZ.js";
99
99
  import {
100
100
  executeFile,
@@ -104,7 +104,7 @@ import {
104
104
  import "./chunks/chunk-CT2AJ2UI.js";
105
105
  import {
106
106
  checkedHandoffCompaction
107
- } from "./chunks/chunk-H3KRHDDF.js";
107
+ } from "./chunks/chunk-QJKOPPW2.js";
108
108
  import {
109
109
  DEFAULT_FABRIC_CONFIG,
110
110
  FUZZY_RESOLUTION_MARKERS,
@@ -154,7 +154,7 @@ import {
154
154
  import {
155
155
  estimateTokens,
156
156
  fabricExecTitleHintCached
157
- } from "./chunks/chunk-BQG4LFAC.js";
157
+ } from "./chunks/chunk-D55BFSFK.js";
158
158
  import "./chunks/chunk-3J7BKUNG.js";
159
159
  import {
160
160
  MAX_COMPACTION_INSTRUCTIONS_CHARS,
@@ -164,12 +164,12 @@ import {
164
164
  encodeCompactionRequest
165
165
  } from "./chunks/chunk-QSRTEINF.js";
166
166
  import "./chunks/chunk-UAP6IQIR.js";
167
- import "./chunks/chunk-3BS4RMF4.js";
167
+ import "./chunks/chunk-AZBJNZS4.js";
168
168
  import {
169
169
  FabricExecutionTraceRecorder,
170
170
  FabricTraceSafeError,
171
171
  executionOutcomeFromError
172
- } from "./chunks/chunk-JBKYNJFN.js";
172
+ } from "./chunks/chunk-FL4A542C.js";
173
173
  import {
174
174
  OMP_GUEST_TOOL_NAMES,
175
175
  OMP_GUEST_TOOL_NAME_SET,
@@ -10773,6 +10773,10 @@ var GREP_SKIP_PROPERTY = {
10773
10773
  type: "number",
10774
10774
  description: "Files to skip before collecting results \u2014 paginate when a search hit the file limit"
10775
10775
  };
10776
+ var GREP_LIMIT_PROPERTY = {
10777
+ type: "number",
10778
+ description: "Cap on total surfaced matches \u2014 applied on top of the per-file and file-window caps, never above them"
10779
+ };
10776
10780
  var GITIGNORE_PROPERTY = {
10777
10781
  type: "boolean",
10778
10782
  description: "Respect gitignore rules; pass false to search ignored files such as build output or .env"
@@ -10793,7 +10797,7 @@ var withExtraProperties = (document, extras) => {
10793
10797
  if (Object.keys(additions).length === 0) return document;
10794
10798
  return { ...schema, properties: { ...properties, ...additions } };
10795
10799
  };
10796
- var withGrepSkipSchema = (document) => withExtraProperties(document, { skip: GREP_SKIP_PROPERTY, gitignore: GITIGNORE_PROPERTY });
10800
+ var withGrepOptionSchema = (document) => withExtraProperties(document, { skip: GREP_SKIP_PROPERTY, limit: GREP_LIMIT_PROPERTY, gitignore: GITIGNORE_PROPERTY });
10797
10801
  var withFindFilterSchema = (document) => withExtraProperties(document, { gitignore: GITIGNORE_PROPERTY, hidden: HIDDEN_PROPERTY });
10798
10802
  var grepSession = (cwd, context) => ({
10799
10803
  cwd,
@@ -10804,12 +10808,12 @@ var grepSession = (cwd, context) => ({
10804
10808
  context === void 0 ? void 0 : { "grep.contextBefore": Math.max(0, Math.floor(context)), "grep.contextAfter": Math.max(0, Math.floor(context)) }
10805
10809
  )
10806
10810
  });
10807
- var createGrepDefinitionWithSkip = (cwd) => {
10811
+ var createGrepDefinitionWithOptions = (cwd) => {
10808
10812
  const legacy = createGrepToolDefinition(cwd);
10809
10813
  const defaultTool = new GrepTool(grepSession(cwd));
10810
10814
  return {
10811
10815
  ...legacy,
10812
- parameters: withGrepSkipSchema(legacy.parameters),
10816
+ parameters: withGrepOptionSchema(legacy.parameters),
10813
10817
  execute: (toolCallId, params, signal, onUpdate, context) => {
10814
10818
  const record2 = asRecord(params) ?? {};
10815
10819
  const rawPattern = typeof record2.pattern === "string" ? record2.pattern : "";
@@ -10817,7 +10821,8 @@ var createGrepDefinitionWithSkip = (cwd) => {
10817
10821
  const glob = typeof record2.glob === "string" ? record2.glob : void 0;
10818
10822
  const contextLines = typeof record2.context === "number" ? record2.context : void 0;
10819
10823
  const skip = typeof record2.skip === "number" ? record2.skip : void 0;
10820
- const tool = contextLines === void 0 ? defaultTool : new GrepTool(grepSession(cwd, contextLines));
10824
+ const limit = typeof record2.limit === "number" ? record2.limit : void 0;
10825
+ const tool = contextLines === void 0 && limit === void 0 ? defaultTool : new GrepTool(grepSession(cwd, contextLines), limit === void 0 ? void 0 : { totalMatchLimit: limit });
10821
10826
  return tool.execute(
10822
10827
  toolCallId,
10823
10828
  {
@@ -11036,8 +11041,20 @@ var unreadableReadMessage = (note, readPath) => {
11036
11041
  const remedy = target ? ` Read the bytes with omp.read("${target}:raw").` : "";
11037
11042
  return `omp.read returned no text content: ${note.trim()}${remedy}`;
11038
11043
  };
11039
- var restoreBashOutput = (artifactPath, maxChars, delivered) => {
11044
+ var artifactFailureClause = (artifactError) => typeof artifactError === "string" ? `the host failed to save it (artifact ${artifactError} failed)` : "the host failed to save it";
11045
+ var oversizedArtifactBytes = (artifactPath, maxChars) => {
11046
+ if (!artifactPath || maxChars <= 0) return void 0;
11047
+ try {
11048
+ const { size } = statSync4(artifactPath);
11049
+ return size > maxChars ? size : void 0;
11050
+ } catch {
11051
+ return void 0;
11052
+ }
11053
+ };
11054
+ var restoreBashOutput = (artifactPath, maxChars, delivered, artifactElidedBytes, artifactError) => {
11040
11055
  if (!artifactPath || maxChars <= 0) return void 0;
11056
+ if (artifactError !== void 0) return void 0;
11057
+ if (artifactElidedBytes !== void 0 && artifactElidedBytes > 0) return void 0;
11041
11058
  let size;
11042
11059
  try {
11043
11060
  size = statSync4(artifactPath).size;
@@ -11066,15 +11083,24 @@ var withoutColumnLimit = (detailRecord, metaRecord) => {
11066
11083
  const { meta: _meta, ...remainingDetails } = detailRecord;
11067
11084
  return remainingDetails;
11068
11085
  };
11069
- var grepTruncationSignal = (details) => {
11086
+ var grepTruncationSignal = (details, requestedLimit) => {
11070
11087
  const record2 = asRecord(details);
11071
11088
  if (!record2 || record2.truncated !== true) return void 0;
11072
- const perFile = finiteNumber2(record2.perFileLimitReached);
11089
+ const reached = finiteNumber2(record2.perFileLimitReached);
11090
+ const askedFor = requestedLimit === void 0 ? void 0 : Math.max(1, Math.floor(requestedLimit));
11091
+ const totalLimit = reached !== void 0 && reached === askedFor ? reached : void 0;
11092
+ const perFile = totalLimit === void 0 ? reached : void 0;
11073
11093
  const maxColumn = finiteNumber2(asRecord(asRecord(asRecord(record2.meta)?.limits)?.columnTruncated)?.maxColumn);
11074
11094
  const fileCount = finiteNumber2(record2.fileCount);
11075
11095
  const reasons = [];
11076
11096
  const notes = [];
11077
11097
  let continuation = null;
11098
+ if (totalLimit !== void 0) {
11099
+ reasons.push("matchLimit");
11100
+ notes.push(
11101
+ `Only the first ${totalLimit} matches are returned because limit=${totalLimit}; raise limit or narrow the pattern.`
11102
+ );
11103
+ }
11078
11104
  if (perFile !== void 0) {
11079
11105
  reasons.push("matchLimit");
11080
11106
  notes.push(
@@ -11100,6 +11126,7 @@ var grepTruncationSignal = (details) => {
11100
11126
  reasons,
11101
11127
  ...finiteNumber2(record2.matchCount) === void 0 ? {} : { matchCount: record2.matchCount },
11102
11128
  ...fileCount === void 0 ? {} : { fileCount },
11129
+ ...totalLimit === void 0 ? {} : { matchLimit: totalLimit },
11103
11130
  ...perFile === void 0 ? {} : { perFileMatchLimit: perFile },
11104
11131
  ...maxColumn === void 0 ? {} : { maxColumn },
11105
11132
  continue: continuation,
@@ -11204,7 +11231,7 @@ var normalizeResult = (name, result, artifactPaths, appendReadNewline = true, ex
11204
11231
  return readSignal?.signal ? appendTruncationMarker(body, readSignal.signal) : body;
11205
11232
  }
11206
11233
  if (name === "grep") {
11207
- const signal = grepTruncationSignal(result.details);
11234
+ const signal = grepTruncationSignal(result.details, extras?.grepLimit);
11208
11235
  return signal ? appendTruncationMarker(text, signal) : text;
11209
11236
  }
11210
11237
  if (name === "find") {
@@ -11225,7 +11252,9 @@ var normalizeResult = (name, result, artifactPaths, appendReadNewline = true, ex
11225
11252
  if (truncation && typeof truncation === "object" && !Array.isArray(truncation)) {
11226
11253
  const truncationRecord = truncation;
11227
11254
  const artifactId = truncationRecord.artifactId;
11228
- const fullOutputPath = typeof artifactId === "string" ? artifactPaths?.get(artifactId) ?? extras?.bashArtifactPath : extras?.bashArtifactPath;
11255
+ const artifactError = metaRecord?.artifactError;
11256
+ const fullOutputPath = artifactError !== void 0 ? void 0 : typeof artifactId === "string" ? artifactPaths?.get(artifactId) ?? extras?.bashArtifactPath : extras?.bashArtifactPath;
11257
+ const artifactElidedBytes = finiteNumber2(truncationRecord.artifactElidedBytes);
11229
11258
  details = {
11230
11259
  ...detailRecord,
11231
11260
  truncation: { ...truncationRecord, truncated: true },
@@ -11244,27 +11273,40 @@ var normalizeResult = (name, result, artifactPaths, appendReadNewline = true, ex
11244
11273
  ...columnCap === void 0 ? {} : { maxColumn: columnCap },
11245
11274
  fullOutputPath: fullOutputPath ?? null,
11246
11275
  continue: null,
11247
- note: fullOutputPath ? `Output exceeded the host bash result budget; the complete stream is on disk at ${fullOutputPath}.` : "Output exceeded the host bash result budget and no full-output artifact was retained."
11276
+ note: artifactError !== void 0 ? `Output exceeded the host bash result budget and ${artifactFailureClause(artifactError)}, so the full output is unrecoverable.` : fullOutputPath ? artifactElidedBytes === void 0 ? `Output exceeded the host bash result budget; the complete stream is on disk at ${fullOutputPath}.` : `Output exceeded the host bash result budget, and the on-disk artifact at ${fullOutputPath} is itself capped: ${artifactElidedBytes} bytes were dropped from its middle. Only the artifact's head and tail survive; set the host's \`tools.artifactMaxBytes\` to \`0\` for an uncapped file.` : "Output exceeded the host bash result budget and no full-output artifact was retained."
11248
11277
  });
11249
11278
  }
11250
11279
  } else {
11251
11280
  const columnCap = finiteNumber2(asRecord(asRecord(metaRecord?.limits)?.columnTruncated)?.maxColumn);
11252
11281
  if (columnCap !== void 0) {
11253
- const restored = restoreBashOutput(extras?.bashArtifactPath, extras?.maxResultChars ?? 0, text);
11282
+ const columnElidedBytes = finiteNumber2(
11283
+ asRecord(asRecord(metaRecord?.limits)?.columnTruncated)?.artifactElidedBytes
11284
+ );
11285
+ const artifactError = metaRecord?.artifactError;
11286
+ const maxChars = extras?.maxResultChars ?? 0;
11287
+ const restored = restoreBashOutput(
11288
+ extras?.bashArtifactPath,
11289
+ maxChars,
11290
+ text,
11291
+ columnElidedBytes,
11292
+ artifactError
11293
+ );
11254
11294
  if (restored === void 0) {
11295
+ const fullOutputPath = artifactError === void 0 ? extras?.bashArtifactPath : void 0;
11296
+ const oversizedBytes = columnElidedBytes === void 0 ? oversizedArtifactBytes(fullOutputPath, maxChars) : void 0;
11255
11297
  details = {
11256
11298
  ...detailRecord,
11257
11299
  columnTruncated: { maxColumn: columnCap, restored: false },
11258
- ...extras?.bashArtifactPath ? { fullOutputPath: extras.bashArtifactPath } : {}
11300
+ ...fullOutputPath ? { fullOutputPath } : {}
11259
11301
  };
11260
11302
  output = appendTruncationMarker(text, {
11261
11303
  tool: name,
11262
11304
  partial: true,
11263
11305
  reasons: ["columnLimit"],
11264
11306
  maxColumn: columnCap,
11265
- fullOutputPath: extras?.bashArtifactPath ?? null,
11307
+ fullOutputPath: fullOutputPath ?? null,
11266
11308
  continue: null,
11267
- note: `Output lines were cut at ${columnCap} bytes by the host bash executor, which reads global settings and ignores this session's tools.outputMaxColumns.`
11309
+ note: artifactError !== void 0 ? `Output lines were cut at ${columnCap} bytes by the host bash executor and ${artifactFailureClause(artifactError)}, so the full output is unrecoverable.` : columnElidedBytes !== void 0 && columnElidedBytes > 0 ? `Output lines were cut at ${columnCap} bytes by the host bash executor, and the artifact is itself capped: ${columnElidedBytes} bytes were dropped from its middle, so the full output is unrecoverable. Set the host's \`tools.artifactMaxBytes\` to \`0\` for an uncapped file.` : oversizedBytes !== void 0 && fullOutputPath ? `Output lines were cut at ${columnCap} bytes by the host bash executor; the complete output is on disk at ${fullOutputPath}, ${oversizedBytes} bytes that exceed this session's \`executor.maxNestedResultChars\` (${maxChars}), so it was not inlined here.` : `Output lines were cut at ${columnCap} bytes by the host bash executor, which reads global settings and ignores this session's tools.outputMaxColumns.`
11268
11310
  });
11269
11311
  } else {
11270
11312
  output = restored;
@@ -11311,7 +11353,7 @@ var OmpToolsProvider = class _OmpToolsProvider {
11311
11353
  bash: createNativeBashToolDefinition(cwd, this.#artifacts, this.#identity, this.#autoBackground),
11312
11354
  edit: createNativeReplaceEditToolDefinition(cwd, this.#identity),
11313
11355
  write: createPreviewWriteToolDefinition(cwd, createNativeSession(cwd, { identity: this.#identity })),
11314
- grep: createGrepDefinitionWithSkip(cwd),
11356
+ grep: createGrepDefinitionWithOptions(cwd),
11315
11357
  find: createFindDefinitionWithFilters(cwd),
11316
11358
  ls: createLsToolDefinition(cwd),
11317
11359
  wait: createNativeWaitToolDefinition(cwd, this.#identity, this.#autoBackground)
@@ -11540,6 +11582,10 @@ var OmpToolsProvider = class _OmpToolsProvider {
11540
11582
  // provider boundary; replacement is idempotent when middleware already ran.
11541
11583
  async #normalizeResult(name, result, args, context, appendReadNewline = true, artifacts) {
11542
11584
  const extras = {};
11585
+ if (name === "grep") {
11586
+ const limit = finiteNumber2(args.limit);
11587
+ if (limit !== void 0) extras.grepLimit = limit;
11588
+ }
11543
11589
  if (isOmpShellToolName(name)) {
11544
11590
  const artifactPath = artifacts?.at(-1);
11545
11591
  if (artifactPath !== void 0) extras.bashArtifactPath = artifactPath;