@hyperline/cli 0.1.0-build.1.5ce30c4 → 0.1.0-build.1.5d28ec7

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.
@@ -37739,10 +37739,9 @@ Examples:
37739
37739
  baseUrlOverride: resolveIngestBaseUrl(ctx.baseUrl)
37740
37740
  });
37741
37741
  });
37742
- resource.command("send").description(`Send a single billable event.`).requiredOption("--customer-id <value>", `Customer ID or external ID`).requiredOption("--event-type <value>", `Event type`).requiredOption("--timestamp <value>", `ISO8601 timestamp`).requiredOption("--record <value>", `Event record as JSON (must include "id" key)`).option("--with-price-calculation", `Whether to calculate prices for the event`).addHelpText("after", `
37742
+ resource.command("send").description(`Send a single billable event.`).requiredOption("--customer-id <value>", `Customer ID or external ID`).requiredOption("--event-type <value>", `Event type`).requiredOption("--timestamp <value>", `ISO8601 timestamp`).requiredOption("--record <value>", `Event record as JSON (must include "id" key)`).addHelpText("after", `
37743
37743
  Examples:
37744
- hyperline events send --customer-id cus_xyz --event-type api_call --timestamp 2024-01-15T10:00:00Z --record '{"id":"evt_1","duration":32}'
37745
- hyperline events send --customer-id cus_xyz --event-type api_call --timestamp 2024-01-15T10:00:00Z --record '{"id":"evt_1"}' --with-price-calculation`).action(async (opts) => {
37744
+ hyperline events send --customer-id cus_xyz --event-type api_call --timestamp 2024-01-15T10:00:00Z --record '{"id":"evt_1","duration":32}'`).action(async (opts) => {
37746
37745
  const ctx = resource.parent?.opts()._ctx;
37747
37746
  if (!ctx) {
37748
37747
  process.stderr.write("Error: Not authenticated\n");
@@ -37762,14 +37761,10 @@ Examples:
37762
37761
  timestamp: opts.timestamp,
37763
37762
  record: record2
37764
37763
  };
37765
- const args = {};
37766
- if (opts.withPriceCalculation !== void 0)
37767
- args.with_price_calculation = true;
37768
37764
  await ctx.execute({
37769
37765
  method: "POST",
37770
37766
  path: "/v1/events",
37771
- args,
37772
- queryParamKeys: ["with_price_calculation"],
37767
+ args: {},
37773
37768
  body,
37774
37769
  baseUrlOverride: resolveIngestBaseUrl(ctx.baseUrl)
37775
37770
  });
@@ -38285,7 +38280,7 @@ Examples:
38285
38280
  queryParamKeys: []
38286
38281
  });
38287
38282
  });
38288
- resource.command("preview-manual-journal-entry-recognition").description(`Preview revenue-recognition slices for a manual journal entry without writing data.`).requiredOption("--ledger-id <value>", `Ledger identifier.`).requiredOption("--amount <value>", `Deferred amount in minor ledger-currency units.`).requiredOption("--method <value>", `Recognition method to preview.`).option("--recognition-date <value>", `Recognition date for point-in-time recognition.`).option("--window <json>", `Service window for over-time recognition.`).option("--granularity <value>", `Slice granularity for over-time recognition.`).addHelpText("after", `
38283
+ resource.command("preview-manual-journal-entry-recognition").description(`Preview revenue-recognition slices for a manual journal entry without writing data.`).requiredOption("--ledger-id <value>", `Ledger identifier.`).requiredOption("--amount <number>", `Deferred amount in minor ledger-currency units.`).requiredOption("--method <value>", `Recognition method to preview.`).option("--recognition-date <value>", `Recognition date for point-in-time recognition.`).option("--window <json>", `Service window for over-time recognition.`).option("--granularity <value>", `Slice granularity for over-time recognition.`).addHelpText("after", `
38289
38284
  Examples:
38290
38285
  hyperline accounting-journal-entries preview-manual-journal-entry-recognition --ledger-id <ledger_id> --amount <amount> --method <method>
38291
38286
  hyperline accounting-journal-entries preview-manual-journal-entry-recognition --ledger-id <ledger_id> --amount <amount> --method <method> --recognition-date <recognition_date> --window <window>
@@ -38298,14 +38293,14 @@ Examples:
38298
38293
  const args = {};
38299
38294
  if (opts.ledgerId !== void 0)
38300
38295
  args.ledger_id = opts.ledgerId;
38301
- if (opts.amount !== void 0)
38302
- args.amount = opts.amount;
38303
38296
  if (opts.method !== void 0)
38304
38297
  args.method = opts.method;
38305
38298
  if (opts.recognitionDate !== void 0)
38306
38299
  args.recognition_date = opts.recognitionDate;
38307
38300
  if (opts.granularity !== void 0)
38308
38301
  args.granularity = opts.granularity;
38302
+ if (opts.amount !== void 0)
38303
+ args.amount = Number(opts.amount);
38309
38304
  if (opts.window !== void 0)
38310
38305
  args.window = JSON.parse(opts.window);
38311
38306
  await ctx.execute({
@@ -38483,7 +38478,7 @@ Examples:
38483
38478
  queryParamKeys: []
38484
38479
  });
38485
38480
  });
38486
- resource.command("delete-ledger").description(`Delete an unused accounting ledger.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
38481
+ resource.command("delete-ledger").description(`Permanently delete a ledger with its accounts, rules, journal entries and revenue recognition schedules, and unlink the suppliers, supplier contracts and accounting settings that reference it.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
38487
38482
  Examples:
38488
38483
  hyperline accounting-ledgers delete-ledger --id <id>
38489
38484
  hyperline accounting-ledgers delete-ledger --id <id> --output json`).action(async (opts) => {
@@ -38583,7 +38578,7 @@ Examples:
38583
38578
  // build/commands/generated/accounting-revenue-recognition.js
38584
38579
  function registerAccounting_Revenue_RecognitionCommands(parent) {
38585
38580
  const resource = parent.command("accounting-revenue-recognition").description("Manage accounting > revenue recognition");
38586
- resource.command("get-rev-rec-waterfall").description(`Aggregate revenue-recognition schedules into a booked-by-recognition month matrix.`).option("--ledger-id <value>", `Ledger identifier.`).option("--year <number>", `Booked calendar year.`).option("--customer-id.in <value>", `Comma-separated customer identifiers.`).option("--product-id.in <value>", `Comma-separated product identifiers.`).option("--search <value>", `Search customer, product, invoice, or schedule data.`).addHelpText("after", `
38581
+ resource.command("get-rev-rec-waterfall").description(`Aggregate revenue-recognition schedules into a booked-by-recognition month matrix.`).option("--ledger-id <value>", `Ledger identifier.`).option("--year <number>", `Booked calendar year.`).option("--customer-id.in <value>", `Comma-separated customer identifiers.`).option("--product-id.in <value>", `Comma-separated product identifiers.`).option("--search <value>", `Search by invoice ID or number, customer name or ID, or subscription ID.`).addHelpText("after", `
38587
38582
  Examples:
38588
38583
  hyperline accounting-revenue-recognition get-rev-rec-waterfall
38589
38584
  hyperline accounting-revenue-recognition get-rev-rec-waterfall --ledger-id <ledger_id> --year <year>`).action(async (opts) => {
@@ -38616,7 +38611,7 @@ Examples:
38616
38611
  ]
38617
38612
  });
38618
38613
  });
38619
- resource.command("get-rev-rec-waterfall-cell").description(`List the schedules and slices contributing to a waterfall cell.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--ledger-id <value>", `Ledger identifier.`).option("--booked-month <value>", `Booked month formatted YYYY-MM; required if year is absent.`).option("--year <number>", `Booked year; required if booked_month is absent.`).option("--recognition-month <value>", `Recognition month formatted YYYY-MM.`).option("--cell-type <value>", `Waterfall cell category.`).option("--status <value>", `Recognition status filter.`).option("--customer-id.in <value>", `Comma-separated customer identifiers.`).option("--product-id.in <value>", `Comma-separated product identifiers.`).option("--search <value>", `Search customer, product, invoice, or schedule data.`).addHelpText("after", `
38614
+ resource.command("get-rev-rec-waterfall-cell").description(`List the schedules and slices contributing to a waterfall cell.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--ledger-id <value>", `Ledger identifier.`).option("--booked-month <value>", `Booked month formatted YYYY-MM; required if year is absent.`).option("--year <number>", `Booked year; required if booked_month is absent.`).option("--recognition-month <value>", `Recognition month formatted YYYY-MM.`).option("--cell-type <value>", `Waterfall cell category.`).option("--status <value>", `Recognition status filter.`).option("--customer-id.in <value>", `Comma-separated customer identifiers.`).option("--product-id.in <value>", `Comma-separated product identifiers.`).option("--search <value>", `Search by invoice ID or number, customer name or ID, or subscription ID.`).addHelpText("after", `
38620
38615
  Examples:
38621
38616
  hyperline accounting-revenue-recognition get-rev-rec-waterfall-cell
38622
38617
  hyperline accounting-revenue-recognition get-rev-rec-waterfall-cell --take <take> --ledger-id <ledger_id>`).action(async (opts) => {
@@ -38794,7 +38789,7 @@ Examples:
38794
38789
  queryParamKeys: []
38795
38790
  });
38796
38791
  });
38797
- resource.command("reshape-rev-rec-schedule").description(`Recognize an amount now and optionally spread the remainder over a new window.`).requiredOption("--schedule-id <value>", `schedule_id parameter`).requiredOption("--recognize-now-amount <value>", `Amount to recognize immediately in ledger currency.`).option("--window <json>", `Window over which to spread the remaining amount.`).requiredOption("--reason-code <value>", `Stable reason code for the adjustment.`).option("--reason-detail <value>", `Required explanation when reason_code is \`other\`.`).addHelpText("after", `
38792
+ resource.command("reshape-rev-rec-schedule").description(`Recognize an amount now and optionally spread the remainder over a new window.`).requiredOption("--schedule-id <value>", `schedule_id parameter`).requiredOption("--recognize-now-amount <number>", `Amount to recognize immediately in ledger currency. Expressed in currency's smallest unit.`).option("--window <json>", `Window over which to spread the remaining amount.`).requiredOption("--reason-code <value>", `Stable reason code for the adjustment.`).option("--reason-detail <value>", `Required explanation when reason_code is \`other\`.`).addHelpText("after", `
38798
38793
  Examples:
38799
38794
  hyperline accounting-revenue-recognition reshape-rev-rec-schedule --schedule-id <schedule_id> --recognize-now-amount <recognize_now_amount> --reason-code <reason_code>
38800
38795
  hyperline accounting-revenue-recognition reshape-rev-rec-schedule --schedule-id <schedule_id> --recognize-now-amount <recognize_now_amount> --reason-code <reason_code> --window <window> --reason-detail <reason_detail>
@@ -38807,12 +38802,12 @@ Examples:
38807
38802
  const args = {};
38808
38803
  if (opts.scheduleId !== void 0)
38809
38804
  args.schedule_id = opts.scheduleId;
38810
- if (opts.recognizeNowAmount !== void 0)
38811
- args.recognize_now_amount = opts.recognizeNowAmount;
38812
38805
  if (opts.reasonCode !== void 0)
38813
38806
  args.reason_code = opts.reasonCode;
38814
38807
  if (opts.reasonDetail !== void 0)
38815
38808
  args.reason_detail = opts.reasonDetail;
38809
+ if (opts.recognizeNowAmount !== void 0)
38810
+ args.recognize_now_amount = Number(opts.recognizeNowAmount);
38816
38811
  if (opts.window !== void 0)
38817
38812
  args.window = JSON.parse(opts.window);
38818
38813
  await ctx.execute({
@@ -38822,7 +38817,7 @@ Examples:
38822
38817
  queryParamKeys: []
38823
38818
  });
38824
38819
  });
38825
- resource.command("preview-reshape-rev-rec-schedule").description(`Preview the exact reshape plan without writing data.`).requiredOption("--schedule-id <value>", `schedule_id parameter`).requiredOption("--recognize-now-amount <value>", `Amount to recognize immediately in ledger currency.`).option("--window <json>", `Window over which to spread the remaining amount.`).addHelpText("after", `
38820
+ resource.command("preview-reshape-rev-rec-schedule").description(`Preview the exact reshape plan without writing data.`).requiredOption("--schedule-id <value>", `schedule_id parameter`).requiredOption("--recognize-now-amount <number>", `Amount to recognize immediately in ledger currency. Expressed in currency's smallest unit.`).option("--window <json>", `Window over which to spread the remaining amount.`).addHelpText("after", `
38826
38821
  Examples:
38827
38822
  hyperline accounting-revenue-recognition preview-reshape-rev-rec-schedule --schedule-id <schedule_id> --recognize-now-amount <recognize_now_amount>
38828
38823
  hyperline accounting-revenue-recognition preview-reshape-rev-rec-schedule --schedule-id <schedule_id> --recognize-now-amount <recognize_now_amount> --window <window>
@@ -38836,7 +38831,7 @@ Examples:
38836
38831
  if (opts.scheduleId !== void 0)
38837
38832
  args.schedule_id = opts.scheduleId;
38838
38833
  if (opts.recognizeNowAmount !== void 0)
38839
- args.recognize_now_amount = opts.recognizeNowAmount;
38834
+ args.recognize_now_amount = Number(opts.recognizeNowAmount);
38840
38835
  if (opts.window !== void 0)
38841
38836
  args.window = JSON.parse(opts.window);
38842
38837
  await ctx.execute({
@@ -39229,164 +39224,158 @@ Examples:
39229
39224
  });
39230
39225
  }
39231
39226
 
