deepline 0.3.236 → 0.3.237

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/cli/index.js CHANGED
@@ -3454,7 +3454,7 @@ var SDK_RELEASE = {
3454
3454
  // getters keep their established compatibility behavior.
3455
3455
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
3456
3456
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
3457
- version: "0.3.236",
3457
+ version: "0.3.237",
3458
3458
  updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.",
3459
3459
  packageCapabilities: {
3460
3460
  updatePreferences: 1
@@ -12899,9 +12899,13 @@ function recentUsageLines(entries) {
12899
12899
  for (const entry of entries) {
12900
12900
  const op = `${humanize(entry.provider)} ${humanize(entry.operation)}`.trim();
12901
12901
  const roughUsd = Number(entry.rough_usd_cost);
12902
- const usdText = entry.charge_state !== "pending" && entry.rough_usd_cost !== null && entry.rough_usd_cost !== void 0 && Number.isFinite(roughUsd) ? ` (\u2248$${roughUsd.toFixed(2)})` : "";
12903
- const charge = entry.billing_mode === "no_bill" ? "free" : entry.charge_state === "temporary_hold" ? `${entry.credits ?? 0} cr held${usdText}, not final` : entry.charge_state === "pending" ? "final Deepline charge pending" : `${entry.credits ?? 0} cr${usdText}`;
12904
- const state = entry.charge_state === "temporary_hold" ? "temporary hold, final charge pending" : entry.charge_state === "pending" ? "no final charge recorded yet" : entry.status || "completed";
12902
+ const credits = entry.credits !== null && entry.credits !== void 0 && String(entry.credits).trim().length > 0 && Number.isFinite(Number(entry.credits)) ? Number(entry.credits) : null;
12903
+ const temporaryHold = entry.charge_state === "temporary_hold";
12904
+ const pending = entry.charge_state === "pending" || entry.charge_finality === "pending";
12905
+ const unknown = entry.charge_finality === "unknown" || credits === null;
12906
+ const usdText = !pending && !unknown && entry.rough_usd_cost !== null && entry.rough_usd_cost !== void 0 && Number.isFinite(roughUsd) ? ` (\u2248$${roughUsd.toFixed(2)})` : "";
12907
+ const charge = temporaryHold ? `${credits === null ? "unknown amount" : `${credits} cr`} held${usdText}, not final` : pending ? "final Deepline charge pending" : unknown ? "charge unknown" : entry.billing_mode === "no_bill" ? "free" : credits === 0 && (entry.charge_finality === "final" || entry.charge_state === "hold_release") ? "0 cr, final" : `${credits} cr${usdText}`;
12908
+ const state = temporaryHold ? "temporary hold, final charge pending" : pending ? "no final charge recorded yet" : entry.status || "unknown";
12905
12909
  const auditBits = [
12906
12910
  entry.outcome ? `outcome=${entry.outcome}` : null,
12907
12911
  entry.pricing_basis ? `priced_by=${entry.pricing_basis}` : null,
@@ -13098,6 +13102,7 @@ async function handleUsage(options) {
13098
13102
  const recentLines = recentUsageLines(
13099
13103
  Array.isArray(recent.entries) ? recent.entries : []
13100
13104
  );
13105
+ const matchingActivity = typeof recent.total === "number" && Number.isFinite(recent.total) && recent.total >= 0 && typeof recent.total_is_exact === "boolean" ? recent.total_is_exact ? `Matching activity: ${recent.total}` : typeof recent.total_lower_bound === "number" && Number.isFinite(recent.total_lower_bound) && recent.total_lower_bound >= 0 ? `Matching activity: at least ${recent.total_lower_bound}` : `Matching activity: count not exact (reported ${recent.total})` : null;
13101
13106
  const lines = options.requestId ? [`Charge lookup: ${options.requestId}`, ...recentLines] : [
13102
13107
  `Balance: ${payload.balance ?? "(unknown)"}`,
13103
13108
  `Last 30 days usage: ${last30Usage ?? "(unknown)"}`,
@@ -13106,8 +13111,10 @@ async function handleUsage(options) {
13106
13111
  ...options.runId && recent.run_id ? [
13107
13112
  `Run spend: ${(payload.run ?? {}).spent_credits ?? "(unknown)"} Deepline Credits`
13108
13113
  ] : [],
13114
+ ...matchingActivity ? [matchingActivity] : [],
13109
13115
  ...recentLines,
13110
- ...recent.has_more === true || recent.incomplete === true ? ["List truncated \u2014 more recent calls match this query."] : [],
13116
+ ...recent.has_more === true ? ["More activity pages are available."] : [],
13117
+ ...recent.incomplete === true ? ["Recent activity is incomplete; the matching count may be higher."] : [],
13111
13118
  ...nextPage ? [`Next page: ${nextPage}`] : [],
13112
13119
  ...!nextPage && (recent.has_more === true || recent.incomplete === true) ? [
13113
13120
  "No continuation is available for this view. Use deepline billing ledger export all --json for the full ledger."
@@ -13187,7 +13194,13 @@ async function handleLimitOff(options) {
13187
13194
  async function exportLedger(http, outputPath, options) {
13188
13195
  let summary = { row_count: 0, net_delta_credits: 0 };
13189
13196
  let initialized = false;
13197
+ let pageNumber = 0;
13198
+ console.error(`Exporting billing ledger to ${outputPath}`);
13190
13199
  for await (const entries of iterateCursorPages(async (cursor) => {
13200
+ pageNumber += 1;
13201
+ console.error(
13202
+ `Fetching page ${pageNumber}; ${summary.row_count} rows written.`
13203
+ );
13191
13204
  const params = new URLSearchParams({ limit: "5000" });
13192
13205
  if (cursor) params.set("cursor", cursor);
13193
13206
  if (options.sinceAt !== null)
@@ -13214,7 +13227,11 @@ async function exportLedger(http, outputPath, options) {
13214
13227
  const rows = entries.map(ledgerApiEntryToRow);
13215
13228
  await (0, import_promises2.appendFile)(outputPath, ledgerRowsToCsv(rows, false), "utf-8");
13216
13229
  summary = summarizeLedgerRows(summary, rows);
13230
+ console.error(
13231
+ `Wrote page ${pageNumber}; ${summary.row_count} rows written.`
13232
+ );
13217
13233
  }
13234
+ console.error(`Export complete: ${summary.row_count} rows written.`);
13218
13235
  return summary;
13219
13236
  }
13220
13237
  async function handleHistory(options) {
@@ -14014,6 +14031,8 @@ function registerBillingCommands(program) {
14014
14031
  `
14015
14032
  Concepts:
14016
14033
  Billing commands show Deepline credits, not raw provider spend.
14034
+ Balance is shared by the workspace; concurrent work changes it. Use a job_id
14035
+ charge lookup to attribute one tool command instead of comparing balances.
14017
14036
  checkout/subscribe/redeem-code can open a browser unless --no-open is set.
14018
14037
 
14019
14038
  Examples:
@@ -14023,6 +14042,10 @@ Examples:
14023
14042
  deepline billing plans --json
14024
14043
  deepline billing subscription status --json
14025
14044
 
14045
+ # Price a tool before execution; look up its exact charge afterward
14046
+ deepline tools describe <tool-id> --pricing-only
14047
+ deepline billing usage --request-id <job_id> --json
14048
+
14026
14049
  # Buy credits or a plan
14027
14050
  deepline billing top-up 1000 --json
14028
14051
  deepline billing checkout --credits 1000 --no-open --json
@@ -14044,6 +14067,8 @@ Examples:
14044
14067
  `
14045
14068
  Notes:
14046
14069
  Read-only. Shows the current Deepline credit balance for the active workspace.
14070
+ The balance includes concurrent workspace activity, so a before/after difference
14071
+ cannot isolate one command. Use billing usage --request-id <job_id> --json.
14047
14072
 
14048
14073
  Examples:
14049
14074
  deepline billing balance
@@ -14056,6 +14081,9 @@ Examples:
14056
14081
  Notes:
14057
14082
  Read-only. Shows last-30-day Deepline credit usage plus a bounded recent-call
14058
14083
  page. Use --limit/--cursor to paginate the recent-call section.
14084
+ For one tool command, use the job_id returned by tools execute, or its next.billing
14085
+ command. Pending charges and temporary holds are not final spend; unknown means
14086
+ final charge evidence is unavailable. Workspace balance changes include other work.
14059
14087
 
14060
14088
  Examples:
14061
14089
  deepline billing usage
@@ -29941,7 +29969,23 @@ async function handleRunsList(args) {
29941
29969
  }
29942
29970
  }
29943
29971
  if (!playName && !statusFilter) {
29944
- console.error(usage);
29972
+ const message = "runs list requires --play or --status.";
29973
+ const next = {
29974
+ discover: "deepline plays list --json",
29975
+ running: "deepline runs list --status running --json"
29976
+ };
29977
+ console.error(
29978
+ `${message}
29979
+ ${usage}
29980
+ Discover Plays: ${next.discover}
29981
+ Active runs: ${next.running}`
29982
+ );
29983
+ if (argsWantJson(args)) {
29984
+ printCommandEnvelope(
29985
+ { ok: false, exitCode: 1, code: "RUN_FILTER_REQUIRED", message, next },
29986
+ { json: true }
29987
+ );
29988
+ }
29945
29989
  return 1;
29946
29990
  }
29947
29991
  if ((offset ?? 0) > 0 && !playName) {
@@ -32374,11 +32418,15 @@ Examples:
32374
32418
  "after",
32375
32419
  `
32376
32420
  Notes:
32421
+ Requires --play or --status. Discover Play references with deepline plays list --json.
32377
32422
  Bounded inventory for a play's recent runs. Use --compact for agent loops.
32423
+ Use the exact qualified Play reference, such as workspace/my-play or prebuilt/my-play.
32424
+ --offset requires --play; narrow status-only lists with a Play reference to paginate.
32378
32425
  Common statuses include running, completed, failed, and stopped.
32379
32426
 
32380
32427
  Examples:
32381
32428
  deepline runs list --play my-play
32429
+ deepline runs list --play workspace/my-play --json
32382
32430
  deepline runs list --play my-play --status failed --compact --json
32383
32431
  deepline runs list --status running --compact --json
32384
32432
  `
@@ -49856,11 +49904,17 @@ var CapabilityDescription = class _CapabilityDescription {
49856
49904
  legacyCost.pricingModel ?? legacyCost.pricing_model
49857
49905
  );
49858
49906
  const pricingModel = unit === "call" ? "fixed" : unit === "result" || unit === "page" ? `per_${unit}` : unit === "usage" ? "provider_usage" : legacyPricingModel;
49859
- const canonicalCredits = numberValue(
49860
- pricing.creditsPerUnit ?? pricing.credits_per_unit
49861
- );
49862
- const canonicalUsd = numberValue(
49863
- pricing.usdPerUnit ?? pricing.usd_per_unit
49907
+ const canonicalCredits = pricingNumber(
49908
+ pricing,
49909
+ "creditsPerUnit",
49910
+ "credits_per_unit",
49911
+ this.#catalogEntry.deeplineCreditsPerPricingUnit ?? this.#catalogEntry.deepline_credits_per_pricing_unit
49912
+ );
49913
+ const canonicalUsd = pricingNumber(
49914
+ pricing,
49915
+ "usdPerUnit",
49916
+ "usd_per_unit",
49917
+ this.#catalogEntry.deeplineUsdPerPricingUnit ?? this.#catalogEntry.deepline_usd_per_pricing_unit
49864
49918
  );
49865
49919
  const billingSource = stringValue4(
49866
49920
  this.#catalogEntry.billingSource ?? this.#catalogEntry.billing_source
@@ -49879,12 +49933,8 @@ var CapabilityDescription = class _CapabilityDescription {
49879
49933
  ),
49880
49934
  billingSource,
49881
49935
  billingSourceLabel,
49882
- deeplineCreditsPerPricingUnit: isFree ? 0 : canonicalCredits ?? numberValue(
49883
- this.#catalogEntry.deeplineCreditsPerPricingUnit ?? this.#catalogEntry.deepline_credits_per_pricing_unit
49884
- ),
49885
- deeplineUsdPerPricingUnit: isFree ? 0 : canonicalUsd ?? numberValue(
49886
- this.#catalogEntry.deeplineUsdPerPricingUnit ?? this.#catalogEntry.deepline_usd_per_pricing_unit
49887
- )
49936
+ deeplineCreditsPerPricingUnit: isFree ? 0 : canonicalCredits,
49937
+ deeplineUsdPerPricingUnit: isFree ? 0 : canonicalUsd
49888
49938
  };
49889
49939
  }
49890
49940
  };
@@ -49897,6 +49947,13 @@ function stringValue4(value) {
49897
49947
  function numberValue(value) {
49898
49948
  return typeof value === "number" && Number.isFinite(value) ? value : null;
49899
49949
  }
49950
+ function pricingNumber(pricing, canonicalKey, aliasKey, legacyValue) {
49951
+ for (const key of [canonicalKey, aliasKey]) {
49952
+ if (Object.prototype.hasOwnProperty.call(pricing, key))
49953
+ return numberValue(pricing[key]);
49954
+ }
49955
+ return numberValue(legacyValue);
49956
+ }
49900
49957
 
49901
49958
  // src/cli/tool-connection-status.ts
49902
49959
  function toolConnectionStatusMessage(input2) {
@@ -50490,11 +50547,15 @@ Concepts:
50490
50547
  Common commands:
50491
50548
  deepline tools search email --json
50492
50549
  deepline tools describe hunter_email_verifier --json
50550
+ deepline tools describe hunter_email_verifier --pricing-only --json
50493
50551
  deepline tools execute hunter_email_verifier --input '{"email":"a@b.com"}'
50552
+ deepline billing usage --request-id <job_id> --json
50494
50553
 
50495
50554
  Output:
50496
50555
  Use describe for tool contracts.
50497
50556
  Use execute to run a tool.
50557
+ Read pricing before execution; use the returned next.billing command for its
50558
+ exact charge. Workspace balance changes also include other callers' activity.
50498
50559
  `
50499
50560
  );
50500
50561
  tools.command("list [category]").description("Browse tool categories, or list every tool in a category.").addHelpText(
@@ -50620,6 +50681,7 @@ Notes:
50620
50681
  Examples:
50621
50682
  deepline tools describe hunter_email_verifier
50622
50683
  deepline tools describe hunter_email_verifier --pricing-only
50684
+ deepline tools describe hunter_email_verifier --pricing-only --json
50623
50685
  deepline tools describe hunter_email_verifier --schema-only
50624
50686
  deepline tools describe hunter_email_verifier --examples-only
50625
50687
  deepline tools describe hunter_email_verifier --json
@@ -50669,10 +50731,15 @@ Notes:
50669
50731
  waterfalls, row maps, checkpoints, and retries.
50670
50732
  Calling a provider-backed tool can spend Deepline credits. Use --json for the
50671
50733
  stable result payload plus output preview and debugging helpers.
50734
+ Read pricing first with tools describe <toolId> --pricing-only --json.
50735
+ Use the returned next.billing command to look up this execution's exact charge;
50736
+ workspace balance changes also include other callers' activity.
50672
50737
  --timeout sets this CLI request's HTTP deadline; it does not cancel provider work.
50673
50738
 
50674
50739
  Examples:
50675
50740
  deepline tools execute hunter_email_verifier --input '{"email":"a@b.com"}'
50741
+ deepline tools describe hunter_email_verifier --pricing-only --json
50742
+ deepline billing usage --request-id <job_id> --json
50676
50743
  deepline tools execute bounceban_verify_bulk --input @batch.json --timeout 10m --json
50677
50744
  deepline tools execute hunter_email_verifier -p email=a@b.com
50678
50745
  deepline tools execute test_rate_limit --input '{"key":"smoke"}' --timeout 90s --json
@@ -50776,6 +50843,38 @@ async function getTool(toolId, options = {}) {
50776
50843
  );
50777
50844
  return 2;
50778
50845
  }
50846
+ const onlyModes = [
50847
+ options.pricingOnly,
50848
+ options.schemaOnly,
50849
+ options.examplesOnly,
50850
+ options.gettersOnly
50851
+ ].filter(Boolean).length;
50852
+ if (onlyModes > 1) {
50853
+ console.error(
50854
+ "Use only one of --pricing-only, --schema-only, --examples-only, or --getters-only."
50855
+ );
50856
+ return 2;
50857
+ }
50858
+ if (options.pricingOnly) {
50859
+ const lines = toolPricingOnlyLines(tool, toolId);
50860
+ if (inferenceQuote)
50861
+ lines.push(...inferenceQuoteSummaryLines(inferenceQuote));
50862
+ printCommandEnvelope(
50863
+ {
50864
+ toolId: String(tool.toolId || toolId),
50865
+ cost: Capability.fromCatalogEntry(tool).describe().customerCost(),
50866
+ ...modelDescription ? { modelOptions: modelDescription } : {},
50867
+ ...isMonitorTypeTool(tool) ? { pricing: recordField2(tool, "pricing") } : {},
50868
+ ...inferenceQuote ? { inferenceQuote } : {}
50869
+ },
50870
+ {
50871
+ json: Boolean(options.json || options.contractJson),
50872
+ text: `${lines.join("\n")}
50873
+ `
50874
+ }
50875
+ );
50876
+ return 0;
50877
+ }
50779
50878
  if (options.contractJson) {
50780
50879
  printCompactJson({
50781
50880
  ...toolContractJsonForDescribe(tool, toolId),
@@ -50793,23 +50892,6 @@ async function getTool(toolId, options = {}) {
50793
50892
  });
50794
50893
  return 0;
50795
50894
  }
50796
- const onlyModes = [
50797
- options.pricingOnly,
50798
- options.schemaOnly,
50799
- options.examplesOnly,
50800
- options.gettersOnly
50801
- ].filter(Boolean).length;
50802
- if (onlyModes > 1) {
50803
- console.error(
50804
- "Use only one of --pricing-only, --schema-only, --examples-only, or --getters-only."
50805
- );
50806
- return 2;
50807
- }
50808
- if (options.pricingOnly) {
50809
- printToolPricingOnly(tool, toolId);
50810
- if (inferenceQuote) printInferenceQuoteSummary(inferenceQuote);
50811
- return 0;
50812
- }
50813
50895
  if (options.schemaOnly) {
50814
50896
  printToolSchemaOnly(tool, toolId);
50815
50897
  if (inferenceQuote) printInferenceQuoteSummary(inferenceQuote);
@@ -50850,11 +50932,16 @@ ${formatModelDescription(modelDescription)}`);
50850
50932
  if (inferenceQuote) printInferenceQuoteSummary(inferenceQuote);
50851
50933
  return 0;
50852
50934
  }
50853
- function printInferenceQuoteSummary(_quote) {
50854
- console.log("");
50855
- console.log("Inference quote:");
50856
- console.log("- Temporary hold: priced estimate (minimum 0.02 credits)");
50857
- console.log("- Final charge: actual usage");
50935
+ function inferenceQuoteSummaryLines(_quote) {
50936
+ return [
50937
+ "",
50938
+ "Inference quote:",
50939
+ "- Temporary hold: priced estimate (minimum 0.02 credits)",
50940
+ "- Final charge: actual usage"
50941
+ ];
50942
+ }
50943
+ function printInferenceQuoteSummary(quote) {
50944
+ for (const line of inferenceQuoteSummaryLines(quote)) console.log(line);
50858
50945
  }
50859
50946
  function toolContractJsonForDescribe(tool, requestedToolId) {
50860
50947
  const toolId = String(tool.toolId || requestedToolId);
@@ -50913,6 +51000,7 @@ function toolContractJsonForDescribe(tool, requestedToolId) {
50913
51000
  toolId,
50914
51001
  provider: tool.provider,
50915
51002
  displayName: tool.displayName,
51003
+ cost: pricing,
50916
51004
  description: tool.description,
50917
51005
  categories: tool.categories,
50918
51006
  ...deprecated ? {
@@ -50932,7 +51020,6 @@ function toolContractJsonForDescribe(tool, requestedToolId) {
50932
51020
  } : {},
50933
51021
  ...executionMetadata ? { executionMetadata } : {},
50934
51022
  ...batchCapability ? { batchCapability } : {},
50935
- cost: pricing,
50936
51023
  getters: {
50937
51024
  extractedLists,
50938
51025
  extractedValues
@@ -51008,7 +51095,7 @@ function printMonitorTypeStreams(tool) {
51008
51095
  console.log(`- ${name}: ${cols.join(", ")}`);
51009
51096
  }
51010
51097
  }
51011
- function printMonitorTypePricing(tool) {
51098
+ function monitorTypePricingLines(tool) {
51012
51099
  const pricing = recordField2(tool, "pricing");
51013
51100
  const byType = recordField2(
51014
51101
  pricing,
@@ -51017,17 +51104,20 @@ function printMonitorTypePricing(tool) {
51017
51104
  );
51018
51105
  const keys = Object.keys(byType);
51019
51106
  if (!keys.length) {
51020
- console.log("Pricing: Deepline credits per accepted event (see --json)");
51021
- return;
51107
+ return ["Pricing: Deepline credits per accepted event (see --json)"];
51022
51108
  }
51023
- console.log("Pricing (Deepline credits per accepted event):");
51109
+ const lines = ["Pricing (Deepline credits per accepted event):"];
51024
51110
  for (const key of keys) {
51025
51111
  const entry = isRecord13(byType[key]) ? byType[key] : {};
51026
51112
  const credits = numberField2(entry, "deepline_credits", "deeplineCredits");
51027
51113
  const display = stringField2(entry, "display");
51028
51114
  const shown = display || (credits !== null ? `${formatDecimal(credits)} credits/event` : "see --json");
51029
- console.log(`- ${key}: ${shown}`);
51115
+ lines.push(`- ${key}: ${shown}`);
51030
51116
  }
51117
+ return lines;
51118
+ }
51119
+ function printMonitorTypePricing(tool) {
51120
+ for (const line of monitorTypePricingLines(tool)) console.log(line);
51031
51121
  }
51032
51122
  function printMonitorTypeDeploy(tool) {
51033
51123
  const deploy = recordField2(tool, "deploy");
@@ -51165,13 +51255,12 @@ function printCompactToolContract(tool, requestedToolId) {
51165
51255
  `More: deepline tools describe ${contract.toolId} --pricing-only | --schema-only | --examples-only | --getters-only | --json`
51166
51256
  );
51167
51257
  }
51168
- function printToolPricingOnly(tool, requestedToolId, options = {}) {
51258
+ function toolPricingOnlyLines(tool, requestedToolId, options = {}) {
51169
51259
  if (isMonitorTypeTool(tool)) {
51170
- printMonitorTypePricing(tool);
51171
- return;
51260
+ return monitorTypePricingLines(tool);
51172
51261
  }
51173
- const contract = toolContractJsonForDescribe(tool, requestedToolId);
51174
- const cost = isRecord13(contract.cost) ? contract.cost : {};
51262
+ const toolId = String(tool.toolId || requestedToolId);
51263
+ const cost = Capability.fromCatalogEntry(tool).describe().customerCost();
51175
51264
  const pricingModel = stringField2(cost, "pricingModel") || "unknown";
51176
51265
  const billing = stringField2(cost, "billingSourceLabel") || stringField2(cost, "billingSource") || stringField2(cost, "billingMode") || "unknown";
51177
51266
  const explicitUnit = stringField2(cost, "unit");
@@ -51181,8 +51270,14 @@ function printToolPricingOnly(tool, requestedToolId, options = {}) {
51181
51270
  const displayText = stringField2(cost, "displayText");
51182
51271
  const summary = stringField2(cost, "summary");
51183
51272
  const price = displayText || summary || (credits !== null ? `${formatDecimal(credits)} Deepline credits${usd !== null ? ` / ${formatUsd(usd)}` : ""} per ${unit}` : "pricing unavailable");
51184
- console.log(`${options.heading ?? `Pricing: ${contract.toolId}`}: ${price}`);
51185
- console.log(`Billing: ${billing}`);
51273
+ return [
51274
+ `${options.heading ?? `Pricing: ${toolId}`}: ${price}`,
51275
+ `Billing: ${billing}`
51276
+ ];
51277
+ }
51278
+ function printToolPricingOnly(tool, requestedToolId, options = {}) {
51279
+ for (const line of toolPricingOnlyLines(tool, requestedToolId, options))
51280
+ console.log(line);
51186
51281
  }
51187
51282
  function printToolSchemaOnly(tool, requestedToolId) {
51188
51283
  if (isMonitorTypeTool(tool)) {
@@ -51395,6 +51490,7 @@ function toolMetadataJsonForDescribe(tool, requestedToolId) {
51395
51490
  } = tool;
51396
51491
  const outputSchemaRecord = recordField2(tool, "outputSchema", "output_schema");
51397
51492
  return {
51493
+ cost: Capability.fromCatalogEntry(tool).describe().customerCost(),
51398
51494
  ...publicTool,
51399
51495
  toolId,
51400
51496
  provider: tool.provider,
@@ -51406,7 +51502,6 @@ function toolMetadataJsonForDescribe(tool, requestedToolId) {
51406
51502
  )
51407
51503
  } : {},
51408
51504
  inputFields: inputFields.map(inputFieldJsonForDescribe),
51409
- cost: Capability.fromCatalogEntry(tool).describe().customerCost(),
51410
51505
  usageGuidance,
51411
51506
  runtimeOutputHelp: {
51412
51507
  contract: "tools describe shows declared schema and Deepline getters; it is not an observed provider response.",