39232
- // build/commands/generated/agents.js
39233
- function registerAgentsCommands(parent) {
39234
- const resource = parent.command("agents").description("Manage agents");
39235
- resource.command("list-agent-plans").description(`List AI agent billing plans: workspace-level offers carrying a billing mode (wallet/credits/windows), rate card, allowance windows, markups and per-seat credit grants. Filter by mode; paginated with take/skip.`).option("--mode <value>", `Billing mode.
39236
-
39237
- - wallet: Charges a monetary wallet.
39238
- - credits: Consumes a credit balance.
39239
- - windows: Meters weighted units against rolling allowances.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39227
+ // build/commands/generated/aggregators.js
39228
+ function registerAggregatorsCommands(parent) {
39229
+ const resource = parent.command("aggregators").description("Manage aggregators");
39230
+ resource.command("list").description(`List all aggregators with pagination. Aggregators define how billable events are counted or summed to compute usage.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39240
39231
  Examples:
39241
- hyperline agents list-agent-plans
39242
- hyperline agents list-agent-plans --mode <mode> --take <take>`).action(async (opts) => {
39232
+ hyperline aggregators list
39233
+ hyperline aggregators list --take <take>`).action(async (opts) => {
39243
39234
  const ctx = resource.parent?.opts()._ctx;
39244
39235
  if (!ctx) {
39245
39236
  process.stderr.write("Error: Not authenticated\n");
39246
39237
  process.exit(1);
39247
39238
  }
39248
39239
  const args = {};
39249
- if (opts.mode !== void 0)
39250
- args.mode = opts.mode;
39251
39240
  if (opts.take !== void 0)
39252
39241
  args.take = Number(opts.take);
39253
39242
  if (opts.skip !== void 0)
39254
39243
  args.skip = Number(opts.skip);
39255
39244
  await ctx.execute({
39256
39245
  method: "GET",
39257
- path: "/v1/agents/plans",
39246
+ path: "/v1/aggregators",
39258
39247
  args,
39259
- queryParamKeys: ["mode", "take", "skip"]
39248
+ queryParamKeys: ["take", "skip"]
39260
39249
  });
39261
39250
  });
39262
- resource.command("create-agent-plan").description(`Create an AI agent billing plan: name, billing mode (wallet/credits/windows), rate card reference, allowance windows, markups, per-seat credit grants and overage stance. Past-limit usage is priced EITHER by overage_markup_percent over the base rates OR by overage_rate_card_id, a currency rate card whose own rates are the overage price \u2014 never both. Metered overage mints the plan's invoice container.`).requiredOption("--name <value>", `Human-readable resource name.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--overage-mode <value>", `Behavior when credits or an allowance are exhausted. Policy values may inherit the attached plan.
39263
-
39264
- - refuse: Rejects the call that crosses the boundary without deducting usage.
39265
- - metered: Prices the whole call as monetary overage, using the overage card or USD provider cost plus markup.`).option("--markup-percent <value>", `Percentage added to resolved cost. Null on writes means no override; an attached plan may supply the value.`).option("--overage-markup-percent <value>", `Percentage added to provider cost for overage. Mutually exclusive with overage_rate_card_id.`).option("--overage-rate-card-id <value>", `Currency rate card used to price overage directly. Null means provider cost plus the resolved overage markup.`).option("--windows <json>", `Rolling allowances. Required for windows plans; each window meters every call. A plan replacement replaces the entire array.`).option("--per-seat-credits <value>", `Credits granted per seat per billing period. Null grants no credits.`).option("--grant-rollover-enabled", `Whether granted credits survive renewal. Purchased credits always roll over.`).option("--settlement-interval-minutes <number>", `Settlement interval in minutes. Null means no interval override. Mutually exclusive with settlement_schedule.`).option("--settlement-schedule <value>", `Calendar settlement schedule. Null clears the override; mutually exclusive with settlement_interval_minutes.
39266
-
39267
- - calendar_month: Settles at the end of each UTC calendar month.`).requiredOption("--mode <value>", `Billing mode.
39268
-
39269
- - wallet: Charges a monetary wallet.
39270
- - credits: Consumes a credit balance.
39271
- - windows: Meters weighted units against rolling allowances.`).addHelpText("after", `
39251
+ resource.command("create").description(`Create a new aggregator that counts or sums billable events. Aggregators can then be linked to products via aggregator_id.`).requiredOption("--entity <value>", `The billable event entity to aggregate.`).option("--type <value>", `The type of aggregator.`).option("--where <json>", `Filter conditions for the aggregation.`).option("--name <value>", `Name of the aggregator.`).option("--description <value>", `Description of the aggregator.`).option("--allow-negative-values", `Whether the aggregator can produce negative values.`).option("--aggregate-on-customers-enabled", `Whether the aggregator should aggregate on customers.`).option("--custom-event-name <value>", `Custom event name for the aggregator.`).option("--exposed-event-keys <json>", `Event keys exposed by the aggregator.`).option("--unit-name <value>", `Display name of the unit being measured (e.g. 'user', 'request'). Used as fallback for products attached to this aggregator.`).option("--default-interval-count <number>", `Default interval count for usage periods.`).option("--default-interval-period <value>", `Default interval period for usage periods.`).option("--thresholds <json>", `Thresholds for the aggregator.`).requiredOption("--operation <value>", `The aggregation operation to perform.`).option("--property <value>", `The property to sum.`).addHelpText("after", `
39272
39252
  Examples:
39273
- hyperline agents create-agent-plan --name <name> --mode <mode>
39274
- hyperline agents create-agent-plan --name <name> --mode <mode> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39275
- hyperline agents create-agent-plan --name <name> --mode <mode> --output json`).action(async (opts) => {
39253
+ hyperline aggregators create --entity <entity> --operation <operation>
39254
+ hyperline aggregators create --entity <entity> --operation <operation> --type <type> --where <where>
39255
+ hyperline aggregators create --entity <entity> --operation <operation> --output json`).action(async (opts) => {
39276
39256
  const ctx = resource.parent?.opts()._ctx;
39277
39257
  if (!ctx) {
39278
39258
  process.stderr.write("Error: Not authenticated\n");
39279
39259
  process.exit(1);
39280
39260
  }
39281
39261
  const args = {};
39262
+ if (opts.entity !== void 0)
39263
+ args.entity = opts.entity;
39264
+ if (opts.type !== void 0)
39265
+ args.type = opts.type;
39282
39266
  if (opts.name !== void 0)
39283
39267
  args.name = opts.name;
39284
- if (opts.rateCardId !== void 0)
39285
- args.rate_card_id = opts.rateCardId;
39286
- if (opts.overageMode !== void 0)
39287
- args.overage_mode = opts.overageMode;
39288
- if (opts.markupPercent !== void 0)
39289
- args.markup_percent = opts.markupPercent;
39290
- if (opts.overageMarkupPercent !== void 0)
39291
- args.overage_markup_percent = opts.overageMarkupPercent;
39292
- if (opts.overageRateCardId !== void 0)
39293
- args.overage_rate_card_id = opts.overageRateCardId;
39294
- if (opts.perSeatCredits !== void 0)
39295
- args.per_seat_credits = opts.perSeatCredits;
39296
- if (opts.settlementSchedule !== void 0)
39297
- args.settlement_schedule = opts.settlementSchedule;
39298
- if (opts.mode !== void 0)
39299
- args.mode = opts.mode;
39300
- if (opts.settlementIntervalMinutes !== void 0)
39301
- args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39302
- if (opts.grantRolloverEnabled !== void 0)
39303
- args.grant_rollover_enabled = true;
39304
- if (opts.windows !== void 0)
39305
- args.windows = JSON.parse(opts.windows);
39268
+ if (opts.description !== void 0)
39269
+ args.description = opts.description;
39270
+ if (opts.customEventName !== void 0)
39271
+ args.custom_event_name = opts.customEventName;
39272
+ if (opts.unitName !== void 0)
39273
+ args.unit_name = opts.unitName;
39274
+ if (opts.defaultIntervalPeriod !== void 0)
39275
+ args.default_interval_period = opts.defaultIntervalPeriod;
39276
+ if (opts.operation !== void 0)
39277
+ args.operation = opts.operation;
39278
+ if (opts.property !== void 0)
39279
+ args.property = opts.property;
39280
+ if (opts.defaultIntervalCount !== void 0)
39281
+ args.default_interval_count = Number(opts.defaultIntervalCount);
39282
+ if (opts.allowNegativeValues !== void 0)
39283
+ args.allow_negative_values = true;
39284
+ if (opts.aggregateOnCustomersEnabled !== void 0)
39285
+ args.aggregate_on_customers_enabled = true;
39286
+ if (opts.where !== void 0)
39287
+ args.where = JSON.parse(opts.where);
39288
+ if (opts.exposedEventKeys !== void 0)
39289
+ args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
39290
+ if (opts.thresholds !== void 0)
39291
+ args.thresholds = JSON.parse(opts.thresholds);
39306
39292
  await ctx.execute({
39307
39293
  method: "POST",
39308
- path: "/v1/agents/plans",
39294
+ path: "/v1/aggregators",
39309
39295
  args,
39310
39296
  queryParamKeys: []
39311
39297
  });
39312
39298
  });
39313
- resource.command("get-agent-plan").description(`Get one AI agent billing plan by id, with its embedded rate card, window definitions, markups, per-seat grants and minted catalog object ids.`).requiredOption("--plan-id <value>", `plan_id parameter`).addHelpText("after", `
39299
+ resource.command("get").description(`Retrieve a specific aggregator by ID.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
39314
39300
  Examples:
39315
- hyperline agents get-agent-plan --plan-id <plan_id>`).action(async (opts) => {
39301
+ hyperline aggregators get --id <id>`).action(async (opts) => {
39316
39302
  const ctx = resource.parent?.opts()._ctx;
39317
39303
  if (!ctx) {
39318
39304
  process.stderr.write("Error: Not authenticated\n");
39319
39305
  process.exit(1);
39320
39306
  }
39321
39307
  const args = {};
39322
- if (opts.planId !== void 0)
39323
- args.plan_id = opts.planId;
39308
+ if (opts.id !== void 0)
39309
+ args.id = opts.id;
39324
39310
  await ctx.execute({
39325
39311
  method: "GET",
39326
- path: "/v1/agents/plans/{plan_id}",
39312
+ path: "/v1/aggregators/{id}",
39327
39313
  args,
39328
39314
  queryParamKeys: []
39329
39315
  });
39330
39316
  });
39331
- resource.command("replace-agent-plan").description(`Replace an AI agent billing plan (whole-row semantics). Changes take effect on the next call for every customer on the plan; mode is immutable. Overage is priced by overage_markup_percent or by overage_rate_card_id, never both.`).requiredOption("--plan-id <value>", `plan_id parameter`).requiredOption("--name <value>", `Human-readable resource name.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--overage-mode <value>", `Behavior when credits or an allowance are exhausted. Policy values may inherit the attached plan.
39332
-
39333
- - refuse: Rejects the call that crosses the boundary without deducting usage.
39334
- - metered: Prices the whole call as monetary overage, using the overage card or USD provider cost plus markup.`).option("--markup-percent <value>", `Percentage added to resolved cost. Null on writes means no override; an attached plan may supply the value.`).option("--overage-markup-percent <value>", `Percentage added to provider cost for overage. Mutually exclusive with overage_rate_card_id.`).option("--overage-rate-card-id <value>", `Currency rate card used to price overage directly. Null means provider cost plus the resolved overage markup.`).option("--windows <json>", `Rolling allowances. Required for windows plans; each window meters every call. A plan replacement replaces the entire array.`).option("--per-seat-credits <value>", `Credits granted per seat per billing period. Null grants no credits.`).option("--grant-rollover-enabled", `Whether granted credits survive renewal. Purchased credits always roll over.`).option("--settlement-interval-minutes <number>", `Settlement interval in minutes. Null means no interval override. Mutually exclusive with settlement_schedule.`).option("--settlement-schedule <value>", `Calendar settlement schedule. Null clears the override; mutually exclusive with settlement_interval_minutes.
39335
-
39336
- - calendar_month: Settles at the end of each UTC calendar month.`).addHelpText("after", `
39317
+ resource.command("update").description(`Update an existing aggregator's configuration.`).requiredOption("--id <value>", `id parameter`).option("--entity <value>", `The billable event entity to aggregate.`).option("--type <value>", `The type of aggregator.`).option("--where <json>", `Filter conditions for the aggregation.`).option("--name <value>", `Name of the aggregator.`).option("--description <value>", `Description of the aggregator.`).option("--allow-negative-values", `Whether the aggregator can produce negative values.`).option("--aggregate-on-customers-enabled", `Whether the aggregator should aggregate on customers.`).option("--custom-event-name <value>", `Custom event name for the aggregator.`).option("--exposed-event-keys <json>", `Event keys exposed by the aggregator.`).option("--unit-name <value>", `Display name of the unit being measured (e.g. 'user', 'request'). Used as fallback for products attached to this aggregator.`).option("--default-interval-count <number>", `Default interval count for usage periods.`).option("--default-interval-period <value>", `Default interval period for usage periods.`).option("--thresholds <json>", `Thresholds for the aggregator. Replaces existing thresholds.`).option("--operation <value>", `The aggregation operation to perform.`).option("--property <value>", `The property to sum. Required when operation is 'sum'.`).addHelpText("after", `
39337
39318
  Examples:
39338
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name>
39339
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39340
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name> --output json`).action(async (opts) => {
39319
+ hyperline aggregators update --id <id>
39320
+ hyperline aggregators update --id <id> --entity <entity> --type <type>
39321
+ hyperline aggregators update --id <id> --output json`).action(async (opts) => {
39341
39322
  const ctx = resource.parent?.opts()._ctx;
39342
39323
  if (!ctx) {
39343
39324
  process.stderr.write("Error: Not authenticated\n");
39344
39325
  process.exit(1);
39345
39326
  }
39346
39327
  const args = {};
39347
- if (opts.planId !== void 0)
39348
- args.plan_id = opts.planId;
39328
+ if (opts.id !== void 0)
39329
+ args.id = opts.id;
39330
+ if (opts.entity !== void 0)
39331
+ args.entity = opts.entity;
39332
+ if (opts.type !== void 0)
39333
+ args.type = opts.type;
39349
39334
  if (opts.name !== void 0)
39350
39335
  args.name = opts.name;
39351
- if (opts.rateCardId !== void 0)
39352
- args.rate_card_id = opts.rateCardId;
39353
- if (opts.overageMode !== void 0)
39354
- args.overage_mode = opts.overageMode;
39355
- if (opts.markupPercent !== void 0)
39356
- args.markup_percent = opts.markupPercent;
39357
- if (opts.overageMarkupPercent !== void 0)
39358
- args.overage_markup_percent = opts.overageMarkupPercent;
39359
- if (opts.overageRateCardId !== void 0)
39360
- args.overage_rate_card_id = opts.overageRateCardId;
39361
- if (opts.perSeatCredits !== void 0)
39362
- args.per_seat_credits = opts.perSeatCredits;
39363
- if (opts.settlementSchedule !== void 0)
39364
- args.settlement_schedule = opts.settlementSchedule;
39365
- if (opts.settlementIntervalMinutes !== void 0)
39366
- args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39367
- if (opts.grantRolloverEnabled !== void 0)
39368
- args.grant_rollover_enabled = true;
39369
- if (opts.windows !== void 0)
39370
- args.windows = JSON.parse(opts.windows);
39336
+ if (opts.description !== void 0)
39337
+ args.description = opts.description;
39338
+ if (opts.customEventName !== void 0)
39339
+ args.custom_event_name = opts.customEventName;
39340
+ if (opts.unitName !== void 0)
39341
+ args.unit_name = opts.unitName;
39342
+ if (opts.defaultIntervalPeriod !== void 0)
39343
+ args.default_interval_period = opts.defaultIntervalPeriod;
39344
+ if (opts.operation !== void 0)
39345
+ args.operation = opts.operation;
39346
+ if (opts.property !== void 0)
39347
+ args.property = opts.property;
39348
+ if (opts.defaultIntervalCount !== void 0)
39349
+ args.default_interval_count = Number(opts.defaultIntervalCount);
39350
+ if (opts.allowNegativeValues !== void 0)
39351
+ args.allow_negative_values = true;
39352
+ if (opts.aggregateOnCustomersEnabled !== void 0)
39353
+ args.aggregate_on_customers_enabled = true;
39354
+ if (opts.where !== void 0)
39355
+ args.where = JSON.parse(opts.where);
39356
+ if (opts.exposedEventKeys !== void 0)
39357
+ args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
39358
+ if (opts.thresholds !== void 0)
39359
+ args.thresholds = JSON.parse(opts.thresholds);
39371
39360
  await ctx.execute({
39372
39361
  method: "PUT",
39373
- path: "/v1/agents/plans/{plan_id}",
39362
+ path: "/v1/aggregators/{id}",
39374
39363
  args,
39375
39364
  queryParamKeys: []
39376
39365
  });
39377
39366
  });
39378
- resource.command("delete-agent-plan").description(`Delete an AI agent billing plan. Refused (409, plan_in_use) while any customer is still attached to it.`).requiredOption("--plan-id <value>", `plan_id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39367
+ resource.command("delete").description(`Delete an aggregator by ID. Will fail if the aggregator is linked to a product.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39379
39368
  Examples:
39380
- hyperline agents delete-agent-plan --plan-id <plan_id>
39381
- hyperline agents delete-agent-plan --plan-id <plan_id> --output json`).action(async (opts) => {
39369
+ hyperline aggregators delete --id <id>
39370
+ hyperline aggregators delete --id <id> --output json`).action(async (opts) => {
39382
39371
  const ctx = resource.parent?.opts()._ctx;
39383
39372
  if (!ctx) {
39384
39373
  process.stderr.write("Error: Not authenticated\n");
39385
39374
  process.exit(1);
39386
39375
  }
39387
39376
  const args = {};
39388
- if (opts.planId !== void 0)
39389
- args.plan_id = opts.planId;
39377
+ if (opts.id !== void 0)
39378
+ args.id = opts.id;
39390
39379
  if (!opts.yes) {
39391
39380
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39392
39381
  if (!confirmed) {
@@ -39396,113 +39385,182 @@ Examples:
39396
39385
  }
39397
39386
  await ctx.execute({
39398
39387
  method: "DELETE",
39399
- path: "/v1/agents/plans/{plan_id}",
39388
+ path: "/v1/aggregators/{id}",
39400
39389
  args,
39401
39390
  queryParamKeys: []
39402
39391
  });
39403
39392
  });
39404
- resource.command("get-agent-default-plan").description(`Get the workspace's default AI agent billing plan marker (plan id and auto_apply flag). 404 when none is set.`).addHelpText("after", `
39393
+ }
39394
+
39395
+ // build/commands/generated/aggregators-usage.js
39396
+ function registerAggregators_UsageCommands(parent) {
39397
+ const resource = parent.command("aggregators-usage").description("Manage aggregators > usage");
39398
+ resource.command("get-aggregator-usage").description(`Retrieve a usage row for an aggregator. Use the timeseries, group-by-customer or events endpoints to query metering data.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
39405
39399
  Examples:
39406
- hyperline agents get-agent-default-plan`).action(async (_opts) => {
39400
+ hyperline aggregators-usage get-aggregator-usage --id <id>`).action(async (opts) => {
39407
39401
  const ctx = resource.parent?.opts()._ctx;
39408
39402
  if (!ctx) {
39409
39403
  process.stderr.write("Error: Not authenticated\n");
39410
39404
  process.exit(1);
39411
39405
  }
39412
39406
  const args = {};
39407
+ if (opts.id !== void 0)
39408
+ args.id = opts.id;
39413
39409
  await ctx.execute({
39414
39410
  method: "GET",
39415
- path: "/v1/agents/default-plan",
39411
+ path: "/v1/aggregators/{id}/usage",
39416
39412
  args,
39417
39413
  queryParamKeys: []
39418
39414
  });
39419
39415
  });
39420
- resource.command("set-agent-default-plan").description(`Mark one plan as the workspace's default AI agent billing plan (body: plan_id, optional auto_apply). Replaces the previous marker; 404 when the plan is not this workspace's.`).requiredOption("--plan-id <value>", `Billing plan reference. On policy writes, omission preserves the current plan and null detaches it.`).option("--auto-apply", `Whether eligible newly ingested customers receive the default plan automatically.`).addHelpText("after", `
39416
+ resource.command("get-aggregator-usage-timeseries").description(`Get client-wide usage for an aggregator bucketed by month/day/hour over a period.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--group-by <value>", `Bucket size for the timeseries.`).addHelpText("after", `
39421
39417
  Examples:
39422
- hyperline agents set-agent-default-plan --plan-id <plan_id>
39423
- hyperline agents set-agent-default-plan --plan-id <plan_id> --auto-apply
39424
- hyperline agents set-agent-default-plan --plan-id <plan_id> --output json`).action(async (opts) => {
39418
+ hyperline aggregators-usage get-aggregator-usage-timeseries --id <id>
39419
+ hyperline aggregators-usage get-aggregator-usage-timeseries --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
39425
39420
  const ctx = resource.parent?.opts()._ctx;
39426
39421
  if (!ctx) {
39427
39422
  process.stderr.write("Error: Not authenticated\n");
39428
39423
  process.exit(1);
39429
39424
  }
39430
39425
  const args = {};
39431
- if (opts.planId !== void 0)
39432
- args.plan_id = opts.planId;
39433
- if (opts.autoApply !== void 0)
39434
- args.auto_apply = true;
39426
+ if (opts.id !== void 0)
39427
+ args.id = opts.id;
39428
+ if (opts.startDate !== void 0)
39429
+ args.start_date = opts.startDate;
39430
+ if (opts.endDate !== void 0)
39431
+ args.end_date = opts.endDate;
39432
+ if (opts.aggregatorFilterId !== void 0)
39433
+ args.aggregator_filter_id = opts.aggregatorFilterId;
39434
+ if (opts.groupBy !== void 0)
39435
+ args.group_by = opts.groupBy;
39435
39436
  await ctx.execute({
39436
- method: "PUT",
39437
- path: "/v1/agents/default-plan",
39437
+ method: "GET",
39438
+ path: "/v1/aggregators/{id}/usage/timeseries",
39438
39439
  args,
39439
- queryParamKeys: []
39440
+ queryParamKeys: [
39441
+ "start_date",
39442
+ "end_date",
39443
+ "aggregator_filter_id",
39444
+ "group_by"
39445
+ ]
39440
39446
  });
39441
39447
  });
39442
- resource.command("clear-agent-default-plan").description(`Clear the workspace's default AI agent billing plan marker. The plan itself is untouched. 404 when none is set.`).option("--yes", "Skip confirmation").addHelpText("after", `
39448
+ resource.command("get-aggregator-usage-group-by-customer").description(`Per-customer total usage for an aggregator over a period, ranked by total. Paginated with take/skip.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39443
39449
  Examples:
39444
- hyperline agents clear-agent-default-plan
39445
- hyperline agents clear-agent-default-plan --output json`).action(async (opts) => {
39450
+ hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id>
39451
+ hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
39446
39452
  const ctx = resource.parent?.opts()._ctx;
39447
39453
  if (!ctx) {
39448
39454
  process.stderr.write("Error: Not authenticated\n");
39449
39455
  process.exit(1);
39450
39456
  }
39451
39457
  const args = {};
39452
- if (!opts.yes) {
39453
- const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39454
- if (!confirmed) {
39455
- process.stdout.write("Aborted.\n");
39456
- return;
39457
- }
39458
- }
39458
+ if (opts.id !== void 0)
39459
+ args.id = opts.id;
39460
+ if (opts.startDate !== void 0)
39461
+ args.start_date = opts.startDate;
39462
+ if (opts.endDate !== void 0)
39463
+ args.end_date = opts.endDate;
39464
+ if (opts.aggregatorFilterId !== void 0)
39465
+ args.aggregator_filter_id = opts.aggregatorFilterId;
39466
+ if (opts.take !== void 0)
39467
+ args.take = Number(opts.take);
39468
+ if (opts.skip !== void 0)
39469
+ args.skip = Number(opts.skip);
39459
39470
  await ctx.execute({
39460
- method: "DELETE",
39461
- path: "/v1/agents/default-plan",
39471
+ method: "GET",
39472
+ path: "/v1/aggregators/{id}/usage/group-by-customer",
39462
39473
  args,
39463
- queryParamKeys: []
39474
+ queryParamKeys: [
39475
+ "start_date",
39476
+ "end_date",
39477
+ "aggregator_filter_id",
39478
+ "take",
39479
+ "skip"
39480
+ ]
39464
39481
  });
39465
39482
  });
39466
- resource.command("list-agent-rate-cards").description(`List AI rate cards: named pricing row sets in credits, window units or currency. Shows what plans/policies/products depend on each. Filter by denomination, currency or name search; paginated with take/skip.`).option("--denomination <value>", `Unit in which rate-card prices are expressed.
39467
-
39468
- - credits: Credit counts.
39469
- - units: Weighted rolling-allowance units.
39470
- - currency: Major units of the specified currency.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--search <value>", `search`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39483
+ resource.command("get-aggregator-usage-events").description(`List raw billable events for an aggregator across every customer of the client. Paginated with take/skip.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39471
39484
  Examples:
39472
- hyperline agents list-agent-rate-cards
39473
- hyperline agents list-agent-rate-cards --denomination <denomination> --currency <currency>`).action(async (opts) => {
39485
+ hyperline aggregators-usage get-aggregator-usage-events --id <id>
39486
+ hyperline aggregators-usage get-aggregator-usage-events --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
39474
39487
  const ctx = resource.parent?.opts()._ctx;
39475
39488
  if (!ctx) {
39476
39489
  process.stderr.write("Error: Not authenticated\n");
39477
39490
  process.exit(1);
39478
39491
  }
39479
39492
  const args = {};
39480
- if (opts.denomination !== void 0)
39481
- args.denomination = opts.denomination;
39482
- if (opts.currency !== void 0)
39483
- args.currency = opts.currency;
39484
- if (opts.search !== void 0)
39485
- args.search = opts.search;
39486
- if (opts.take !== void 0)
39487
- args.take = Number(opts.take);
39488
- if (opts.skip !== void 0)
39493
+ if (opts.id !== void 0)
39494
+ args.id = opts.id;
39495
+ if (opts.startDate !== void 0)
39496
+ args.start_date = opts.startDate;
39497
+ if (opts.endDate !== void 0)
39498
+ args.end_date = opts.endDate;
39499
+ if (opts.aggregatorFilterId !== void 0)
39500
+ args.aggregator_filter_id = opts.aggregatorFilterId;
39501
+ if (opts.take !== void 0)
39502
+ args.take = Number(opts.take);
39503
+ if (opts.skip !== void 0)
39489
39504
  args.skip = Number(opts.skip);
39490
39505
  await ctx.execute({
39491
39506
  method: "GET",
39492
- path: "/v1/agents/rate-cards",
39507
+ path: "/v1/aggregators/{id}/usage/events",
39493
39508
  args,
39494
- queryParamKeys: ["denomination", "currency", "search", "take", "skip"]
39509
+ queryParamKeys: [
39510
+ "start_date",
39511
+ "end_date",
39512
+ "aggregator_filter_id",
39513
+ "take",
39514
+ "skip"
39515
+ ]
39495
39516
  });
39496
39517
  });
39497
- resource.command("create-agent-rate-card").description(`Create an AI rate card with llm rows (per-1M input/output token rates) and item rows (per-unit rates), a denomination (credits/units/currency) and an optional USD fallback conversion.`).requiredOption("--name <value>", `Human-readable resource name.`).option("--fallback-per-usd <value>", `Credits, allowance units, or major currency units per USD of provider cost. Null leaves unmatched usage unpriced.`).requiredOption("--rows <json>", `All pricing rows on the card; replacement replaces the complete list.`).requiredOption("--denomination <value>", `Unit in which rate-card prices are expressed.
39518
+ }
39498
39519
 
39499
- - credits: Credit counts.
39500
- - units: Weighted rolling-allowance units.
39501
- - currency: Major units of the specified currency.`).option("--currency <value>", `ISO 4217 currency code for monetary values. Null for counts or historical amounts without recorded currency.`).addHelpText("after", `
39520
+ // build/commands/generated/ai-billing.js
39521
+ function registerAi_BillingCommands(parent) {
39522
+ const resource = parent.command("ai-billing").description("Manage ai > billing");
39523
+ resource.command("list-agent-plans").description(`List AI agent billing plans: workspace-level offers carrying a billing mode (wallet/credits/windows), rate card, allowance windows, markups and per-seat credit grants. Filter by mode; paginated with take/skip.`).option("--mode <value>", `Billing mode.
39524
+
39525
+ - wallet: Charges a monetary wallet.
39526
+ - credits: Consumes a credit balance.
39527
+ - windows: Meters weighted units against rolling allowances.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39528
+ Examples:
39529
+ hyperline ai-billing list-agent-plans
39530
+ hyperline ai-billing list-agent-plans --mode <mode> --take <take>`).action(async (opts) => {
39531
+ const ctx = resource.parent?.opts()._ctx;
39532
+ if (!ctx) {
39533
+ process.stderr.write("Error: Not authenticated\n");
39534
+ process.exit(1);
39535
+ }
39536
+ const args = {};
39537
+ if (opts.mode !== void 0)
39538
+ args.mode = opts.mode;
39539
+ if (opts.take !== void 0)
39540
+ args.take = Number(opts.take);
39541
+ if (opts.skip !== void 0)
39542
+ args.skip = Number(opts.skip);
39543
+ await ctx.execute({
39544
+ method: "GET",
39545
+ path: "/v1/ai/billing/plans",
39546
+ args,
39547
+ queryParamKeys: ["mode", "take", "skip"]
39548
+ });
39549
+ });
39550
+ resource.command("create-agent-plan").description(`Create an AI agent billing plan: name, billing mode (wallet/credits/windows), rate card reference, allowance windows, markups, per-seat credit grants and overage stance. Past-limit usage is priced EITHER by overage_markup_percent over the base rates OR by overage_rate_card_id, a currency rate card whose own rates are the overage price \u2014 never both. Metered overage mints the plan's invoice container.`).requiredOption("--name <value>", `Human-readable resource name.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--overage-mode <value>", `Behavior when credits or an allowance are exhausted. Policy values may inherit the attached plan.
39551
+
39552
+ - refuse: Rejects the call that crosses the boundary without deducting usage.
39553
+ - metered: Prices the whole call as monetary overage, using the overage card or USD provider cost plus markup.`).option("--markup-percent <value>", `Percentage added to resolved cost. Null on writes means no override; an attached plan may supply the value.`).option("--overage-markup-percent <value>", `Percentage added to provider cost for overage. Mutually exclusive with overage_rate_card_id.`).option("--overage-rate-card-id <value>", `Currency rate card used to price overage directly. Null means provider cost plus the resolved overage markup.`).option("--windows <json>", `Rolling allowances. Required for windows plans; each window meters every call. A plan replacement replaces the entire array.`).option("--per-seat-credits <value>", `Credits granted per seat per billing period. Null grants no credits.`).option("--grant-rollover-enabled", `Whether granted credits survive renewal. Purchased credits always roll over.`).option("--settlement-interval-minutes <number>", `Settlement interval in minutes. Null means no interval override. Mutually exclusive with settlement_schedule.`).option("--settlement-schedule <value>", `Calendar settlement schedule. Null clears the override; mutually exclusive with settlement_interval_minutes.
39554
+
39555
+ - calendar_month: Settles at the end of each UTC calendar month.`).requiredOption("--mode <value>", `Billing mode.
39556
+
39557
+ - wallet: Charges a monetary wallet.
39558
+ - credits: Consumes a credit balance.
39559
+ - windows: Meters weighted units against rolling allowances.`).addHelpText("after", `
39502
39560
  Examples:
39503
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination>
39504
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --fallback-per-usd <fallback_per_usd> --currency <currency>
39505
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --output json`).action(async (opts) => {
39561
+ hyperline ai-billing create-agent-plan --name <name> --mode <mode>
39562
+ hyperline ai-billing create-agent-plan --name <name> --mode <mode> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39563
+ hyperline ai-billing create-agent-plan --name <name> --mode <mode> --output json`).action(async (opts) => {
39506
39564
  const ctx = resource.parent?.opts()._ctx;
39507
39565
  if (!ctx) {
39508
39566
  process.stderr.write("Error: Not authenticated\n");
@@ -39511,77 +39569,83 @@ Examples:
39511
39569
  const args = {};
39512
39570
  if (opts.name !== void 0)
39513
39571
  args.name = opts.name;
39514
- if (opts.fallbackPerUsd !== void 0)
39515
- args.fallback_per_usd = opts.fallbackPerUsd;
39516
- if (opts.denomination !== void 0)
39517
- args.denomination = opts.denomination;
39518
- if (opts.currency !== void 0)
39519
- args.currency = opts.currency;
39520
- if (opts.rows !== void 0)
39521
- args.rows = JSON.parse(opts.rows);
39572
+ if (opts.rateCardId !== void 0)
39573
+ args.rate_card_id = opts.rateCardId;
39574
+ if (opts.overageMode !== void 0)
39575
+ args.overage_mode = opts.overageMode;
39576
+ if (opts.markupPercent !== void 0)
39577
+ args.markup_percent = opts.markupPercent;
39578
+ if (opts.overageMarkupPercent !== void 0)
39579
+ args.overage_markup_percent = opts.overageMarkupPercent;
39580
+ if (opts.overageRateCardId !== void 0)
39581
+ args.overage_rate_card_id = opts.overageRateCardId;
39582
+ if (opts.perSeatCredits !== void 0)
39583
+ args.per_seat_credits = opts.perSeatCredits;
39584
+ if (opts.settlementSchedule !== void 0)
39585
+ args.settlement_schedule = opts.settlementSchedule;
39586
+ if (opts.mode !== void 0)
39587
+ args.mode = opts.mode;
39588
+ if (opts.settlementIntervalMinutes !== void 0)
39589
+ args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39590
+ if (opts.grantRolloverEnabled !== void 0)
39591
+ args.grant_rollover_enabled = true;
39592
+ if (opts.windows !== void 0)
39593
+ args.windows = JSON.parse(opts.windows);
39522
39594
  await ctx.execute({
39523
39595
  method: "POST",
39524
- path: "/v1/agents/rate-cards",
39596
+ path: "/v1/ai/billing/plans",
39525
39597
  args,
39526
39598
  queryParamKeys: []
39527
39599
  });
39528
39600
  });
39529
- resource.command("get-agent-rate-card").description(`Get one AI rate card by id with all its pricing rows and usage counts (plans, policies, credit product).`).requiredOption("--rate-card-id <value>", `rate_card_id parameter`).addHelpText("after", `
39601
+ resource.command("get-agent-default-plan").description(`Get the workspace's default AI agent billing plan marker (plan id and auto_apply flag). 404 when none is set.`).addHelpText("after", `
39530
39602
  Examples:
39531
- hyperline agents get-agent-rate-card --rate-card-id <rate_card_id>`).action(async (opts) => {
39603
+ hyperline ai-billing get-agent-default-plan`).action(async (_opts) => {
39532
39604
  const ctx = resource.parent?.opts()._ctx;
39533
39605
  if (!ctx) {
39534
39606
  process.stderr.write("Error: Not authenticated\n");
39535
39607
  process.exit(1);
39536
39608
  }
39537
39609
  const args = {};
39538
- if (opts.rateCardId !== void 0)
39539
- args.rate_card_id = opts.rateCardId;
39540
39610
  await ctx.execute({
39541
39611
  method: "GET",
39542
- path: "/v1/agents/rate-cards/{rate_card_id}",
39612
+ path: "/v1/ai/billing/plans/default",
39543
39613
  args,
39544
39614
  queryParamKeys: []
39545
39615
  });
39546
39616
  });
39547
- resource.command("replace-agent-rate-card").description(`Replace an AI rate card's rows, name, description and USD fallback (whole-card semantics). Denomination and currency are immutable.`).requiredOption("--rate-card-id <value>", `rate_card_id parameter`).requiredOption("--name <value>", `Human-readable resource name.`).option("--fallback-per-usd <value>", `Credits, allowance units, or major currency units per USD of provider cost. Null leaves unmatched usage unpriced.`).requiredOption("--rows <json>", `All pricing rows on the card; replacement replaces the complete list.`).addHelpText("after", `
39617
+ resource.command("set-agent-default-plan").description(`Mark one plan as the workspace's default AI agent billing plan (body: plan_id, optional auto_apply). Replaces the previous marker; 404 when the plan is not this workspace's.`).requiredOption("--plan-id <value>", `Billing plan reference. On policy writes, omission preserves the current plan and null detaches it.`).option("--auto-apply", `Whether eligible newly ingested customers receive the default plan automatically.`).addHelpText("after", `
39548
39618
  Examples:
39549
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows>
39550
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows> --fallback-per-usd <fallback_per_usd>
39551
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows> --output json`).action(async (opts) => {
39619
+ hyperline ai-billing set-agent-default-plan --plan-id <plan_id>
39620
+ hyperline ai-billing set-agent-default-plan --plan-id <plan_id> --auto-apply
39621
+ hyperline ai-billing set-agent-default-plan --plan-id <plan_id> --output json`).action(async (opts) => {
39552
39622
  const ctx = resource.parent?.opts()._ctx;
39553
39623
  if (!ctx) {
39554
39624
  process.stderr.write("Error: Not authenticated\n");
39555
39625
  process.exit(1);
39556
39626
  }
39557
39627
  const args = {};
39558
- if (opts.rateCardId !== void 0)
39559
- args.rate_card_id = opts.rateCardId;
39560
- if (opts.name !== void 0)
39561
- args.name = opts.name;
39562
- if (opts.fallbackPerUsd !== void 0)
39563
- args.fallback_per_usd = opts.fallbackPerUsd;
39564
- if (opts.rows !== void 0)
39565
- args.rows = JSON.parse(opts.rows);
39628
+ if (opts.planId !== void 0)
39629
+ args.plan_id = opts.planId;
39630
+ if (opts.autoApply !== void 0)
39631
+ args.auto_apply = true;
39566
39632
  await ctx.execute({
39567
39633
  method: "PUT",
39568
- path: "/v1/agents/rate-cards/{rate_card_id}",
39634
+ path: "/v1/ai/billing/plans/default",
39569
39635
  args,
39570
39636
  queryParamKeys: []
39571
39637
  });
39572
39638
  });
39573
- resource.command("delete-agent-rate-card").description(`Delete an AI rate card. Refused (409, rate_card_in_use) while any plan, credit product or customer policy still uses it.`).requiredOption("--rate-card-id <value>", `rate_card_id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39639
+ resource.command("clear-agent-default-plan").description(`Clear the workspace's default AI agent billing plan marker. The plan itself is untouched. 404 when none is set.`).option("--yes", "Skip confirmation").addHelpText("after", `
39574
39640
  Examples:
39575
- hyperline agents delete-agent-rate-card --rate-card-id <rate_card_id>
39576
- hyperline agents delete-agent-rate-card --rate-card-id <rate_card_id> --output json`).action(async (opts) => {
39641
+ hyperline ai-billing clear-agent-default-plan
39642
+ hyperline ai-billing clear-agent-default-plan --output json`).action(async (opts) => {
39577
39643
  const ctx = resource.parent?.opts()._ctx;
39578
39644
  if (!ctx) {
39579
39645
  process.stderr.write("Error: Not authenticated\n");
39580
39646
  process.exit(1);
39581
39647
  }
39582
39648
  const args = {};
39583
- if (opts.rateCardId !== void 0)
39584
- args.rate_card_id = opts.rateCardId;
39585
39649
  if (!opts.yes) {
39586
39650
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39587
39651
  if (!confirmed) {
@@ -39591,139 +39655,221 @@ Examples:
39591
39655
  }
39592
39656
  await ctx.execute({
39593
39657
  method: "DELETE",
39594
- path: "/v1/agents/rate-cards/{rate_card_id}",
39658
+ path: "/v1/ai/billing/plans/default",
39595
39659
  args,
39596
39660
  queryParamKeys: []
39597
39661
  });
39598
39662
  });
39599
- resource.command("list-agent-credit-products").description(`List the credit products AI agent usage can draw down, with their purchasable packs and default rate cards. Customer pot balances live on the customer credits endpoints.`).addHelpText("after", `
39663
+ resource.command("get-agent-plan").description(`Get one AI agent billing plan by id, with its embedded rate card, window definitions, markups, per-seat grants and minted catalog object ids.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
39600
39664
  Examples:
39601
- hyperline agents list-agent-credit-products`).action(async (_opts) => {
39665
+ hyperline ai-billing get-agent-plan --id <id>`).action(async (opts) => {
39602
39666
  const ctx = resource.parent?.opts()._ctx;
39603
39667
  if (!ctx) {
39604
39668
  process.stderr.write("Error: Not authenticated\n");
39605
39669
  process.exit(1);
39606
39670
  }
39607
39671
  const args = {};
39672
+ if (opts.id !== void 0)
39673
+ args.id = opts.id;
39608
39674
  await ctx.execute({
39609
39675
  method: "GET",
39610
- path: "/v1/agents/credit-products",
39676
+ path: "/v1/ai/billing/plans/{id}",
39611
39677
  args,
39612
39678
  queryParamKeys: []
39613
39679
  });
39614
39680
  });
39615
- resource.command("list-agent-cost-catalog").description(`List the AI cost catalog: registry model prices merged with this workspace's negotiated overrides, its own custom cost items (source custom), and the unpriced pairs its telemetry has carried (source unlisted). Rates are USD decimal strings. Pass enabled_only=true for just the enabled catalog.`).option("--enabled-only <value>", `enabled_only`).addHelpText("after", `
39681
+ resource.command("replace-agent-plan").description(`Replace an AI agent billing plan (whole-row semantics). Changes take effect on the next call for every customer on the plan; mode is immutable. Overage is priced by overage_markup_percent or by overage_rate_card_id, never both.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `Human-readable resource name.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--overage-mode <value>", `Behavior when credits or an allowance are exhausted. Policy values may inherit the attached plan.
39682
+
39683
+ - refuse: Rejects the call that crosses the boundary without deducting usage.
39684
+ - metered: Prices the whole call as monetary overage, using the overage card or USD provider cost plus markup.`).option("--markup-percent <value>", `Percentage added to resolved cost. Null on writes means no override; an attached plan may supply the value.`).option("--overage-markup-percent <value>", `Percentage added to provider cost for overage. Mutually exclusive with overage_rate_card_id.`).option("--overage-rate-card-id <value>", `Currency rate card used to price overage directly. Null means provider cost plus the resolved overage markup.`).option("--windows <json>", `Rolling allowances. Required for windows plans; each window meters every call. A plan replacement replaces the entire array.`).option("--per-seat-credits <value>", `Credits granted per seat per billing period. Null grants no credits.`).option("--grant-rollover-enabled", `Whether granted credits survive renewal. Purchased credits always roll over.`).option("--settlement-interval-minutes <number>", `Settlement interval in minutes. Null means no interval override. Mutually exclusive with settlement_schedule.`).option("--settlement-schedule <value>", `Calendar settlement schedule. Null clears the override; mutually exclusive with settlement_interval_minutes.
39685
+
39686
+ - calendar_month: Settles at the end of each UTC calendar month.`).addHelpText("after", `
39616
39687
  Examples:
39617
- hyperline agents list-agent-cost-catalog
39618
- hyperline agents list-agent-cost-catalog --enabled-only <enabled_only>`).action(async (opts) => {
39688
+ hyperline ai-billing replace-agent-plan --id <id> --name <name>
39689
+ hyperline ai-billing replace-agent-plan --id <id> --name <name> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39690
+ hyperline ai-billing replace-agent-plan --id <id> --name <name> --output json`).action(async (opts) => {
39619
39691
  const ctx = resource.parent?.opts()._ctx;
39620
39692
  if (!ctx) {
39621
39693
  process.stderr.write("Error: Not authenticated\n");
39622
39694
  process.exit(1);
39623
39695
  }
39624
39696
  const args = {};
39625
- if (opts.enabledOnly !== void 0)
39626
- args.enabled_only = opts.enabledOnly;
39697
+ if (opts.id !== void 0)
39698
+ args.id = opts.id;
39699
+ if (opts.name !== void 0)
39700
+ args.name = opts.name;
39701
+ if (opts.rateCardId !== void 0)
39702
+ args.rate_card_id = opts.rateCardId;
39703
+ if (opts.overageMode !== void 0)
39704
+ args.overage_mode = opts.overageMode;
39705
+ if (opts.markupPercent !== void 0)
39706
+ args.markup_percent = opts.markupPercent;
39707
+ if (opts.overageMarkupPercent !== void 0)
39708
+ args.overage_markup_percent = opts.overageMarkupPercent;
39709
+ if (opts.overageRateCardId !== void 0)
39710
+ args.overage_rate_card_id = opts.overageRateCardId;
39711
+ if (opts.perSeatCredits !== void 0)
39712
+ args.per_seat_credits = opts.perSeatCredits;
39713
+ if (opts.settlementSchedule !== void 0)
39714
+ args.settlement_schedule = opts.settlementSchedule;
39715
+ if (opts.settlementIntervalMinutes !== void 0)
39716
+ args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39717
+ if (opts.grantRolloverEnabled !== void 0)
39718
+ args.grant_rollover_enabled = true;
39719
+ if (opts.windows !== void 0)
39720
+ args.windows = JSON.parse(opts.windows);
39721
+ await ctx.execute({
39722
+ method: "PUT",
39723
+ path: "/v1/ai/billing/plans/{id}",
39724
+ args,
39725
+ queryParamKeys: []
39726
+ });
39727
+ });
39728
+ resource.command("delete-agent-plan").description(`Delete an AI agent billing plan. Refused (409, plan_in_use) while any customer is still attached to it.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39729
+ Examples:
39730
+ hyperline ai-billing delete-agent-plan --id <id>
39731
+ hyperline ai-billing delete-agent-plan --id <id> --output json`).action(async (opts) => {
39732
+ const ctx = resource.parent?.opts()._ctx;
39733
+ if (!ctx) {
39734
+ process.stderr.write("Error: Not authenticated\n");
39735
+ process.exit(1);
39736
+ }
39737
+ const args = {};
39738
+ if (opts.id !== void 0)
39739
+ args.id = opts.id;
39740
+ if (!opts.yes) {
39741
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39742
+ if (!confirmed) {
39743
+ process.stdout.write("Aborted.\n");
39744
+ return;
39745
+ }
39746
+ }
39747
+ await ctx.execute({
39748
+ method: "DELETE",
39749
+ path: "/v1/ai/billing/plans/{id}",
39750
+ args,
39751
+ queryParamKeys: []
39752
+ });
39753
+ });
39754
+ resource.command("list-agent-rate-cards").description(`List AI rate cards: named pricing row sets in credits, window units or currency. Shows what plans/policies/products depend on each. Filter by denomination, currency or name search; paginated with take/skip.`).option("--denomination <value>", `Unit in which rate-card prices are expressed.
39755
+
39756
+ - credits: Credit counts.
39757
+ - units: Weighted rolling-allowance units.
39758
+ - currency: Major units of the specified currency.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--search <value>", `search`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39759
+ Examples:
39760
+ hyperline ai-billing list-agent-rate-cards
39761
+ hyperline ai-billing list-agent-rate-cards --denomination <denomination> --currency <currency>`).action(async (opts) => {
39762
+ const ctx = resource.parent?.opts()._ctx;
39763
+ if (!ctx) {
39764
+ process.stderr.write("Error: Not authenticated\n");
39765
+ process.exit(1);
39766
+ }
39767
+ const args = {};
39768
+ if (opts.denomination !== void 0)
39769
+ args.denomination = opts.denomination;
39770
+ if (opts.currency !== void 0)
39771
+ args.currency = opts.currency;
39772
+ if (opts.search !== void 0)
39773
+ args.search = opts.search;
39774
+ if (opts.take !== void 0)
39775
+ args.take = Number(opts.take);
39776
+ if (opts.skip !== void 0)
39777
+ args.skip = Number(opts.skip);
39627
39778
  await ctx.execute({
39628
39779
  method: "GET",
39629
- path: "/v1/agents/cost-catalog",
39780
+ path: "/v1/ai/billing/rate-cards",
39630
39781
  args,
39631
- queryParamKeys: ["enabled_only"]
39782
+ queryParamKeys: ["denomination", "currency", "search", "take", "skip"]
39632
39783
  });
39633
39784
  });
39634
- resource.command("create-agent-cost-catalog-item").description(`Create a custom AI cost item so a non-LLM vendor call is priced instead of landing unpriced at $0. provider/item must match hyperline.cost({ vendor, item }) verbatim and each dimensions[].key must match the unit the SDK sends. Re-creating an existing open item returns it unchanged (200); a pair the global registry already prices is refused \u2014 use the overrides endpoint for that.`).requiredOption("--provider <value>", `AI model provider, or the vendor of a custom cost item. This is not an integration connection.`).requiredOption("--item <value>", `Custom item name matching the usage payload.`).requiredOption("--dimensions <json>", `Additional billable dimensions; each key matches a usage_extra key and rates use the owning card's units or USD for cost-catalog dimensions.`).addHelpText("after", `
39785
+ resource.command("create-agent-rate-card").description(`Create an AI rate card with llm rows (per-1M input/output token rates) and item rows (per-unit rates), a denomination (credits/units/currency) and an optional USD fallback conversion.`).requiredOption("--name <value>", `Human-readable resource name.`).option("--fallback-per-usd <value>", `Credits, allowance units, or major currency units per USD of provider cost. Null leaves unmatched usage unpriced.`).requiredOption("--rows <json>", `All pricing rows on the card; replacement replaces the complete list.`).requiredOption("--denomination <value>", `Unit in which rate-card prices are expressed.
39786
+
39787
+ - credits: Credit counts.
39788
+ - units: Weighted rolling-allowance units.
39789
+ - currency: Major units of the specified currency.`).option("--currency <value>", `ISO 4217 currency code for monetary values. Null for counts or historical amounts without recorded currency.`).addHelpText("after", `
39635
39790
  Examples:
39636
- hyperline agents create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions>
39637
- hyperline agents create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions> --output json`).action(async (opts) => {
39791
+ hyperline ai-billing create-agent-rate-card --name <name> --rows <rows> --denomination <denomination>
39792
+ hyperline ai-billing create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --fallback-per-usd <fallback_per_usd> --currency <currency>
39793
+ hyperline ai-billing create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --output json`).action(async (opts) => {
39638
39794
  const ctx = resource.parent?.opts()._ctx;
39639
39795
  if (!ctx) {
39640
39796
  process.stderr.write("Error: Not authenticated\n");
39641
39797
  process.exit(1);
39642
39798
  }
39643
39799
  const args = {};
39644
- if (opts.provider !== void 0)
39645
- args.provider = opts.provider;
39646
- if (opts.item !== void 0)
39647
- args.item = opts.item;
39648
- if (opts.dimensions !== void 0)
39649
- args.dimensions = JSON.parse(opts.dimensions);
39800
+ if (opts.name !== void 0)
39801
+ args.name = opts.name;
39802
+ if (opts.fallbackPerUsd !== void 0)
39803
+ args.fallback_per_usd = opts.fallbackPerUsd;
39804
+ if (opts.denomination !== void 0)
39805
+ args.denomination = opts.denomination;
39806
+ if (opts.currency !== void 0)
39807
+ args.currency = opts.currency;
39808
+ if (opts.rows !== void 0)
39809
+ args.rows = JSON.parse(opts.rows);
39650
39810
  await ctx.execute({
39651
39811
  method: "POST",
39652
- path: "/v1/agents/cost-catalog/items",
39812
+ path: "/v1/ai/billing/rate-cards",
39653
39813
  args,
39654
39814
  queryParamKeys: []
39655
39815
  });
39656
39816
  });
39657
- resource.command("delete-agent-cost-catalog-item").description(`Close a custom AI cost item by its custom_item_id. History is kept; new calls on that pair go back to unpriced. An override id passed here is a 404.`).requiredOption("--item-id <value>", `item_id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39817
+ resource.command("get-agent-rate-card").description(`Get one AI rate card by id with all its pricing rows and usage counts (plans, policies, credit product).`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
39658
39818
  Examples:
39659
- hyperline agents delete-agent-cost-catalog-item --item-id <item_id>
39660
- hyperline agents delete-agent-cost-catalog-item --item-id <item_id> --output json`).action(async (opts) => {
39819
+ hyperline ai-billing get-agent-rate-card --id <id>`).action(async (opts) => {
39661
39820
  const ctx = resource.parent?.opts()._ctx;
39662
39821
  if (!ctx) {
39663
39822
  process.stderr.write("Error: Not authenticated\n");
39664
39823
  process.exit(1);
39665
39824
  }
39666
39825
  const args = {};
39667
- if (opts.itemId !== void 0)
39668
- args.item_id = opts.itemId;
39669
- if (!opts.yes) {
39670
- const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39671
- if (!confirmed) {
39672
- process.stdout.write("Aborted.\n");
39673
- return;
39674
- }
39675
- }
39826
+ if (opts.id !== void 0)
39827
+ args.id = opts.id;
39676
39828
  await ctx.execute({
39677
- method: "DELETE",
39678
- path: "/v1/agents/cost-catalog/items/{item_id}",
39829
+ method: "GET",
39830
+ path: "/v1/ai/billing/rate-cards/{id}",
39679
39831
  args,
39680
39832
  queryParamKeys: []
39681
39833
  });
39682
39834
  });
39683
- resource.command("upsert-agent-cost-catalog-override").description(`Set this workspace's negotiated price for a registry AI model (input/output/cached/cache-write USD per 1M tokens, plus optional dimensions). Replaces any open override immediately; historical calls keep their original rate. A pair the registry does not know is refused \u2014 create a custom cost item instead.`).requiredOption("--provider <value>", `AI model provider, or the vendor of a custom cost item. This is not an integration connection.`).requiredOption("--model <value>", `Model identifier, or custom item identifier. Null on wildcard pricing rows.`).requiredOption("--input-per-m-tokens <value>", `Provider cost in USD per million input tokens, as an exact decimal string.`).requiredOption("--output-per-m-tokens <value>", `Provider cost in USD per million output tokens, as an exact decimal string.`).option("--cached-input-per-m-tokens <value>", `Provider cost in USD per million cached input tokens, as an exact decimal string.`).option("--cache-write-per-m-tokens <value>", `Provider cost in USD per million cache write tokens, as an exact decimal string.`).option("--dimensions <json>", `Additional billable dimensions; each key matches a usage_extra key and rates use the owning card's units or USD for cost-catalog dimensions.`).addHelpText("after", `
39835
+ resource.command("replace-agent-rate-card").description(`Replace an AI rate card's rows, name and USD fallback (whole-card semantics). Denomination and currency are immutable.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `Human-readable resource name.`).option("--fallback-per-usd <value>", `Credits, allowance units, or major currency units per USD of provider cost. Null leaves unmatched usage unpriced.`).requiredOption("--rows <json>", `All pricing rows on the card; replacement replaces the complete list.`).addHelpText("after", `
39684
39836
  Examples:
39685
- hyperline agents upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens>
39686
- hyperline agents upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens> --cached-input-per-m-tokens <cached_input_per_m_tokens> --cache-write-per-m-tokens <cache_write_per_m_tokens>
39687
- hyperline agents upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens> --output json`).action(async (opts) => {
39837
+ hyperline ai-billing replace-agent-rate-card --id <id> --name <name> --rows <rows>
39838
+ hyperline ai-billing replace-agent-rate-card --id <id> --name <name> --rows <rows> --fallback-per-usd <fallback_per_usd>
39839
+ hyperline ai-billing replace-agent-rate-card --id <id> --name <name> --rows <rows> --output json`).action(async (opts) => {
39688
39840
  const ctx = resource.parent?.opts()._ctx;
39689
39841
  if (!ctx) {
39690
39842
  process.stderr.write("Error: Not authenticated\n");
39691
39843
  process.exit(1);
39692
39844
  }
39693
39845
  const args = {};
39694
- if (opts.provider !== void 0)
39695
- args.provider = opts.provider;
39696
- if (opts.model !== void 0)
39697
- args.model = opts.model;
39698
- if (opts.inputPerMTokens !== void 0)
39699
- args.input_per_m_tokens = opts.inputPerMTokens;
39700
- if (opts.outputPerMTokens !== void 0)
39701
- args.output_per_m_tokens = opts.outputPerMTokens;
39702
- if (opts.cachedInputPerMTokens !== void 0)
39703
- args.cached_input_per_m_tokens = opts.cachedInputPerMTokens;
39704
- if (opts.cacheWritePerMTokens !== void 0)
39705
- args.cache_write_per_m_tokens = opts.cacheWritePerMTokens;
39706
- if (opts.dimensions !== void 0)
39707
- args.dimensions = JSON.parse(opts.dimensions);
39846
+ if (opts.id !== void 0)
39847
+ args.id = opts.id;
39848
+ if (opts.name !== void 0)
39849
+ args.name = opts.name;
39850
+ if (opts.fallbackPerUsd !== void 0)
39851
+ args.fallback_per_usd = opts.fallbackPerUsd;
39852
+ if (opts.rows !== void 0)
39853
+ args.rows = JSON.parse(opts.rows);
39708
39854
  await ctx.execute({
39709
39855
  method: "PUT",
39710
- path: "/v1/agents/cost-catalog/overrides",
39856
+ path: "/v1/ai/billing/rate-cards/{id}",
39711
39857
  args,
39712
39858
  queryParamKeys: []
39713
39859
  });
39714
39860
  });
39715
- resource.command("delete-agent-cost-catalog-override").description(`Close this workspace's negotiated price override by its override.id; pricing falls back to the global registry rate. A custom cost item id passed here is a 404.`).requiredOption("--override-id <value>", `override_id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39861
+ resource.command("delete-agent-rate-card").description(`Delete an AI rate card. Refused (409, rate_card_in_use) while any plan, credit product or customer policy still uses it.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39716
39862
  Examples:
39717
- hyperline agents delete-agent-cost-catalog-override --override-id <override_id>
39718
- hyperline agents delete-agent-cost-catalog-override --override-id <override_id> --output json`).action(async (opts) => {
39863
+ hyperline ai-billing delete-agent-rate-card --id <id>
39864
+ hyperline ai-billing delete-agent-rate-card --id <id> --output json`).action(async (opts) => {
39719
39865
  const ctx = resource.parent?.opts()._ctx;
39720
39866
  if (!ctx) {
39721
39867
  process.stderr.write("Error: Not authenticated\n");
39722
39868
  process.exit(1);
39723
39869
  }
39724
39870
  const args = {};
39725
- if (opts.overrideId !== void 0)
39726
- args.override_id = opts.overrideId;
39871
+ if (opts.id !== void 0)
39872
+ args.id = opts.id;
39727
39873
  if (!opts.yes) {
39728
39874
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39729
39875
  if (!confirmed) {
@@ -39733,51 +39879,53 @@ Examples:
39733
39879
  }
39734
39880
  await ctx.execute({
39735
39881
  method: "DELETE",
39736
- path: "/v1/agents/cost-catalog/overrides/{override_id}",
39882
+ path: "/v1/ai/billing/rate-cards/{id}",
39737
39883
  args,
39738
39884
  queryParamKeys: []
39739
39885
  });
39740
39886
  });
39741
- resource.command("list-agent-customer-policies").description(`List all AI billing policies (scopes) for one customer: the default shared pool plus per-agent overrides. Accepts Hyperline or external customer ids.`).requiredOption("--customer-id <value>", `customer_id parameter`).addHelpText("after", `
39887
+ resource.command("list-agent-customer-policies").description(`List all AI billing policies (scopes) for one customer: the default shared pool plus per-agent overrides. Accepts Hyperline or external customer ids.`).requiredOption("--id <value>", `id parameter`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39742
39888
  Examples:
39743
- hyperline agents list-agent-customer-policies --customer-id <customer_id>`).action(async (opts) => {
39889
+ hyperline ai-billing list-agent-customer-policies --id <id>
39890
+ hyperline ai-billing list-agent-customer-policies --id <id> --take <take>`).action(async (opts) => {
39744
39891
  const ctx = resource.parent?.opts()._ctx;
39745
39892
  if (!ctx) {
39746
39893
  process.stderr.write("Error: Not authenticated\n");
39747
39894
  process.exit(1);
39748
39895
  }
39749
39896
  const args = {};
39750
- if (opts.customerId !== void 0)
39751
- args.customer_id = opts.customerId;
39897
+ if (opts.id !== void 0)
39898
+ args.id = opts.id;
39899
+ if (opts.take !== void 0)
39900
+ args.take = Number(opts.take);
39901
+ if (opts.skip !== void 0)
39902
+ args.skip = Number(opts.skip);
39752
39903
  await ctx.execute({
39753
39904
  method: "GET",
39754
- path: "/v1/agents/customers/{customer_id}/policies",
39905
+ path: "/v1/ai/billing/customers/{id}/policies",
39755
39906
  args,
39756
- queryParamKeys: []
39907
+ queryParamKeys: ["take", "skip"]
39757
39908
  });
39758
39909
  });
39759
- resource.command("get-agent-customer-policy").description(`Get one customer's AI billing policy \u2014 the default shared pool, or one agent's own scope via the agent query param.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).addHelpText("after", `
39910
+ resource.command("get-default-customer-billing-policy").description(`Get the exact customer billing policy addressed by this resource; agent policies never fall back to the shared pool.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
39760
39911
  Examples:
39761
- hyperline agents get-agent-customer-policy --customer-id <customer_id>
39762
- hyperline agents get-agent-customer-policy --customer-id <customer_id> --agent <agent>`).action(async (opts) => {
39912
+ hyperline ai-billing get-default-customer-billing-policy --id <id>`).action(async (opts) => {
39763
39913
  const ctx = resource.parent?.opts()._ctx;
39764
39914
  if (!ctx) {
39765
39915
  process.stderr.write("Error: Not authenticated\n");
39766
39916
  process.exit(1);
39767
39917
  }
39768
39918
  const args = {};
39769
- if (opts.customerId !== void 0)
39770
- args.customer_id = opts.customerId;
39771
- if (opts.agent !== void 0)
39772
- args.agent = opts.agent;
39919
+ if (opts.id !== void 0)
39920
+ args.id = opts.id;
39773
39921
  await ctx.execute({
39774
39922
  method: "GET",
39775
- path: "/v1/agents/customers/{customer_id}/policy",
39923
+ path: "/v1/ai/billing/customers/{id}/policies/default",
39776
39924
  args,
39777
- queryParamKeys: ["agent"]
39925
+ queryParamKeys: []
39778
39926
  });
39779
39927
  });
39780
- resource.command("upsert-agent-customer-policy").description(`Create or replace one customer's AI billing policy (whole-row). Pass plan_id to attach the customer to a billing plan \u2014 this also attaches the plan's overage invoice container to their subscription. Past-limit usage is priced by overage_markup_percent over the base rates, or by overage_rate_card_id (a currency rate card whose rates ARE the overage price) \u2014 never both. Wallet/credit pots are auto-opened empty.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).requiredOption("--mode <value>", `Billing mode.
39928
+ resource.command("upsert-default-customer-billing-policy").description(`Replace customer billing settings while preserving omitted plan_id and rate_card_id references; null detaches them, and a shared policy enables automatic telemetry billing.`).requiredOption("--id <value>", `id parameter`).requiredOption("--mode <value>", `Billing mode.
39781
39929
 
39782
39930
  - wallet: Charges a monetary wallet.
39783
39931
  - credits: Consumes a credit balance.
@@ -39786,21 +39934,19 @@ Examples:
39786
39934
  - refuse: Rejects the call that crosses the boundary without deducting usage.
39787
39935
  - metered: Prices the whole call as monetary overage, using the overage card or USD provider cost plus markup.`).option("--overage-markup-percent <value>", `Percentage added to provider cost for overage. Mutually exclusive with overage_rate_card_id.`).option("--overage-rate-card-id <value>", `Currency rate card used to price overage directly. Null means provider cost plus the resolved overage markup.`).option("--overage-wallet-id <value>", `Wallet charged for overage. Null bills overage in arrears.`).option("--floor <value>", `Minimum available balance a spend check requires, in the policy's denomination.`).option("--settlement-interval-minutes <number>", `Settlement interval in minutes. Null means no interval override. Mutually exclusive with settlement_schedule.`).option("--settlement-schedule <value>", `Calendar settlement schedule. Null clears the override; mutually exclusive with settlement_interval_minutes.
39788
39936
 
39789
- - calendar_month: Settles at the end of each UTC calendar month.`).option("--credit-rates <json>", `Inline credit pricing. Mutually exclusive with rate_card_id. Omitted rates may be supplied by a plan or product default.`).option("--window-rates <json>", `Window definitions and optional inline unit rates. An attached plan may supply omitted definitions; rate_card_id may supply unit rates.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--plan-id <value>", `Billing plan reference. On policy writes, omission preserves the current plan and null detaches it.`).requiredOption("--blocked", `Whether spending is disabled for this billing scope.`).addHelpText("after", `
39937
+ - calendar_month: Settles at the end of each UTC calendar month.`).option("--windows <json>", `Rolling allowances. Required for windows plans; each window meters every call. A plan replacement replaces the entire array.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--plan-id <value>", `Billing plan reference. On policy writes, omission preserves the current plan and null detaches it.`).requiredOption("--blocked", `Whether spending is disabled for this billing scope.`).addHelpText("after", `
39790
39938
  Examples:
39791
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked
39792
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked --agent <agent> --wallet-id <wallet_id>
39793
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked --output json`).action(async (opts) => {
39939
+ hyperline ai-billing upsert-default-customer-billing-policy --id <id> --mode <mode> --blocked
39940
+ hyperline ai-billing upsert-default-customer-billing-policy --id <id> --mode <mode> --blocked --wallet-id <wallet_id> --credit-product-id <credit_product_id>
39941
+ hyperline ai-billing upsert-default-customer-billing-policy --id <id> --mode <mode> --blocked --output json`).action(async (opts) => {
39794
39942
  const ctx = resource.parent?.opts()._ctx;
39795
39943
  if (!ctx) {
39796
39944
  process.stderr.write("Error: Not authenticated\n");
39797
39945
  process.exit(1);
39798
39946
  }
39799
39947
  const args = {};
39800
- if (opts.customerId !== void 0)
39801
- args.customer_id = opts.customerId;
39802
- if (opts.agent !== void 0)
39803
- args.agent = opts.agent;
39948
+ if (opts.id !== void 0)
39949
+ args.id = opts.id;
39804
39950
  if (opts.mode !== void 0)
39805
39951
  args.mode = opts.mode;
39806
39952
  if (opts.walletId !== void 0)
@@ -39829,32 +39975,27 @@ Examples:
39829
39975
  args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39830
39976
  if (opts.blocked !== void 0)
39831
39977
  args.blocked = true;
39832
- if (opts.creditRates !== void 0)
39833
- args.credit_rates = JSON.parse(opts.creditRates);
39834
- if (opts.windowRates !== void 0)
39835
- args.window_rates = JSON.parse(opts.windowRates);
39978
+ if (opts.windows !== void 0)
39979
+ args.windows = JSON.parse(opts.windows);
39836
39980
  await ctx.execute({
39837
39981
  method: "PUT",
39838
- path: "/v1/agents/customers/{customer_id}/policy",
39982
+ path: "/v1/ai/billing/customers/{id}/policies/default",
39839
39983
  args,
39840
- queryParamKeys: ["agent"]
39984
+ queryParamKeys: []
39841
39985
  });
39842
39986
  });
39843
- resource.command("delete-agent-customer-policy").description(`Delete one customer's AI billing policy scope. Refused (409) while it owes unsettled consumption or while agent overrides still depend on it.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).option("--yes", "Skip confirmation").addHelpText("after", `
39987
+ resource.command("delete-default-customer-billing-policy").description(`Delete one customer's AI billing policy scope. Refused (409) while it owes unsettled consumption or while agent overrides still depend on it.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39844
39988
  Examples:
39845
- hyperline agents delete-agent-customer-policy --customer-id <customer_id>
39846
- hyperline agents delete-agent-customer-policy --customer-id <customer_id> --agent <agent>
39847
- hyperline agents delete-agent-customer-policy --customer-id <customer_id> --output json`).action(async (opts) => {
39989
+ hyperline ai-billing delete-default-customer-billing-policy --id <id>
39990
+ hyperline ai-billing delete-default-customer-billing-policy --id <id> --output json`).action(async (opts) => {
39848
39991
  const ctx = resource.parent?.opts()._ctx;
39849
39992
  if (!ctx) {
39850
39993
  process.stderr.write("Error: Not authenticated\n");
39851
39994
  process.exit(1);
39852
39995
  }
39853
39996
  const args = {};
39854
- if (opts.customerId !== void 0)
39855
- args.customer_id = opts.customerId;
39856
- if (opts.agent !== void 0)
39857
- args.agent = opts.agent;
39997
+ if (opts.id !== void 0)
39998
+ args.id = opts.id;
39858
39999
  if (!opts.yes) {
39859
40000
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39860
40001
  if (!confirmed) {
@@ -39864,199 +40005,186 @@ Examples:
39864
40005
  }
39865
40006
  await ctx.execute({
39866
40007
  method: "DELETE",
39867
- path: "/v1/agents/customers/{customer_id}/policy",
39868
- args,
39869
- queryParamKeys: ["agent"]
39870
- });
39871
- });
39872
- resource.command("apply-agent-default-plan").description(`Apply the workspace's default AI agent billing plan to one customer (by id or external id). Idempotent; refuses (409) if the customer already has a different billing policy, 404 when no default plan is set.`).requiredOption("--customer-id <value>", `customer_id parameter`).addHelpText("after", `
39873
- Examples:
39874
- hyperline agents apply-agent-default-plan --customer-id <customer_id>
39875
- hyperline agents apply-agent-default-plan --customer-id <customer_id> --output json`).action(async (opts) => {
39876
- const ctx = resource.parent?.opts()._ctx;
39877
- if (!ctx) {
39878
- process.stderr.write("Error: Not authenticated\n");
39879
- process.exit(1);
39880
- }
39881
- const args = {};
39882
- if (opts.customerId !== void 0)
39883
- args.customer_id = opts.customerId;
39884
- await ctx.execute({
39885
- method: "POST",
39886
- path: "/v1/agents/customers/{customer_id}/apply-default-plan",
40008
+ path: "/v1/ai/billing/customers/{id}/policies/default",
39887
40009
  args,
39888
40010
  queryParamKeys: []
39889
40011
  });
39890
40012
  });
39891
- resource.command("get-agent-customer-balance").description(`Get one customer's live AI balance, shaped by their billing mode: wallet shadow balance, credit pot, or rolling window meters with reset times. Includes per-agent scopes and overage state.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).addHelpText("after", `
40013
+ resource.command("get-agent-customer-billing-policy").description(`Get the exact customer billing policy addressed by this resource; agent policies never fall back to the shared pool.`).requiredOption("--id <value>", `id parameter`).requiredOption("--agent-slug <value>", `agent_slug parameter`).addHelpText("after", `
39892
40014
  Examples:
39893
- hyperline agents get-agent-customer-balance --customer-id <customer_id>
39894
- hyperline agents get-agent-customer-balance --customer-id <customer_id> --agent <agent>`).action(async (opts) => {
40015
+ hyperline ai-billing get-agent-customer-billing-policy --id <id> --agent-slug <agent_slug>`).action(async (opts) => {
39895
40016
  const ctx = resource.parent?.opts()._ctx;
39896
40017
  if (!ctx) {
39897
40018
  process.stderr.write("Error: Not authenticated\n");
39898
40019
  process.exit(1);
39899
40020
  }
39900
40021
  const args = {};
39901
- if (opts.customerId !== void 0)
39902
- args.customer_id = opts.customerId;
39903
- if (opts.agent !== void 0)
39904
- args.agent = opts.agent;
40022
+ if (opts.id !== void 0)
40023
+ args.id = opts.id;
40024
+ if (opts.agentSlug !== void 0)
40025
+ args.agent_slug = opts.agentSlug;
39905
40026
  await ctx.execute({
39906
40027
  method: "GET",
39907
- path: "/v1/agents/customers/{customer_id}/balance",
40028
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39908
40029
  args,
39909
- queryParamKeys: ["agent"]
40030
+ queryParamKeys: []
39910
40031
  });
39911
40032
  });
39912
- resource.command("reset-agent-customer-windows").description(`Reset one customer's open AI allowance windows so their next call starts a fresh full allowance. Windows-mode scopes only.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).addHelpText("after", `
40033
+ resource.command("upsert-agent-customer-billing-policy").description(`Replace customer billing settings while preserving omitted plan_id and rate_card_id references; null detaches them, and a shared policy enables automatic telemetry billing.`).requiredOption("--id <value>", `id parameter`).requiredOption("--agent-slug <value>", `agent_slug parameter`).requiredOption("--mode <value>", `Billing mode.
40034
+
40035
+ - wallet: Charges a monetary wallet.
40036
+ - credits: Consumes a credit balance.
40037
+ - windows: Meters weighted units against rolling allowances.`).option("--wallet-id <value>", `Customer wallet identifier. Omit on wallet policy writes to provision or reuse the customer's wallet.`).option("--credit-product-id <value>", `Public credit product identifier whose balance this policy consumes.`).option("--markup-percent <value>", `Percentage added to resolved cost. Null on writes means no override; an attached plan may supply the value.`).option("--overage-mode <value>", `Behavior when credits or an allowance are exhausted. Policy values may inherit the attached plan.
40038
+
40039
+ - refuse: Rejects the call that crosses the boundary without deducting usage.
40040
+ - metered: Prices the whole call as monetary overage, using the overage card or USD provider cost plus markup.`).option("--overage-markup-percent <value>", `Percentage added to provider cost for overage. Mutually exclusive with overage_rate_card_id.`).option("--overage-rate-card-id <value>", `Currency rate card used to price overage directly. Null means provider cost plus the resolved overage markup.`).option("--overage-wallet-id <value>", `Wallet charged for overage. Null bills overage in arrears.`).option("--floor <value>", `Minimum available balance a spend check requires, in the policy's denomination.`).option("--settlement-interval-minutes <number>", `Settlement interval in minutes. Null means no interval override. Mutually exclusive with settlement_schedule.`).option("--settlement-schedule <value>", `Calendar settlement schedule. Null clears the override; mutually exclusive with settlement_interval_minutes.
40041
+
40042
+ - calendar_month: Settles at the end of each UTC calendar month.`).option("--windows <json>", `Rolling allowances. Required for windows plans; each window meters every call. A plan replacement replaces the entire array.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--plan-id <value>", `Billing plan reference. On policy writes, omission preserves the current plan and null detaches it.`).requiredOption("--blocked", `Whether spending is disabled for this billing scope.`).addHelpText("after", `
39913
40043
  Examples:
39914
- hyperline agents reset-agent-customer-windows --customer-id <customer_id>
39915
- hyperline agents reset-agent-customer-windows --customer-id <customer_id> --agent <agent>
39916
- hyperline agents reset-agent-customer-windows --customer-id <customer_id> --output json`).action(async (opts) => {
40044
+ hyperline ai-billing upsert-agent-customer-billing-policy --id <id> --agent-slug <agent_slug> --mode <mode> --blocked
40045
+ hyperline ai-billing upsert-agent-customer-billing-policy --id <id> --agent-slug <agent_slug> --mode <mode> --blocked --wallet-id <wallet_id> --credit-product-id <credit_product_id>
40046
+ hyperline ai-billing upsert-agent-customer-billing-policy --id <id> --agent-slug <agent_slug> --mode <mode> --blocked --output json`).action(async (opts) => {
39917
40047
  const ctx = resource.parent?.opts()._ctx;
39918
40048
  if (!ctx) {
39919
40049
  process.stderr.write("Error: Not authenticated\n");
39920
40050
  process.exit(1);
39921
40051
  }
39922
40052
  const args = {};
39923
- if (opts.customerId !== void 0)
39924
- args.customer_id = opts.customerId;
39925
- if (opts.agent !== void 0)
39926
- args.agent = opts.agent;
40053
+ if (opts.id !== void 0)
40054
+ args.id = opts.id;
40055
+ if (opts.agentSlug !== void 0)
40056
+ args.agent_slug = opts.agentSlug;
40057
+ if (opts.mode !== void 0)
40058
+ args.mode = opts.mode;
40059
+ if (opts.walletId !== void 0)
40060
+ args.wallet_id = opts.walletId;
40061
+ if (opts.creditProductId !== void 0)
40062
+ args.credit_product_id = opts.creditProductId;
40063
+ if (opts.markupPercent !== void 0)
40064
+ args.markup_percent = opts.markupPercent;
40065
+ if (opts.overageMode !== void 0)
40066
+ args.overage_mode = opts.overageMode;
40067
+ if (opts.overageMarkupPercent !== void 0)
40068
+ args.overage_markup_percent = opts.overageMarkupPercent;
40069
+ if (opts.overageRateCardId !== void 0)
40070
+ args.overage_rate_card_id = opts.overageRateCardId;
40071
+ if (opts.overageWalletId !== void 0)
40072
+ args.overage_wallet_id = opts.overageWalletId;
40073
+ if (opts.floor !== void 0)
40074
+ args.floor = opts.floor;
40075
+ if (opts.settlementSchedule !== void 0)
40076
+ args.settlement_schedule = opts.settlementSchedule;
40077
+ if (opts.rateCardId !== void 0)
40078
+ args.rate_card_id = opts.rateCardId;
40079
+ if (opts.planId !== void 0)
40080
+ args.plan_id = opts.planId;
40081
+ if (opts.settlementIntervalMinutes !== void 0)
40082
+ args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
40083
+ if (opts.blocked !== void 0)
40084
+ args.blocked = true;
40085
+ if (opts.windows !== void 0)
40086
+ args.windows = JSON.parse(opts.windows);
39927
40087
  await ctx.execute({
39928
- method: "POST",
39929
- path: "/v1/agents/customers/{customer_id}/windows/reset",
40088
+ method: "PUT",
40089
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39930
40090
  args,
39931
- queryParamKeys: ["agent"]
40091
+ queryParamKeys: []
39932
40092
  });
39933
40093
  });
39934
- resource.command("list-agent-customer-consumption").description(`List one customer's AI consumption ledger entries, newest first, with amounts, denominations and overage flags. Filter by agent scope, overage, and from/to time range; paginated with take/skip.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent slug. An empty string selects the shared pool; omission includes all scopes.`).option("--overage <value>", `Filter by overage status. Omit to include both ordinary and overage entries.`).option("--from <value>", `UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--to <value>", `UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
40094
+ resource.command("delete-agent-customer-billing-policy").description(`Delete one customer's AI billing policy scope. Refused (409) while it owes unsettled consumption or while agent overrides still depend on it.`).requiredOption("--id <value>", `id parameter`).requiredOption("--agent-slug <value>", `agent_slug parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
39935
40095
  Examples:
39936
- hyperline agents list-agent-customer-consumption --customer-id <customer_id>
39937
- hyperline agents list-agent-customer-consumption --customer-id <customer_id> --agent <agent> --overage <overage>`).action(async (opts) => {
40096
+ hyperline ai-billing delete-agent-customer-billing-policy --id <id> --agent-slug <agent_slug>
40097
+ hyperline ai-billing delete-agent-customer-billing-policy --id <id> --agent-slug <agent_slug> --output json`).action(async (opts) => {
39938
40098
  const ctx = resource.parent?.opts()._ctx;
39939
40099
  if (!ctx) {
39940
40100
  process.stderr.write("Error: Not authenticated\n");
39941
40101
  process.exit(1);
39942
40102
  }
39943
40103
  const args = {};
39944
- if (opts.customerId !== void 0)
39945
- args.customer_id = opts.customerId;
39946
- if (opts.agent !== void 0)
39947
- args.agent = opts.agent;
39948
- if (opts.overage !== void 0)
39949
- args.overage = opts.overage;
39950
- if (opts.from !== void 0)
39951
- args.from = opts.from;
39952
- if (opts.to !== void 0)
39953
- args.to = opts.to;
39954
- if (opts.take !== void 0)
39955
- args.take = Number(opts.take);
39956
- if (opts.skip !== void 0)
39957
- args.skip = Number(opts.skip);
40104
+ if (opts.id !== void 0)
40105
+ args.id = opts.id;
40106
+ if (opts.agentSlug !== void 0)
40107
+ args.agent_slug = opts.agentSlug;
40108
+ if (!opts.yes) {
40109
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
40110
+ if (!confirmed) {
40111
+ process.stdout.write("Aborted.\n");
40112
+ return;
40113
+ }
40114
+ }
39958
40115
  await ctx.execute({
39959
- method: "GET",
39960
- path: "/v1/agents/customers/{customer_id}/consumption",
40116
+ method: "DELETE",
40117
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39961
40118
  args,
39962
- queryParamKeys: ["agent", "overage", "from", "to", "take", "skip"]
40119
+ queryParamKeys: []
39963
40120
  });
39964
40121
  });
39965
- resource.command("get-agent-customer-overview").description(`Get one customer's full AI billing overview: default policy, per-agent scopes, balances and billed consumption totals in one read.`).requiredOption("--customer-id <value>", `customer_id parameter`).addHelpText("after", `
40122
+ resource.command("apply-agent-default-plan").description(`Apply the workspace's default AI agent billing plan to one customer (by id or external id). Idempotent; refuses (409) if the customer already has a different billing policy, 404 when no default plan is set.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
39966
40123
  Examples:
39967
- hyperline agents get-agent-customer-overview --customer-id <customer_id>`).action(async (opts) => {
40124
+ hyperline ai-billing apply-agent-default-plan --id <id>
40125
+ hyperline ai-billing apply-agent-default-plan --id <id> --output json`).action(async (opts) => {
39968
40126
  const ctx = resource.parent?.opts()._ctx;
39969
40127
  if (!ctx) {
39970
40128
  process.stderr.write("Error: Not authenticated\n");
39971
40129
  process.exit(1);
39972
40130
  }
39973
40131
  const args = {};
39974
- if (opts.customerId !== void 0)
39975
- args.customer_id = opts.customerId;
40132
+ if (opts.id !== void 0)
40133
+ args.id = opts.id;
39976
40134
  await ctx.execute({
39977
- method: "GET",
39978
- path: "/v1/agents/customers/{customer_id}/overview",
40135
+ method: "POST",
40136
+ path: "/v1/ai/billing/customers/{id}/apply-default-plan",
39979
40137
  args,
39980
40138
  queryParamKeys: []
39981
40139
  });
39982
40140
  });
39983
- }
39984
-
39985
- // build/commands/generated/aggregators.js
39986
- function registerAggregatorsCommands(parent) {
39987
- const resource = parent.command("aggregators").description("Manage aggregators");
39988
- resource.command("list").description(`List all aggregators with pagination. Aggregators define how billable events are counted or summed to compute usage.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
40141
+ resource.command("get-agent-customer-balance").description(`Get one customer's live AI balance, shaped by their billing mode: wallet shadow balance, credit pot, or rolling window meters with reset times. Includes per-agent scopes and overage state.`).requiredOption("--id <value>", `id parameter`).option("--agent-slug <value>", `Agent scope identifier. Null is the customer's shared pool.`).addHelpText("after", `
39989
40142
  Examples:
39990
- hyperline aggregators list
39991
- hyperline aggregators list --take <take>`).action(async (opts) => {
40143
+ hyperline ai-billing get-agent-customer-balance --id <id>
40144
+ hyperline ai-billing get-agent-customer-balance --id <id> --agent-slug <agent_slug>`).action(async (opts) => {
39992
40145
  const ctx = resource.parent?.opts()._ctx;
39993
40146
  if (!ctx) {
39994
40147
  process.stderr.write("Error: Not authenticated\n");
39995
40148
  process.exit(1);
39996
40149
  }
39997
40150
  const args = {};
39998
- if (opts.take !== void 0)
39999
- args.take = Number(opts.take);
40000
- if (opts.skip !== void 0)
40001
- args.skip = Number(opts.skip);
40151
+ if (opts.id !== void 0)
40152
+ args.id = opts.id;
40153
+ if (opts.agentSlug !== void 0)
40154
+ args.agent_slug = opts.agentSlug;
40002
40155
  await ctx.execute({
40003
40156
  method: "GET",
40004
- path: "/v1/aggregators",
40157
+ path: "/v1/ai/billing/customers/{id}/balance",
40005
40158
  args,
40006
- queryParamKeys: ["take", "skip"]
40159
+ queryParamKeys: ["agent_slug"]
40007
40160
  });
40008
40161
  });
40009
- resource.command("create").description(`Create a new aggregator that counts or sums billable events. Aggregators can then be linked to products via aggregator_id.`).requiredOption("--entity <value>", `The billable event entity to aggregate.`).option("--type <value>", `The type of aggregator.`).option("--where <json>", `Filter conditions for the aggregation.`).option("--name <value>", `Name of the aggregator.`).option("--description <value>", `Description of the aggregator.`).option("--allow-negative-values", `Whether the aggregator can produce negative values.`).option("--aggregate-on-customers-enabled", `Whether the aggregator should aggregate on customers.`).option("--custom-event-name <value>", `Custom event name for the aggregator.`).option("--exposed-event-keys <json>", `Event keys exposed by the aggregator.`).option("--unit-name <value>", `Display name of the unit being measured (e.g. 'user', 'request'). Used as fallback for products attached to this aggregator.`).option("--default-interval-count <number>", `Default interval count for usage periods.`).option("--default-interval-period <value>", `Default interval period for usage periods.`).option("--thresholds <json>", `Thresholds for the aggregator.`).requiredOption("--operation <value>", `The aggregation operation to perform.`).option("--property <value>", `The property to sum.`).addHelpText("after", `
40162
+ resource.command("reset-agent-customer-windows").description(`Reset one customer's open AI allowance windows so their next call starts a fresh full allowance. Windows-mode scopes only.`).requiredOption("--id <value>", `id parameter`).option("--agent-slug <value>", `Agent scope identifier. Null is the customer's shared pool.`).addHelpText("after", `
40010
40163
  Examples:
40011
- hyperline aggregators create --entity <entity> --operation <operation>
40012
- hyperline aggregators create --entity <entity> --operation <operation> --type <type> --where <where>
40013
- hyperline aggregators create --entity <entity> --operation <operation> --output json`).action(async (opts) => {
40164
+ hyperline ai-billing reset-agent-customer-windows --id <id>
40165
+ hyperline ai-billing reset-agent-customer-windows --id <id> --agent-slug <agent_slug>
40166
+ hyperline ai-billing reset-agent-customer-windows --id <id> --output json`).action(async (opts) => {
40014
40167
  const ctx = resource.parent?.opts()._ctx;
40015
40168
  if (!ctx) {
40016
40169
  process.stderr.write("Error: Not authenticated\n");
40017
40170
  process.exit(1);
40018
40171
  }
40019
40172
  const args = {};
40020
- if (opts.entity !== void 0)
40021
- args.entity = opts.entity;
40022
- if (opts.type !== void 0)
40023
- args.type = opts.type;
40024
- if (opts.name !== void 0)
40025
- args.name = opts.name;
40026
- if (opts.description !== void 0)
40027
- args.description = opts.description;
40028
- if (opts.customEventName !== void 0)
40029
- args.custom_event_name = opts.customEventName;
40030
- if (opts.unitName !== void 0)
40031
- args.unit_name = opts.unitName;
40032
- if (opts.defaultIntervalPeriod !== void 0)
40033
- args.default_interval_period = opts.defaultIntervalPeriod;
40034
- if (opts.operation !== void 0)
40035
- args.operation = opts.operation;
40036
- if (opts.property !== void 0)
40037
- args.property = opts.property;
40038
- if (opts.defaultIntervalCount !== void 0)
40039
- args.default_interval_count = Number(opts.defaultIntervalCount);
40040
- if (opts.allowNegativeValues !== void 0)
40041
- args.allow_negative_values = true;
40042
- if (opts.aggregateOnCustomersEnabled !== void 0)
40043
- args.aggregate_on_customers_enabled = true;
40044
- if (opts.where !== void 0)
40045
- args.where = JSON.parse(opts.where);
40046
- if (opts.exposedEventKeys !== void 0)
40047
- args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
40048
- if (opts.thresholds !== void 0)
40049
- args.thresholds = JSON.parse(opts.thresholds);
40173
+ if (opts.id !== void 0)
40174
+ args.id = opts.id;
40175
+ if (opts.agentSlug !== void 0)
40176
+ args.agent_slug = opts.agentSlug;
40050
40177
  await ctx.execute({
40051
40178
  method: "POST",
40052
- path: "/v1/aggregators",
40179
+ path: "/v1/ai/billing/customers/{id}/windows/reset",
40053
40180
  args,
40054
- queryParamKeys: []
40181
+ queryParamKeys: ["agent_slug"]
40055
40182
  });
40056
40183
  });
40057
- resource.command("get").description(`Retrieve a specific aggregator by ID.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
40184
+ resource.command("list-agent-customer-consumption").description(`List one customer's AI consumption ledger entries, newest first, with amounts, denominations and overage flags. Filter by agent scope, overage, and from/to time range; paginated with take/skip.`).requiredOption("--id <value>", `id parameter`).option("--agent-slug <value>", `Billing scope: an empty string selects the shared pool; omission includes all scopes.`).option("--overage <value>", `Filter by overage status; omission includes both ordinary and overage entries.`).option("--from <value>", `UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--to <value>", `UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
40058
40185
  Examples:
40059
- hyperline aggregators get --id <id>`).action(async (opts) => {
40186
+ hyperline ai-billing list-agent-customer-consumption --id <id>
40187
+ hyperline ai-billing list-agent-customer-consumption --id <id> --agent-slug <agent_slug> --overage <overage>`).action(async (opts) => {
40060
40188
  const ctx = resource.parent?.opts()._ctx;
40061
40189
  if (!ctx) {
40062
40190
  process.stderr.write("Error: Not authenticated\n");
@@ -40065,18 +40193,28 @@ Examples:
40065
40193
  const args = {};
40066
40194
  if (opts.id !== void 0)
40067
40195
  args.id = opts.id;
40196
+ if (opts.agentSlug !== void 0)
40197
+ args.agent_slug = opts.agentSlug;
40198
+ if (opts.overage !== void 0)
40199
+ args.overage = opts.overage;
40200
+ if (opts.from !== void 0)
40201
+ args.from = opts.from;
40202
+ if (opts.to !== void 0)
40203
+ args.to = opts.to;
40204
+ if (opts.take !== void 0)
40205
+ args.take = Number(opts.take);
40206
+ if (opts.skip !== void 0)
40207
+ args.skip = Number(opts.skip);
40068
40208
  await ctx.execute({
40069
40209
  method: "GET",
40070
- path: "/v1/aggregators/{id}",
40210
+ path: "/v1/ai/billing/customers/{id}/consumption",
40071
40211
  args,
40072
- queryParamKeys: []
40212
+ queryParamKeys: ["agent_slug", "overage", "from", "to", "take", "skip"]
40073
40213
  });
40074
40214
  });
40075
- resource.command("update").description(`Update an existing aggregator's configuration.`).requiredOption("--id <value>", `id parameter`).option("--entity <value>", `The billable event entity to aggregate.`).option("--type <value>", `The type of aggregator.`).option("--where <json>", `Filter conditions for the aggregation.`).option("--name <value>", `Name of the aggregator.`).option("--description <value>", `Description of the aggregator.`).option("--allow-negative-values", `Whether the aggregator can produce negative values.`).option("--aggregate-on-customers-enabled", `Whether the aggregator should aggregate on customers.`).option("--custom-event-name <value>", `Custom event name for the aggregator.`).option("--exposed-event-keys <json>", `Event keys exposed by the aggregator.`).option("--unit-name <value>", `Display name of the unit being measured (e.g. 'user', 'request'). Used as fallback for products attached to this aggregator.`).option("--default-interval-count <number>", `Default interval count for usage periods.`).option("--default-interval-period <value>", `Default interval period for usage periods.`).option("--thresholds <json>", `Thresholds for the aggregator. Replaces existing thresholds.`).option("--operation <value>", `The aggregation operation to perform.`).option("--property <value>", `The property to sum. Required when operation is 'sum'.`).addHelpText("after", `
40215
+ resource.command("get-product-ai-rate-card").description(`Get the default AI rate-card reference for a credit product, or 404 when none is attached.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
40076
40216
  Examples:
40077
- hyperline aggregators update --id <id>
40078
- hyperline aggregators update --id <id> --entity <entity> --type <type>
40079
- hyperline aggregators update --id <id> --output json`).action(async (opts) => {
40217
+ hyperline ai-billing get-product-ai-rate-card --id <id>`).action(async (opts) => {
40080
40218
  const ctx = resource.parent?.opts()._ctx;
40081
40219
  if (!ctx) {
40082
40220
  process.stderr.write("Error: Not authenticated\n");
@@ -40085,47 +40223,38 @@ Examples:
40085
40223
  const args = {};
40086
40224
  if (opts.id !== void 0)
40087
40225
  args.id = opts.id;
40088
- if (opts.entity !== void 0)
40089
- args.entity = opts.entity;
40090
- if (opts.type !== void 0)
40091
- args.type = opts.type;
40092
- if (opts.name !== void 0)
40093
- args.name = opts.name;
40094
- if (opts.description !== void 0)
40095
- args.description = opts.description;
40096
- if (opts.customEventName !== void 0)
40097
- args.custom_event_name = opts.customEventName;
40098
- if (opts.unitName !== void 0)
40099
- args.unit_name = opts.unitName;
40100
- if (opts.defaultIntervalPeriod !== void 0)
40101
- args.default_interval_period = opts.defaultIntervalPeriod;
40102
- if (opts.operation !== void 0)
40103
- args.operation = opts.operation;
40104
- if (opts.property !== void 0)
40105
- args.property = opts.property;
40106
- if (opts.defaultIntervalCount !== void 0)
40107
- args.default_interval_count = Number(opts.defaultIntervalCount);
40108
- if (opts.allowNegativeValues !== void 0)
40109
- args.allow_negative_values = true;
40110
- if (opts.aggregateOnCustomersEnabled !== void 0)
40111
- args.aggregate_on_customers_enabled = true;
40112
- if (opts.where !== void 0)
40113
- args.where = JSON.parse(opts.where);
40114
- if (opts.exposedEventKeys !== void 0)
40115
- args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
40116
- if (opts.thresholds !== void 0)
40117
- args.thresholds = JSON.parse(opts.thresholds);
40226
+ await ctx.execute({
40227
+ method: "GET",
40228
+ path: "/v1/ai/billing/products/{id}/rate-card",
40229
+ args,
40230
+ queryParamKeys: []
40231
+ });
40232
+ });
40233
+ resource.command("set-product-ai-rate-card").description(`Attach a credits-denominated AI rate card with complete fallback pricing as the credit product's default.`).requiredOption("--id <value>", `id parameter`).requiredOption("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).addHelpText("after", `
40234
+ Examples:
40235
+ hyperline ai-billing set-product-ai-rate-card --id <id> --rate-card-id <rate_card_id>
40236
+ hyperline ai-billing set-product-ai-rate-card --id <id> --rate-card-id <rate_card_id> --output json`).action(async (opts) => {
40237
+ const ctx = resource.parent?.opts()._ctx;
40238
+ if (!ctx) {
40239
+ process.stderr.write("Error: Not authenticated\n");
40240
+ process.exit(1);
40241
+ }
40242
+ const args = {};
40243
+ if (opts.id !== void 0)
40244
+ args.id = opts.id;
40245
+ if (opts.rateCardId !== void 0)
40246
+ args.rate_card_id = opts.rateCardId;
40118
40247
  await ctx.execute({
40119
40248
  method: "PUT",
40120
- path: "/v1/aggregators/{id}",
40249
+ path: "/v1/ai/billing/products/{id}/rate-card",
40121
40250
  args,
40122
40251
  queryParamKeys: []
40123
40252
  });
40124
40253
  });
40125
- resource.command("delete").description(`Delete an aggregator by ID. Will fail if the aggregator is linked to a product.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
40254
+ resource.command("clear-product-ai-rate-card").description(`Detach a credit product's default AI rate card without deleting the card, or return 404 when none is attached.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
40126
40255
  Examples:
40127
- hyperline aggregators delete --id <id>
40128
- hyperline aggregators delete --id <id> --output json`).action(async (opts) => {
40256
+ hyperline ai-billing clear-product-ai-rate-card --id <id>
40257
+ hyperline ai-billing clear-product-ai-rate-card --id <id> --output json`).action(async (opts) => {
40129
40258
  const ctx = resource.parent?.opts()._ctx;
40130
40259
  if (!ctx) {
40131
40260
  process.stderr.write("Error: Not authenticated\n");
@@ -40143,38 +40272,66 @@ Examples:
40143
40272
  }
40144
40273
  await ctx.execute({
40145
40274
  method: "DELETE",
40146
- path: "/v1/aggregators/{id}",
40275
+ path: "/v1/ai/billing/products/{id}/rate-card",
40147
40276
  args,
40148
40277
  queryParamKeys: []
40149
40278
  });
40150
40279
  });
40151
40280
  }
40152
40281
 
40153
- // build/commands/generated/aggregators-usage.js
40154
- function registerAggregators_UsageCommands(parent) {
40155
- const resource = parent.command("aggregators-usage").description("Manage aggregators > usage");
40156
- resource.command("get-aggregator-usage").description(`Retrieve a usage row for an aggregator. Use the timeseries, group-by-customer or events endpoints to query metering data.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
40282
+ // build/commands/generated/ai-costs.js
40283
+ function registerAi_CostsCommands(parent) {
40284
+ const resource = parent.command("ai-costs").description("Manage ai > costs");
40285
+ resource.command("list-agent-cost-catalog").description(`List the AI cost catalog: registry model prices merged with this workspace's negotiated overrides, its own custom cost items (source custom), and the unpriced pairs its telemetry has carried (source unlisted). Rates are USD decimal strings. Pass enabled_only=true for just the enabled catalog.`).option("--take <number>", `Maximum catalog entries to return.`).option("--skip <number>", `skip`).option("--enabled-only <value>", `enabled_only`).addHelpText("after", `
40157
40286
  Examples:
40158
- hyperline aggregators-usage get-aggregator-usage --id <id>`).action(async (opts) => {
40287
+ hyperline ai-costs list-agent-cost-catalog
40288
+ hyperline ai-costs list-agent-cost-catalog --take <take> --enabled-only <enabled_only>`).action(async (opts) => {
40159
40289
  const ctx = resource.parent?.opts()._ctx;
40160
40290
  if (!ctx) {
40161
40291
  process.stderr.write("Error: Not authenticated\n");
40162
40292
  process.exit(1);
40163
40293
  }
40164
40294
  const args = {};
40165
- if (opts.id !== void 0)
40166
- args.id = opts.id;
40295
+ if (opts.enabledOnly !== void 0)
40296
+ args.enabled_only = opts.enabledOnly;
40297
+ if (opts.take !== void 0)
40298
+ args.take = Number(opts.take);
40299
+ if (opts.skip !== void 0)
40300
+ args.skip = Number(opts.skip);
40167
40301
  await ctx.execute({
40168
40302
  method: "GET",
40169
- path: "/v1/aggregators/{id}/usage",
40303
+ path: "/v1/ai/billing/costs",
40304
+ args,
40305
+ queryParamKeys: ["take", "skip", "enabled_only"]
40306
+ });
40307
+ });
40308
+ resource.command("create-agent-cost-catalog-item").description(`Create a custom provider/item cost; an existing pair returns 200 with its unchanged rates, so use PUT /v1/ai/billing/costs/items/:id to edit it.`).requiredOption("--provider <value>", `AI model provider, or the vendor of a custom cost item. This is not an integration connection.`).requiredOption("--item <value>", `Custom item name matching the usage payload.`).requiredOption("--dimensions <json>", `Additional billable dimensions; each key matches a usage_extra key and rates use the owning card's units or USD for cost-catalog dimensions.`).addHelpText("after", `
40309
+ Examples:
40310
+ hyperline ai-costs create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions>
40311
+ hyperline ai-costs create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions> --output json`).action(async (opts) => {
40312
+ const ctx = resource.parent?.opts()._ctx;
40313
+ if (!ctx) {
40314
+ process.stderr.write("Error: Not authenticated\n");
40315
+ process.exit(1);
40316
+ }
40317
+ const args = {};
40318
+ if (opts.provider !== void 0)
40319
+ args.provider = opts.provider;
40320
+ if (opts.item !== void 0)
40321
+ args.item = opts.item;
40322
+ if (opts.dimensions !== void 0)
40323
+ args.dimensions = JSON.parse(opts.dimensions);
40324
+ await ctx.execute({
40325
+ method: "POST",
40326
+ path: "/v1/ai/billing/costs/items",
40170
40327
  args,
40171
40328
  queryParamKeys: []
40172
40329
  });
40173
40330
  });
40174
- resource.command("get-aggregator-usage-timeseries").description(`Get client-wide usage for an aggregator bucketed by month/day/hour over a period.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--group-by <value>", `Bucket size for the timeseries.`).addHelpText("after", `
40331
+ resource.command("delete-agent-cost-catalog-item").description(`Close a custom AI cost item by its custom_item_id. History is kept; new calls on that pair go back to unpriced. An override id passed here is a 404.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
40175
40332
  Examples:
40176
- hyperline aggregators-usage get-aggregator-usage-timeseries --id <id>
40177
- hyperline aggregators-usage get-aggregator-usage-timeseries --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
40333
+ hyperline ai-costs delete-agent-cost-catalog-item --id <id>
40334
+ hyperline ai-costs delete-agent-cost-catalog-item --id <id> --output json`).action(async (opts) => {
40178
40335
  const ctx = resource.parent?.opts()._ctx;
40179
40336
  if (!ctx) {
40180
40337
  process.stderr.write("Error: Not authenticated\n");
@@ -40183,30 +40340,56 @@ Examples:
40183
40340
  const args = {};
40184
40341
  if (opts.id !== void 0)
40185
40342
  args.id = opts.id;
40186
- if (opts.startDate !== void 0)
40187
- args.start_date = opts.startDate;
40188
- if (opts.endDate !== void 0)
40189
- args.end_date = opts.endDate;
40190
- if (opts.aggregatorFilterId !== void 0)
40191
- args.aggregator_filter_id = opts.aggregatorFilterId;
40192
- if (opts.groupBy !== void 0)
40193
- args.group_by = opts.groupBy;
40343
+ if (!opts.yes) {
40344
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
40345
+ if (!confirmed) {
40346
+ process.stdout.write("Aborted.\n");
40347
+ return;
40348
+ }
40349
+ }
40194
40350
  await ctx.execute({
40195
- method: "GET",
40196
- path: "/v1/aggregators/{id}/usage/timeseries",
40351
+ method: "DELETE",
40352
+ path: "/v1/ai/billing/costs/items/{id}",
40197
40353
  args,
40198
- queryParamKeys: [
40199
- "start_date",
40200
- "end_date",
40201
- "aggregator_filter_id",
40202
- "group_by"
40203
- ]
40354
+ queryParamKeys: []
40204
40355
  });
40205
40356
  });
40206
- resource.command("get-aggregator-usage-group-by-customer").description(`Per-customer total usage for an aggregator over a period, ranked by total. Paginated with take/skip.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
40357
+ resource.command("upsert-agent-cost-catalog-override").description(`Set this workspace's negotiated price for a registry AI model (input/output/cached/cache-write USD per 1M tokens, plus optional dimensions). Replaces any open override immediately; historical calls keep their original rate. A pair the registry does not know is refused \u2014 create a custom cost item instead.`).requiredOption("--provider <value>", `AI model provider, or the vendor of a custom cost item. This is not an integration connection.`).requiredOption("--model <value>", `Model identifier, or custom item identifier. Null on wildcard pricing rows.`).requiredOption("--input-per-m-tokens <value>", `Provider cost in USD per million input tokens, as an exact decimal string.`).requiredOption("--output-per-m-tokens <value>", `Provider cost in USD per million output tokens, as an exact decimal string.`).option("--cached-input-per-m-tokens <value>", `Provider cost in USD per million cached input tokens, as an exact decimal string.`).option("--cache-write-per-m-tokens <value>", `Provider cost in USD per million cache write tokens, as an exact decimal string.`).option("--dimensions <json>", `Additional billable dimensions; each key matches a usage_extra key and rates use the owning card's units or USD for cost-catalog dimensions.`).addHelpText("after", `
40207
40358
  Examples:
40208
- hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id>
40209
- hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
40359
+ hyperline ai-costs upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens>
40360
+ hyperline ai-costs upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens> --cached-input-per-m-tokens <cached_input_per_m_tokens> --cache-write-per-m-tokens <cache_write_per_m_tokens>
40361
+ hyperline ai-costs upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens> --output json`).action(async (opts) => {
40362
+ const ctx = resource.parent?.opts()._ctx;
40363
+ if (!ctx) {
40364
+ process.stderr.write("Error: Not authenticated\n");
40365
+ process.exit(1);
40366
+ }
40367
+ const args = {};
40368
+ if (opts.provider !== void 0)
40369
+ args.provider = opts.provider;
40370
+ if (opts.model !== void 0)
40371
+ args.model = opts.model;
40372
+ if (opts.inputPerMTokens !== void 0)
40373
+ args.input_per_m_tokens = opts.inputPerMTokens;
40374
+ if (opts.outputPerMTokens !== void 0)
40375
+ args.output_per_m_tokens = opts.outputPerMTokens;
40376
+ if (opts.cachedInputPerMTokens !== void 0)
40377
+ args.cached_input_per_m_tokens = opts.cachedInputPerMTokens;
40378
+ if (opts.cacheWritePerMTokens !== void 0)
40379
+ args.cache_write_per_m_tokens = opts.cacheWritePerMTokens;
40380
+ if (opts.dimensions !== void 0)
40381
+ args.dimensions = JSON.parse(opts.dimensions);
40382
+ await ctx.execute({
40383
+ method: "PUT",
40384
+ path: "/v1/ai/billing/costs/overrides",
40385
+ args,
40386
+ queryParamKeys: []
40387
+ });
40388
+ });
40389
+ resource.command("delete-agent-cost-catalog-override").description(`Close this workspace's negotiated price override by its override.id; pricing falls back to the global registry rate. A custom cost item id passed here is a 404.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
40390
+ Examples:
40391
+ hyperline ai-costs delete-agent-cost-catalog-override --id <id>
40392
+ hyperline ai-costs delete-agent-cost-catalog-override --id <id> --output json`).action(async (opts) => {
40210
40393
  const ctx = resource.parent?.opts()._ctx;
40211
40394
  if (!ctx) {
40212
40395
  process.stderr.write("Error: Not authenticated\n");
@@ -40215,33 +40398,24 @@ Examples:
40215
40398
  const args = {};
40216
40399
  if (opts.id !== void 0)
40217
40400
  args.id = opts.id;
40218
- if (opts.startDate !== void 0)
40219
- args.start_date = opts.startDate;
40220
- if (opts.endDate !== void 0)
40221
- args.end_date = opts.endDate;
40222
- if (opts.aggregatorFilterId !== void 0)
40223
- args.aggregator_filter_id = opts.aggregatorFilterId;
40224
- if (opts.take !== void 0)
40225
- args.take = Number(opts.take);
40226
- if (opts.skip !== void 0)
40227
- args.skip = Number(opts.skip);
40401
+ if (!opts.yes) {
40402
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
40403
+ if (!confirmed) {
40404
+ process.stdout.write("Aborted.\n");
40405
+ return;
40406
+ }
40407
+ }
40228
40408
  await ctx.execute({
40229
- method: "GET",
40230
- path: "/v1/aggregators/{id}/usage/group-by-customer",
40409
+ method: "DELETE",
40410
+ path: "/v1/ai/billing/costs/overrides/{id}",
40231
40411
  args,
40232
- queryParamKeys: [
40233
- "start_date",
40234
- "end_date",
40235
- "aggregator_filter_id",
40236
- "take",
40237
- "skip"
40238
- ]
40412
+ queryParamKeys: []
40239
40413
  });
40240
40414
  });
40241
- resource.command("get-aggregator-usage-events").description(`List raw billable events for an aggregator across every customer of the client. Paginated with take/skip.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
40415
+ resource.command("replace-agent-cost-catalog-item").description(`Replace a custom item's provider, item and dimensions, preserving historical prices and returning the new active custom_item_id.`).requiredOption("--id <value>", `id parameter`).requiredOption("--provider <value>", `AI model provider, or the vendor of a custom cost item. This is not an integration connection.`).requiredOption("--item <value>", `Custom item name matching the usage payload.`).requiredOption("--dimensions <json>", `Additional billable dimensions; each key matches a usage_extra key and rates use the owning card's units or USD for cost-catalog dimensions.`).addHelpText("after", `
40242
40416
  Examples:
40243
- hyperline aggregators-usage get-aggregator-usage-events --id <id>
40244
- hyperline aggregators-usage get-aggregator-usage-events --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
40417
+ hyperline ai-costs replace-agent-cost-catalog-item --id <id> --provider <provider> --item <item> --dimensions <dimensions>
40418
+ hyperline ai-costs replace-agent-cost-catalog-item --id <id> --provider <provider> --item <item> --dimensions <dimensions> --output json`).action(async (opts) => {
40245
40419
  const ctx = resource.parent?.opts()._ctx;
40246
40420
  if (!ctx) {
40247
40421
  process.stderr.write("Error: Not authenticated\n");
@@ -40250,27 +40424,17 @@ Examples:
40250
40424
  const args = {};
40251
40425
  if (opts.id !== void 0)
40252
40426
  args.id = opts.id;
40253
- if (opts.startDate !== void 0)
40254
- args.start_date = opts.startDate;
40255
- if (opts.endDate !== void 0)
40256
- args.end_date = opts.endDate;
40257
- if (opts.aggregatorFilterId !== void 0)
40258
- args.aggregator_filter_id = opts.aggregatorFilterId;
40259
- if (opts.take !== void 0)
40260
- args.take = Number(opts.take);
40261
- if (opts.skip !== void 0)
40262
- args.skip = Number(opts.skip);
40427
+ if (opts.provider !== void 0)
40428
+ args.provider = opts.provider;
40429
+ if (opts.item !== void 0)
40430
+ args.item = opts.item;
40431
+ if (opts.dimensions !== void 0)
40432
+ args.dimensions = JSON.parse(opts.dimensions);
40263
40433
  await ctx.execute({
40264
- method: "GET",
40265
- path: "/v1/aggregators/{id}/usage/events",
40434
+ method: "PUT",
40435
+ path: "/v1/ai/billing/costs/items/{id}",
40266
40436
  args,
40267
- queryParamKeys: [
40268
- "start_date",
40269
- "end_date",
40270
- "aggregator_filter_id",
40271
- "take",
40272
- "skip"
40273
- ]
40437
+ queryParamKeys: []
40274
40438
  });
40275
40439
  });
40276
40440
  }
@@ -41945,7 +42109,7 @@ Examples:
41945
42109
  queryParamKeys: []
41946
42110
  });
41947
42111
  });
41948
- resource.command("purchase-customer-credits").description(`Purchase credits for a customer. This generates an invoice and charges the customer. Returns the invoice ID and new balance.`).requiredOption("--id <value>", `id parameter`).requiredOption("--product-id <value>", `productId parameter`).requiredOption("--credit-count <number>", `Value indicating a number of credits to add. If \`price_id\` is defined, this value must correspond to a full credit pack for the price.`).option("--amount-excluding-tax <number>", `Custom amount for the added credits. Either \`amount_excluding_tax\` or \`price_id\` must be defined. Expressed in currency's smallest unit.`).option("--price-id <value>", `Price ID used to add credits. The price must be of type \`bundle\`. Either \`amount_excluding_tax\` or \`price_id\` must be defined.`).option("--expires-at <value>", `Expiration date for credits linked to this transaction. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).addHelpText("after", `
42112
+ resource.command("purchase-customer-credits").description(`Purchase credits for a customer. This generates an invoice and charges the customer's card immediately, granting the credits only once paid. Requires a card payment method (otherwise fails with reason \`payment_method_not_supported\`). Returns the invoice ID and new balance.`).requiredOption("--id <value>", `id parameter`).requiredOption("--product-id <value>", `productId parameter`).requiredOption("--credit-count <number>", `Value indicating a number of credits to add. If \`price_id\` is defined, this value must correspond to a full credit pack for the price.`).option("--amount-excluding-tax <number>", `Custom amount for the added credits. Either \`amount_excluding_tax\` or \`price_id\` must be defined. Expressed in currency's smallest unit.`).option("--price-id <value>", `Price ID used to add credits. The price must be of type \`bundle\`. Either \`amount_excluding_tax\` or \`price_id\` must be defined.`).option("--expires-at <value>", `Expiration date for credits linked to this transaction. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).addHelpText("after", `
41949
42113
  Examples:
41950
42114
  hyperline customers-credits purchase-customer-credits --id <id> --product-id <productId> --credit-count <credit_count>
41951
42115
  hyperline customers-credits purchase-customer-credits --id <id> --product-id <productId> --credit-count <credit_count> --amount-excluding-tax <amount_excluding_tax> --price-id <price_id>
@@ -42027,6 +42191,54 @@ Examples:
42027
42191
  queryParamKeys: []
42028
42192
  });
42029
42193
  });
42194
+ resource.command("get-customer-credit-portal-settings").description(`Get whether a customer can top up a credit product from the customer portal, at which price, and which prices can be selected.`).requiredOption("--id <value>", `id parameter`).requiredOption("--product-id <value>", `productId parameter`).addHelpText("after", `
42195
+ Examples:
42196
+ hyperline customers-credits get-customer-credit-portal-settings --id <id> --product-id <productId>`).action(async (opts) => {
42197
+ const ctx = resource.parent?.opts()._ctx;
42198
+ if (!ctx) {
42199
+ process.stderr.write("Error: Not authenticated\n");
42200
+ process.exit(1);
42201
+ }
42202
+ const args = {};
42203
+ if (opts.id !== void 0)
42204
+ args.id = opts.id;
42205
+ if (opts.productId !== void 0)
42206
+ args.productId = opts.productId;
42207
+ await ctx.execute({
42208
+ method: "GET",
42209
+ path: "/v1/customers/{id}/credits/{productId}/portal-settings",
42210
+ args,
42211
+ queryParamKeys: []
42212
+ });
42213
+ });
42214
+ resource.command("update-customer-credit-portal-settings").description(`Enable or disable customer portal credit top-ups for a customer and credit product, with the price configuration (or a custom price) the customer pays. Enabling requires the customer's credit balance for the product: create it first (createCustomerCredit, a 0 balance is fine).`).requiredOption("--id <value>", `id parameter`).requiredOption("--product-id <value>", `productId parameter`).requiredOption("--enabled", `Whether the customer can buy this credit product from the customer portal. Enabling requires a price: \`price_configuration_id\`, \`custom_price_configuration\`, or the price already set. Disabling clears the price and removes the customer's own price.`).option("--price-configuration-id <value>", `ID of one of the credit product's price configurations, in the customer's price book and currency, of type \`bundle\`, \`volume\` or \`bulk\`. Mutually exclusive with \`custom_price_configuration\`.`).option("--custom-price-configuration <json>", `A price of the customer's own, in the customer's currency, replacing any previous one. Same shape as a credit product price configuration. Mutually exclusive with \`price_configuration_id\`. It needs at least one price; \`unit_count\` is a whole number of at least 1; \`amount\` is never negative, a \`bundle\` pack is never free, and the price is not free altogether; volume tiers start at 0 and each starts where the previous one ends; bulk tiers are in increasing \`to\` order; only the last tier has \`to: null\`. Otherwise the request fails with reason \`invalid_custom_price\`.`).addHelpText("after", `
42215
+ Examples:
42216
+ hyperline customers-credits update-customer-credit-portal-settings --id <id> --product-id <productId> --enabled
42217
+ hyperline customers-credits update-customer-credit-portal-settings --id <id> --product-id <productId> --enabled --price-configuration-id <price_configuration_id> --custom-price-configuration <custom_price_configuration>
42218
+ hyperline customers-credits update-customer-credit-portal-settings --id <id> --product-id <productId> --enabled --output json`).action(async (opts) => {
42219
+ const ctx = resource.parent?.opts()._ctx;
42220
+ if (!ctx) {
42221
+ process.stderr.write("Error: Not authenticated\n");
42222
+ process.exit(1);
42223
+ }
42224
+ const args = {};
42225
+ if (opts.id !== void 0)
42226
+ args.id = opts.id;
42227
+ if (opts.productId !== void 0)
42228
+ args.productId = opts.productId;
42229
+ if (opts.priceConfigurationId !== void 0)
42230
+ args.price_configuration_id = opts.priceConfigurationId;
42231
+ if (opts.enabled !== void 0)
42232
+ args.enabled = true;
42233
+ if (opts.customPriceConfiguration !== void 0)
42234
+ args.custom_price_configuration = JSON.parse(opts.customPriceConfiguration);
42235
+ await ctx.execute({
42236
+ method: "PUT",
42237
+ path: "/v1/customers/{id}/credits/{productId}/portal-settings",
42238
+ args,
42239
+ queryParamKeys: []
42240
+ });
42241
+ });
42030
42242
  }
42031
42243
 
42032
42244
  // build/commands/generated/customers-payment-methods.js
@@ -43465,7 +43677,7 @@ Examples:
43465
43677
  queryParamKeys: []
43466
43678
  });
43467
43679
  });
43468
- resource.command("create-invoicing-entity").description(`Create a new invoicing entity with company details, address, and tax configuration. Used as the sender on invoices.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).requiredOption("--name <value>", `The name of the invoicing entity.`).option("--trade-name <value>", `The trade name of the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).requiredOption("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).requiredOption("--currency <value>", `The currency code that the invoicing entity operates in.`).requiredOption("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--next-invoice-number <number>", `The next invoice number to be used.`).option("--next-credit-note-number <number>", `The next credit note number to be used.`).option("--next-document-number <number>", `The next document number to be used.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--quote-footer <value>", `The footer text to be used in quotes.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity.`).addHelpText("after", `
43680
+ resource.command("create-invoicing-entity").description(`Create a new invoicing entity with company details, address, and tax configuration. Used as the sender on invoices.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).requiredOption("--name <value>", `The name of the invoicing entity.`).option("--trade-name <value>", `The trade name of the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).requiredOption("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).requiredOption("--currency <value>", `The currency code that the invoicing entity operates in.`).requiredOption("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--next-invoice-number <number>", `The next invoice number to be used.`).option("--next-credit-note-number <number>", `The next credit note number to be used.`).option("--next-document-number <number>", `The next document number to be used.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--quote-footer <value>", `The footer text to be used in quotes.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity. Defaults to \`true\`.`).option("--fx-conversion-display-enabled", `Whether the exchange rate and converted amount in the accounting currency are displayed on the invoice PDF when the invoice currency differs from the accounting currency. The conversion data is still stored and returned by the API when disabled. Defaults to \`true\`.`).addHelpText("after", `
43469
43681
  Examples:
43470
43682
  hyperline invoicing-entities create-invoicing-entity --name <name> --country <country> --currency <currency> --accounting-currency <accounting_currency>
43471
43683
  hyperline invoicing-entities create-invoicing-entity --name <name> --country <country> --currency <currency> --accounting-currency <accounting_currency> --is-default --trade-name <trade_name>
@@ -43548,6 +43760,8 @@ Examples:
43548
43760
  args.credit_note_wallet_refund_enabled = true;
43549
43761
  if (opts.standaloneCreditNoteCreationEnabled !== void 0)
43550
43762
  args.standalone_credit_note_creation_enabled = true;
43763
+ if (opts.fxConversionDisplayEnabled !== void 0)
43764
+ args.fx_conversion_display_enabled = true;
43551
43765
  await ctx.execute({
43552
43766
  method: "POST",
43553
43767
  path: "/v1/invoicing-entities",
@@ -43555,7 +43769,7 @@ Examples:
43555
43769
  queryParamKeys: []
43556
43770
  });
43557
43771
  });
43558
- resource.command("update-invoicing-entity").description(`Update an existing invoicing entity's details (address, tax ID, branding, etc.).`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `The name of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).option("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).option("--currency <value>", `The currency code that the invoicing entity operates in.`).option("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity.`).addHelpText("after", `
43772
+ resource.command("update-invoicing-entity").description(`Update an existing invoicing entity's details (address, tax ID, branding, etc.).`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `The name of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).option("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).option("--currency <value>", `The currency code that the invoicing entity operates in.`).option("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity. Defaults to \`true\`.`).option("--fx-conversion-display-enabled", `Whether the exchange rate and converted amount in the accounting currency are displayed on the invoice PDF when the invoice currency differs from the accounting currency. The conversion data is still stored and returned by the API when disabled. Defaults to \`true\`.`).addHelpText("after", `
43559
43773
  Examples:
43560
43774
  hyperline invoicing-entities update-invoicing-entity --id <id>
43561
43775
  hyperline invoicing-entities update-invoicing-entity --id <id> --name <name> --registration-number <registration_number>
@@ -43630,6 +43844,8 @@ Examples:
43630
43844
  args.credit_note_wallet_refund_enabled = true;
43631
43845
  if (opts.standaloneCreditNoteCreationEnabled !== void 0)
43632
43846
  args.standalone_credit_note_creation_enabled = true;
43847
+ if (opts.fxConversionDisplayEnabled !== void 0)
43848
+ args.fx_conversion_display_enabled = true;
43633
43849
  await ctx.execute({
43634
43850
  method: "PUT",
43635
43851
  path: "/v1/invoicing-entities/{id}",
@@ -43665,6 +43881,68 @@ Examples:
43665
43881
  });
43666
43882
  }
43667
43883
 
43884
+ // build/commands/generated/monitoring.js
43885
+ function registerMonitoringCommands(parent) {
43886
+ const resource = parent.command("monitoring").description("Manage monitoring");
43887
+ resource.command("list-monitoring-analyses").description(`List customer health analyses from the monitoring agent, newest first: health score (0-100), tier, summary, per-dimension scores, risk factors and positive signals. Filter by customer (Hyperline or external ID) with limit=1 to get a customer's current health score. Only completed analyses unless status is set.`).option("--limit <number>", `Maximum number of items to return (1-100).`).option("--cursor <value>", `Opaque cursor returned in the previous response's \`next_cursor\`. Omit to fetch the first page.`).option("--include-total <value>", `Set to \`true\` to include \`total\` in the response.`).option("--customer-id <value>", `Return only analyses of this customer. Accepts the Hyperline ID or your own external ID.`).option("--status <value>", `Return only analyses with this status. Defaults to \`completed\`, the analyses that carry a score.`).option("--created-at.gte <value>", `Return only analyses created at or after this date.`).option("--created-at.lte <value>", `Return only analyses created at or before this date.`).addHelpText("after", `
43888
+ Examples:
43889
+ hyperline monitoring list-monitoring-analyses
43890
+ hyperline monitoring list-monitoring-analyses --limit <limit> --cursor <cursor>`).action(async (opts) => {
43891
+ const ctx = resource.parent?.opts()._ctx;
43892
+ if (!ctx) {
43893
+ process.stderr.write("Error: Not authenticated\n");
43894
+ process.exit(1);
43895
+ }
43896
+ const args = {};
43897
+ if (opts.cursor !== void 0)
43898
+ args.cursor = opts.cursor;
43899
+ if (opts.includeTotal !== void 0)
43900
+ args.include_total = opts.includeTotal;
43901
+ if (opts.customerId !== void 0)
43902
+ args.customer_id = opts.customerId;
43903
+ if (opts.status !== void 0)
43904
+ args.status = opts.status;
43905
+ if (opts["createdAt.gte"] !== void 0)
43906
+ args.created_at__gte = opts["createdAt.gte"];
43907
+ if (opts["createdAt.lte"] !== void 0)
43908
+ args.created_at__lte = opts["createdAt.lte"];
43909
+ if (opts.limit !== void 0)
43910
+ args.limit = Number(opts.limit);
43911
+ await ctx.execute({
43912
+ method: "GET",
43913
+ path: "/v1/agents/monitoring/analyses",
43914
+ args,
43915
+ queryParamKeys: [
43916
+ "limit",
43917
+ "cursor",
43918
+ "include_total",
43919
+ "customer_id",
43920
+ "status",
43921
+ "created_at__gte",
43922
+ "created_at__lte"
43923
+ ]
43924
+ });
43925
+ });
43926
+ resource.command("get-monitoring-analysis").description(`Get one customer health analysis by ID: health score (0-100), tier, summary, per-dimension scores, risk factors and positive signals.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
43927
+ Examples:
43928
+ hyperline monitoring get-monitoring-analysis --id <id>`).action(async (opts) => {
43929
+ const ctx = resource.parent?.opts()._ctx;
43930
+ if (!ctx) {
43931
+ process.stderr.write("Error: Not authenticated\n");
43932
+ process.exit(1);
43933
+ }
43934
+ const args = {};
43935
+ if (opts.id !== void 0)
43936
+ args.id = opts.id;
43937
+ await ctx.execute({
43938
+ method: "GET",
43939
+ path: "/v1/agents/monitoring/analyses/{id}",
43940
+ args,
43941
+ queryParamKeys: []
43942
+ });
43943
+ });
43944
+ }
43945
+
43668
43946
  // build/commands/generated/organisations.js
43669
43947
  function registerOrganisationsCommands(parent) {
43670
43948
  const resource = parent.command("organisations").description("Manage organisations");
@@ -43950,6 +44228,44 @@ Examples:
43950
44228
  queryParamKeys: []
43951
44229
  });
43952
44230
  });
44231
+ resource.command("create").description(`Create a new price configuration on an existing product. Specify the product_id, pricing type (fee, volume, bulk, packaged, bps, bundle), currency, billing interval, and price tiers. Supports metering_filter for dynamic products.`).requiredOption("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--countries <json>", `Countries this price configuration is eligible in. Omit or send \`null\` to make it eligible in every country. An empty array restricts it to customers that have no country set.`).option("--price-book-id <value>", `ID of the price book to which this price configuration belongs to. If null, the price configuration belongs to the default price book.`).requiredOption("--billing-interval <json>", `Billing interval on which the price configuration is eligible.`).option("--commitment-interval <json>", `Commitment interval on which the price configuration is eligible.`).requiredOption("--type <value>", `type`).requiredOption("--prices <json>", `Price tiers of the price configuration. If fixed amount, only one price is available.`).requiredOption("--product-id <value>", `ID of the product to add the price configuration to.`).option("--metering-filter <json>", `Filter to scope which billable events are eligible for this price configuration.`).option("--allow-on-portal", `allow_on_portal`).addHelpText("after", `
44232
+ Examples:
44233
+ hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id>
44234
+ hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id> --countries <countries> --price-book-id <price_book_id>
44235
+ hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id> --output json`).action(async (opts) => {
44236
+ const ctx = resource.parent?.opts()._ctx;
44237
+ if (!ctx) {
44238
+ process.stderr.write("Error: Not authenticated\n");
44239
+ process.exit(1);
44240
+ }
44241
+ const args = {};
44242
+ if (opts.currency !== void 0)
44243
+ args.currency = opts.currency;
44244
+ if (opts.priceBookId !== void 0)
44245
+ args.price_book_id = opts.priceBookId;
44246
+ if (opts.type !== void 0)
44247
+ args.type = opts.type;
44248
+ if (opts.productId !== void 0)
44249
+ args.product_id = opts.productId;
44250
+ if (opts.allowOnPortal !== void 0)
44251
+ args.allow_on_portal = true;
44252
+ if (opts.countries !== void 0)
44253
+ args.countries = JSON.parse(opts.countries);
44254
+ if (opts.billingInterval !== void 0)
44255
+ args.billing_interval = JSON.parse(opts.billingInterval);
44256
+ if (opts.commitmentInterval !== void 0)
44257
+ args.commitment_interval = JSON.parse(opts.commitmentInterval);
44258
+ if (opts.prices !== void 0)
44259
+ args.prices = JSON.parse(opts.prices);
44260
+ if (opts.meteringFilter !== void 0)
44261
+ args.metering_filter = JSON.parse(opts.meteringFilter);
44262
+ await ctx.execute({
44263
+ method: "POST",
44264
+ path: "/v1/price-configurations",
44265
+ args,
44266
+ queryParamKeys: []
44267
+ });
44268
+ });
43953
44269
  resource.command("update-prices").description(`Update the prices of an existing price configuration by ID. Allows changing tier thresholds, unit prices, and flat fees.`).requiredOption("--id <value>", `id parameter`).option("--stdin", `Read JSON array input from stdin`).addHelpText("after", `
43954
44270
  Examples:
43955
44271
  hyperline price-configurations update-prices --id <id>
@@ -44148,7 +44464,7 @@ How the periodic credit allowance is granted for partial billing periods.
44148
44464
 
44149
44465
  - \`prorated\` (default): the granted credits are prorated to the elapsed period.
44150
44466
  - \`full_allowance\`: the full allowance is always granted (the invoice remains prorated).
44151
- `).option("--credits-balance-auto-creation-enabled <value>", `Default for the \`credits_balance_auto_creation_enabled\` setting of subscription products using this credit product: whether the customer credit balance is created as soon as the product is added to a subscription. \`true\` when unset. A subscription product can override it.`).option("--portal-top-up-auto-activation-enabled <value>", `Whether portal top-ups are enabled for the customer when a credit balance of this product is created for them, from a subscription or manually. Portal top-ups must also be enabled in the hosted pages settings to show on the portal. \`false\` when unset.`).option("--display-mode <value>", `How bundle items are displayed on invoices.`).option("--exclusive-items-enabled", `When true, only one item in the bundle can be active at a time.`).option("--bundle-items <json>", `Products included in this bundle. Percentages must sum to 100.`).addHelpText("after", `
44467
+ `).option("--credits-balance-auto-creation-enabled <value>", `Default for the \`credits_balance_auto_creation_enabled\` setting of subscription products using this credit product: whether the customer credit balance is created as soon as the product is added to a subscription. \`true\` when unset. A subscription product can override it.`).option("--display-mode <value>", `How bundle items are displayed on invoices.`).option("--exclusive-items-enabled", `When true, only one item in the bundle can be active at a time.`).option("--bundle-items <json>", `Products included in this bundle. Percentages must sum to 100.`).addHelpText("after", `
44152
44468
  Examples:
44153
44469
  hyperline products create --name <name> --type <type> --price-configurations <price_configurations>
44154
44470
  hyperline products create --name <name> --type <type> --price-configurations <price_configurations> --description <description> --description-display-interval-dates
@@ -44175,8 +44491,6 @@ Examples:
44175
44491
  args.credits_grant_mode = opts.creditsGrantMode;
44176
44492
  if (opts.creditsBalanceAutoCreationEnabled !== void 0)
44177
44493
  args.credits_balance_auto_creation_enabled = opts.creditsBalanceAutoCreationEnabled;
44178
- if (opts.portalTopUpAutoActivationEnabled !== void 0)
44179
- args.portal_top_up_auto_activation_enabled = opts.portalTopUpAutoActivationEnabled;
44180
44494
  if (opts.displayMode !== void 0)
44181
44495
  args.display_mode = opts.displayMode;
44182
44496
  if (opts.lowCreditsThreshold !== void 0)
@@ -44346,7 +44660,7 @@ Quote status.
44346
44660
  - \`draft\`: The quote is a draft.
44347
44661
  - \`approved\`: The quote is approved and ready to be sent to the customer.
44348
44662
  - \`pending_signature\`: The quote is awaiting the customer's signature.
44349
- `).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner. If not specified, the Hyperline account owner will be assigned.`).requiredOption("--customer-id <value>", `ID of the customer.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity attached to the quote.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. For subscription quotes, defaults to the computed subscription value if not specified. For one-off quotes, this field is ignored \u2014 the amount is always derived from the linked invoice's \`amount_excluding_tax\`.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
44663
+ `).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner. The owner requests approval when the quote is finalized using an API key or finalized during creation. If not specified, the Hyperline account owner will be assigned.`).requiredOption("--customer-id <value>", `ID of the customer.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity attached to the quote.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. For subscription quotes, defaults to the computed subscription value if not specified. For one-off quotes, this field is ignored \u2014 the amount is always derived from the linked invoice's \`amount_excluding_tax\`.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
44350
44664
 
44351
44665
  - \`all\`: Display all pricing tiers.
44352
44666
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
@@ -44638,7 +44952,7 @@ Examples:
44638
44952
  queryParamKeys: []
44639
44953
  });
44640
44954
  });
44641
- resource.command("update").description(`Update quote-level fields before a quote is finalized. On draft quotes, pass \`subscription\` inline \u2014 the full configuration, not a reference to an existing subscription \u2014 to create or replace the draft subscription configuration, or pass \`invoice\` on a one-off quote to replace the linked draft invoice. For quotes created from \`template_id\`, use this tool for subscription overrides such as dates, contract terms, products, phases, coupons, discounts, prices, seats, and subscription custom properties. Omit \`terms\`, \`comments\`, and \`contract_clause_ids\` unless deliberately overriding template content. Discover product and price configuration IDs with \`get_catalog_context\`.`).requiredOption("--id <value>", `id parameter`).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. Set to \`null\` to clear the manually set value.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
44955
+ resource.command("update").description(`Update quote-level fields before a quote is finalized. On draft quotes, pass \`subscription\` inline \u2014 the full configuration, not a reference to an existing subscription \u2014 to create or replace the draft subscription configuration, or pass \`invoice\` on a one-off quote to replace the linked draft invoice. For quotes created from \`template_id\`, use this tool for subscription overrides such as dates, contract terms, products, phases, coupons, discounts, prices, seats, and subscription custom properties. Omit \`terms\`, \`comments\`, and \`contract_clause_ids\` unless deliberately overriding template content. Discover product and price configuration IDs with \`get_catalog_context\`.`).requiredOption("--id <value>", `id parameter`).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner. The owner requests approval when the quote is finalized using an API key or finalized during creation.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. Set to \`null\` to clear the manually set value.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
44642
44956
 
44643
44957
  - \`all\`: Display all pricing tiers.
44644
44958
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
@@ -44747,10 +45061,11 @@ Examples:
44747
45061
  queryParamKeys: ["locale"]
44748
45062
  });
44749
45063
  });
44750
- resource.command("approve").description(`Approve a quote as the account owner. This is a prerequisite before sending the quote for customer signature.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45064
+ resource.command("finalize").description(`Finalize a draft quote. The quote is submitted for approval when approval is required, otherwise it becomes approved and ready to be sent for signature.`).requiredOption("--id <value>", `id parameter`).option("--requester-comment <value>", `Internal comment supplied by the requester for approvers; not displayed on the customer-facing quote.`).addHelpText("after", `
44751
45065
  Examples:
44752
- hyperline quotes approve --id <id>
44753
- hyperline quotes approve --id <id> --output json`).action(async (opts) => {
45066
+ hyperline quotes finalize --id <id>
45067
+ hyperline quotes finalize --id <id> --requester-comment <requester_comment>
45068
+ hyperline quotes finalize --id <id> --output json`).action(async (opts) => {
44754
45069
  const ctx = resource.parent?.opts()._ctx;
44755
45070
  if (!ctx) {
44756
45071
  process.stderr.write("Error: Not authenticated\n");
@@ -44759,17 +45074,20 @@ Examples:
44759
45074
  const args = {};
44760
45075
  if (opts.id !== void 0)
44761
45076
  args.id = opts.id;
45077
+ if (opts.requesterComment !== void 0)
45078
+ args.requester_comment = opts.requesterComment;
44762
45079
  await ctx.execute({
44763
45080
  method: "POST",
44764
- path: "/v1/quotes/{id}/approve",
45081
+ path: "/v1/quotes/{id}/finalize",
44765
45082
  args,
44766
45083
  queryParamKeys: []
44767
45084
  });
44768
45085
  });
44769
- resource.command("finalize").description(`Finalize a draft quote. The quote is submitted for approval when approval is required, otherwise it becomes approved and ready to be sent for signature.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45086
+ resource.command("send").description(`Send a quote by email for customer signature. Requires the quote to be approved first.`).requiredOption("--id <value>", `id parameter`).option("--email <value>", `Email address to which the quote will be sent for signature. Required unless the quote has signers, in which case the email goes to the signers of the current step and this field is ignored.`).option("--message <value>", `Custom message used in the email content.`).addHelpText("after", `
44770
45087
  Examples:
44771
- hyperline quotes finalize --id <id>
44772
- hyperline quotes finalize --id <id> --output json`).action(async (opts) => {
45088
+ hyperline quotes send --id <id>
45089
+ hyperline quotes send --id <id> --email <email> --message <message>
45090
+ hyperline quotes send --id <id> --output json`).action(async (opts) => {
44773
45091
  const ctx = resource.parent?.opts()._ctx;
44774
45092
  if (!ctx) {
44775
45093
  process.stderr.write("Error: Not authenticated\n");
@@ -44778,18 +45096,20 @@ Examples:
44778
45096
  const args = {};
44779
45097
  if (opts.id !== void 0)
44780
45098
  args.id = opts.id;
45099
+ if (opts.email !== void 0)
45100
+ args.email = opts.email;
45101
+ if (opts.message !== void 0)
45102
+ args.message = opts.message;
44781
45103
  await ctx.execute({
44782
45104
  method: "POST",
44783
- path: "/v1/quotes/{id}/finalize",
45105
+ path: "/v1/quotes/{id}/send",
44784
45106
  args,
44785
45107
  queryParamKeys: []
44786
45108
  });
44787
45109
  });
44788
- resource.command("send").description(`Send a quote by email for customer signature. Requires the quote to be approved first.`).requiredOption("--id <value>", `id parameter`).requiredOption("--email <value>", `Email address to which the quote will be sent for signature.`).option("--message <value>", `Custom message used in the email content.`).addHelpText("after", `
45110
+ resource.command("list-quote-signers").description(`List the signers of a quote in signing order, with each signer's status (pending, notified, viewed, signed, declined). An empty list means the quote uses the single-signer flow of \`send_quote\`.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
44789
45111
  Examples:
44790
- hyperline quotes send --id <id> --email <email>
44791
- hyperline quotes send --id <id> --email <email> --message <message>
44792
- hyperline quotes send --id <id> --email <email> --output json`).action(async (opts) => {
45112
+ hyperline quotes list-quote-signers --id <id>`).action(async (opts) => {
44793
45113
  const ctx = resource.parent?.opts()._ctx;
44794
45114
  if (!ctx) {
44795
45115
  process.stderr.write("Error: Not authenticated\n");
@@ -44798,13 +45118,36 @@ Examples:
44798
45118
  const args = {};
44799
45119
  if (opts.id !== void 0)
44800
45120
  args.id = opts.id;
44801
- if (opts.email !== void 0)
44802
- args.email = opts.email;
44803
- if (opts.message !== void 0)
44804
- args.message = opts.message;
44805
45121
  await ctx.execute({
44806
- method: "POST",
44807
- path: "/v1/quotes/{id}/send",
45122
+ method: "GET",
45123
+ path: "/v1/quotes/{id}/signers",
45124
+ args,
45125
+ queryParamKeys: []
45126
+ });
45127
+ });
45128
+ resource.command("set-quote-signers").description(`Replace the full list of signers of a quote. Signers with the same \`step_order\` sign in parallel; steps sign in ascending order. Requires at least one \`external\` signer, and a \`countersigner\` must sign after an external step. Set signers before calling \`send_quote\`, which then emails the signers of the first step and no longer needs \`email\`. Pass an empty list to go back to the single-signer flow.`).requiredOption("--id <value>", `id parameter`).requiredOption("--signers <json>", `
45129
+ Signature workflow of the quote, replaced as a whole.
45130
+
45131
+ Signers sign step by step, in ascending \`step_order\`. Signers sharing a step sign in parallel, and the next step opens once all of them have signed. The workflow needs at least one \`external\` signer, and a \`countersigner\` must sign after the first external step.
45132
+
45133
+ Signers who already signed cannot be removed or moved. Once the quote is out for signature at an electronic signature provider, the workflow can no longer be changed.
45134
+ `).addHelpText("after", `
45135
+ Examples:
45136
+ hyperline quotes set-quote-signers --id <id> --signers <signers>
45137
+ hyperline quotes set-quote-signers --id <id> --signers <signers> --output json`).action(async (opts) => {
45138
+ const ctx = resource.parent?.opts()._ctx;
45139
+ if (!ctx) {
45140
+ process.stderr.write("Error: Not authenticated\n");
45141
+ process.exit(1);
45142
+ }
45143
+ const args = {};
45144
+ if (opts.id !== void 0)
45145
+ args.id = opts.id;
45146
+ if (opts.signers !== void 0)
45147
+ args.signers = JSON.parse(opts.signers);
45148
+ await ctx.execute({
45149
+ method: "PUT",
45150
+ path: "/v1/quotes/{id}/signers",
44808
45151
  args,
44809
45152
  queryParamKeys: []
44810
45153
  });
@@ -44892,6 +45235,48 @@ Examples:
44892
45235
  });
44893
45236
  }
44894
45237
 
45238
+ // build/commands/generated/quotes-approvals.js
45239
+ function registerQuotes_ApprovalsCommands(parent) {
45240
+ const resource = parent.command("quotes-approvals").description("Manage quotes > approvals");
45241
+ resource.command("approve-quote").description(`Approve a quote as the account owner. This is a prerequisite before sending the quote for customer signature.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45242
+ Examples:
45243
+ hyperline quotes-approvals approve-quote --id <id>
45244
+ hyperline quotes-approvals approve-quote --id <id> --output json`).action(async (opts) => {
45245
+ const ctx = resource.parent?.opts()._ctx;
45246
+ if (!ctx) {
45247
+ process.stderr.write("Error: Not authenticated\n");
45248
+ process.exit(1);
45249
+ }
45250
+ const args = {};
45251
+ if (opts.id !== void 0)
45252
+ args.id = opts.id;
45253
+ await ctx.execute({
45254
+ method: "POST",
45255
+ path: "/v1/quotes/{id}/approve",
45256
+ args,
45257
+ queryParamKeys: []
45258
+ });
45259
+ });
45260
+ resource.command("get-quote-approvals").description(`Read quote approvals without submitting the quote. Returns a newest-first array, currently containing one element. Draft and changes-requested quotes return current approval routing in preview mode; other statuses return the recorded request, ordered steps and decisions in execution mode. A null request means no workflow execution was recorded, including automatic and legacy approval.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45261
+ Examples:
45262
+ hyperline quotes-approvals get-quote-approvals --id <id>`).action(async (opts) => {
45263
+ const ctx = resource.parent?.opts()._ctx;
45264
+ if (!ctx) {
45265
+ process.stderr.write("Error: Not authenticated\n");
45266
+ process.exit(1);
45267
+ }
45268
+ const args = {};
45269
+ if (opts.id !== void 0)
45270
+ args.id = opts.id;
45271
+ await ctx.execute({
45272
+ method: "GET",
45273
+ path: "/v1/quotes/{id}/approvals",
45274
+ args,
45275
+ queryParamKeys: []
45276
+ });
45277
+ });
45278
+ }
45279
+
44895
45280
  // build/commands/generated/quotes-templates.js
44896
45281
  function registerQuotes_TemplatesCommands(parent) {
44897
45282
  const resource = parent.command("quotes-templates").description("Manage quotes > templates");
@@ -45091,7 +45476,7 @@ Examples:
45091
45476
  queryParamKeys: []
45092
45477
  });
45093
45478
  });
45094
- resource.command("cancel").description(`Cancel a subscription. Supports immediate or end-of-period cancellation. Optionally specify a cancellation reason.`).requiredOption("--id <value>", `id parameter`).option("--cancel-at <value>", `Subscription cancel date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--reason <value>", `Reason for the cancellation.`).option("--pro-rata", `Indicates if the cancel should refund the customer using a pro rata strategy.`).option("--refund-method <value>", `Override the refund destination for the resulting credit note. When omitted, falls back to the invoicing entity's \`creditNoteWalletRefundEnabled\` setting.`).addHelpText("after", `
45479
+ resource.command("cancel").description(`Cancel a subscription. Supports immediate or end-of-period cancellation. Optionally specify a cancellation reason. On a cancelled subscription with a scheduled reinstatement, call it with an empty body to remove that reinstatement; the subscription stays cancelled.`).requiredOption("--id <value>", `id parameter`).option("--cancel-at <value>", `Subscription cancel date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--reason <value>", `Reason for the cancellation.`).option("--pro-rata", `Indicates if the cancel should refund the customer using a pro rata strategy.`).option("--refund-method <value>", `Override the refund destination for the resulting credit note. When omitted, falls back to the invoicing entity's \`creditNoteWalletRefundEnabled\` setting.`).addHelpText("after", `
45095
45480
  Examples:
45096
45481
  hyperline subscriptions cancel --id <id>
45097
45482
  hyperline subscriptions cancel --id <id> --cancel-at <cancel_at> --reason <reason>
@@ -45119,9 +45504,10 @@ Examples:
45119
45504
  queryParamKeys: []
45120
45505
  });
45121
45506
  });
45122
- resource.command("reinstate").description(`Reinstate a subscription that is scheduled for cancellation, reverting it to active status.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45507
+ resource.command("reinstate").description(`Reinstate a subscription, reverting it to active status. Works for a subscription scheduled for cancellation and for a fully-cancelled one. For a fully-cancelled subscription, optionally pass reactivate_at (may be in the past, after the cancellation date; a future date schedules it) and invoicing_mode (or charge_line_items for a custom charge) to control how the cancelled gap is invoiced.`).requiredOption("--id <value>", `id parameter`).option("--reactivate-at <value>", `Date a fully-cancelled subscription resumes from. May be in the past (after the cancellation date). Defaults to now. A future date schedules the reinstatement; calling again with another date reschedules it, and cancelling the subscription removes it. Ignored for scheduled-cancellation reinstatement.`).option("--invoicing-mode <value>", `How the paused/cancelled gap is invoiced when the subscription resumes. \`charge_full_period\`: bill the frozen periods as if never paused. \`prorate_remaining_period\`: skip the gap and bill the prorated remainder from the resume date. \`resume_at_next_cycle\` (default): skip the gap with no catch-up invoice.`).option("--charge-line-items <json>", `Custom charge: bill exactly these lines on an immediate resume instead of applying \`invoicing_mode\`. The lines cover the stopped period (pause or cancellation date to resume date). Requires the \`invoices_create\` permission. Fully-cancelled subscriptions only. Not allowed with a future \`reactivate_at\`.`).addHelpText("after", `
45123
45508
  Examples:
45124
45509
  hyperline subscriptions reinstate --id <id>
45510
+ hyperline subscriptions reinstate --id <id> --reactivate-at <reactivate_at> --invoicing-mode <invoicing_mode>
45125
45511
  hyperline subscriptions reinstate --id <id> --output json`).action(async (opts) => {
45126
45512
  const ctx = resource.parent?.opts()._ctx;
45127
45513
  if (!ctx) {
@@ -45131,6 +45517,12 @@ Examples:
45131
45517
  const args = {};
45132
45518
  if (opts.id !== void 0)
45133
45519
  args.id = opts.id;
45520
+ if (opts.reactivateAt !== void 0)
45521
+ args.reactivate_at = opts.reactivateAt;
45522
+ if (opts.invoicingMode !== void 0)
45523
+ args.invoicing_mode = opts.invoicingMode;
45524
+ if (opts.chargeLineItems !== void 0)
45525
+ args.charge_line_items = JSON.parse(opts.chargeLineItems);
45134
45526
  await ctx.execute({
45135
45527
  method: "POST",
45136
45528
  path: "/v1/subscriptions/{id}/reinstate",
@@ -45138,7 +45530,7 @@ Examples:
45138
45530
  queryParamKeys: []
45139
45531
  });
45140
45532
  });
45141
- resource.command("pause").description(`Pause a subscription. Billing stops while paused. Optionally specify a reactivate_at date for automatic resumption. If the subscription is already paused, updates (or clears) its reactivation date.`).requiredOption("--id <value>", `id parameter`).option("--reactivate-at <value>", `Date when the subscription will be automatically reactivated. Must be a future date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).addHelpText("after", `
45533
+ resource.command("pause").description(`Pause a subscription. Billing stops while paused. Optionally specify a reactivate_at date for automatic resumption. If the subscription is already paused, updates (or clears) its reactivation date.`).requiredOption("--id <value>", `id parameter`).option("--reactivate-at <value>", `Date when the subscription will be automatically reactivated. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. A date on or before the pause date resumes it at the next scheduled run.`).addHelpText("after", `
45142
45534
  Examples:
45143
45535
  hyperline subscriptions pause --id <id>
45144
45536
  hyperline subscriptions pause --id <id> --reactivate-at <reactivate_at>
@@ -45179,9 +45571,10 @@ Examples:
45179
45571
  queryParamKeys: []
45180
45572
  });
45181
45573
  });
45182
- resource.command("reactivate").description(`Resume a paused subscription, restarting billing from the current date.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45574
+ resource.command("reactivate").description(`Resume a paused subscription. Optionally pass reactivate_at (may be in the past, after the pause date; a future date schedules it) and invoicing_mode (or charge_line_items for a custom charge) to control how the paused gap is invoiced.`).requiredOption("--id <value>", `id parameter`).option("--reactivate-at <value>", `Date the subscription resumes from. May be in the past (after the pause date). Defaults to now. A future date schedules the reactivation.`).option("--invoicing-mode <value>", `How the paused/cancelled gap is invoiced when the subscription resumes. \`charge_full_period\`: bill the frozen periods as if never paused. \`prorate_remaining_period\`: skip the gap and bill the prorated remainder from the resume date. \`resume_at_next_cycle\` (default): skip the gap with no catch-up invoice.`).option("--charge-line-items <json>", `Custom charge: bill exactly these lines on an immediate resume instead of applying \`invoicing_mode\`. The lines cover the stopped period (pause or cancellation date to resume date). Requires the \`invoices_create\` permission. Not allowed with a future \`reactivate_at\`.`).addHelpText("after", `
45183
45575
  Examples:
45184
45576
  hyperline subscriptions reactivate --id <id>
45577
+ hyperline subscriptions reactivate --id <id> --reactivate-at <reactivate_at> --invoicing-mode <invoicing_mode>
45185
45578
  hyperline subscriptions reactivate --id <id> --output json`).action(async (opts) => {
45186
45579
  const ctx = resource.parent?.opts()._ctx;
45187
45580
  if (!ctx) {
@@ -45191,6 +45584,12 @@ Examples:
45191
45584
  const args = {};
45192
45585
  if (opts.id !== void 0)
45193
45586
  args.id = opts.id;
45587
+ if (opts.reactivateAt !== void 0)
45588
+ args.reactivate_at = opts.reactivateAt;
45589
+ if (opts.invoicingMode !== void 0)
45590
+ args.invoicing_mode = opts.invoicingMode;
45591
+ if (opts.chargeLineItems !== void 0)
45592
+ args.charge_line_items = JSON.parse(opts.chargeLineItems);
45194
45593
  await ctx.execute({
45195
45594
  method: "POST",
45196
45595
  path: "/v1/subscriptions/{id}/reactivate",
@@ -46774,10 +47173,11 @@ function registerAllCommands(program2) {
46774
47173
  registerAccounting_ReportsCommands(program2);
46775
47174
  registerAccounting_Revenue_RecognitionCommands(program2);
46776
47175
  registerAccounting_RulesCommands(program2);
46777
- registerAgentsCommands(program2);
46778
47176
  registerCustom_PropertiesCommands(program2);
46779
47177
  registerAggregatorsCommands(program2);
46780
47178
  registerAggregators_UsageCommands(program2);
47179
+ registerAi_BillingCommands(program2);
47180
+ registerAi_CostsCommands(program2);
46781
47181
  registerAnalyticsCommands(program2);
46782
47182
  registerBank_AccountsCommands(program2);
46783
47183
  registerCompaniesCommands(program2);
@@ -46796,11 +47196,13 @@ function registerAllCommands(program2) {
46796
47196
  registerInvoicesCommands(program2);
46797
47197
  registerInvoices_TransactionsCommands(program2);
46798
47198
  registerInvoicing_EntitiesCommands(program2);
47199
+ registerMonitoringCommands(program2);
46799
47200
  registerPaymentsCommands(program2);
46800
47201
  registerProductsCommands(program2);
46801
47202
  registerPrice_ConfigurationsCommands(program2);
46802
47203
  registerQuotesCommands(program2);
46803
47204
  registerQuotes_TemplatesCommands(program2);
47205
+ registerQuotes_ApprovalsCommands(program2);
46804
47206
  registerSubscriptions_TemplatesCommands(program2);
46805
47207
  registerSubscriptionsCommands(program2);
46806
47208
  registerSubscriptions_TransitionsCommands(program2);
@@ -62811,17 +63213,18 @@ var languages = [
62811
63213
 
62812
63214
  // ../hyperline-i18n/build/locales/de.js
62813
63215
  var de = {
62814
- "accounting.invoicePosted.entryDescription": "Buchungseintrag f\xFCr Rechnung {{invoiceId}}",
62815
- "accounting.transactionSettled.entryDescription": "Zahlungsabwicklung f\xFCr Rechnung {{invoiceId}}",
62816
- "accounting.transactionRefunded.entryDescription": "R\xFCckerstattung f\xFCr Rechnung {{invoiceId}}",
62817
63216
  "accounting.creditNotePosted.entryDescription": "Gutschrift {{creditNoteId}} f\xFCr Rechnung {{invoiceId}}",
62818
- "accounting.standaloneCreditNotePosted.entryDescription": "Gutschrift {{creditNoteId}}",
63217
+ "accounting.invoicePosted.entryDescription": "Buchungseintrag f\xFCr Rechnung {{invoiceId}}",
63218
+ "accounting.revrec.closedPeriodFallbackNote": " (in die n\xE4chste offene Periode gebucht \u2013 Zielperiode geschlossen; urspr\xFCngliches Datum {{originalDate}})",
62819
63219
  "accounting.revrec.creditLineDescription": "Umsatz realisieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62820
63220
  "accounting.revrec.debitLineDescription": "Abgrenzungsposten reduzieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62821
63221
  "accounting.revrec.discountCreditLineDescription": "Erl\xF6sminderung (Rabatt) erfassen \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62822
- "accounting.revrec.closedPeriodFallbackNote": " (in die n\xE4chste offene Periode gebucht \u2013 Zielperiode geschlossen; urspr\xFCngliches Datum {{originalDate}})",
62823
63222
  "accounting.revrec.discountDebitLineDescription": "Abgegrenzten Rabatt reduzieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62824
63223
  "accounting.revrec.entryDescription": "Umsatzrealisierung f\xFCr Zeitplan {{scheduleId}}, Zeitraum {{periodStart}} - {{periodEnd}}",
63224
+ "accounting.standaloneCreditNotePosted.entryDescription": "Gutschrift {{creditNoteId}}",
63225
+ "accounting.transactionChargedBack.entryDescription": "R\xFCckbuchung f\xFCr Rechnung {{invoiceId}}",
63226
+ "accounting.transactionRefunded.entryDescription": "R\xFCckerstattung f\xFCr Rechnung {{invoiceId}}",
63227
+ "accounting.transactionSettled.entryDescription": "Zahlungsabwicklung f\xFCr Rechnung {{invoiceId}}",
62825
63228
  "creditNotes.refundChargeName": "R\xFCckerstattung f\xFCr die Rechnung",
62826
63229
  "credits.bundleOf": "{{productName}} - Paket mit {{creditCount}} Guthaben",
62827
63230
  "credits.unitsOf": "{{productName}} - {{creditCount}} Guthaben",
@@ -62835,9 +63238,9 @@ var de = {
62835
63238
  "invoices.prorata.paymentForItemFullPeriod": "Zahlung f\xFCr",
62836
63239
  "invoices.prorata.refundForItem": "Anteilig erstatteter Betrag f\xFCr",
62837
63240
  "invoices.prorata.refundForItemFullPeriod": "Erstattung f\xFCr",
62838
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 abgelaufenes Guthaben",
62839
63241
  "subscriptions.closingChargeName": "Abschlussgeb\xFChr f\xFCr das Abonnement",
62840
63242
  "subscriptions.correction": "Vorperiodische Anpassung",
63243
+ "subscriptions.reinstatementRechargeName": "Wiederherstellungsgeb\xFChr f\xFCr den stornierten Zeitraum",
62841
63244
  "subscriptions.updates.addCoupon": "Gutschein hinzuf\xFCgen {{couponName}}",
62842
63245
  "subscriptions.updates.addProduct": "{{productName}} hinzuf\xFCgen",
62843
63246
  "subscriptions.updates.removeCoupon": "Gutschein entfernen {{couponName}}",
@@ -62852,7 +63255,8 @@ var de = {
62852
63255
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Betrag von {{amount}} (mit einer minimal zugesicherten Anzahl von {{committedCount}}) f\xFCr den anteiligen Zeitraum nicht in Rechnung gestellt",
62853
63256
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Diese Position wurde f\xFCr den anteiligen Zeitraum in Rechnung gestellt",
62854
63257
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Betrag von {{amount}} f\xFCr den anteiligen Zeitraum nicht in Rechnung gestellt",
62855
- "subscriptions.updates.updatePrices": "Preise f\xFCr {{productName}} aktualisieren"
63258
+ "subscriptions.updates.updatePrices": "Preise f\xFCr {{productName}} aktualisieren",
63259
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 abgelaufenes Guthaben"
62856
63260
  };
62857
63261
 
62858
63262
  // ../hyperline-i18n/build/locales/en.js
@@ -62869,6 +63273,7 @@ var en = {
62869
63273
  "invoices.prorata.refundForItemFullPeriod": "Refund for",
62870
63274
  "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 expired balance",
62871
63275
  "subscriptions.closingChargeName": "Closing fee for subscription",
63276
+ "subscriptions.reinstatementRechargeName": "Reinstatement recharge of canceled period",
62872
63277
  "subscriptions.correction": "Adjustment previous period",
62873
63278
  "subscriptions.updates.addCoupon": "Add coupon {{couponName}}",
62874
63279
  "subscriptions.updates.addProduct": "Add {{productName}}",
@@ -62888,6 +63293,7 @@ var en = {
62888
63293
  "accounting.invoicePosted.entryDescription": "Posting entry for Invoice {{invoiceId}} issued",
62889
63294
  "accounting.transactionSettled.entryDescription": "Payment settlement for Invoice {{invoiceId}}",
62890
63295
  "accounting.transactionRefunded.entryDescription": "Refund for Invoice {{invoiceId}}",
63296
+ "accounting.transactionChargedBack.entryDescription": "Chargeback for Invoice {{invoiceId}}",
62891
63297
  "accounting.creditNotePosted.entryDescription": "Credit note {{creditNoteId}} for Invoice {{invoiceId}}",
62892
63298
  "accounting.standaloneCreditNotePosted.entryDescription": "Credit note {{creditNoteId}}",
62893
63299
  "accounting.revrec.entryDescription": "Revenue recognition for schedule {{scheduleId}}, period {{periodStart}} - {{periodEnd}}",
@@ -62903,17 +63309,18 @@ var en = {
62903
63309
 
62904
63310
  // ../hyperline-i18n/build/locales/es.js
62905
63311
  var es = {
62906
- "accounting.invoicePosted.entryDescription": "Asiento contable para la factura {{invoiceId}}",
62907
- "accounting.transactionSettled.entryDescription": "Liquidaci\xF3n de pago para la factura {{invoiceId}}",
62908
- "accounting.transactionRefunded.entryDescription": "Reembolso de la factura {{invoiceId}}",
62909
63312
  "accounting.creditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}} para la factura {{invoiceId}}",
62910
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63313
+ "accounting.invoicePosted.entryDescription": "Asiento contable para la factura {{invoiceId}}",
63314
+ "accounting.revrec.closedPeriodFallbackNote": " (registrado en el pr\xF3ximo per\xEDodo abierto \u2014 per\xEDodo contable de destino cerrado; fecha original {{originalDate}})",
62911
63315
  "accounting.revrec.creditLineDescription": "Reconocer ingresos \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62912
63316
  "accounting.revrec.debitLineDescription": "Disminuci\xF3n de ingresos diferidos \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62913
63317
  "accounting.revrec.discountCreditLineDescription": "Reconocer contra-ingresos (descuento) \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62914
- "accounting.revrec.closedPeriodFallbackNote": " (registrado en el pr\xF3ximo per\xEDodo abierto \u2014 per\xEDodo contable de destino cerrado; fecha original {{originalDate}})",
62915
63318
  "accounting.revrec.discountDebitLineDescription": "Disminuci\xF3n de descuento diferido \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62916
63319
  "accounting.revrec.entryDescription": "Reconocimiento de ingresos para el cronograma {{scheduleId}}, per\xEDodo {{periodStart}} - {{periodEnd}}",
63320
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63321
+ "accounting.transactionChargedBack.entryDescription": "Contracargo de la factura {{invoiceId}}",
63322
+ "accounting.transactionRefunded.entryDescription": "Reembolso de la factura {{invoiceId}}",
63323
+ "accounting.transactionSettled.entryDescription": "Liquidaci\xF3n de pago para la factura {{invoiceId}}",
62917
63324
  "creditNotes.refundChargeName": "Reembolso por factura",
62918
63325
  "credits.bundleOf": "{{productName}} - Paquete de {{creditCount}} cr\xE9ditos",
62919
63326
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9ditos",
@@ -62927,9 +63334,9 @@ var es = {
62927
63334
  "invoices.prorata.paymentForItemFullPeriod": "Pago por",
62928
63335
  "invoices.prorata.refundForItem": "Reembolso prorrateado por",
62929
63336
  "invoices.prorata.refundForItemFullPeriod": "Reembolso por",
62930
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo caducado",
62931
63337
  "subscriptions.closingChargeName": "Cargo por cierre de suscripci\xF3n",
62932
63338
  "subscriptions.correction": "Ajuste del periodo anterior",
63339
+ "subscriptions.reinstatementRechargeName": "Recarga de reinstalaci\xF3n del per\xEDodo cancelado",
62933
63340
  "subscriptions.updates.addCoupon": "A\xF1adir cup\xF3n {{couponName}}",
62934
63341
  "subscriptions.updates.addProduct": "A\xF1adir {{productName}}",
62935
63342
  "subscriptions.updates.removeCoupon": "Eliminar cup\xF3n {{couponName}}",
@@ -62944,22 +63351,24 @@ var es = {
62944
63351
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Importe de {{amount}} (con un m\xEDnimo comprometido de {{committedCount}}) no facturado para el per\xEDodo prorrateado",
62945
63352
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Esta l\xEDnea ha sido facturada para el per\xEDodo prorrateado",
62946
63353
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Importe de {{amount}} no facturado para el per\xEDodo prorrateado",
62947
- "subscriptions.updates.updatePrices": "Actualizar precios para {{productName}}"
63354
+ "subscriptions.updates.updatePrices": "Actualizar precios para {{productName}}",
63355
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo caducado"
62948
63356
  };
62949
63357
 
62950
63358
  // ../hyperline-i18n/build/locales/fr.js
62951
63359
  var fr = {
63360
+ "accounting.creditNotePosted.entryDescription": "Avoir {{creditNoteId}} pour la facture {{invoiceId}}",
63361
+ "accounting.invoicePosted.entryDescription": "\xC9criture de comptabilisation pour la facture {{invoiceId}}",
63362
+ "accounting.revrec.closedPeriodFallbackNote": " (comptabilis\xE9 sur la prochaine p\xE9riode ouverte \u2014 p\xE9riode comptable cible cl\xF4tur\xE9e ; date d'origine {{originalDate}})",
62952
63363
  "accounting.revrec.creditLineDescription": "Reconnaissance du chiffre d'affaires \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62953
63364
  "accounting.revrec.debitLineDescription": "Diminution des produits constat\xE9s d'avance \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62954
63365
  "accounting.revrec.discountCreditLineDescription": "Reconnaissance du contre-revenu (remise) \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62955
- "accounting.revrec.closedPeriodFallbackNote": " (comptabilis\xE9 sur la prochaine p\xE9riode ouverte \u2014 p\xE9riode comptable cible cl\xF4tur\xE9e ; date d'origine {{originalDate}})",
62956
63366
  "accounting.revrec.discountDebitLineDescription": "Diminution des remises diff\xE9r\xE9es \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62957
- "accounting.invoicePosted.entryDescription": "\xC9criture de comptabilisation pour la facture {{invoiceId}}",
62958
- "accounting.transactionSettled.entryDescription": "R\xE8glement de la facture {{invoiceId}}",
62959
- "accounting.transactionRefunded.entryDescription": "Remboursement de la facture {{invoiceId}}",
62960
- "accounting.creditNotePosted.entryDescription": "Avoir {{creditNoteId}} pour la facture {{invoiceId}}",
62961
- "accounting.standaloneCreditNotePosted.entryDescription": "Avoir {{creditNoteId}}",
62962
63367
  "accounting.revrec.entryDescription": "Reconnaissance du chiffre d'affaires pour l'\xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodStart}} - {{periodEnd}}",
63368
+ "accounting.standaloneCreditNotePosted.entryDescription": "Avoir {{creditNoteId}}",
63369
+ "accounting.transactionChargedBack.entryDescription": "R\xE9trofacturation de la facture {{invoiceId}}",
63370
+ "accounting.transactionRefunded.entryDescription": "Remboursement de la facture {{invoiceId}}",
63371
+ "accounting.transactionSettled.entryDescription": "R\xE8glement de la facture {{invoiceId}}",
62963
63372
  "creditNotes.refundChargeName": "Remboursement pour facture",
62964
63373
  "credits.bundleOf": "{{productName}} - Pack de {{creditCount}} cr\xE9dits",
62965
63374
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9dits",
@@ -62973,9 +63382,9 @@ var fr = {
62973
63382
  "invoices.prorata.paymentForItemFullPeriod": "Paiement pour",
62974
63383
  "invoices.prorata.refundForItem": "Remboursement au prorata pour",
62975
63384
  "invoices.prorata.refundForItemFullPeriod": "Remboursement pour",
62976
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 solde expir\xE9",
62977
63385
  "subscriptions.closingChargeName": "Frais de cl\xF4ture pour abonnement",
62978
63386
  "subscriptions.correction": "Ajustement p\xE9riode pr\xE9c\xE9dente",
63387
+ "subscriptions.reinstatementRechargeName": "Recharge de r\xE9tablissement de la p\xE9riode annul\xE9e",
62979
63388
  "subscriptions.updates.addCoupon": "Ajout du coupon {{couponName}}",
62980
63389
  "subscriptions.updates.addProduct": "Ajout {{productName}}",
62981
63390
  "subscriptions.updates.removeCoupon": "Retrait du coupon {{couponName}}",
@@ -62990,22 +63399,24 @@ var fr = {
62990
63399
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Montant de {{amount}} (avec un minimum engag\xE9 de {{committedCount}}) non factur\xE9 pour la p\xE9riode proratis\xE9e",
62991
63400
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Cette ligne a \xE9t\xE9 factur\xE9e pour la p\xE9riode proratis\xE9e",
62992
63401
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Montant de {{amount}} non factur\xE9 pour la p\xE9riode proratis\xE9e",
62993
- "subscriptions.updates.updatePrices": "Mise \xE0 jour des prix pour {{productName}}"
63402
+ "subscriptions.updates.updatePrices": "Mise \xE0 jour des prix pour {{productName}}",
63403
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 solde expir\xE9"
62994
63404
  };
62995
63405
 
62996
63406
  // ../hyperline-i18n/build/locales/it.js
62997
63407
  var it = {
62998
- "accounting.invoicePosted.entryDescription": "Registrazione contabile per la fattura {{invoiceId}}",
62999
- "accounting.transactionSettled.entryDescription": "Regolamento pagamento per la fattura {{invoiceId}}",
63000
- "accounting.transactionRefunded.entryDescription": "Rimborso per la fattura {{invoiceId}}",
63001
63408
  "accounting.creditNotePosted.entryDescription": "Nota di credito {{creditNoteId}} per la fattura {{invoiceId}}",
63002
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota di credito {{creditNoteId}}",
63409
+ "accounting.invoicePosted.entryDescription": "Registrazione contabile per la fattura {{invoiceId}}",
63410
+ "accounting.revrec.closedPeriodFallbackNote": " (registrato nel prossimo periodo aperto \u2014 periodo contabile di destinazione chiuso; data originale {{originalDate}})",
63003
63411
  "accounting.revrec.creditLineDescription": "Riconoscere i ricavi \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
63004
63412
  "accounting.revrec.debitLineDescription": "Diminuzione dei ricavi differiti \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
63005
63413
  "accounting.revrec.discountCreditLineDescription": "Riconoscere il contra-ricavo (sconto) \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
63006
- "accounting.revrec.closedPeriodFallbackNote": " (registrato nel prossimo periodo aperto \u2014 periodo contabile di destinazione chiuso; data originale {{originalDate}})",
63007
63414
  "accounting.revrec.discountDebitLineDescription": "Diminuzione dello sconto differito \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
63008
63415
  "accounting.revrec.entryDescription": "Riconoscimento dei ricavi per il programma {{scheduleId}}, periodo {{periodStart}} - {{periodEnd}}",
63416
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota di credito {{creditNoteId}}",
63417
+ "accounting.transactionChargedBack.entryDescription": "Riaddebito per la fattura {{invoiceId}}",
63418
+ "accounting.transactionRefunded.entryDescription": "Rimborso per la fattura {{invoiceId}}",
63419
+ "accounting.transactionSettled.entryDescription": "Regolamento pagamento per la fattura {{invoiceId}}",
63009
63420
  "creditNotes.refundChargeName": "Rimborso per fattura",
63010
63421
  "credits.bundleOf": "{{productName}} - Pacchetto di {{creditCount}} crediti",
63011
63422
  "credits.unitsOf": "{{productName}} - {{creditCount}} crediti",
@@ -63019,9 +63430,9 @@ var it = {
63019
63430
  "invoices.prorata.paymentForItemFullPeriod": "Pagamento per",
63020
63431
  "invoices.prorata.refundForItem": "Rimborso proporzionale per",
63021
63432
  "invoices.prorata.refundForItemFullPeriod": "Rimborso per",
63022
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo scaduto",
63023
63433
  "subscriptions.closingChargeName": "Costo di chiusura per abbonamento",
63024
63434
  "subscriptions.correction": "Correzione periodo precedente",
63435
+ "subscriptions.reinstatementRechargeName": "Ricarica di reintegrazione del periodo annullato",
63025
63436
  "subscriptions.updates.addCoupon": "Aggiungi coupon {{couponName}}",
63026
63437
  "subscriptions.updates.addProduct": "Aggiungi {{productName}}",
63027
63438
  "subscriptions.updates.removeCoupon": "Rimuovi coupon {{couponName}}",
@@ -63036,14 +63447,30 @@ var it = {
63036
63447
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Importo di {{amount}} (con un minimo impegnato di {{committedCount}}) non fatturato per il periodo proporzionato",
63037
63448
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Questa voce \xE8 stata fatturata per il periodo proporzionato",
63038
63449
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Importo di {{amount}} non fatturato per il periodo proporzionato",
63039
- "subscriptions.updates.updatePrices": "Aggiorna prezzi per {{productName}}"
63450
+ "subscriptions.updates.updatePrices": "Aggiorna prezzi per {{productName}}",
63451
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo scaduto"
63040
63452
  };
63041
63453
 
63042
63454
  // ../hyperline-i18n/build/locales/lt.js
63043
63455
  var lt = {
63456
+ "accounting.creditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}} s\u0105skaitai fakt\u016Brai {{invoiceId}}",
63457
+ "accounting.invoicePosted.entryDescription": "I\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros {{invoiceId}} registravimo \u012Fra\u0161as",
63458
+ "accounting.revrec.closedPeriodFallbackNote": " (u\u017Eregistruota kitame atvirame laikotarpyje, nes tikslinis apskaitos laikotarpis u\u017Edarytas; pradin\u0117 data {{originalDate}})",
63459
+ "accounting.revrec.creditLineDescription": "Pajam\u0173 pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63460
+ "accounting.revrec.debitLineDescription": "Atid\u0117t\u0173j\u0173 pajam\u0173 suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63461
+ "accounting.revrec.discountCreditLineDescription": "Pajamas ma\u017Einan\u010Dios sumos (nuolaidos) pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63462
+ "accounting.revrec.discountDebitLineDescription": "Atid\u0117tosios nuolaidos suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63463
+ "accounting.revrec.entryDescription": "Pajam\u0173 pripa\u017Einimas pagal grafik\u0105 {{scheduleId}}, laikotarpis {{periodStart}}\u2013{{periodEnd}}",
63464
+ "accounting.standaloneCreditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}}",
63465
+ "accounting.transactionChargedBack.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} u\u017Egin\u010Dyto mok\u0117jimo gr\u0105\u017Einimas",
63466
+ "accounting.transactionRefunded.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} gr\u0105\u017Einimas",
63467
+ "accounting.transactionSettled.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} mok\u0117jimo sudengimas",
63044
63468
  "creditNotes.refundChargeName": "S\u0105skaitos fakt\u016Bros gr\u0105\u017Einimas",
63045
63469
  "credits.bundleOf": "{{productName}} \u2013 {{creditCount}} kredit\u0173 paketas",
63046
63470
  "credits.unitsOf": "{{productName}} \u2013 {{creditCount}} kredit\u0173",
63471
+ "einvoicing.paymentFromWallet": "Mok\u0117jimas i\u0161 pinigin\u0117s",
63472
+ "einvoicing.paymentProcessed": "Mok\u0117jimas apdorotas",
63473
+ "einvoicing.paymentReceived": "Mok\u0117jimas gautas",
63047
63474
  "invoices.outstandingProduct.description": "Neapmok\u0117ta {{date}} i\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros{{invoiceNumber}} suma",
63048
63475
  "invoices.outstandingProduct.descriptionPeriod": "Neapmok\u0117ta s\u0105skaitos fakt\u016Bros{{invoiceNumber}} suma u\u017E laikotarp\u012F nuo {{periodStart}} iki {{periodEnd}}",
63049
63476
  "invoices.outstandingProduct.name": "Neapmok\u0117tas likutis",
@@ -63051,53 +63478,41 @@ var lt = {
63051
63478
  "invoices.prorata.paymentForItemFullPeriod": "Mok\u0117jimas u\u017E",
63052
63479
  "invoices.prorata.refundForItem": "Proporcingas gr\u0105\u017Einimas u\u017E",
63053
63480
  "invoices.prorata.refundForItemFullPeriod": "Gr\u0105\u017Einimas u\u017E",
63054
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 nebegaliojantis likutis",
63055
63481
  "subscriptions.closingChargeName": "Prenumeratos u\u017Ebaigimo mokestis",
63056
63482
  "subscriptions.correction": "Ankstesnio laikotarpio koregavimas",
63483
+ "subscriptions.reinstatementRechargeName": "Atnaujinimo \u012Fmokos u\u017E nutraukt\u0105 laikotarp\u012F",
63057
63484
  "subscriptions.updates.addCoupon": "Prid\u0117ti kupon\u0105 {{couponName}}",
63058
63485
  "subscriptions.updates.addProduct": "Prid\u0117ti {{productName}}",
63059
63486
  "subscriptions.updates.removeCoupon": "Pa\u0161alinti kupon\u0105 {{couponName}}",
63060
63487
  "subscriptions.updates.removeProduct": "Pa\u0161alinti {{productName}}",
63061
63488
  "subscriptions.updates.unit": "vnt.",
63062
- "subscriptions.updates.updatePrices": "Atnaujinti {{productName}} kainas",
63063
63489
  "subscriptions.updates.updateCount": "Atnaujinti {{productName}} kiek\u012F ({{previousCount}} \u2192 {{newCount}} {{unit}})",
63064
- "subscriptions.updates.updateCount.description.prorata.committed.invoiced": "Pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
63065
- "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
63066
- "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 proporcingam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63067
- "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63068
63490
  "subscriptions.updates.updateCount.description.full.committed.invoiced": "Visam laikotarpiui pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
63069
63491
  "subscriptions.updates.updateCount.description.full.committed.not_invoiced": "Visam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
63070
63492
  "subscriptions.updates.updateCount.description.full.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 visam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63071
63493
  "subscriptions.updates.updateCount.description.full.not_committed.not_invoiced": "Visam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63072
- "accounting.invoicePosted.entryDescription": "I\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros {{invoiceId}} registravimo \u012Fra\u0161as",
63073
- "accounting.transactionSettled.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} mok\u0117jimo sudengimas",
63074
- "accounting.transactionRefunded.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} gr\u0105\u017Einimas",
63075
- "accounting.creditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}} s\u0105skaitai fakt\u016Brai {{invoiceId}}",
63076
- "accounting.standaloneCreditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}}",
63077
- "accounting.revrec.entryDescription": "Pajam\u0173 pripa\u017Einimas pagal grafik\u0105 {{scheduleId}}, laikotarpis {{periodStart}}\u2013{{periodEnd}}",
63078
- "accounting.revrec.debitLineDescription": "Atid\u0117t\u0173j\u0173 pajam\u0173 suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63079
- "accounting.revrec.creditLineDescription": "Pajam\u0173 pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63080
- "accounting.revrec.discountDebitLineDescription": "Atid\u0117tosios nuolaidos suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63081
- "accounting.revrec.discountCreditLineDescription": "Pajamas ma\u017Einan\u010Dios sumos (nuolaidos) pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63082
- "accounting.revrec.closedPeriodFallbackNote": " (u\u017Eregistruota kitame atvirame laikotarpyje, nes tikslinis apskaitos laikotarpis u\u017Edarytas; pradin\u0117 data {{originalDate}})",
63083
- "einvoicing.paymentProcessed": "Mok\u0117jimas apdorotas",
63084
- "einvoicing.paymentReceived": "Mok\u0117jimas gautas",
63085
- "einvoicing.paymentFromWallet": "Mok\u0117jimas i\u0161 pinigin\u0117s"
63494
+ "subscriptions.updates.updateCount.description.prorata.committed.invoiced": "Pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
63495
+ "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
63496
+ "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 proporcingam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63497
+ "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63498
+ "subscriptions.updates.updatePrices": "Atnaujinti {{productName}} kainas",
63499
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 nebegaliojantis likutis"
63086
63500
  };
63087
63501
 
63088
63502
  // ../hyperline-i18n/build/locales/nl.js
63089
63503
  var nl = {
63090
- "accounting.invoicePosted.entryDescription": "Boekingsregel voor factuur {{invoiceId}}",
63091
- "accounting.transactionSettled.entryDescription": "Betalingsafwikkeling voor factuur {{invoiceId}}",
63092
- "accounting.transactionRefunded.entryDescription": "Terugbetaling voor factuur {{invoiceId}}",
63093
63504
  "accounting.creditNotePosted.entryDescription": "Creditnota {{creditNoteId}} voor factuur {{invoiceId}}",
63094
- "accounting.standaloneCreditNotePosted.entryDescription": "Creditnota {{creditNoteId}}",
63505
+ "accounting.invoicePosted.entryDescription": "Boekingsregel voor factuur {{invoiceId}}",
63506
+ "accounting.revrec.closedPeriodFallbackNote": " (geboekt in de volgende open periode \u2014 doelboekingsperiode gesloten; oorspronkelijke datum {{originalDate}})",
63095
63507
  "accounting.revrec.creditLineDescription": "Omzet erkennen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63096
63508
  "accounting.revrec.debitLineDescription": "Uitgestelde omzet verlagen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63097
63509
  "accounting.revrec.discountCreditLineDescription": "Omzetvermindering (korting) erkennen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63098
- "accounting.revrec.closedPeriodFallbackNote": " (geboekt in de volgende open periode \u2014 doelboekingsperiode gesloten; oorspronkelijke datum {{originalDate}})",
63099
63510
  "accounting.revrec.discountDebitLineDescription": "Uitgestelde korting verlagen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63100
63511
  "accounting.revrec.entryDescription": "Omzeterkenning voor schema {{scheduleId}}, periode {{periodStart}} - {{periodEnd}}",
63512
+ "accounting.standaloneCreditNotePosted.entryDescription": "Creditnota {{creditNoteId}}",
63513
+ "accounting.transactionChargedBack.entryDescription": "Terugboeking voor factuur {{invoiceId}}",
63514
+ "accounting.transactionRefunded.entryDescription": "Terugbetaling voor factuur {{invoiceId}}",
63515
+ "accounting.transactionSettled.entryDescription": "Betalingsafwikkeling voor factuur {{invoiceId}}",
63101
63516
  "creditNotes.refundChargeName": "Terugbetaling voor factuur",
63102
63517
  "credits.bundleOf": "{{productName}} - Bundel van {{creditCount}} credits",
63103
63518
  "credits.unitsOf": "{{productName}} - {{creditCount}} credits",
@@ -63111,9 +63526,9 @@ var nl = {
63111
63526
  "invoices.prorata.paymentForItemFullPeriod": "Betaling voor",
63112
63527
  "invoices.prorata.refundForItem": "Gedeeltelijke terugbetaling voor",
63113
63528
  "invoices.prorata.refundForItemFullPeriod": "Terugbetaling voor",
63114
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 verlopen saldo",
63115
63529
  "subscriptions.closingChargeName": "Afsluitkosten voor abonnement",
63116
63530
  "subscriptions.correction": "Aanpassing vorige periode",
63531
+ "subscriptions.reinstatementRechargeName": "Herstelkosten van geannuleerde periode",
63117
63532
  "subscriptions.updates.addCoupon": "Coupon toevoegen {{couponName}}",
63118
63533
  "subscriptions.updates.addProduct": "{{productName}} toevoegen",
63119
63534
  "subscriptions.updates.removeCoupon": "Coupon verwijderen {{couponName}}",
@@ -63128,22 +63543,24 @@ var nl = {
63128
63543
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Bedrag van {{amount}} (met een minimaal toegezegd aantal van {{committedCount}}) niet gefactureerd voor de geproportioneerde periode",
63129
63544
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Deze regel is gefactureerd voor de geproportioneerde periode",
63130
63545
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Bedrag van {{amount}} niet gefactureerd voor de geproportioneerde periode",
63131
- "subscriptions.updates.updatePrices": "Prijzen bijwerken voor {{productName}}"
63546
+ "subscriptions.updates.updatePrices": "Prijzen bijwerken voor {{productName}}",
63547
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 verlopen saldo"
63132
63548
  };
63133
63549
 
63134
63550
  // ../hyperline-i18n/build/locales/pl.js
63135
63551
  var pl = {
63136
- "accounting.invoicePosted.entryDescription": "Zapis ksi\u0119gowy dla faktury {{invoiceId}}",
63137
- "accounting.transactionSettled.entryDescription": "Rozliczenie p\u0142atno\u015Bci dla faktury {{invoiceId}}",
63138
- "accounting.transactionRefunded.entryDescription": "Zwrot za faktur\u0119 {{invoiceId}}",
63139
63552
  "accounting.creditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}} dla faktury {{invoiceId}}",
63140
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}}",
63553
+ "accounting.invoicePosted.entryDescription": "Zapis ksi\u0119gowy dla faktury {{invoiceId}}",
63554
+ "accounting.revrec.closedPeriodFallbackNote": " (zaksi\u0119gowano w nast\u0119pnym otwartym okresie \u2014 docelowy okres ksi\u0119gowy zamkni\u0119ty; pierwotna data {{originalDate}})",
63141
63555
  "accounting.revrec.creditLineDescription": "Rozpoznanie przychodu \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63142
63556
  "accounting.revrec.debitLineDescription": "Zmniejszenie przychod\xF3w przysz\u0142ych okres\xF3w \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63143
63557
  "accounting.revrec.discountCreditLineDescription": "Rozpoznanie kontra-przychodu (rabat) \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63144
- "accounting.revrec.closedPeriodFallbackNote": " (zaksi\u0119gowano w nast\u0119pnym otwartym okresie \u2014 docelowy okres ksi\u0119gowy zamkni\u0119ty; pierwotna data {{originalDate}})",
63145
63558
  "accounting.revrec.discountDebitLineDescription": "Zmniejszenie odroczonego rabatu \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63146
63559
  "accounting.revrec.entryDescription": "Rozpoznanie przychodu dla harmonogramu {{scheduleId}}, okres {{periodStart}} - {{periodEnd}}",
63560
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}}",
63561
+ "accounting.transactionChargedBack.entryDescription": "Obci\u0105\u017Cenie zwrotne za faktur\u0119 {{invoiceId}}",
63562
+ "accounting.transactionRefunded.entryDescription": "Zwrot za faktur\u0119 {{invoiceId}}",
63563
+ "accounting.transactionSettled.entryDescription": "Rozliczenie p\u0142atno\u015Bci dla faktury {{invoiceId}}",
63147
63564
  "creditNotes.refundChargeName": "Zwrot za faktur\u0119",
63148
63565
  "credits.bundleOf": "{{productName}} - Pakiet {{creditCount}} kredyt\xF3w",
63149
63566
  "credits.unitsOf": "{{productName}} - {{creditCount}} kredyt\xF3w",
@@ -63157,9 +63574,9 @@ var pl = {
63157
63574
  "invoices.prorata.paymentForItemFullPeriod": "P\u0142atno\u015B\u0107 za",
63158
63575
  "invoices.prorata.refundForItem": "Zwrot proporcjonalny za",
63159
63576
  "invoices.prorata.refundForItemFullPeriod": "Zwrot za",
63160
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 wygas\u0142e saldo",
63161
63577
  "subscriptions.closingChargeName": "Op\u0142ata za zamkni\u0119cie subskrypcji",
63162
63578
  "subscriptions.correction": "Korekta poprzedniego okresu",
63579
+ "subscriptions.reinstatementRechargeName": "Op\u0142ata za przywr\xF3cenie anulowanego okresu",
63163
63580
  "subscriptions.updates.addCoupon": "Dodaj kupon {{couponName}}",
63164
63581
  "subscriptions.updates.addProduct": "Dodaj {{productName}}",
63165
63582
  "subscriptions.updates.removeCoupon": "Usu\u0144 kupon {{couponName}}",
@@ -63174,22 +63591,24 @@ var pl = {
63174
63591
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Kwota {{amount}} (z minimaln\u0105 zobowi\u0105zan\u0105 ilo\u015Bci\u0105 {{committedCount}}) niefakturowana za okres proporcjonalny",
63175
63592
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Ta pozycja zosta\u0142a zafakturowana za okres proporcjonalny",
63176
63593
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Kwota {{amount}} niefakturowana za okres proporcjonalny",
63177
- "subscriptions.updates.updatePrices": "Aktualizuj ceny dla {{productName}}"
63594
+ "subscriptions.updates.updatePrices": "Aktualizuj ceny dla {{productName}}",
63595
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 wygas\u0142e saldo"
63178
63596
  };
63179
63597
 
63180
63598
  // ../hyperline-i18n/build/locales/pt.js
63181
63599
  var pt = {
63182
- "accounting.invoicePosted.entryDescription": "Lan\xE7amento cont\xE1bil para a fatura {{invoiceId}}",
63183
- "accounting.transactionSettled.entryDescription": "Liquida\xE7\xE3o de pagamento para a fatura {{invoiceId}}",
63184
- "accounting.transactionRefunded.entryDescription": "Reembolso da fatura {{invoiceId}}",
63185
63600
  "accounting.creditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}} para a fatura {{invoiceId}}",
63186
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63601
+ "accounting.invoicePosted.entryDescription": "Lan\xE7amento cont\xE1bil para a fatura {{invoiceId}}",
63602
+ "accounting.revrec.closedPeriodFallbackNote": " (lan\xE7ado no pr\xF3ximo per\xEDodo aberto \u2014 per\xEDodo cont\xE1bil de destino fechado; data original {{originalDate}})",
63187
63603
  "accounting.revrec.creditLineDescription": "Reconhecer receita \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63188
63604
  "accounting.revrec.debitLineDescription": "Diminui\xE7\xE3o da receita diferida \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63189
63605
  "accounting.revrec.discountCreditLineDescription": "Reconhecer contra-receita (desconto) \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63190
- "accounting.revrec.closedPeriodFallbackNote": " (lan\xE7ado no pr\xF3ximo per\xEDodo aberto \u2014 per\xEDodo cont\xE1bil de destino fechado; data original {{originalDate}})",
63191
63606
  "accounting.revrec.discountDebitLineDescription": "Diminui\xE7\xE3o do desconto diferido \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63192
63607
  "accounting.revrec.entryDescription": "Reconhecimento de receita para o cronograma {{scheduleId}}, per\xEDodo {{periodStart}} - {{periodEnd}}",
63608
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63609
+ "accounting.transactionChargedBack.entryDescription": "Estorno da fatura {{invoiceId}}",
63610
+ "accounting.transactionRefunded.entryDescription": "Reembolso da fatura {{invoiceId}}",
63611
+ "accounting.transactionSettled.entryDescription": "Liquida\xE7\xE3o de pagamento para a fatura {{invoiceId}}",
63193
63612
  "creditNotes.refundChargeName": "Reembolso pela fatura",
63194
63613
  "credits.bundleOf": "{{productName}} - Pacote de {{creditCount}} cr\xE9ditos",
63195
63614
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9ditos",
@@ -63203,9 +63622,9 @@ var pt = {
63203
63622
  "invoices.prorata.paymentForItemFullPeriod": "Pagamento por",
63204
63623
  "invoices.prorata.refundForItem": "Reembolso proporcional por",
63205
63624
  "invoices.prorata.refundForItemFullPeriod": "Reembolso por",
63206
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo expirado",
63207
63625
  "subscriptions.closingChargeName": "Taxa de encerramento da assinatura",
63208
63626
  "subscriptions.correction": "Ajuste do per\xEDodo anterior",
63627
+ "subscriptions.reinstatementRechargeName": "Recarga de reintegra\xE7\xE3o do per\xEDodo cancelado",
63209
63628
  "subscriptions.updates.addCoupon": "Adicionar cupom {{couponName}}",
63210
63629
  "subscriptions.updates.addProduct": "Adicionar {{productName}}",
63211
63630
  "subscriptions.updates.removeCoupon": "Remover cupom {{couponName}}",
@@ -63220,7 +63639,8 @@ var pt = {
63220
63639
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Valor de {{amount}} (com um m\xEDnimo comprometido de {{committedCount}}) n\xE3o faturado para o per\xEDodo proporcional",
63221
63640
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Esta linha foi faturada para o per\xEDodo proporcional",
63222
63641
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Valor de {{amount}} n\xE3o faturado para o per\xEDodo proporcional",
63223
- "subscriptions.updates.updatePrices": "Atualizar pre\xE7os para {{productName}}"
63642
+ "subscriptions.updates.updatePrices": "Atualizar pre\xE7os para {{productName}}",
63643
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo expirado"
63224
63644
  };
63225
63645
 
63226
63646
  // ../hyperline-i18n/build/language.js
@@ -65999,6 +66419,150 @@ var isAxiosError = axios.isAxiosError;
65999
66419
  // ../hyperline-lib/build/httpClient/httpClient.js
66000
66420
  import axios2 from "axios";
66001
66421
  import axiosRetry, { isNetworkOrIdempotentRequestError, retryAfter } from "axios-retry";
66422
+
66423
+ // ../hyperline-lib/build/httpClient/logRedaction.js
66424
+ var REDACTED_KEY_NAMES = /* @__PURE__ */ new Set([
66425
+ "accesstoken",
66426
+ "apikey",
66427
+ "apitoken",
66428
+ "assertion",
66429
+ "authtoken",
66430
+ "clientassertion",
66431
+ "codeverifier",
66432
+ "credentials",
66433
+ "idtoken",
66434
+ "privatekey",
66435
+ "refreshtoken",
66436
+ "sessiontoken",
66437
+ "token"
66438
+ ]);
66439
+ var REDACTED_KEY_SUFFIX_PATTERN = /(secret|password)$/;
66440
+ var REDACTED_KEY_CANDIDATE_PATTERN = /token|key|secret|password|assertion|verifier|credentials/i;
66441
+ var REDACTED_VALUE = "<redacted>";
66442
+ var MAX_REDACTION_DEPTH = 10;
66443
+ var MAX_PARSED_STRING_LENGTH = 16384;
66444
+ var MAX_VISITED_NODES = 1e3;
66445
+ var MAX_CONTAINER_ENTRIES = MAX_VISITED_NODES;
66446
+ function redactLogBody({ body }) {
66447
+ return redactValue({
66448
+ value: body,
66449
+ depth: MAX_REDACTION_DEPTH,
66450
+ budget: { remainingNodes: MAX_VISITED_NODES }
66451
+ });
66452
+ }
66453
+ function redactLogUrl({ url: url2 }) {
66454
+ const queryIndex = url2.indexOf("?");
66455
+ if (queryIndex === -1 || url2.length > MAX_PARSED_STRING_LENGTH) {
66456
+ return url2;
66457
+ }
66458
+ const redactedQuery = redactFormEncoded({ text: url2.slice(queryIndex + 1) });
66459
+ return redactedQuery === void 0 ? url2 : `${url2.slice(0, queryIndex)}?${redactedQuery}`;
66460
+ }
66461
+ function redactValue({ value, depth, budget }) {
66462
+ if (depth <= 0 || budget.remainingNodes <= 0) {
66463
+ return value;
66464
+ }
66465
+ budget.remainingNodes -= 1;
66466
+ if (typeof value === "string") {
66467
+ return redactString({ text: value, budget });
66468
+ }
66469
+ if (value instanceof URLSearchParams) {
66470
+ return redactFormEncoded({ text: value.toString() }) ?? value;
66471
+ }
66472
+ if (Array.isArray(value)) {
66473
+ return redactArray({ items: value, depth, budget });
66474
+ }
66475
+ if (isPlainObject2(value)) {
66476
+ return redactObject({ record: value, depth, budget });
66477
+ }
66478
+ return value;
66479
+ }
66480
+ function redactArray({ items, depth, budget }) {
66481
+ if (items.length > MAX_CONTAINER_ENTRIES) {
66482
+ return items;
66483
+ }
66484
+ let redactedItems;
66485
+ for (const [index, item] of items.entries()) {
66486
+ if (budget.remainingNodes <= 0) {
66487
+ break;
66488
+ }
66489
+ const redactedItem = redactValue({ value: item, depth: depth - 1, budget });
66490
+ if (redactedItem !== item) {
66491
+ redactedItems ??= [...items];
66492
+ redactedItems[index] = redactedItem;
66493
+ }
66494
+ }
66495
+ return redactedItems ?? items;
66496
+ }
66497
+ function redactObject({ record: record2, depth, budget }) {
66498
+ const redactedEntries = /* @__PURE__ */ new Map();
66499
+ let entryCount = 0;
66500
+ for (const key in record2) {
66501
+ if (!Object.hasOwn(record2, key)) {
66502
+ continue;
66503
+ }
66504
+ entryCount += 1;
66505
+ if (entryCount > MAX_CONTAINER_ENTRIES) {
66506
+ return record2;
66507
+ }
66508
+ if (budget.remainingNodes <= 0) {
66509
+ break;
66510
+ }
66511
+ const nestedValue = record2[key];
66512
+ const redactedNestedValue = isRedactedKey({ key }) && nestedValue != null ? REDACTED_VALUE : redactValue({ value: nestedValue, depth: depth - 1, budget });
66513
+ if (redactedNestedValue !== nestedValue) {
66514
+ redactedEntries.set(key, redactedNestedValue);
66515
+ }
66516
+ }
66517
+ return redactedEntries.size === 0 ? record2 : { ...record2, ...Object.fromEntries(redactedEntries) };
66518
+ }
66519
+ function redactString({ text, budget }) {
66520
+ if (text.length > MAX_PARSED_STRING_LENGTH) {
66521
+ return text;
66522
+ }
66523
+ const trimmedText = text.trim();
66524
+ if (trimmedText.startsWith("{") || trimmedText.startsWith("[")) {
66525
+ try {
66526
+ const parsedValue = JSON.parse(trimmedText);
66527
+ const redactedValue = redactValue({
66528
+ value: parsedValue,
66529
+ depth: MAX_REDACTION_DEPTH,
66530
+ budget
66531
+ });
66532
+ return redactedValue === parsedValue ? text : JSON.stringify(redactedValue);
66533
+ } catch {
66534
+ return text;
66535
+ }
66536
+ }
66537
+ return redactFormEncoded({ text }) ?? text;
66538
+ }
66539
+ function redactFormEncoded({ text }) {
66540
+ if (!text.includes("=") || !REDACTED_KEY_CANDIDATE_PATTERN.test(text)) {
66541
+ return void 0;
66542
+ }
66543
+ const params = new URLSearchParams(text);
66544
+ let hasRedactedParam = false;
66545
+ for (const key of new Set(params.keys())) {
66546
+ if (isRedactedKey({ key })) {
66547
+ params.set(key, REDACTED_VALUE);
66548
+ hasRedactedParam = true;
66549
+ }
66550
+ }
66551
+ return hasRedactedParam ? params.toString() : void 0;
66552
+ }
66553
+ function isRedactedKey({ key }) {
66554
+ const normalizedKey = key.toLowerCase().replace(/[_-]/g, "");
66555
+ return REDACTED_KEY_NAMES.has(normalizedKey) || REDACTED_KEY_SUFFIX_PATTERN.test(normalizedKey);
66556
+ }
66557
+ function isPlainObject2(value) {
66558
+ if (typeof value !== "object" || value === null) {
66559
+ return false;
66560
+ }
66561
+ const prototype = Object.getPrototypeOf(value);
66562
+ return prototype === Object.prototype || prototype === null;
66563
+ }
66564
+
66565
+ // ../hyperline-lib/build/httpClient/httpClient.js
66002
66566
  import { AxiosError } from "axios";
66003
66567
  var recommendedRetryConfig = {
66004
66568
  retries: 3,
@@ -66066,13 +66630,14 @@ function isTooManyRequestsError(error48) {
66066
66630
  return error48.response?.status === 429;
66067
66631
  }
66068
66632
  var toLogRequest = (config4) => {
66633
+ const url2 = redactLogUrl({ url: config4.url ?? "" });
66069
66634
  return {
66070
66635
  method: config4.method ?? "",
66071
- url: config4.url ?? "",
66072
- path: config4.url ?? "",
66636
+ url: url2,
66637
+ path: url2,
66073
66638
  hostname: config4.baseURL ?? "",
66074
- originalUrl: `${config4.baseURL ?? ""}${config4.url}`,
66075
- body: config4.data,
66639
+ originalUrl: `${config4.baseURL ?? ""}${url2}`,
66640
+ body: redactLogBody({ body: config4.data }),
66076
66641
  headers: {}
66077
66642
  };
66078
66643
  };