@hyperline/cli 0.1.0-build.1.f3906be → 0.1.0-build.1.f521870

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.
@@ -33833,7 +33833,7 @@ var require_shared = __commonJS({
33833
33833
  getNameForCurrency: () => getNameForCurrency,
33834
33834
  getNaturalNumber: () => getNaturalNumber,
33835
33835
  getSymbolForCurrency: () => getSymbolForCurrency,
33836
- getTimezoneByName: () => getTimezoneByName,
33836
+ getTimezoneByName: () => getTimezoneByName2,
33837
33837
  getTimezoneOffsetName: () => getTimezoneOffsetName,
33838
33838
  getTimezones: () => getTimezones2,
33839
33839
  getValidTimezonesNames: () => getValidTimezonesNames,
@@ -33850,7 +33850,7 @@ var require_shared = __commonJS({
33850
33850
  subtract: () => subtract,
33851
33851
  sum: () => sum2,
33852
33852
  toLocalTime: () => toLocalTime3,
33853
- toUtc: () => toUtc2,
33853
+ toUtc: () => toUtc3,
33854
33854
  useDebounce: () => useDebounce
33855
33855
  });
33856
33856
  module.exports = __toCommonJS(shared_exports);
@@ -34985,10 +34985,10 @@ var require_shared = __commonJS({
34985
34985
  ZodId: () => ZodId,
34986
34986
  ZodTranslationsSchemaFn: () => ZodTranslationsSchemaFn
34987
34987
  });
34988
- var import_zod21 = require_lib();
34988
+ var import_zod23 = require_lib();
34989
34989
  var countryIds2 = ["all", ...countries.map(({ id }) => id)];
34990
- var ZodId = import_zod21.z.enum(countryIds2);
34991
- var ZodTranslationsSchemaFn = (schema) => import_zod21.z.record(import_zod21.z.string(), schema.optional());
34990
+ var ZodId = import_zod23.z.enum(countryIds2);
34991
+ var ZodTranslationsSchemaFn = (schema) => import_zod23.z.record(import_zod23.z.string(), schema.optional());
34992
34992
  var UsStates = [
34993
34993
  { id: "AA", name: "Armed Forces Americas" },
34994
34994
  { id: "AE", name: "Armed Forces Europe" },
@@ -36287,14 +36287,14 @@ var require_shared = __commonJS({
36287
36287
  ZodNumberCurrencyPositiveValue: () => ZodNumberCurrencyPositiveValue,
36288
36288
  ZodNumberCurrencyPositiveValueExcludingZero: () => ZodNumberCurrencyPositiveValueExcludingZero
36289
36289
  });
36290
- var import_zod22 = require_lib();
36291
- var ZodCurrencyId = import_zod22.z.enum(
36290
+ var import_zod24 = require_lib();
36291
+ var ZodCurrencyId = import_zod24.z.enum(
36292
36292
  all_default.map(({ id }) => id)
36293
36293
  );
36294
- var ZodNumberCurrency = import_zod22.z.string().or(import_zod22.z.number().transform((number4) => number4)).transform((number4) => number4);
36295
- var ZodNumberCurrencyPositiveValue = import_zod22.z.number().min(0).transform((number4) => number4).transform((number4) => number4);
36296
- var ZodNumberCurrencyPositiveValueExcludingZero = import_zod22.z.number().gt(0).transform((number4) => number4).transform((number4) => number4);
36297
- var ZodCurrencyMap = import_zod22.z.record(ZodNumberCurrency).refine(
36294
+ var ZodNumberCurrency = import_zod24.z.string().or(import_zod24.z.number().transform((number4) => number4)).transform((number4) => number4);
36295
+ var ZodNumberCurrencyPositiveValue = import_zod24.z.number().min(0).transform((number4) => number4).transform((number4) => number4);
36296
+ var ZodNumberCurrencyPositiveValueExcludingZero = import_zod24.z.number().gt(0).transform((number4) => number4).transform((number4) => number4);
36297
+ var ZodCurrencyMap = import_zod24.z.record(ZodNumberCurrency).refine(
36298
36298
  (data) => Object.keys(data).every((key) => ZodCurrencyId.safeParse(key).success),
36299
36299
  {
36300
36300
  message: "Invalid currency key.",
@@ -36557,14 +36557,14 @@ var require_shared = __commonJS({
36557
36557
  function getTimezones2() {
36558
36558
  return timezones;
36559
36559
  }
36560
- function getTimezoneByName(tz) {
36560
+ function getTimezoneByName2(tz) {
36561
36561
  var _a2;
36562
36562
  if (tz === "UTC") {
36563
36563
  return timezones.find(({ name }) => name === "Etc/UTC");
36564
36564
  }
36565
36565
  return (_a2 = timezones.find(({ name }) => name === tz)) != null ? _a2 : timezones.find(({ group }) => group.includes(tz));
36566
36566
  }
36567
- function toUtc2(date5, timezone) {
36567
+ function toUtc3(date5, timezone) {
36568
36568
  return (0, import_date_fns_tz.fromZonedTime)(date5, timezone);
36569
36569
  }
36570
36570
  function toLocalTime3(date5, localTimezone) {
@@ -36575,7 +36575,7 @@ var require_shared = __commonJS({
36575
36575
  );
36576
36576
  var constructDateFromTimezoneToLocal = (date5, timezone) => {
36577
36577
  if (!timezone) return date5;
36578
- const timezoneObj = getTimezoneByName(timezone);
36578
+ const timezoneObj = getTimezoneByName2(timezone);
36579
36579
  if (!timezoneObj) return date5;
36580
36580
  const dateAtTimezone = new Date(
36581
36581
  date5.getFullYear(),
@@ -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({
@@ -38941,7 +38936,7 @@ Examples:
38941
38936
  ]
38942
38937
  });
38943
38938
  });
38944
- resource.command("get-accounting-rule-tree").description(`Retrieve accounting rules organized as a filter tree.`).option("--ledger-id <value>", `Ledger identifier.`).option("--invoicing-entity-id <value>", `Optional invoicing entity identifier.`).option("--max-depth <number>", `Maximum tree depth to return.`).option("--search <value>", `Search by rule identifier or category.`).addHelpText("after", `
38939
+ resource.command("get-accounting-rule-tree").description(`Retrieve accounting rules organized as a filter tree. Accounting software sync rules are excluded.`).option("--ledger-id <value>", `Ledger identifier.`).option("--invoicing-entity-id <value>", `Optional invoicing entity identifier.`).option("--max-depth <number>", `Maximum tree depth to return.`).option("--search <value>", `Search by rule identifier or category.`).addHelpText("after", `
38945
38940
  Examples:
38946
38941
  hyperline accounting-rules get-accounting-rule-tree
38947
38942
  hyperline accounting-rules get-accounting-rule-tree --ledger-id <ledger_id> --invoicing-entity-id <invoicing_entity_id>`).action(async (opts) => {
@@ -39013,7 +39008,7 @@ Examples:
39013
39008
  queryParamKeys: []
39014
39009
  });
39015
39010
  });
39016
- resource.command("create").description(`Create a new accounting rule for account code routing or journal posting.`).option("--ledger-id <value>", `Identifier of the ledger this rule belongs to.`).option("--name <value>", `Optional user-defined name for the rule.`).requiredOption("--category <value>", `Rule category (e.g. accounting_software, invoice_posted).`).requiredOption("--priority <number>", `Override order. Higher priority wins when multiple rules match.`).option("--product-ids <json>", `Product IDs to match. Empty means match all.`).option("--product-types <json>", `Product types to match. Allowed values: flat_fee, dynamic, seat, credit. Empty means match all.`).option("--customer-ids <json>", `Customer IDs for customer-specific overrides.`).option("--currencies <json>", `Currency codes to match (e.g. EUR, USD).`).option("--countries <json>", `Country codes for jurisdiction-based overrides.`).option("--coupon-ids <json>", `Coupon IDs to match. Empty means match all.`).option("--client-provider-ids <json>", `Client provider IDs to match. Empty means match all.`).option("--payment-method-types <json>", `Payment method types to match. Empty means match all.`).option("--interval-period <value>", `Billing interval period filter (month, year, etc.).`).option("--interval-count <number>", `Billing interval count filter.`).option("--revenue-ledger-account-id <value>", `Revenue ledger account ID used for invoice line revenue routing.`).option("--deferred-revenue-ledger-account-id <value>", `Deferred revenue ledger account ID used before revenue is recognized.`).option("--deferred-discount-ledger-account-id <value>", `Deferred discount ledger account ID used before discounts are recognized.`).option("--contra-revenue-ledger-account-id <value>", `Contra revenue ledger account ID used for amounts that reduce revenue.`).option("--discount-ledger-account-id <value>", `Discount ledger account ID used for recognized discounts.`).option("--ar-ledger-account-id <value>", `Accounts receivable ledger account ID used for invoice posting.`).option("--cash-ledger-account-id <value>", `Cash ledger account ID used for payment settlement.`).option("--payments-clearing-ledger-account-id <value>", `Payments clearing ledger account ID used while payments settle.`).option("--output-tax-ledger-account-id <value>", `Output tax ledger account ID used for tax liability.`).option("--uncollectible-debit-ledger-account-id <value>", `Ledger account ID debited when an invoice becomes uncollectible. Use an asset account for doubtful-receivable reclassification or an expense account for direct write-off.`).option("--customer-credits-ledger-account-id <value>", `Customer credits ledger account ID used for credit balances.`).option("--journal-id <value>", `Journal ID used to route entries in the accounting provider.`).option("--entity-type <value>", `Entity type the rule applies to.`).addHelpText("after", `
39011
+ resource.command("create").description(`Create a new accounting rule for account code routing or journal posting, with the filters, accounts and required fields the rule editor applies to its category.`).option("--ledger-id <value>", `Identifier of the ledger this rule belongs to.`).option("--name <value>", `Optional user-defined name for the rule.`).requiredOption("--category <value>", `Rule category (e.g. accounting_software, invoice_posted).`).requiredOption("--priority <number>", `Override order. Higher priority wins when multiple rules match.`).option("--product-ids <json>", `Product IDs to match. Empty means match all.`).option("--product-types <json>", `Product types to match. Allowed values: flat_fee, dynamic, seat, credit. Empty means match all.`).option("--customer-ids <json>", `Customer IDs for customer-specific overrides.`).option("--currencies <json>", `Currency codes to match (e.g. EUR, USD).`).option("--countries <json>", `Country codes for jurisdiction-based overrides.`).option("--tax-schemes <json>", `Tax schemes to match. A context without a tax scheme never matches a rule that sets this filter. Empty means match all.`).option("--tax-territories <json>", `Tax territory country codes to match. A context without a tax territory never matches a rule that sets this filter. Empty means match all.`).option("--tax-rate-classes <json>", `Tax rate classes to match. A context without a tax rate class never matches a rule that sets this filter. Empty means match all.`).option("--coupon-ids <json>", `Coupon IDs to match. Empty means match all.`).option("--client-provider-ids <json>", `Client provider IDs to match. Empty means match all.`).option("--payment-method-types <json>", `Payment method types to match. Empty means match all.`).option("--bank-account-ids <json>", `Bank account IDs to match. Empty means match all.`).option("--invoice-types <json>", `Invoice kinds to match: \`invoice\` or \`document\`. Refunds and other standard invoices match as \`invoice\`. A context without an invoice, such as a PSP payout, never matches a rule that sets this filter. Empty means match all.`).option("--interval-period <value>", `Billing interval period filter (months, years, etc.).`).option("--interval-count <number>", `Billing interval count filter.`).option("--custom-property-filters <json>", `Invoice custom property filters. A rule matches only when every entry matches (AND across entries), and an entry matches when the invoice value is one of its \`values\` (any-of). Matching is strict: an invoice without a value for the property never matches. Each entry adds 10 to the \`suggested_priority\` returned by the rule defaults endpoint. Allowed on invoice_posted, invoice_settled, revenue_recognition, credit_note_created and accounting_software (invoice side) rules. An invoice_settled rule with filters cannot set \`payments_clearing_ledger_account_id\`, as PSP payouts are booked without the invoice. Empty means match all.`).option("--revenue-ledger-account-id <value>", `Revenue ledger account ID used for invoice line revenue routing. Must be a \`revenue\` account. On accounting_software rules, a \`revenue\` or \`contra_revenue\` account with entity_type invoice, an \`asset\` or \`contra_asset\` account with entity_type payment.`).option("--deferred-revenue-ledger-account-id <value>", `Deferred revenue ledger account ID used before revenue is recognized. Must be a \`liability\` account.`).option("--deferred-discount-ledger-account-id <value>", `Deferred discount ledger account ID used before discounts are recognized. Must be an \`asset\` or \`contra_liability\` account.`).option("--contra-revenue-ledger-account-id <value>", `Contra revenue ledger account ID used for amounts that reduce revenue. Must be a \`contra_revenue\` account.`).option("--discount-ledger-account-id <value>", `Discount ledger account ID used for recognized discounts. Must be a \`contra_revenue\` account.`).option("--ar-ledger-account-id <value>", `Accounts receivable ledger account ID used for invoice posting. Must be an \`asset\` account.`).option("--cash-ledger-account-id <value>", `Cash ledger account ID used for payment settlement. Must be an \`asset\` account.`).option("--payments-clearing-ledger-account-id <value>", `Payments clearing ledger account ID used while payments settle. Must be an \`asset\` account.`).option("--output-tax-ledger-account-id <value>", `Output tax ledger account ID used for tax liability. Must be a \`liability\` account.`).option("--uncollectible-debit-ledger-account-id <value>", `Ledger account ID debited when an invoice becomes uncollectible. Must be an \`asset\` account, for doubtful-receivable reclassification, or an \`expense\` account, for direct write-off.`).option("--allowance-for-doubtful-accounts-id <value>", `Allowance for doubtful accounts ledger account ID, set on credit_note_created rules. Must be a \`contra_asset\` account.`).option("--provider-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment provider fees when a payment settles. Must be an \`expense\` account.`).option("--payment-processing-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment processing fees when a payment settles. Takes precedence over \`provider_fees_expense_ledger_account_id\` when set by the same or a higher priority rule. Must be an \`expense\` account.`).option("--payment-processing-fees-revenue-ledger-account-id <value>", `Payment processing fees revenue ledger account ID, set on invoice_settled rules. Must be a \`revenue\` account.`).option("--customer-credits-ledger-account-id <value>", `Customer credits ledger account ID used for credit balances. Must be a \`liability\` account.`).option("--rev-rec-method <value>", `Revenue recognition method.`).option("--rev-rec-granularity <value>", `Recognition period granularity. Used when \`rev_rec_method\` is \`over_time\`.`).option("--rev-rec-point-in-time-basis <value>", `Date revenue is recognized on. Used when \`rev_rec_method\` is \`point_in_time\`.`).option("--discount-recognition-method <value>", `Method used to recognize discounts.`).option("--journal-id <value>", `Journal ID used to route entries in the accounting provider.`).option("--entity-type <value>", `Entity type the rule applies to.`).addHelpText("after", `
39017
39012
  Examples:
39018
39013
  hyperline accounting-rules create --category <category> --priority <priority>
39019
39014
  hyperline accounting-rules create --category <category> --priority <priority> --ledger-id <ledger_id> --name <name>
@@ -39052,8 +39047,24 @@ Examples:
39052
39047
  args.output_tax_ledger_account_id = opts.outputTaxLedgerAccountId;
39053
39048
  if (opts.uncollectibleDebitLedgerAccountId !== void 0)
39054
39049
  args.uncollectible_debit_ledger_account_id = opts.uncollectibleDebitLedgerAccountId;
39050
+ if (opts.allowanceForDoubtfulAccountsId !== void 0)
39051
+ args.allowance_for_doubtful_accounts_id = opts.allowanceForDoubtfulAccountsId;
39052
+ if (opts.providerFeesExpenseLedgerAccountId !== void 0)
39053
+ args.provider_fees_expense_ledger_account_id = opts.providerFeesExpenseLedgerAccountId;
39054
+ if (opts.paymentProcessingFeesExpenseLedgerAccountId !== void 0)
39055
+ args.payment_processing_fees_expense_ledger_account_id = opts.paymentProcessingFeesExpenseLedgerAccountId;
39056
+ if (opts.paymentProcessingFeesRevenueLedgerAccountId !== void 0)
39057
+ args.payment_processing_fees_revenue_ledger_account_id = opts.paymentProcessingFeesRevenueLedgerAccountId;
39055
39058
  if (opts.customerCreditsLedgerAccountId !== void 0)
39056
39059
  args.customer_credits_ledger_account_id = opts.customerCreditsLedgerAccountId;
39060
+ if (opts.revRecMethod !== void 0)
39061
+ args.rev_rec_method = opts.revRecMethod;
39062
+ if (opts.revRecGranularity !== void 0)
39063
+ args.rev_rec_granularity = opts.revRecGranularity;
39064
+ if (opts.revRecPointInTimeBasis !== void 0)
39065
+ args.rev_rec_point_in_time_basis = opts.revRecPointInTimeBasis;
39066
+ if (opts.discountRecognitionMethod !== void 0)
39067
+ args.discount_recognition_method = opts.discountRecognitionMethod;
39057
39068
  if (opts.journalId !== void 0)
39058
39069
  args.journal_id = opts.journalId;
39059
39070
  if (opts.entityType !== void 0)
@@ -39072,12 +39083,24 @@ Examples:
39072
39083
  args.currencies = JSON.parse(opts.currencies);
39073
39084
  if (opts.countries !== void 0)
39074
39085
  args.countries = JSON.parse(opts.countries);
39086
+ if (opts.taxSchemes !== void 0)
39087
+ args.tax_schemes = JSON.parse(opts.taxSchemes);
39088
+ if (opts.taxTerritories !== void 0)
39089
+ args.tax_territories = JSON.parse(opts.taxTerritories);
39090
+ if (opts.taxRateClasses !== void 0)
39091
+ args.tax_rate_classes = JSON.parse(opts.taxRateClasses);
39075
39092
  if (opts.couponIds !== void 0)
39076
39093
  args.coupon_ids = JSON.parse(opts.couponIds);
39077
39094
  if (opts.clientProviderIds !== void 0)
39078
39095
  args.client_provider_ids = JSON.parse(opts.clientProviderIds);
39079
39096
  if (opts.paymentMethodTypes !== void 0)
39080
39097
  args.payment_method_types = JSON.parse(opts.paymentMethodTypes);
39098
+ if (opts.bankAccountIds !== void 0)
39099
+ args.bank_account_ids = JSON.parse(opts.bankAccountIds);
39100
+ if (opts.invoiceTypes !== void 0)
39101
+ args.invoice_types = JSON.parse(opts.invoiceTypes);
39102
+ if (opts.customPropertyFilters !== void 0)
39103
+ args.custom_property_filters = JSON.parse(opts.customPropertyFilters);
39081
39104
  await ctx.execute({
39082
39105
  method: "POST",
39083
39106
  path: "/v1/accounting/rules",
@@ -39085,7 +39108,7 @@ Examples:
39085
39108
  queryParamKeys: []
39086
39109
  });
39087
39110
  });
39088
- resource.command("update").description(`Update an existing accounting rule.`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `Optional user-defined name for the rule.`).option("--category <value>", `Rule category (e.g. accounting_software, invoice_posted).`).option("--priority <number>", `Override order. Higher priority wins when multiple rules match.`).option("--product-ids <json>", `Product IDs to match. Empty means match all.`).option("--product-types <json>", `Product types to match. Allowed values: flat_fee, dynamic, seat, credit. Empty means match all.`).option("--customer-ids <json>", `Customer IDs for customer-specific overrides.`).option("--currencies <json>", `Currency codes to match (e.g. EUR, USD).`).option("--countries <json>", `Country codes for jurisdiction-based overrides.`).option("--coupon-ids <json>", `Coupon IDs to match. Empty means match all.`).option("--client-provider-ids <json>", `Client provider IDs to match. Empty means match all.`).option("--payment-method-types <json>", `Payment method types to match. Empty means match all.`).option("--interval-period <value>", `Billing interval period filter (month, year, etc.).`).option("--interval-count <number>", `Billing interval count filter.`).option("--revenue-ledger-account-id <value>", `Revenue ledger account ID used for invoice line revenue routing.`).option("--deferred-revenue-ledger-account-id <value>", `Deferred revenue ledger account ID used before revenue is recognized.`).option("--deferred-discount-ledger-account-id <value>", `Deferred discount ledger account ID used before discounts are recognized.`).option("--contra-revenue-ledger-account-id <value>", `Contra revenue ledger account ID used for amounts that reduce revenue.`).option("--discount-ledger-account-id <value>", `Discount ledger account ID used for recognized discounts.`).option("--ar-ledger-account-id <value>", `Accounts receivable ledger account ID used for invoice posting.`).option("--cash-ledger-account-id <value>", `Cash ledger account ID used for payment settlement.`).option("--payments-clearing-ledger-account-id <value>", `Payments clearing ledger account ID used while payments settle.`).option("--output-tax-ledger-account-id <value>", `Output tax ledger account ID used for tax liability.`).option("--uncollectible-debit-ledger-account-id <value>", `Ledger account ID debited when an invoice becomes uncollectible. Use an asset account for doubtful-receivable reclassification or an expense account for direct write-off.`).option("--customer-credits-ledger-account-id <value>", `Customer credits ledger account ID used for credit balances.`).option("--journal-id <value>", `Journal ID used to route entries in the accounting provider.`).option("--entity-type <value>", `Entity type the rule applies to.`).addHelpText("after", `
39111
+ resource.command("update").description(`Update an existing accounting rule, with the filters, accounts and required fields the rule editor applies to its category.`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `Optional user-defined name for the rule.`).option("--category <value>", `Rule category. Cannot be changed after creation, must match the current category when sent.`).option("--priority <number>", `Override order. Higher priority wins when multiple rules match.`).option("--product-ids <json>", `Product IDs to match. Empty means match all.`).option("--product-types <json>", `Product types to match. Allowed values: flat_fee, dynamic, seat, credit. Empty means match all.`).option("--customer-ids <json>", `Customer IDs for customer-specific overrides.`).option("--currencies <json>", `Currency codes to match (e.g. EUR, USD).`).option("--countries <json>", `Country codes for jurisdiction-based overrides.`).option("--tax-schemes <json>", `Tax schemes to match. A context without a tax scheme never matches a rule that sets this filter. Empty means match all.`).option("--tax-territories <json>", `Tax territory country codes to match. A context without a tax territory never matches a rule that sets this filter. Empty means match all.`).option("--tax-rate-classes <json>", `Tax rate classes to match. A context without a tax rate class never matches a rule that sets this filter. Empty means match all.`).option("--coupon-ids <json>", `Coupon IDs to match. Empty means match all.`).option("--client-provider-ids <json>", `Client provider IDs to match. Empty means match all.`).option("--payment-method-types <json>", `Payment method types to match. Empty means match all.`).option("--bank-account-ids <json>", `Bank account IDs to match. Empty means match all.`).option("--invoice-types <json>", `Invoice kinds to match: \`invoice\` or \`document\`. Refunds and other standard invoices match as \`invoice\`. A context without an invoice, such as a PSP payout, never matches a rule that sets this filter. Empty means match all.`).option("--interval-period <value>", `Billing interval period filter (months, years, etc.).`).option("--interval-count <number>", `Billing interval count filter.`).option("--custom-property-filters <json>", `Invoice custom property filters. A rule matches only when every entry matches (AND across entries), and an entry matches when the invoice value is one of its \`values\` (any-of). Matching is strict: an invoice without a value for the property never matches. Each entry adds 10 to the \`suggested_priority\` returned by the rule defaults endpoint. Allowed on invoice_posted, invoice_settled, revenue_recognition, credit_note_created and accounting_software (invoice side) rules. An invoice_settled rule with filters cannot set \`payments_clearing_ledger_account_id\`, as PSP payouts are booked without the invoice. Empty means match all.`).option("--revenue-ledger-account-id <value>", `Revenue ledger account ID used for invoice line revenue routing. Must be a \`revenue\` account. On accounting_software rules, a \`revenue\` or \`contra_revenue\` account with entity_type invoice, an \`asset\` or \`contra_asset\` account with entity_type payment.`).option("--deferred-revenue-ledger-account-id <value>", `Deferred revenue ledger account ID used before revenue is recognized. Must be a \`liability\` account.`).option("--deferred-discount-ledger-account-id <value>", `Deferred discount ledger account ID used before discounts are recognized. Must be an \`asset\` or \`contra_liability\` account.`).option("--contra-revenue-ledger-account-id <value>", `Contra revenue ledger account ID used for amounts that reduce revenue. Must be a \`contra_revenue\` account.`).option("--discount-ledger-account-id <value>", `Discount ledger account ID used for recognized discounts. Must be a \`contra_revenue\` account.`).option("--ar-ledger-account-id <value>", `Accounts receivable ledger account ID used for invoice posting. Must be an \`asset\` account.`).option("--cash-ledger-account-id <value>", `Cash ledger account ID used for payment settlement. Must be an \`asset\` account.`).option("--payments-clearing-ledger-account-id <value>", `Payments clearing ledger account ID used while payments settle. Must be an \`asset\` account.`).option("--output-tax-ledger-account-id <value>", `Output tax ledger account ID used for tax liability. Must be a \`liability\` account.`).option("--uncollectible-debit-ledger-account-id <value>", `Ledger account ID debited when an invoice becomes uncollectible. Must be an \`asset\` account, for doubtful-receivable reclassification, or an \`expense\` account, for direct write-off.`).option("--allowance-for-doubtful-accounts-id <value>", `Allowance for doubtful accounts ledger account ID, set on credit_note_created rules. Must be a \`contra_asset\` account.`).option("--provider-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment provider fees when a payment settles. Must be an \`expense\` account.`).option("--payment-processing-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment processing fees when a payment settles. Takes precedence over \`provider_fees_expense_ledger_account_id\` when set by the same or a higher priority rule. Must be an \`expense\` account.`).option("--payment-processing-fees-revenue-ledger-account-id <value>", `Payment processing fees revenue ledger account ID, set on invoice_settled rules. Must be a \`revenue\` account.`).option("--customer-credits-ledger-account-id <value>", `Customer credits ledger account ID used for credit balances. Must be a \`liability\` account.`).option("--rev-rec-method <value>", `Revenue recognition method.`).option("--rev-rec-granularity <value>", `Recognition period granularity. Used when \`rev_rec_method\` is \`over_time\`.`).option("--rev-rec-point-in-time-basis <value>", `Date revenue is recognized on. Used when \`rev_rec_method\` is \`point_in_time\`.`).option("--discount-recognition-method <value>", `Method used to recognize discounts.`).option("--journal-id <value>", `Journal ID used to route entries in the accounting provider.`).option("--entity-type <value>", `Entity type the rule applies to.`).addHelpText("after", `
39089
39112
  Examples:
39090
39113
  hyperline accounting-rules update --id <id>
39091
39114
  hyperline accounting-rules update --id <id> --name <name> --category <category>
@@ -39124,8 +39147,24 @@ Examples:
39124
39147
  args.output_tax_ledger_account_id = opts.outputTaxLedgerAccountId;
39125
39148
  if (opts.uncollectibleDebitLedgerAccountId !== void 0)
39126
39149
  args.uncollectible_debit_ledger_account_id = opts.uncollectibleDebitLedgerAccountId;
39150
+ if (opts.allowanceForDoubtfulAccountsId !== void 0)
39151
+ args.allowance_for_doubtful_accounts_id = opts.allowanceForDoubtfulAccountsId;
39152
+ if (opts.providerFeesExpenseLedgerAccountId !== void 0)
39153
+ args.provider_fees_expense_ledger_account_id = opts.providerFeesExpenseLedgerAccountId;
39154
+ if (opts.paymentProcessingFeesExpenseLedgerAccountId !== void 0)
39155
+ args.payment_processing_fees_expense_ledger_account_id = opts.paymentProcessingFeesExpenseLedgerAccountId;
39156
+ if (opts.paymentProcessingFeesRevenueLedgerAccountId !== void 0)
39157
+ args.payment_processing_fees_revenue_ledger_account_id = opts.paymentProcessingFeesRevenueLedgerAccountId;
39127
39158
  if (opts.customerCreditsLedgerAccountId !== void 0)
39128
39159
  args.customer_credits_ledger_account_id = opts.customerCreditsLedgerAccountId;
39160
+ if (opts.revRecMethod !== void 0)
39161
+ args.rev_rec_method = opts.revRecMethod;
39162
+ if (opts.revRecGranularity !== void 0)
39163
+ args.rev_rec_granularity = opts.revRecGranularity;
39164
+ if (opts.revRecPointInTimeBasis !== void 0)
39165
+ args.rev_rec_point_in_time_basis = opts.revRecPointInTimeBasis;
39166
+ if (opts.discountRecognitionMethod !== void 0)
39167
+ args.discount_recognition_method = opts.discountRecognitionMethod;
39129
39168
  if (opts.journalId !== void 0)
39130
39169
  args.journal_id = opts.journalId;
39131
39170
  if (opts.entityType !== void 0)
@@ -39144,12 +39183,24 @@ Examples:
39144
39183
  args.currencies = JSON.parse(opts.currencies);
39145
39184
  if (opts.countries !== void 0)
39146
39185
  args.countries = JSON.parse(opts.countries);
39186
+ if (opts.taxSchemes !== void 0)
39187
+ args.tax_schemes = JSON.parse(opts.taxSchemes);
39188
+ if (opts.taxTerritories !== void 0)
39189
+ args.tax_territories = JSON.parse(opts.taxTerritories);
39190
+ if (opts.taxRateClasses !== void 0)
39191
+ args.tax_rate_classes = JSON.parse(opts.taxRateClasses);
39147
39192
  if (opts.couponIds !== void 0)
39148
39193
  args.coupon_ids = JSON.parse(opts.couponIds);
39149
39194
  if (opts.clientProviderIds !== void 0)
39150
39195
  args.client_provider_ids = JSON.parse(opts.clientProviderIds);
39151
39196
  if (opts.paymentMethodTypes !== void 0)
39152
39197
  args.payment_method_types = JSON.parse(opts.paymentMethodTypes);
39198
+ if (opts.bankAccountIds !== void 0)
39199
+ args.bank_account_ids = JSON.parse(opts.bankAccountIds);
39200
+ if (opts.invoiceTypes !== void 0)
39201
+ args.invoice_types = JSON.parse(opts.invoiceTypes);
39202
+ if (opts.customPropertyFilters !== void 0)
39203
+ args.custom_property_filters = JSON.parse(opts.customPropertyFilters);
39153
39204
  await ctx.execute({
39154
39205
  method: "PUT",
39155
39206
  path: "/v1/accounting/rules/{id}",
@@ -39183,7 +39234,7 @@ Examples:
39183
39234
  queryParamKeys: []
39184
39235
  });
39185
39236
  });
39186
- resource.command("resolve").description(`Preview which account codes would be resolved for a given context.`).requiredOption("--ledger-id <value>", `Identifier of the ledger this rule belongs to.`).requiredOption("--category <value>", `Rule category (e.g. accounting_software, invoice_posted).`).option("--product-id <value>", `Product ID to resolve against.`).option("--product-type <value>", `Product type to resolve against.`).option("--currency <value>", `Currency code to resolve against.`).option("--country <value>", `Country code to resolve against.`).option("--customer-id <value>", `Customer ID to resolve against.`).option("--invoice-type <value>", `Invoice kind to resolve against. Accepts \`invoice\` or \`document\`; any other invoice kind is matched as \`invoice\`.`).option("--interval-period <value>", `Billing interval period filter (month, year, etc.).`).option("--interval-count <number>", `Billing interval count filter.`).addHelpText("after", `
39237
+ resource.command("resolve").description(`Preview which account codes would be resolved for a given context.`).requiredOption("--ledger-id <value>", `Identifier of the ledger this rule belongs to.`).requiredOption("--category <value>", `Rule category (e.g. accounting_software, invoice_posted).`).option("--product-id <value>", `Product ID to resolve against.`).option("--product-type <value>", `Product type to resolve against.`).option("--currency <value>", `Currency code to resolve against.`).option("--country <value>", `Country code to resolve against.`).option("--tax-scheme <value>", `Tax scheme to resolve against.`).option("--tax-territory <value>", `Tax territory country code to resolve against.`).option("--tax-rate-class <value>", `Tax rate class to resolve against.`).option("--customer-id <value>", `Customer ID to resolve against.`).option("--coupon-id <value>", `Coupon ID to resolve against.`).option("--client-provider-id <value>", `Client provider ID to resolve against.`).option("--payment-method-type <value>", `Payment method type to resolve against.`).option("--bank-account-id <value>", `Bank account ID to resolve against.`).option("--invoice-type <value>", `Invoice kind to resolve against. Accepts \`invoice\` or \`document\`; any other invoice kind is matched as \`invoice\`.`).option("--interval-period <value>", `Billing interval period filter (months, years, etc.).`).option("--interval-count <number>", `Billing interval count filter.`).option("--custom-properties <json>", `Invoice custom property values to resolve against, keyed by custom property slug. Unknown slugs and null values are ignored. Rules with custom property filters never match without them.`).addHelpText("after", `
39187
39238
  Examples:
39188
39239
  hyperline accounting-rules resolve --ledger-id <ledger_id> --category <category>
39189
39240
  hyperline accounting-rules resolve --ledger-id <ledger_id> --category <category> --product-id <product_id> --product-type <product_type>
@@ -39206,14 +39257,30 @@ Examples:
39206
39257
  args.currency = opts.currency;
39207
39258
  if (opts.country !== void 0)
39208
39259
  args.country = opts.country;
39260
+ if (opts.taxScheme !== void 0)
39261
+ args.tax_scheme = opts.taxScheme;
39262
+ if (opts.taxTerritory !== void 0)
39263
+ args.tax_territory = opts.taxTerritory;
39264
+ if (opts.taxRateClass !== void 0)
39265
+ args.tax_rate_class = opts.taxRateClass;
39209
39266
  if (opts.customerId !== void 0)
39210
39267
  args.customer_id = opts.customerId;
39268
+ if (opts.couponId !== void 0)
39269
+ args.coupon_id = opts.couponId;
39270
+ if (opts.clientProviderId !== void 0)
39271
+ args.client_provider_id = opts.clientProviderId;
39272
+ if (opts.paymentMethodType !== void 0)
39273
+ args.payment_method_type = opts.paymentMethodType;
39274
+ if (opts.bankAccountId !== void 0)
39275
+ args.bank_account_id = opts.bankAccountId;
39211
39276
  if (opts.invoiceType !== void 0)
39212
39277
  args.invoice_type = opts.invoiceType;
39213
39278
  if (opts.intervalPeriod !== void 0)
39214
39279
  args.interval_period = opts.intervalPeriod;
39215
39280
  if (opts.intervalCount !== void 0)
39216
39281
  args.interval_count = Number(opts.intervalCount);
39282
+ if (opts.customProperties !== void 0)
39283
+ args.custom_properties = JSON.parse(opts.customProperties);
39217
39284
  await ctx.execute({
39218
39285
  method: "POST",
39219
39286
  path: "/v1/accounting/rules/resolve",
@@ -39223,164 +39290,158 @@ Examples:
39223
39290
  });
39224
39291
  }
39225
39292
 
39226
- // build/commands/generated/agents.js
39227
- function registerAgentsCommands(parent) {
39228
- const resource = parent.command("agents").description("Manage agents");
39229
- 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.
39230
-
39231
- - wallet: Charges a monetary wallet.
39232
- - credits: Consumes a credit balance.
39233
- - windows: Meters weighted units against rolling allowances.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39293
+ // build/commands/generated/aggregators.js
39294
+ function registerAggregatorsCommands(parent) {
39295
+ const resource = parent.command("aggregators").description("Manage aggregators");
39296
+ 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", `
39234
39297
  Examples:
39235
- hyperline agents list-agent-plans
39236
- hyperline agents list-agent-plans --mode <mode> --take <take>`).action(async (opts) => {
39298
+ hyperline aggregators list
39299
+ hyperline aggregators list --take <take>`).action(async (opts) => {
39237
39300
  const ctx = resource.parent?.opts()._ctx;
39238
39301
  if (!ctx) {
39239
39302
  process.stderr.write("Error: Not authenticated\n");
39240
39303
  process.exit(1);
39241
39304
  }
39242
39305
  const args = {};
39243
- if (opts.mode !== void 0)
39244
- args.mode = opts.mode;
39245
39306
  if (opts.take !== void 0)
39246
39307
  args.take = Number(opts.take);
39247
39308
  if (opts.skip !== void 0)
39248
39309
  args.skip = Number(opts.skip);
39249
39310
  await ctx.execute({
39250
39311
  method: "GET",
39251
- path: "/v1/agents/plans",
39312
+ path: "/v1/aggregators",
39252
39313
  args,
39253
- queryParamKeys: ["mode", "take", "skip"]
39314
+ queryParamKeys: ["take", "skip"]
39254
39315
  });
39255
39316
  });
39256
- 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.
39257
-
39258
- - refuse: Rejects the call that crosses the boundary without deducting usage.
39259
- - 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.
39260
-
39261
- - calendar_month: Settles at the end of each UTC calendar month.`).requiredOption("--mode <value>", `Billing mode.
39262
-
39263
- - wallet: Charges a monetary wallet.
39264
- - credits: Consumes a credit balance.
39265
- - windows: Meters weighted units against rolling allowances.`).addHelpText("after", `
39317
+ 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", `
39266
39318
  Examples:
39267
- hyperline agents create-agent-plan --name <name> --mode <mode>
39268
- hyperline agents create-agent-plan --name <name> --mode <mode> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39269
- hyperline agents create-agent-plan --name <name> --mode <mode> --output json`).action(async (opts) => {
39319
+ hyperline aggregators create --entity <entity> --operation <operation>
39320
+ hyperline aggregators create --entity <entity> --operation <operation> --type <type> --where <where>
39321
+ hyperline aggregators create --entity <entity> --operation <operation> --output json`).action(async (opts) => {
39270
39322
  const ctx = resource.parent?.opts()._ctx;
39271
39323
  if (!ctx) {
39272
39324
  process.stderr.write("Error: Not authenticated\n");
39273
39325
  process.exit(1);
39274
39326
  }
39275
39327
  const args = {};
39328
+ if (opts.entity !== void 0)
39329
+ args.entity = opts.entity;
39330
+ if (opts.type !== void 0)
39331
+ args.type = opts.type;
39276
39332
  if (opts.name !== void 0)
39277
39333
  args.name = opts.name;
39278
- if (opts.rateCardId !== void 0)
39279
- args.rate_card_id = opts.rateCardId;
39280
- if (opts.overageMode !== void 0)
39281
- args.overage_mode = opts.overageMode;
39282
- if (opts.markupPercent !== void 0)
39283
- args.markup_percent = opts.markupPercent;
39284
- if (opts.overageMarkupPercent !== void 0)
39285
- args.overage_markup_percent = opts.overageMarkupPercent;
39286
- if (opts.overageRateCardId !== void 0)
39287
- args.overage_rate_card_id = opts.overageRateCardId;
39288
- if (opts.perSeatCredits !== void 0)
39289
- args.per_seat_credits = opts.perSeatCredits;
39290
- if (opts.settlementSchedule !== void 0)
39291
- args.settlement_schedule = opts.settlementSchedule;
39292
- if (opts.mode !== void 0)
39293
- args.mode = opts.mode;
39294
- if (opts.settlementIntervalMinutes !== void 0)
39295
- args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39296
- if (opts.grantRolloverEnabled !== void 0)
39297
- args.grant_rollover_enabled = true;
39298
- if (opts.windows !== void 0)
39299
- args.windows = JSON.parse(opts.windows);
39334
+ if (opts.description !== void 0)
39335
+ args.description = opts.description;
39336
+ if (opts.customEventName !== void 0)
39337
+ args.custom_event_name = opts.customEventName;
39338
+ if (opts.unitName !== void 0)
39339
+ args.unit_name = opts.unitName;
39340
+ if (opts.defaultIntervalPeriod !== void 0)
39341
+ args.default_interval_period = opts.defaultIntervalPeriod;
39342
+ if (opts.operation !== void 0)
39343
+ args.operation = opts.operation;
39344
+ if (opts.property !== void 0)
39345
+ args.property = opts.property;
39346
+ if (opts.defaultIntervalCount !== void 0)
39347
+ args.default_interval_count = Number(opts.defaultIntervalCount);
39348
+ if (opts.allowNegativeValues !== void 0)
39349
+ args.allow_negative_values = true;
39350
+ if (opts.aggregateOnCustomersEnabled !== void 0)
39351
+ args.aggregate_on_customers_enabled = true;
39352
+ if (opts.where !== void 0)
39353
+ args.where = JSON.parse(opts.where);
39354
+ if (opts.exposedEventKeys !== void 0)
39355
+ args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
39356
+ if (opts.thresholds !== void 0)
39357
+ args.thresholds = JSON.parse(opts.thresholds);
39300
39358
  await ctx.execute({
39301
39359
  method: "POST",
39302
- path: "/v1/agents/plans",
39360
+ path: "/v1/aggregators",
39303
39361
  args,
39304
39362
  queryParamKeys: []
39305
39363
  });
39306
39364
  });
39307
- 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", `
39365
+ resource.command("get").description(`Retrieve a specific aggregator by ID.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
39308
39366
  Examples:
39309
- hyperline agents get-agent-plan --plan-id <plan_id>`).action(async (opts) => {
39367
+ hyperline aggregators get --id <id>`).action(async (opts) => {
39310
39368
  const ctx = resource.parent?.opts()._ctx;
39311
39369
  if (!ctx) {
39312
39370
  process.stderr.write("Error: Not authenticated\n");
39313
39371
  process.exit(1);
39314
39372
  }
39315
39373
  const args = {};
39316
- if (opts.planId !== void 0)
39317
- args.plan_id = opts.planId;
39374
+ if (opts.id !== void 0)
39375
+ args.id = opts.id;
39318
39376
  await ctx.execute({
39319
39377
  method: "GET",
39320
- path: "/v1/agents/plans/{plan_id}",
39378
+ path: "/v1/aggregators/{id}",
39321
39379
  args,
39322
39380
  queryParamKeys: []
39323
39381
  });
39324
39382
  });
39325
- 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.
39326
-
39327
- - refuse: Rejects the call that crosses the boundary without deducting usage.
39328
- - 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.
39329
-
39330
- - calendar_month: Settles at the end of each UTC calendar month.`).addHelpText("after", `
39383
+ 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", `
39331
39384
  Examples:
39332
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name>
39333
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39334
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name> --output json`).action(async (opts) => {
39385
+ hyperline aggregators update --id <id>
39386
+ hyperline aggregators update --id <id> --entity <entity> --type <type>
39387
+ hyperline aggregators update --id <id> --output json`).action(async (opts) => {
39335
39388
  const ctx = resource.parent?.opts()._ctx;
39336
39389
  if (!ctx) {
39337
39390
  process.stderr.write("Error: Not authenticated\n");
39338
39391
  process.exit(1);
39339
39392
  }
39340
39393
  const args = {};
39341
- if (opts.planId !== void 0)
39342
- args.plan_id = opts.planId;
39394
+ if (opts.id !== void 0)
39395
+ args.id = opts.id;
39396
+ if (opts.entity !== void 0)
39397
+ args.entity = opts.entity;
39398
+ if (opts.type !== void 0)
39399
+ args.type = opts.type;
39343
39400
  if (opts.name !== void 0)
39344
39401
  args.name = opts.name;
39345
- if (opts.rateCardId !== void 0)
39346
- args.rate_card_id = opts.rateCardId;
39347
- if (opts.overageMode !== void 0)
39348
- args.overage_mode = opts.overageMode;
39349
- if (opts.markupPercent !== void 0)
39350
- args.markup_percent = opts.markupPercent;
39351
- if (opts.overageMarkupPercent !== void 0)
39352
- args.overage_markup_percent = opts.overageMarkupPercent;
39353
- if (opts.overageRateCardId !== void 0)
39354
- args.overage_rate_card_id = opts.overageRateCardId;
39355
- if (opts.perSeatCredits !== void 0)
39356
- args.per_seat_credits = opts.perSeatCredits;
39357
- if (opts.settlementSchedule !== void 0)
39358
- args.settlement_schedule = opts.settlementSchedule;
39359
- if (opts.settlementIntervalMinutes !== void 0)
39360
- args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39361
- if (opts.grantRolloverEnabled !== void 0)
39362
- args.grant_rollover_enabled = true;
39363
- if (opts.windows !== void 0)
39364
- args.windows = JSON.parse(opts.windows);
39402
+ if (opts.description !== void 0)
39403
+ args.description = opts.description;
39404
+ if (opts.customEventName !== void 0)
39405
+ args.custom_event_name = opts.customEventName;
39406
+ if (opts.unitName !== void 0)
39407
+ args.unit_name = opts.unitName;
39408
+ if (opts.defaultIntervalPeriod !== void 0)
39409
+ args.default_interval_period = opts.defaultIntervalPeriod;
39410
+ if (opts.operation !== void 0)
39411
+ args.operation = opts.operation;
39412
+ if (opts.property !== void 0)
39413
+ args.property = opts.property;
39414
+ if (opts.defaultIntervalCount !== void 0)
39415
+ args.default_interval_count = Number(opts.defaultIntervalCount);
39416
+ if (opts.allowNegativeValues !== void 0)
39417
+ args.allow_negative_values = true;
39418
+ if (opts.aggregateOnCustomersEnabled !== void 0)
39419
+ args.aggregate_on_customers_enabled = true;
39420
+ if (opts.where !== void 0)
39421
+ args.where = JSON.parse(opts.where);
39422
+ if (opts.exposedEventKeys !== void 0)
39423
+ args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
39424
+ if (opts.thresholds !== void 0)
39425
+ args.thresholds = JSON.parse(opts.thresholds);
39365
39426
  await ctx.execute({
39366
39427
  method: "PUT",
39367
- path: "/v1/agents/plans/{plan_id}",
39428
+ path: "/v1/aggregators/{id}",
39368
39429
  args,
39369
39430
  queryParamKeys: []
39370
39431
  });
39371
39432
  });
39372
- 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", `
39433
+ 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", `
39373
39434
  Examples:
39374
- hyperline agents delete-agent-plan --plan-id <plan_id>
39375
- hyperline agents delete-agent-plan --plan-id <plan_id> --output json`).action(async (opts) => {
39435
+ hyperline aggregators delete --id <id>
39436
+ hyperline aggregators delete --id <id> --output json`).action(async (opts) => {
39376
39437
  const ctx = resource.parent?.opts()._ctx;
39377
39438
  if (!ctx) {
39378
39439
  process.stderr.write("Error: Not authenticated\n");
39379
39440
  process.exit(1);
39380
39441
  }
39381
39442
  const args = {};
39382
- if (opts.planId !== void 0)
39383
- args.plan_id = opts.planId;
39443
+ if (opts.id !== void 0)
39444
+ args.id = opts.id;
39384
39445
  if (!opts.yes) {
39385
39446
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39386
39447
  if (!confirmed) {
@@ -39390,113 +39451,182 @@ Examples:
39390
39451
  }
39391
39452
  await ctx.execute({
39392
39453
  method: "DELETE",
39393
- path: "/v1/agents/plans/{plan_id}",
39454
+ path: "/v1/aggregators/{id}",
39394
39455
  args,
39395
39456
  queryParamKeys: []
39396
39457
  });
39397
39458
  });
39398
- 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", `
39459
+ }
39460
+
39461
+ // build/commands/generated/aggregators-usage.js
39462
+ function registerAggregators_UsageCommands(parent) {
39463
+ const resource = parent.command("aggregators-usage").description("Manage aggregators > usage");
39464
+ 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", `
39399
39465
  Examples:
39400
- hyperline agents get-agent-default-plan`).action(async (_opts) => {
39466
+ hyperline aggregators-usage get-aggregator-usage --id <id>`).action(async (opts) => {
39401
39467
  const ctx = resource.parent?.opts()._ctx;
39402
39468
  if (!ctx) {
39403
39469
  process.stderr.write("Error: Not authenticated\n");
39404
39470
  process.exit(1);
39405
39471
  }
39406
39472
  const args = {};
39473
+ if (opts.id !== void 0)
39474
+ args.id = opts.id;
39407
39475
  await ctx.execute({
39408
39476
  method: "GET",
39409
- path: "/v1/agents/default-plan",
39477
+ path: "/v1/aggregators/{id}/usage",
39410
39478
  args,
39411
39479
  queryParamKeys: []
39412
39480
  });
39413
39481
  });
39414
- 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", `
39482
+ 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", `
39415
39483
  Examples:
39416
- hyperline agents set-agent-default-plan --plan-id <plan_id>
39417
- hyperline agents set-agent-default-plan --plan-id <plan_id> --auto-apply
39418
- hyperline agents set-agent-default-plan --plan-id <plan_id> --output json`).action(async (opts) => {
39484
+ hyperline aggregators-usage get-aggregator-usage-timeseries --id <id>
39485
+ hyperline aggregators-usage get-aggregator-usage-timeseries --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
39419
39486
  const ctx = resource.parent?.opts()._ctx;
39420
39487
  if (!ctx) {
39421
39488
  process.stderr.write("Error: Not authenticated\n");
39422
39489
  process.exit(1);
39423
39490
  }
39424
39491
  const args = {};
39425
- if (opts.planId !== void 0)
39426
- args.plan_id = opts.planId;
39427
- if (opts.autoApply !== void 0)
39428
- args.auto_apply = true;
39492
+ if (opts.id !== void 0)
39493
+ args.id = opts.id;
39494
+ if (opts.startDate !== void 0)
39495
+ args.start_date = opts.startDate;
39496
+ if (opts.endDate !== void 0)
39497
+ args.end_date = opts.endDate;
39498
+ if (opts.aggregatorFilterId !== void 0)
39499
+ args.aggregator_filter_id = opts.aggregatorFilterId;
39500
+ if (opts.groupBy !== void 0)
39501
+ args.group_by = opts.groupBy;
39429
39502
  await ctx.execute({
39430
- method: "PUT",
39431
- path: "/v1/agents/default-plan",
39503
+ method: "GET",
39504
+ path: "/v1/aggregators/{id}/usage/timeseries",
39432
39505
  args,
39433
- queryParamKeys: []
39506
+ queryParamKeys: [
39507
+ "start_date",
39508
+ "end_date",
39509
+ "aggregator_filter_id",
39510
+ "group_by"
39511
+ ]
39434
39512
  });
39435
39513
  });
39436
- 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", `
39514
+ 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", `
39437
39515
  Examples:
39438
- hyperline agents clear-agent-default-plan
39439
- hyperline agents clear-agent-default-plan --output json`).action(async (opts) => {
39516
+ hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id>
39517
+ hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
39440
39518
  const ctx = resource.parent?.opts()._ctx;
39441
39519
  if (!ctx) {
39442
39520
  process.stderr.write("Error: Not authenticated\n");
39443
39521
  process.exit(1);
39444
39522
  }
39445
39523
  const args = {};
39446
- if (!opts.yes) {
39447
- const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39448
- if (!confirmed) {
39449
- process.stdout.write("Aborted.\n");
39450
- return;
39451
- }
39452
- }
39524
+ if (opts.id !== void 0)
39525
+ args.id = opts.id;
39526
+ if (opts.startDate !== void 0)
39527
+ args.start_date = opts.startDate;
39528
+ if (opts.endDate !== void 0)
39529
+ args.end_date = opts.endDate;
39530
+ if (opts.aggregatorFilterId !== void 0)
39531
+ args.aggregator_filter_id = opts.aggregatorFilterId;
39532
+ if (opts.take !== void 0)
39533
+ args.take = Number(opts.take);
39534
+ if (opts.skip !== void 0)
39535
+ args.skip = Number(opts.skip);
39453
39536
  await ctx.execute({
39454
- method: "DELETE",
39455
- path: "/v1/agents/default-plan",
39537
+ method: "GET",
39538
+ path: "/v1/aggregators/{id}/usage/group-by-customer",
39456
39539
  args,
39457
- queryParamKeys: []
39540
+ queryParamKeys: [
39541
+ "start_date",
39542
+ "end_date",
39543
+ "aggregator_filter_id",
39544
+ "take",
39545
+ "skip"
39546
+ ]
39458
39547
  });
39459
39548
  });
39460
- 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.
39461
-
39462
- - credits: Credit counts.
39463
- - units: Weighted rolling-allowance units.
39464
- - 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", `
39549
+ 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", `
39465
39550
  Examples:
39466
- hyperline agents list-agent-rate-cards
39467
- hyperline agents list-agent-rate-cards --denomination <denomination> --currency <currency>`).action(async (opts) => {
39551
+ hyperline aggregators-usage get-aggregator-usage-events --id <id>
39552
+ hyperline aggregators-usage get-aggregator-usage-events --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
39468
39553
  const ctx = resource.parent?.opts()._ctx;
39469
39554
  if (!ctx) {
39470
39555
  process.stderr.write("Error: Not authenticated\n");
39471
39556
  process.exit(1);
39472
39557
  }
39473
39558
  const args = {};
39474
- if (opts.denomination !== void 0)
39475
- args.denomination = opts.denomination;
39476
- if (opts.currency !== void 0)
39477
- args.currency = opts.currency;
39478
- if (opts.search !== void 0)
39479
- args.search = opts.search;
39559
+ if (opts.id !== void 0)
39560
+ args.id = opts.id;
39561
+ if (opts.startDate !== void 0)
39562
+ args.start_date = opts.startDate;
39563
+ if (opts.endDate !== void 0)
39564
+ args.end_date = opts.endDate;
39565
+ if (opts.aggregatorFilterId !== void 0)
39566
+ args.aggregator_filter_id = opts.aggregatorFilterId;
39480
39567
  if (opts.take !== void 0)
39481
39568
  args.take = Number(opts.take);
39482
39569
  if (opts.skip !== void 0)
39483
39570
  args.skip = Number(opts.skip);
39484
39571
  await ctx.execute({
39485
39572
  method: "GET",
39486
- path: "/v1/agents/rate-cards",
39573
+ path: "/v1/aggregators/{id}/usage/events",
39487
39574
  args,
39488
- queryParamKeys: ["denomination", "currency", "search", "take", "skip"]
39575
+ queryParamKeys: [
39576
+ "start_date",
39577
+ "end_date",
39578
+ "aggregator_filter_id",
39579
+ "take",
39580
+ "skip"
39581
+ ]
39489
39582
  });
39490
39583
  });
39491
- 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.
39584
+ }
39492
39585
 
39493
- - credits: Credit counts.
39494
- - units: Weighted rolling-allowance units.
39495
- - 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", `
39586
+ // build/commands/generated/ai-billing.js
39587
+ function registerAi_BillingCommands(parent) {
39588
+ const resource = parent.command("ai-billing").description("Manage ai > billing");
39589
+ 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.
39590
+
39591
+ - wallet: Charges a monetary wallet.
39592
+ - credits: Consumes a credit balance.
39593
+ - windows: Meters weighted units against rolling allowances.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
39594
+ Examples:
39595
+ hyperline ai-billing list-agent-plans
39596
+ hyperline ai-billing list-agent-plans --mode <mode> --take <take>`).action(async (opts) => {
39597
+ const ctx = resource.parent?.opts()._ctx;
39598
+ if (!ctx) {
39599
+ process.stderr.write("Error: Not authenticated\n");
39600
+ process.exit(1);
39601
+ }
39602
+ const args = {};
39603
+ if (opts.mode !== void 0)
39604
+ args.mode = opts.mode;
39605
+ if (opts.take !== void 0)
39606
+ args.take = Number(opts.take);
39607
+ if (opts.skip !== void 0)
39608
+ args.skip = Number(opts.skip);
39609
+ await ctx.execute({
39610
+ method: "GET",
39611
+ path: "/v1/ai/billing/plans",
39612
+ args,
39613
+ queryParamKeys: ["mode", "take", "skip"]
39614
+ });
39615
+ });
39616
+ 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.
39617
+
39618
+ - refuse: Rejects the call that crosses the boundary without deducting usage.
39619
+ - 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.
39620
+
39621
+ - calendar_month: Settles at the end of each UTC calendar month.`).requiredOption("--mode <value>", `Billing mode.
39622
+
39623
+ - wallet: Charges a monetary wallet.
39624
+ - credits: Consumes a credit balance.
39625
+ - windows: Meters weighted units against rolling allowances.`).addHelpText("after", `
39496
39626
  Examples:
39497
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination>
39498
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --fallback-per-usd <fallback_per_usd> --currency <currency>
39499
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --output json`).action(async (opts) => {
39627
+ hyperline ai-billing create-agent-plan --name <name> --mode <mode>
39628
+ hyperline ai-billing create-agent-plan --name <name> --mode <mode> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39629
+ hyperline ai-billing create-agent-plan --name <name> --mode <mode> --output json`).action(async (opts) => {
39500
39630
  const ctx = resource.parent?.opts()._ctx;
39501
39631
  if (!ctx) {
39502
39632
  process.stderr.write("Error: Not authenticated\n");
@@ -39505,77 +39635,174 @@ Examples:
39505
39635
  const args = {};
39506
39636
  if (opts.name !== void 0)
39507
39637
  args.name = opts.name;
39508
- if (opts.fallbackPerUsd !== void 0)
39509
- args.fallback_per_usd = opts.fallbackPerUsd;
39510
- if (opts.denomination !== void 0)
39511
- args.denomination = opts.denomination;
39512
- if (opts.currency !== void 0)
39513
- args.currency = opts.currency;
39514
- if (opts.rows !== void 0)
39515
- args.rows = JSON.parse(opts.rows);
39638
+ if (opts.rateCardId !== void 0)
39639
+ args.rate_card_id = opts.rateCardId;
39640
+ if (opts.overageMode !== void 0)
39641
+ args.overage_mode = opts.overageMode;
39642
+ if (opts.markupPercent !== void 0)
39643
+ args.markup_percent = opts.markupPercent;
39644
+ if (opts.overageMarkupPercent !== void 0)
39645
+ args.overage_markup_percent = opts.overageMarkupPercent;
39646
+ if (opts.overageRateCardId !== void 0)
39647
+ args.overage_rate_card_id = opts.overageRateCardId;
39648
+ if (opts.perSeatCredits !== void 0)
39649
+ args.per_seat_credits = opts.perSeatCredits;
39650
+ if (opts.settlementSchedule !== void 0)
39651
+ args.settlement_schedule = opts.settlementSchedule;
39652
+ if (opts.mode !== void 0)
39653
+ args.mode = opts.mode;
39654
+ if (opts.settlementIntervalMinutes !== void 0)
39655
+ args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39656
+ if (opts.grantRolloverEnabled !== void 0)
39657
+ args.grant_rollover_enabled = true;
39658
+ if (opts.windows !== void 0)
39659
+ args.windows = JSON.parse(opts.windows);
39516
39660
  await ctx.execute({
39517
39661
  method: "POST",
39518
- path: "/v1/agents/rate-cards",
39662
+ path: "/v1/ai/billing/plans",
39519
39663
  args,
39520
39664
  queryParamKeys: []
39521
39665
  });
39522
39666
  });
39523
- 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", `
39667
+ 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", `
39524
39668
  Examples:
39525
- hyperline agents get-agent-rate-card --rate-card-id <rate_card_id>`).action(async (opts) => {
39669
+ hyperline ai-billing get-agent-default-plan`).action(async (_opts) => {
39526
39670
  const ctx = resource.parent?.opts()._ctx;
39527
39671
  if (!ctx) {
39528
39672
  process.stderr.write("Error: Not authenticated\n");
39529
39673
  process.exit(1);
39530
39674
  }
39531
39675
  const args = {};
39532
- if (opts.rateCardId !== void 0)
39533
- args.rate_card_id = opts.rateCardId;
39534
39676
  await ctx.execute({
39535
39677
  method: "GET",
39536
- path: "/v1/agents/rate-cards/{rate_card_id}",
39678
+ path: "/v1/ai/billing/plans/default",
39537
39679
  args,
39538
39680
  queryParamKeys: []
39539
39681
  });
39540
39682
  });
39541
- 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", `
39683
+ 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", `
39542
39684
  Examples:
39543
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows>
39544
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows> --fallback-per-usd <fallback_per_usd>
39545
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows> --output json`).action(async (opts) => {
39685
+ hyperline ai-billing set-agent-default-plan --plan-id <plan_id>
39686
+ hyperline ai-billing set-agent-default-plan --plan-id <plan_id> --auto-apply
39687
+ hyperline ai-billing set-agent-default-plan --plan-id <plan_id> --output json`).action(async (opts) => {
39546
39688
  const ctx = resource.parent?.opts()._ctx;
39547
39689
  if (!ctx) {
39548
39690
  process.stderr.write("Error: Not authenticated\n");
39549
39691
  process.exit(1);
39550
39692
  }
39551
39693
  const args = {};
39552
- if (opts.rateCardId !== void 0)
39553
- args.rate_card_id = opts.rateCardId;
39554
- if (opts.name !== void 0)
39555
- args.name = opts.name;
39556
- if (opts.fallbackPerUsd !== void 0)
39557
- args.fallback_per_usd = opts.fallbackPerUsd;
39558
- if (opts.rows !== void 0)
39559
- args.rows = JSON.parse(opts.rows);
39694
+ if (opts.planId !== void 0)
39695
+ args.plan_id = opts.planId;
39696
+ if (opts.autoApply !== void 0)
39697
+ args.auto_apply = true;
39560
39698
  await ctx.execute({
39561
39699
  method: "PUT",
39562
- path: "/v1/agents/rate-cards/{rate_card_id}",
39700
+ path: "/v1/ai/billing/plans/default",
39701
+ args,
39702
+ queryParamKeys: []
39703
+ });
39704
+ });
39705
+ 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", `
39706
+ Examples:
39707
+ hyperline ai-billing clear-agent-default-plan
39708
+ hyperline ai-billing clear-agent-default-plan --output json`).action(async (opts) => {
39709
+ const ctx = resource.parent?.opts()._ctx;
39710
+ if (!ctx) {
39711
+ process.stderr.write("Error: Not authenticated\n");
39712
+ process.exit(1);
39713
+ }
39714
+ const args = {};
39715
+ if (!opts.yes) {
39716
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39717
+ if (!confirmed) {
39718
+ process.stdout.write("Aborted.\n");
39719
+ return;
39720
+ }
39721
+ }
39722
+ await ctx.execute({
39723
+ method: "DELETE",
39724
+ path: "/v1/ai/billing/plans/default",
39563
39725
  args,
39564
39726
  queryParamKeys: []
39565
39727
  });
39566
39728
  });
39567
- 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", `
39729
+ 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", `
39568
39730
  Examples:
39569
- hyperline agents delete-agent-rate-card --rate-card-id <rate_card_id>
39570
- hyperline agents delete-agent-rate-card --rate-card-id <rate_card_id> --output json`).action(async (opts) => {
39731
+ hyperline ai-billing get-agent-plan --id <id>`).action(async (opts) => {
39571
39732
  const ctx = resource.parent?.opts()._ctx;
39572
39733
  if (!ctx) {
39573
39734
  process.stderr.write("Error: Not authenticated\n");
39574
39735
  process.exit(1);
39575
39736
  }
39576
39737
  const args = {};
39738
+ if (opts.id !== void 0)
39739
+ args.id = opts.id;
39740
+ await ctx.execute({
39741
+ method: "GET",
39742
+ path: "/v1/ai/billing/plans/{id}",
39743
+ args,
39744
+ queryParamKeys: []
39745
+ });
39746
+ });
39747
+ 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.
39748
+
39749
+ - refuse: Rejects the call that crosses the boundary without deducting usage.
39750
+ - 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.
39751
+
39752
+ - calendar_month: Settles at the end of each UTC calendar month.`).addHelpText("after", `
39753
+ Examples:
39754
+ hyperline ai-billing replace-agent-plan --id <id> --name <name>
39755
+ hyperline ai-billing replace-agent-plan --id <id> --name <name> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39756
+ hyperline ai-billing replace-agent-plan --id <id> --name <name> --output json`).action(async (opts) => {
39757
+ const ctx = resource.parent?.opts()._ctx;
39758
+ if (!ctx) {
39759
+ process.stderr.write("Error: Not authenticated\n");
39760
+ process.exit(1);
39761
+ }
39762
+ const args = {};
39763
+ if (opts.id !== void 0)
39764
+ args.id = opts.id;
39765
+ if (opts.name !== void 0)
39766
+ args.name = opts.name;
39577
39767
  if (opts.rateCardId !== void 0)
39578
39768
  args.rate_card_id = opts.rateCardId;
39769
+ if (opts.overageMode !== void 0)
39770
+ args.overage_mode = opts.overageMode;
39771
+ if (opts.markupPercent !== void 0)
39772
+ args.markup_percent = opts.markupPercent;
39773
+ if (opts.overageMarkupPercent !== void 0)
39774
+ args.overage_markup_percent = opts.overageMarkupPercent;
39775
+ if (opts.overageRateCardId !== void 0)
39776
+ args.overage_rate_card_id = opts.overageRateCardId;
39777
+ if (opts.perSeatCredits !== void 0)
39778
+ args.per_seat_credits = opts.perSeatCredits;
39779
+ if (opts.settlementSchedule !== void 0)
39780
+ args.settlement_schedule = opts.settlementSchedule;
39781
+ if (opts.settlementIntervalMinutes !== void 0)
39782
+ args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39783
+ if (opts.grantRolloverEnabled !== void 0)
39784
+ args.grant_rollover_enabled = true;
39785
+ if (opts.windows !== void 0)
39786
+ args.windows = JSON.parse(opts.windows);
39787
+ await ctx.execute({
39788
+ method: "PUT",
39789
+ path: "/v1/ai/billing/plans/{id}",
39790
+ args,
39791
+ queryParamKeys: []
39792
+ });
39793
+ });
39794
+ 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", `
39795
+ Examples:
39796
+ hyperline ai-billing delete-agent-plan --id <id>
39797
+ hyperline ai-billing delete-agent-plan --id <id> --output json`).action(async (opts) => {
39798
+ const ctx = resource.parent?.opts()._ctx;
39799
+ if (!ctx) {
39800
+ process.stderr.write("Error: Not authenticated\n");
39801
+ process.exit(1);
39802
+ }
39803
+ const args = {};
39804
+ if (opts.id !== void 0)
39805
+ args.id = opts.id;
39579
39806
  if (!opts.yes) {
39580
39807
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39581
39808
  if (!confirmed) {
@@ -39585,81 +39812,130 @@ Examples:
39585
39812
  }
39586
39813
  await ctx.execute({
39587
39814
  method: "DELETE",
39588
- path: "/v1/agents/rate-cards/{rate_card_id}",
39815
+ path: "/v1/ai/billing/plans/{id}",
39589
39816
  args,
39590
39817
  queryParamKeys: []
39591
39818
  });
39592
39819
  });
39593
- 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", `
39820
+ 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.
39821
+
39822
+ - credits: Credit counts.
39823
+ - units: Weighted rolling-allowance units.
39824
+ - 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", `
39594
39825
  Examples:
39595
- hyperline agents list-agent-credit-products`).action(async (_opts) => {
39826
+ hyperline ai-billing list-agent-rate-cards
39827
+ hyperline ai-billing list-agent-rate-cards --denomination <denomination> --currency <currency>`).action(async (opts) => {
39596
39828
  const ctx = resource.parent?.opts()._ctx;
39597
39829
  if (!ctx) {
39598
39830
  process.stderr.write("Error: Not authenticated\n");
39599
39831
  process.exit(1);
39600
39832
  }
39601
39833
  const args = {};
39834
+ if (opts.denomination !== void 0)
39835
+ args.denomination = opts.denomination;
39836
+ if (opts.currency !== void 0)
39837
+ args.currency = opts.currency;
39838
+ if (opts.search !== void 0)
39839
+ args.search = opts.search;
39840
+ if (opts.take !== void 0)
39841
+ args.take = Number(opts.take);
39842
+ if (opts.skip !== void 0)
39843
+ args.skip = Number(opts.skip);
39602
39844
  await ctx.execute({
39603
39845
  method: "GET",
39604
- path: "/v1/agents/credit-products",
39846
+ path: "/v1/ai/billing/rate-cards",
39847
+ args,
39848
+ queryParamKeys: ["denomination", "currency", "search", "take", "skip"]
39849
+ });
39850
+ });
39851
+ 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.
39852
+
39853
+ - credits: Credit counts.
39854
+ - units: Weighted rolling-allowance units.
39855
+ - 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", `
39856
+ Examples:
39857
+ hyperline ai-billing create-agent-rate-card --name <name> --rows <rows> --denomination <denomination>
39858
+ hyperline ai-billing create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --fallback-per-usd <fallback_per_usd> --currency <currency>
39859
+ hyperline ai-billing create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --output json`).action(async (opts) => {
39860
+ const ctx = resource.parent?.opts()._ctx;
39861
+ if (!ctx) {
39862
+ process.stderr.write("Error: Not authenticated\n");
39863
+ process.exit(1);
39864
+ }
39865
+ const args = {};
39866
+ if (opts.name !== void 0)
39867
+ args.name = opts.name;
39868
+ if (opts.fallbackPerUsd !== void 0)
39869
+ args.fallback_per_usd = opts.fallbackPerUsd;
39870
+ if (opts.denomination !== void 0)
39871
+ args.denomination = opts.denomination;
39872
+ if (opts.currency !== void 0)
39873
+ args.currency = opts.currency;
39874
+ if (opts.rows !== void 0)
39875
+ args.rows = JSON.parse(opts.rows);
39876
+ await ctx.execute({
39877
+ method: "POST",
39878
+ path: "/v1/ai/billing/rate-cards",
39605
39879
  args,
39606
39880
  queryParamKeys: []
39607
39881
  });
39608
39882
  });
39609
- 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", `
39883
+ 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", `
39610
39884
  Examples:
39611
- hyperline agents list-agent-cost-catalog
39612
- hyperline agents list-agent-cost-catalog --enabled-only <enabled_only>`).action(async (opts) => {
39885
+ hyperline ai-billing get-agent-rate-card --id <id>`).action(async (opts) => {
39613
39886
  const ctx = resource.parent?.opts()._ctx;
39614
39887
  if (!ctx) {
39615
39888
  process.stderr.write("Error: Not authenticated\n");
39616
39889
  process.exit(1);
39617
39890
  }
39618
39891
  const args = {};
39619
- if (opts.enabledOnly !== void 0)
39620
- args.enabled_only = opts.enabledOnly;
39892
+ if (opts.id !== void 0)
39893
+ args.id = opts.id;
39621
39894
  await ctx.execute({
39622
39895
  method: "GET",
39623
- path: "/v1/agents/cost-catalog",
39896
+ path: "/v1/ai/billing/rate-cards/{id}",
39624
39897
  args,
39625
- queryParamKeys: ["enabled_only"]
39898
+ queryParamKeys: []
39626
39899
  });
39627
39900
  });
39628
- 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", `
39901
+ 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", `
39629
39902
  Examples:
39630
- hyperline agents create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions>
39631
- hyperline agents create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions> --output json`).action(async (opts) => {
39903
+ hyperline ai-billing replace-agent-rate-card --id <id> --name <name> --rows <rows>
39904
+ hyperline ai-billing replace-agent-rate-card --id <id> --name <name> --rows <rows> --fallback-per-usd <fallback_per_usd>
39905
+ hyperline ai-billing replace-agent-rate-card --id <id> --name <name> --rows <rows> --output json`).action(async (opts) => {
39632
39906
  const ctx = resource.parent?.opts()._ctx;
39633
39907
  if (!ctx) {
39634
39908
  process.stderr.write("Error: Not authenticated\n");
39635
39909
  process.exit(1);
39636
39910
  }
39637
39911
  const args = {};
39638
- if (opts.provider !== void 0)
39639
- args.provider = opts.provider;
39640
- if (opts.item !== void 0)
39641
- args.item = opts.item;
39642
- if (opts.dimensions !== void 0)
39643
- args.dimensions = JSON.parse(opts.dimensions);
39912
+ if (opts.id !== void 0)
39913
+ args.id = opts.id;
39914
+ if (opts.name !== void 0)
39915
+ args.name = opts.name;
39916
+ if (opts.fallbackPerUsd !== void 0)
39917
+ args.fallback_per_usd = opts.fallbackPerUsd;
39918
+ if (opts.rows !== void 0)
39919
+ args.rows = JSON.parse(opts.rows);
39644
39920
  await ctx.execute({
39645
- method: "POST",
39646
- path: "/v1/agents/cost-catalog/items",
39921
+ method: "PUT",
39922
+ path: "/v1/ai/billing/rate-cards/{id}",
39647
39923
  args,
39648
39924
  queryParamKeys: []
39649
39925
  });
39650
39926
  });
39651
- 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", `
39927
+ 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", `
39652
39928
  Examples:
39653
- hyperline agents delete-agent-cost-catalog-item --item-id <item_id>
39654
- hyperline agents delete-agent-cost-catalog-item --item-id <item_id> --output json`).action(async (opts) => {
39929
+ hyperline ai-billing delete-agent-rate-card --id <id>
39930
+ hyperline ai-billing delete-agent-rate-card --id <id> --output json`).action(async (opts) => {
39655
39931
  const ctx = resource.parent?.opts()._ctx;
39656
39932
  if (!ctx) {
39657
39933
  process.stderr.write("Error: Not authenticated\n");
39658
39934
  process.exit(1);
39659
39935
  }
39660
39936
  const args = {};
39661
- if (opts.itemId !== void 0)
39662
- args.item_id = opts.itemId;
39937
+ if (opts.id !== void 0)
39938
+ args.id = opts.id;
39663
39939
  if (!opts.yes) {
39664
39940
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39665
39941
  if (!confirmed) {
@@ -39669,55 +39945,123 @@ Examples:
39669
39945
  }
39670
39946
  await ctx.execute({
39671
39947
  method: "DELETE",
39672
- path: "/v1/agents/cost-catalog/items/{item_id}",
39948
+ path: "/v1/ai/billing/rate-cards/{id}",
39673
39949
  args,
39674
39950
  queryParamKeys: []
39675
39951
  });
39676
39952
  });
39677
- 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", `
39953
+ 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", `
39678
39954
  Examples:
39679
- 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>
39680
- 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>
39681
- 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) => {
39955
+ hyperline ai-billing list-agent-customer-policies --id <id>
39956
+ hyperline ai-billing list-agent-customer-policies --id <id> --take <take>`).action(async (opts) => {
39682
39957
  const ctx = resource.parent?.opts()._ctx;
39683
39958
  if (!ctx) {
39684
39959
  process.stderr.write("Error: Not authenticated\n");
39685
39960
  process.exit(1);
39686
39961
  }
39687
39962
  const args = {};
39688
- if (opts.provider !== void 0)
39689
- args.provider = opts.provider;
39690
- if (opts.model !== void 0)
39691
- args.model = opts.model;
39692
- if (opts.inputPerMTokens !== void 0)
39693
- args.input_per_m_tokens = opts.inputPerMTokens;
39694
- if (opts.outputPerMTokens !== void 0)
39695
- args.output_per_m_tokens = opts.outputPerMTokens;
39696
- if (opts.cachedInputPerMTokens !== void 0)
39697
- args.cached_input_per_m_tokens = opts.cachedInputPerMTokens;
39698
- if (opts.cacheWritePerMTokens !== void 0)
39699
- args.cache_write_per_m_tokens = opts.cacheWritePerMTokens;
39700
- if (opts.dimensions !== void 0)
39701
- args.dimensions = JSON.parse(opts.dimensions);
39963
+ if (opts.id !== void 0)
39964
+ args.id = opts.id;
39965
+ if (opts.take !== void 0)
39966
+ args.take = Number(opts.take);
39967
+ if (opts.skip !== void 0)
39968
+ args.skip = Number(opts.skip);
39969
+ await ctx.execute({
39970
+ method: "GET",
39971
+ path: "/v1/ai/billing/customers/{id}/policies",
39972
+ args,
39973
+ queryParamKeys: ["take", "skip"]
39974
+ });
39975
+ });
39976
+ 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", `
39977
+ Examples:
39978
+ hyperline ai-billing get-default-customer-billing-policy --id <id>`).action(async (opts) => {
39979
+ const ctx = resource.parent?.opts()._ctx;
39980
+ if (!ctx) {
39981
+ process.stderr.write("Error: Not authenticated\n");
39982
+ process.exit(1);
39983
+ }
39984
+ const args = {};
39985
+ if (opts.id !== void 0)
39986
+ args.id = opts.id;
39987
+ await ctx.execute({
39988
+ method: "GET",
39989
+ path: "/v1/ai/billing/customers/{id}/policies/default",
39990
+ args,
39991
+ queryParamKeys: []
39992
+ });
39993
+ });
39994
+ 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.
39995
+
39996
+ - wallet: Charges a monetary wallet.
39997
+ - credits: Consumes a credit balance.
39998
+ - 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.
39999
+
40000
+ - refuse: Rejects the call that crosses the boundary without deducting usage.
40001
+ - 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.
40002
+
40003
+ - 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", `
40004
+ Examples:
40005
+ hyperline ai-billing upsert-default-customer-billing-policy --id <id> --mode <mode> --blocked
40006
+ hyperline ai-billing upsert-default-customer-billing-policy --id <id> --mode <mode> --blocked --wallet-id <wallet_id> --credit-product-id <credit_product_id>
40007
+ hyperline ai-billing upsert-default-customer-billing-policy --id <id> --mode <mode> --blocked --output json`).action(async (opts) => {
40008
+ const ctx = resource.parent?.opts()._ctx;
40009
+ if (!ctx) {
40010
+ process.stderr.write("Error: Not authenticated\n");
40011
+ process.exit(1);
40012
+ }
40013
+ const args = {};
40014
+ if (opts.id !== void 0)
40015
+ args.id = opts.id;
40016
+ if (opts.mode !== void 0)
40017
+ args.mode = opts.mode;
40018
+ if (opts.walletId !== void 0)
40019
+ args.wallet_id = opts.walletId;
40020
+ if (opts.creditProductId !== void 0)
40021
+ args.credit_product_id = opts.creditProductId;
40022
+ if (opts.markupPercent !== void 0)
40023
+ args.markup_percent = opts.markupPercent;
40024
+ if (opts.overageMode !== void 0)
40025
+ args.overage_mode = opts.overageMode;
40026
+ if (opts.overageMarkupPercent !== void 0)
40027
+ args.overage_markup_percent = opts.overageMarkupPercent;
40028
+ if (opts.overageRateCardId !== void 0)
40029
+ args.overage_rate_card_id = opts.overageRateCardId;
40030
+ if (opts.overageWalletId !== void 0)
40031
+ args.overage_wallet_id = opts.overageWalletId;
40032
+ if (opts.floor !== void 0)
40033
+ args.floor = opts.floor;
40034
+ if (opts.settlementSchedule !== void 0)
40035
+ args.settlement_schedule = opts.settlementSchedule;
40036
+ if (opts.rateCardId !== void 0)
40037
+ args.rate_card_id = opts.rateCardId;
40038
+ if (opts.planId !== void 0)
40039
+ args.plan_id = opts.planId;
40040
+ if (opts.settlementIntervalMinutes !== void 0)
40041
+ args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
40042
+ if (opts.blocked !== void 0)
40043
+ args.blocked = true;
40044
+ if (opts.windows !== void 0)
40045
+ args.windows = JSON.parse(opts.windows);
39702
40046
  await ctx.execute({
39703
40047
  method: "PUT",
39704
- path: "/v1/agents/cost-catalog/overrides",
40048
+ path: "/v1/ai/billing/customers/{id}/policies/default",
39705
40049
  args,
39706
40050
  queryParamKeys: []
39707
40051
  });
39708
40052
  });
39709
- 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", `
40053
+ 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", `
39710
40054
  Examples:
39711
- hyperline agents delete-agent-cost-catalog-override --override-id <override_id>
39712
- hyperline agents delete-agent-cost-catalog-override --override-id <override_id> --output json`).action(async (opts) => {
40055
+ hyperline ai-billing delete-default-customer-billing-policy --id <id>
40056
+ hyperline ai-billing delete-default-customer-billing-policy --id <id> --output json`).action(async (opts) => {
39713
40057
  const ctx = resource.parent?.opts()._ctx;
39714
40058
  if (!ctx) {
39715
40059
  process.stderr.write("Error: Not authenticated\n");
39716
40060
  process.exit(1);
39717
40061
  }
39718
40062
  const args = {};
39719
- if (opts.overrideId !== void 0)
39720
- args.override_id = opts.overrideId;
40063
+ if (opts.id !== void 0)
40064
+ args.id = opts.id;
39721
40065
  if (!opts.yes) {
39722
40066
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39723
40067
  if (!confirmed) {
@@ -39727,51 +40071,32 @@ Examples:
39727
40071
  }
39728
40072
  await ctx.execute({
39729
40073
  method: "DELETE",
39730
- path: "/v1/agents/cost-catalog/overrides/{override_id}",
40074
+ path: "/v1/ai/billing/customers/{id}/policies/default",
39731
40075
  args,
39732
40076
  queryParamKeys: []
39733
40077
  });
39734
40078
  });
39735
- 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", `
40079
+ 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", `
39736
40080
  Examples:
39737
- hyperline agents list-agent-customer-policies --customer-id <customer_id>`).action(async (opts) => {
40081
+ hyperline ai-billing get-agent-customer-billing-policy --id <id> --agent-slug <agent_slug>`).action(async (opts) => {
39738
40082
  const ctx = resource.parent?.opts()._ctx;
39739
40083
  if (!ctx) {
39740
40084
  process.stderr.write("Error: Not authenticated\n");
39741
40085
  process.exit(1);
39742
40086
  }
39743
40087
  const args = {};
39744
- if (opts.customerId !== void 0)
39745
- args.customer_id = opts.customerId;
40088
+ if (opts.id !== void 0)
40089
+ args.id = opts.id;
40090
+ if (opts.agentSlug !== void 0)
40091
+ args.agent_slug = opts.agentSlug;
39746
40092
  await ctx.execute({
39747
40093
  method: "GET",
39748
- path: "/v1/agents/customers/{customer_id}/policies",
40094
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39749
40095
  args,
39750
40096
  queryParamKeys: []
39751
40097
  });
39752
40098
  });
39753
- 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", `
39754
- Examples:
39755
- hyperline agents get-agent-customer-policy --customer-id <customer_id>
39756
- hyperline agents get-agent-customer-policy --customer-id <customer_id> --agent <agent>`).action(async (opts) => {
39757
- const ctx = resource.parent?.opts()._ctx;
39758
- if (!ctx) {
39759
- process.stderr.write("Error: Not authenticated\n");
39760
- process.exit(1);
39761
- }
39762
- const args = {};
39763
- if (opts.customerId !== void 0)
39764
- args.customer_id = opts.customerId;
39765
- if (opts.agent !== void 0)
39766
- args.agent = opts.agent;
39767
- await ctx.execute({
39768
- method: "GET",
39769
- path: "/v1/agents/customers/{customer_id}/policy",
39770
- args,
39771
- queryParamKeys: ["agent"]
39772
- });
39773
- });
39774
- 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.
40099
+ 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.
39775
40100
 
39776
40101
  - wallet: Charges a monetary wallet.
39777
40102
  - credits: Consumes a credit balance.
@@ -39780,21 +40105,21 @@ Examples:
39780
40105
  - refuse: Rejects the call that crosses the boundary without deducting usage.
39781
40106
  - 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.
39782
40107
 
39783
- - 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", `
40108
+ - 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", `
39784
40109
  Examples:
39785
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked
39786
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked --agent <agent> --wallet-id <wallet_id>
39787
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked --output json`).action(async (opts) => {
40110
+ hyperline ai-billing upsert-agent-customer-billing-policy --id <id> --agent-slug <agent_slug> --mode <mode> --blocked
40111
+ 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>
40112
+ hyperline ai-billing upsert-agent-customer-billing-policy --id <id> --agent-slug <agent_slug> --mode <mode> --blocked --output json`).action(async (opts) => {
39788
40113
  const ctx = resource.parent?.opts()._ctx;
39789
40114
  if (!ctx) {
39790
40115
  process.stderr.write("Error: Not authenticated\n");
39791
40116
  process.exit(1);
39792
40117
  }
39793
40118
  const args = {};
39794
- if (opts.customerId !== void 0)
39795
- args.customer_id = opts.customerId;
39796
- if (opts.agent !== void 0)
39797
- args.agent = opts.agent;
40119
+ if (opts.id !== void 0)
40120
+ args.id = opts.id;
40121
+ if (opts.agentSlug !== void 0)
40122
+ args.agent_slug = opts.agentSlug;
39798
40123
  if (opts.mode !== void 0)
39799
40124
  args.mode = opts.mode;
39800
40125
  if (opts.walletId !== void 0)
@@ -39823,32 +40148,29 @@ Examples:
39823
40148
  args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39824
40149
  if (opts.blocked !== void 0)
39825
40150
  args.blocked = true;
39826
- if (opts.creditRates !== void 0)
39827
- args.credit_rates = JSON.parse(opts.creditRates);
39828
- if (opts.windowRates !== void 0)
39829
- args.window_rates = JSON.parse(opts.windowRates);
40151
+ if (opts.windows !== void 0)
40152
+ args.windows = JSON.parse(opts.windows);
39830
40153
  await ctx.execute({
39831
40154
  method: "PUT",
39832
- path: "/v1/agents/customers/{customer_id}/policy",
40155
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39833
40156
  args,
39834
- queryParamKeys: ["agent"]
40157
+ queryParamKeys: []
39835
40158
  });
39836
40159
  });
39837
- 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", `
40160
+ 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", `
39838
40161
  Examples:
39839
- hyperline agents delete-agent-customer-policy --customer-id <customer_id>
39840
- hyperline agents delete-agent-customer-policy --customer-id <customer_id> --agent <agent>
39841
- hyperline agents delete-agent-customer-policy --customer-id <customer_id> --output json`).action(async (opts) => {
40162
+ hyperline ai-billing delete-agent-customer-billing-policy --id <id> --agent-slug <agent_slug>
40163
+ hyperline ai-billing delete-agent-customer-billing-policy --id <id> --agent-slug <agent_slug> --output json`).action(async (opts) => {
39842
40164
  const ctx = resource.parent?.opts()._ctx;
39843
40165
  if (!ctx) {
39844
40166
  process.stderr.write("Error: Not authenticated\n");
39845
40167
  process.exit(1);
39846
40168
  }
39847
40169
  const args = {};
39848
- if (opts.customerId !== void 0)
39849
- args.customer_id = opts.customerId;
39850
- if (opts.agent !== void 0)
39851
- args.agent = opts.agent;
40170
+ if (opts.id !== void 0)
40171
+ args.id = opts.id;
40172
+ if (opts.agentSlug !== void 0)
40173
+ args.agent_slug = opts.agentSlug;
39852
40174
  if (!opts.yes) {
39853
40175
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39854
40176
  if (!confirmed) {
@@ -39858,87 +40180,87 @@ Examples:
39858
40180
  }
39859
40181
  await ctx.execute({
39860
40182
  method: "DELETE",
39861
- path: "/v1/agents/customers/{customer_id}/policy",
40183
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39862
40184
  args,
39863
- queryParamKeys: ["agent"]
40185
+ queryParamKeys: []
39864
40186
  });
39865
40187
  });
39866
- 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", `
40188
+ 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", `
39867
40189
  Examples:
39868
- hyperline agents apply-agent-default-plan --customer-id <customer_id>
39869
- hyperline agents apply-agent-default-plan --customer-id <customer_id> --output json`).action(async (opts) => {
40190
+ hyperline ai-billing apply-agent-default-plan --id <id>
40191
+ hyperline ai-billing apply-agent-default-plan --id <id> --output json`).action(async (opts) => {
39870
40192
  const ctx = resource.parent?.opts()._ctx;
39871
40193
  if (!ctx) {
39872
40194
  process.stderr.write("Error: Not authenticated\n");
39873
40195
  process.exit(1);
39874
40196
  }
39875
40197
  const args = {};
39876
- if (opts.customerId !== void 0)
39877
- args.customer_id = opts.customerId;
40198
+ if (opts.id !== void 0)
40199
+ args.id = opts.id;
39878
40200
  await ctx.execute({
39879
40201
  method: "POST",
39880
- path: "/v1/agents/customers/{customer_id}/apply-default-plan",
40202
+ path: "/v1/ai/billing/customers/{id}/apply-default-plan",
39881
40203
  args,
39882
40204
  queryParamKeys: []
39883
40205
  });
39884
40206
  });
39885
- 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", `
40207
+ 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", `
39886
40208
  Examples:
39887
- hyperline agents get-agent-customer-balance --customer-id <customer_id>
39888
- hyperline agents get-agent-customer-balance --customer-id <customer_id> --agent <agent>`).action(async (opts) => {
40209
+ hyperline ai-billing get-agent-customer-balance --id <id>
40210
+ hyperline ai-billing get-agent-customer-balance --id <id> --agent-slug <agent_slug>`).action(async (opts) => {
39889
40211
  const ctx = resource.parent?.opts()._ctx;
39890
40212
  if (!ctx) {
39891
40213
  process.stderr.write("Error: Not authenticated\n");
39892
40214
  process.exit(1);
39893
40215
  }
39894
40216
  const args = {};
39895
- if (opts.customerId !== void 0)
39896
- args.customer_id = opts.customerId;
39897
- if (opts.agent !== void 0)
39898
- args.agent = opts.agent;
40217
+ if (opts.id !== void 0)
40218
+ args.id = opts.id;
40219
+ if (opts.agentSlug !== void 0)
40220
+ args.agent_slug = opts.agentSlug;
39899
40221
  await ctx.execute({
39900
40222
  method: "GET",
39901
- path: "/v1/agents/customers/{customer_id}/balance",
40223
+ path: "/v1/ai/billing/customers/{id}/balance",
39902
40224
  args,
39903
- queryParamKeys: ["agent"]
40225
+ queryParamKeys: ["agent_slug"]
39904
40226
  });
39905
40227
  });
39906
- 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", `
40228
+ 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", `
39907
40229
  Examples:
39908
- hyperline agents reset-agent-customer-windows --customer-id <customer_id>
39909
- hyperline agents reset-agent-customer-windows --customer-id <customer_id> --agent <agent>
39910
- hyperline agents reset-agent-customer-windows --customer-id <customer_id> --output json`).action(async (opts) => {
40230
+ hyperline ai-billing reset-agent-customer-windows --id <id>
40231
+ hyperline ai-billing reset-agent-customer-windows --id <id> --agent-slug <agent_slug>
40232
+ hyperline ai-billing reset-agent-customer-windows --id <id> --output json`).action(async (opts) => {
39911
40233
  const ctx = resource.parent?.opts()._ctx;
39912
40234
  if (!ctx) {
39913
40235
  process.stderr.write("Error: Not authenticated\n");
39914
40236
  process.exit(1);
39915
40237
  }
39916
40238
  const args = {};
39917
- if (opts.customerId !== void 0)
39918
- args.customer_id = opts.customerId;
39919
- if (opts.agent !== void 0)
39920
- args.agent = opts.agent;
40239
+ if (opts.id !== void 0)
40240
+ args.id = opts.id;
40241
+ if (opts.agentSlug !== void 0)
40242
+ args.agent_slug = opts.agentSlug;
39921
40243
  await ctx.execute({
39922
40244
  method: "POST",
39923
- path: "/v1/agents/customers/{customer_id}/windows/reset",
40245
+ path: "/v1/ai/billing/customers/{id}/windows/reset",
39924
40246
  args,
39925
- queryParamKeys: ["agent"]
40247
+ queryParamKeys: ["agent_slug"]
39926
40248
  });
39927
40249
  });
39928
- 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", `
40250
+ 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", `
39929
40251
  Examples:
39930
- hyperline agents list-agent-customer-consumption --customer-id <customer_id>
39931
- hyperline agents list-agent-customer-consumption --customer-id <customer_id> --agent <agent> --overage <overage>`).action(async (opts) => {
40252
+ hyperline ai-billing list-agent-customer-consumption --id <id>
40253
+ hyperline ai-billing list-agent-customer-consumption --id <id> --agent-slug <agent_slug> --overage <overage>`).action(async (opts) => {
39932
40254
  const ctx = resource.parent?.opts()._ctx;
39933
40255
  if (!ctx) {
39934
40256
  process.stderr.write("Error: Not authenticated\n");
39935
40257
  process.exit(1);
39936
40258
  }
39937
40259
  const args = {};
39938
- if (opts.customerId !== void 0)
39939
- args.customer_id = opts.customerId;
39940
- if (opts.agent !== void 0)
39941
- args.agent = opts.agent;
40260
+ if (opts.id !== void 0)
40261
+ args.id = opts.id;
40262
+ if (opts.agentSlug !== void 0)
40263
+ args.agent_slug = opts.agentSlug;
39942
40264
  if (opts.overage !== void 0)
39943
40265
  args.overage = opts.overage;
39944
40266
  if (opts.from !== void 0)
@@ -39951,175 +40273,131 @@ Examples:
39951
40273
  args.skip = Number(opts.skip);
39952
40274
  await ctx.execute({
39953
40275
  method: "GET",
39954
- path: "/v1/agents/customers/{customer_id}/consumption",
40276
+ path: "/v1/ai/billing/customers/{id}/consumption",
39955
40277
  args,
39956
- queryParamKeys: ["agent", "overage", "from", "to", "take", "skip"]
40278
+ queryParamKeys: ["agent_slug", "overage", "from", "to", "take", "skip"]
39957
40279
  });
39958
40280
  });
39959
- 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", `
40281
+ 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", `
39960
40282
  Examples:
39961
- hyperline agents get-agent-customer-overview --customer-id <customer_id>`).action(async (opts) => {
40283
+ hyperline ai-billing get-product-ai-rate-card --id <id>`).action(async (opts) => {
39962
40284
  const ctx = resource.parent?.opts()._ctx;
39963
40285
  if (!ctx) {
39964
40286
  process.stderr.write("Error: Not authenticated\n");
39965
40287
  process.exit(1);
39966
40288
  }
39967
40289
  const args = {};
39968
- if (opts.customerId !== void 0)
39969
- args.customer_id = opts.customerId;
40290
+ if (opts.id !== void 0)
40291
+ args.id = opts.id;
39970
40292
  await ctx.execute({
39971
40293
  method: "GET",
39972
- path: "/v1/agents/customers/{customer_id}/overview",
40294
+ path: "/v1/ai/billing/products/{id}/rate-card",
39973
40295
  args,
39974
40296
  queryParamKeys: []
39975
40297
  });
39976
40298
  });
39977
- }
39978
-
39979
- // build/commands/generated/aggregators.js
39980
- function registerAggregatorsCommands(parent) {
39981
- const resource = parent.command("aggregators").description("Manage aggregators");
39982
- 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", `
40299
+ 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", `
39983
40300
  Examples:
39984
- hyperline aggregators list
39985
- hyperline aggregators list --take <take>`).action(async (opts) => {
40301
+ hyperline ai-billing set-product-ai-rate-card --id <id> --rate-card-id <rate_card_id>
40302
+ hyperline ai-billing set-product-ai-rate-card --id <id> --rate-card-id <rate_card_id> --output json`).action(async (opts) => {
39986
40303
  const ctx = resource.parent?.opts()._ctx;
39987
40304
  if (!ctx) {
39988
40305
  process.stderr.write("Error: Not authenticated\n");
39989
40306
  process.exit(1);
39990
40307
  }
39991
40308
  const args = {};
39992
- if (opts.take !== void 0)
39993
- args.take = Number(opts.take);
39994
- if (opts.skip !== void 0)
39995
- args.skip = Number(opts.skip);
40309
+ if (opts.id !== void 0)
40310
+ args.id = opts.id;
40311
+ if (opts.rateCardId !== void 0)
40312
+ args.rate_card_id = opts.rateCardId;
39996
40313
  await ctx.execute({
39997
- method: "GET",
39998
- path: "/v1/aggregators",
40314
+ method: "PUT",
40315
+ path: "/v1/ai/billing/products/{id}/rate-card",
39999
40316
  args,
40000
- queryParamKeys: ["take", "skip"]
40317
+ queryParamKeys: []
40001
40318
  });
40002
40319
  });
40003
- 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", `
40320
+ 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", `
40004
40321
  Examples:
40005
- hyperline aggregators create --entity <entity> --operation <operation>
40006
- hyperline aggregators create --entity <entity> --operation <operation> --type <type> --where <where>
40007
- hyperline aggregators create --entity <entity> --operation <operation> --output json`).action(async (opts) => {
40322
+ hyperline ai-billing clear-product-ai-rate-card --id <id>
40323
+ hyperline ai-billing clear-product-ai-rate-card --id <id> --output json`).action(async (opts) => {
40008
40324
  const ctx = resource.parent?.opts()._ctx;
40009
40325
  if (!ctx) {
40010
40326
  process.stderr.write("Error: Not authenticated\n");
40011
40327
  process.exit(1);
40012
40328
  }
40013
40329
  const args = {};
40014
- if (opts.entity !== void 0)
40015
- args.entity = opts.entity;
40016
- if (opts.type !== void 0)
40017
- args.type = opts.type;
40018
- if (opts.name !== void 0)
40019
- args.name = opts.name;
40020
- if (opts.description !== void 0)
40021
- args.description = opts.description;
40022
- if (opts.customEventName !== void 0)
40023
- args.custom_event_name = opts.customEventName;
40024
- if (opts.unitName !== void 0)
40025
- args.unit_name = opts.unitName;
40026
- if (opts.defaultIntervalPeriod !== void 0)
40027
- args.default_interval_period = opts.defaultIntervalPeriod;
40028
- if (opts.operation !== void 0)
40029
- args.operation = opts.operation;
40030
- if (opts.property !== void 0)
40031
- args.property = opts.property;
40032
- if (opts.defaultIntervalCount !== void 0)
40033
- args.default_interval_count = Number(opts.defaultIntervalCount);
40034
- if (opts.allowNegativeValues !== void 0)
40035
- args.allow_negative_values = true;
40036
- if (opts.aggregateOnCustomersEnabled !== void 0)
40037
- args.aggregate_on_customers_enabled = true;
40038
- if (opts.where !== void 0)
40039
- args.where = JSON.parse(opts.where);
40040
- if (opts.exposedEventKeys !== void 0)
40041
- args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
40042
- if (opts.thresholds !== void 0)
40043
- args.thresholds = JSON.parse(opts.thresholds);
40330
+ if (opts.id !== void 0)
40331
+ args.id = opts.id;
40332
+ if (!opts.yes) {
40333
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
40334
+ if (!confirmed) {
40335
+ process.stdout.write("Aborted.\n");
40336
+ return;
40337
+ }
40338
+ }
40044
40339
  await ctx.execute({
40045
- method: "POST",
40046
- path: "/v1/aggregators",
40340
+ method: "DELETE",
40341
+ path: "/v1/ai/billing/products/{id}/rate-card",
40047
40342
  args,
40048
40343
  queryParamKeys: []
40049
40344
  });
40050
40345
  });
40051
- resource.command("get").description(`Retrieve a specific aggregator by ID.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
40346
+ }
40347
+
40348
+ // build/commands/generated/ai-costs.js
40349
+ function registerAi_CostsCommands(parent) {
40350
+ const resource = parent.command("ai-costs").description("Manage ai > costs");
40351
+ 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", `
40052
40352
  Examples:
40053
- hyperline aggregators get --id <id>`).action(async (opts) => {
40353
+ hyperline ai-costs list-agent-cost-catalog
40354
+ hyperline ai-costs list-agent-cost-catalog --take <take> --enabled-only <enabled_only>`).action(async (opts) => {
40054
40355
  const ctx = resource.parent?.opts()._ctx;
40055
40356
  if (!ctx) {
40056
40357
  process.stderr.write("Error: Not authenticated\n");
40057
40358
  process.exit(1);
40058
40359
  }
40059
40360
  const args = {};
40060
- if (opts.id !== void 0)
40061
- args.id = opts.id;
40361
+ if (opts.enabledOnly !== void 0)
40362
+ args.enabled_only = opts.enabledOnly;
40363
+ if (opts.take !== void 0)
40364
+ args.take = Number(opts.take);
40365
+ if (opts.skip !== void 0)
40366
+ args.skip = Number(opts.skip);
40062
40367
  await ctx.execute({
40063
40368
  method: "GET",
40064
- path: "/v1/aggregators/{id}",
40369
+ path: "/v1/ai/billing/costs",
40065
40370
  args,
40066
- queryParamKeys: []
40371
+ queryParamKeys: ["take", "skip", "enabled_only"]
40067
40372
  });
40068
40373
  });
40069
- 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", `
40374
+ 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", `
40070
40375
  Examples:
40071
- hyperline aggregators update --id <id>
40072
- hyperline aggregators update --id <id> --entity <entity> --type <type>
40073
- hyperline aggregators update --id <id> --output json`).action(async (opts) => {
40376
+ hyperline ai-costs create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions>
40377
+ hyperline ai-costs create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions> --output json`).action(async (opts) => {
40074
40378
  const ctx = resource.parent?.opts()._ctx;
40075
40379
  if (!ctx) {
40076
40380
  process.stderr.write("Error: Not authenticated\n");
40077
40381
  process.exit(1);
40078
40382
  }
40079
40383
  const args = {};
40080
- if (opts.id !== void 0)
40081
- args.id = opts.id;
40082
- if (opts.entity !== void 0)
40083
- args.entity = opts.entity;
40084
- if (opts.type !== void 0)
40085
- args.type = opts.type;
40086
- if (opts.name !== void 0)
40087
- args.name = opts.name;
40088
- if (opts.description !== void 0)
40089
- args.description = opts.description;
40090
- if (opts.customEventName !== void 0)
40091
- args.custom_event_name = opts.customEventName;
40092
- if (opts.unitName !== void 0)
40093
- args.unit_name = opts.unitName;
40094
- if (opts.defaultIntervalPeriod !== void 0)
40095
- args.default_interval_period = opts.defaultIntervalPeriod;
40096
- if (opts.operation !== void 0)
40097
- args.operation = opts.operation;
40098
- if (opts.property !== void 0)
40099
- args.property = opts.property;
40100
- if (opts.defaultIntervalCount !== void 0)
40101
- args.default_interval_count = Number(opts.defaultIntervalCount);
40102
- if (opts.allowNegativeValues !== void 0)
40103
- args.allow_negative_values = true;
40104
- if (opts.aggregateOnCustomersEnabled !== void 0)
40105
- args.aggregate_on_customers_enabled = true;
40106
- if (opts.where !== void 0)
40107
- args.where = JSON.parse(opts.where);
40108
- if (opts.exposedEventKeys !== void 0)
40109
- args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
40110
- if (opts.thresholds !== void 0)
40111
- args.thresholds = JSON.parse(opts.thresholds);
40384
+ if (opts.provider !== void 0)
40385
+ args.provider = opts.provider;
40386
+ if (opts.item !== void 0)
40387
+ args.item = opts.item;
40388
+ if (opts.dimensions !== void 0)
40389
+ args.dimensions = JSON.parse(opts.dimensions);
40112
40390
  await ctx.execute({
40113
- method: "PUT",
40114
- path: "/v1/aggregators/{id}",
40391
+ method: "POST",
40392
+ path: "/v1/ai/billing/costs/items",
40115
40393
  args,
40116
40394
  queryParamKeys: []
40117
40395
  });
40118
40396
  });
40119
- 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", `
40397
+ 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", `
40120
40398
  Examples:
40121
- hyperline aggregators delete --id <id>
40122
- hyperline aggregators delete --id <id> --output json`).action(async (opts) => {
40399
+ hyperline ai-costs delete-agent-cost-catalog-item --id <id>
40400
+ hyperline ai-costs delete-agent-cost-catalog-item --id <id> --output json`).action(async (opts) => {
40123
40401
  const ctx = resource.parent?.opts()._ctx;
40124
40402
  if (!ctx) {
40125
40403
  process.stderr.write("Error: Not authenticated\n");
@@ -40137,19 +40415,47 @@ Examples:
40137
40415
  }
40138
40416
  await ctx.execute({
40139
40417
  method: "DELETE",
40140
- path: "/v1/aggregators/{id}",
40418
+ path: "/v1/ai/billing/costs/items/{id}",
40141
40419
  args,
40142
40420
  queryParamKeys: []
40143
40421
  });
40144
40422
  });
40145
- }
40146
-
40147
- // build/commands/generated/aggregators-usage.js
40148
- function registerAggregators_UsageCommands(parent) {
40149
- const resource = parent.command("aggregators-usage").description("Manage aggregators > usage");
40150
- 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", `
40423
+ 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", `
40151
40424
  Examples:
40152
- hyperline aggregators-usage get-aggregator-usage --id <id>`).action(async (opts) => {
40425
+ 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>
40426
+ 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>
40427
+ 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) => {
40428
+ const ctx = resource.parent?.opts()._ctx;
40429
+ if (!ctx) {
40430
+ process.stderr.write("Error: Not authenticated\n");
40431
+ process.exit(1);
40432
+ }
40433
+ const args = {};
40434
+ if (opts.provider !== void 0)
40435
+ args.provider = opts.provider;
40436
+ if (opts.model !== void 0)
40437
+ args.model = opts.model;
40438
+ if (opts.inputPerMTokens !== void 0)
40439
+ args.input_per_m_tokens = opts.inputPerMTokens;
40440
+ if (opts.outputPerMTokens !== void 0)
40441
+ args.output_per_m_tokens = opts.outputPerMTokens;
40442
+ if (opts.cachedInputPerMTokens !== void 0)
40443
+ args.cached_input_per_m_tokens = opts.cachedInputPerMTokens;
40444
+ if (opts.cacheWritePerMTokens !== void 0)
40445
+ args.cache_write_per_m_tokens = opts.cacheWritePerMTokens;
40446
+ if (opts.dimensions !== void 0)
40447
+ args.dimensions = JSON.parse(opts.dimensions);
40448
+ await ctx.execute({
40449
+ method: "PUT",
40450
+ path: "/v1/ai/billing/costs/overrides",
40451
+ args,
40452
+ queryParamKeys: []
40453
+ });
40454
+ });
40455
+ 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", `
40456
+ Examples:
40457
+ hyperline ai-costs delete-agent-cost-catalog-override --id <id>
40458
+ hyperline ai-costs delete-agent-cost-catalog-override --id <id> --output json`).action(async (opts) => {
40153
40459
  const ctx = resource.parent?.opts()._ctx;
40154
40460
  if (!ctx) {
40155
40461
  process.stderr.write("Error: Not authenticated\n");
@@ -40158,17 +40464,24 @@ Examples:
40158
40464
  const args = {};
40159
40465
  if (opts.id !== void 0)
40160
40466
  args.id = opts.id;
40467
+ if (!opts.yes) {
40468
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
40469
+ if (!confirmed) {
40470
+ process.stdout.write("Aborted.\n");
40471
+ return;
40472
+ }
40473
+ }
40161
40474
  await ctx.execute({
40162
- method: "GET",
40163
- path: "/v1/aggregators/{id}/usage",
40475
+ method: "DELETE",
40476
+ path: "/v1/ai/billing/costs/overrides/{id}",
40164
40477
  args,
40165
40478
  queryParamKeys: []
40166
40479
  });
40167
40480
  });
40168
- 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", `
40481
+ 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", `
40169
40482
  Examples:
40170
- hyperline aggregators-usage get-aggregator-usage-timeseries --id <id>
40171
- hyperline aggregators-usage get-aggregator-usage-timeseries --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
40483
+ hyperline ai-costs replace-agent-cost-catalog-item --id <id> --provider <provider> --item <item> --dimensions <dimensions>
40484
+ hyperline ai-costs replace-agent-cost-catalog-item --id <id> --provider <provider> --item <item> --dimensions <dimensions> --output json`).action(async (opts) => {
40172
40485
  const ctx = resource.parent?.opts()._ctx;
40173
40486
  if (!ctx) {
40174
40487
  process.stderr.write("Error: Not authenticated\n");
@@ -40177,65 +40490,69 @@ Examples:
40177
40490
  const args = {};
40178
40491
  if (opts.id !== void 0)
40179
40492
  args.id = opts.id;
40180
- if (opts.startDate !== void 0)
40181
- args.start_date = opts.startDate;
40182
- if (opts.endDate !== void 0)
40183
- args.end_date = opts.endDate;
40184
- if (opts.aggregatorFilterId !== void 0)
40185
- args.aggregator_filter_id = opts.aggregatorFilterId;
40186
- if (opts.groupBy !== void 0)
40187
- args.group_by = opts.groupBy;
40493
+ if (opts.provider !== void 0)
40494
+ args.provider = opts.provider;
40495
+ if (opts.item !== void 0)
40496
+ args.item = opts.item;
40497
+ if (opts.dimensions !== void 0)
40498
+ args.dimensions = JSON.parse(opts.dimensions);
40188
40499
  await ctx.execute({
40189
- method: "GET",
40190
- path: "/v1/aggregators/{id}/usage/timeseries",
40500
+ method: "PUT",
40501
+ path: "/v1/ai/billing/costs/items/{id}",
40191
40502
  args,
40192
- queryParamKeys: [
40193
- "start_date",
40194
- "end_date",
40195
- "aggregator_filter_id",
40196
- "group_by"
40197
- ]
40503
+ queryParamKeys: []
40198
40504
  });
40199
40505
  });
40200
- 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", `
40506
+ }
40507
+
40508
+ // build/commands/generated/ai-monitoring.js
40509
+ function registerAi_MonitoringCommands(parent) {
40510
+ const resource = parent.command("ai-monitoring").description("Manage ai > monitoring");
40511
+ 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, or by customer_id__in (up to 100 Hyperline IDs) for several customers; the first analysis per customer is its latest. 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("--customer-id.in <value>", `Comma-separated list of up to 100 Hyperline customer IDs. Return only analyses of these customers. Cannot be combined with \`customer_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", `
40201
40512
  Examples:
40202
- hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id>
40203
- hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
40513
+ hyperline ai-monitoring list-monitoring-analyses
40514
+ hyperline ai-monitoring list-monitoring-analyses --limit <limit> --cursor <cursor>`).action(async (opts) => {
40204
40515
  const ctx = resource.parent?.opts()._ctx;
40205
40516
  if (!ctx) {
40206
40517
  process.stderr.write("Error: Not authenticated\n");
40207
40518
  process.exit(1);
40208
40519
  }
40209
40520
  const args = {};
40210
- if (opts.id !== void 0)
40211
- args.id = opts.id;
40212
- if (opts.startDate !== void 0)
40213
- args.start_date = opts.startDate;
40214
- if (opts.endDate !== void 0)
40215
- args.end_date = opts.endDate;
40216
- if (opts.aggregatorFilterId !== void 0)
40217
- args.aggregator_filter_id = opts.aggregatorFilterId;
40218
- if (opts.take !== void 0)
40219
- args.take = Number(opts.take);
40220
- if (opts.skip !== void 0)
40221
- args.skip = Number(opts.skip);
40521
+ if (opts.cursor !== void 0)
40522
+ args.cursor = opts.cursor;
40523
+ if (opts.includeTotal !== void 0)
40524
+ args.include_total = opts.includeTotal;
40525
+ if (opts.customerId !== void 0)
40526
+ args.customer_id = opts.customerId;
40527
+ if (opts["customerId.in"] !== void 0)
40528
+ args.customer_id__in = opts["customerId.in"];
40529
+ if (opts.status !== void 0)
40530
+ args.status = opts.status;
40531
+ if (opts["createdAt.gte"] !== void 0)
40532
+ args.created_at__gte = opts["createdAt.gte"];
40533
+ if (opts["createdAt.lte"] !== void 0)
40534
+ args.created_at__lte = opts["createdAt.lte"];
40535
+ if (opts.limit !== void 0)
40536
+ args.limit = Number(opts.limit);
40222
40537
  await ctx.execute({
40223
40538
  method: "GET",
40224
- path: "/v1/aggregators/{id}/usage/group-by-customer",
40539
+ path: "/v1/agents/monitoring/analyses",
40225
40540
  args,
40226
40541
  queryParamKeys: [
40227
- "start_date",
40228
- "end_date",
40229
- "aggregator_filter_id",
40230
- "take",
40231
- "skip"
40542
+ "limit",
40543
+ "cursor",
40544
+ "include_total",
40545
+ "customer_id",
40546
+ "customer_id__in",
40547
+ "status",
40548
+ "created_at__gte",
40549
+ "created_at__lte"
40232
40550
  ]
40233
40551
  });
40234
40552
  });
40235
- 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", `
40553
+ 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", `
40236
40554
  Examples:
40237
- hyperline aggregators-usage get-aggregator-usage-events --id <id>
40238
- hyperline aggregators-usage get-aggregator-usage-events --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
40555
+ hyperline ai-monitoring get-monitoring-analysis --id <id>`).action(async (opts) => {
40239
40556
  const ctx = resource.parent?.opts()._ctx;
40240
40557
  if (!ctx) {
40241
40558
  process.stderr.write("Error: Not authenticated\n");
@@ -40244,27 +40561,11 @@ Examples:
40244
40561
  const args = {};
40245
40562
  if (opts.id !== void 0)
40246
40563
  args.id = opts.id;
40247
- if (opts.startDate !== void 0)
40248
- args.start_date = opts.startDate;
40249
- if (opts.endDate !== void 0)
40250
- args.end_date = opts.endDate;
40251
- if (opts.aggregatorFilterId !== void 0)
40252
- args.aggregator_filter_id = opts.aggregatorFilterId;
40253
- if (opts.take !== void 0)
40254
- args.take = Number(opts.take);
40255
- if (opts.skip !== void 0)
40256
- args.skip = Number(opts.skip);
40257
40564
  await ctx.execute({
40258
40565
  method: "GET",
40259
- path: "/v1/aggregators/{id}/usage/events",
40566
+ path: "/v1/agents/monitoring/analyses/{id}",
40260
40567
  args,
40261
- queryParamKeys: [
40262
- "start_date",
40263
- "end_date",
40264
- "aggregator_filter_id",
40265
- "take",
40266
- "skip"
40267
- ]
40568
+ queryParamKeys: []
40268
40569
  });
40269
40570
  });
40270
40571
  }
@@ -40428,7 +40729,7 @@ Examples:
40428
40729
  queryParamKeys: ["take", "skip"]
40429
40730
  });
40430
40731
  });
40431
- resource.command("create").description(`Create a new coupon with discount rules. Supports percentage or fixed amount discounts, duration limits, and redemption restrictions.`).requiredOption("--name <value>", `Coupon name.`).option("--description <value>", `Coupon description.`).option("--expiration-date <value>", `Date corresponding to the expiration of the coupon.`).option("--redemption-limit <number>", `Maximum number of subscriptions to which a single coupon can be applied.`).option("--product-ids <json>", `List of product IDs the coupon can be applied to. If empty, the coupon can be applied to any product.`).option("--repeat <value>", `Default repeat behaviour applied when the coupon is attached to a subscription. Valid values: \`once\`, \`forever\`, \`duration\`. Can be overridden at attach time.`).option("--duration <json>", `Default duration applied when \`repeat\` is \`duration\`. Required when \`repeat\` is \`duration\`, must be null otherwise.`).requiredOption("--type <value>", `type`).option("--discount-amount <number>", `Amount to apply as a discount on the total amount (excluding taxes) of a subscription. Expressed in the currency's smallest unit.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--discount-percent <number>", `Percentage to apply as a discount on the amount (excluding taxes) of a product.`).addHelpText("after", `
40732
+ resource.command("create").description(`Create a new coupon with discount rules. Supports percentage or fixed amount discounts, duration limits, and redemption restrictions.`).requiredOption("--name <value>", `Coupon name.`).option("--description <value>", `Coupon description.`).option("--expiration-date <value>", `Date corresponding to the expiration of the coupon.`).option("--redemption-limit <number>", `Maximum number of subscriptions to which a single coupon can be applied.`).option("--product-ids <json>", `Products the coupon is scoped to, read together with \`product_scope\`: the only discounted products when \`include\`, the products never discounted when \`exclude\`, empty when \`all\`.`).option("--product-scope <value>", `Which products the coupon discounts. \`all\`: every product (\`product_ids\` must be empty). \`include\`: only the products in \`product_ids\`. \`exclude\`: every product except those in \`product_ids\` (lines without a product stay discounted). \`include\` and \`exclude\` require a non-empty \`product_ids\`. When omitted on create/update, it is inferred: \`include\` if \`product_ids\` is non-empty, \`all\` otherwise. Integrations that read \`product_ids\` without \`product_scope\` will misread an \`exclude\` list as the products the coupon applies to.`).option("--repeat <value>", `Default repeat behaviour applied when the coupon is attached to a subscription. Valid values: \`once\`, \`forever\`, \`duration\`. Can be overridden at attach time.`).option("--duration <json>", `Default duration applied when \`repeat\` is \`duration\`. Required when \`repeat\` is \`duration\`, must be null otherwise.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).requiredOption("--type <value>", `type`).option("--discount-amount <number>", `Amount to apply as a discount on the total amount (excluding taxes) of a subscription. Expressed in the currency's smallest unit.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--discount-percent <number>", `Percentage to apply as a discount on the amount (excluding taxes) of a product.`).addHelpText("after", `
40432
40733
  Examples:
40433
40734
  hyperline coupons create --name <name> --type <type>
40434
40735
  hyperline coupons create --name <name> --type <type> --description <description> --expiration-date <expiration_date>
@@ -40445,6 +40746,8 @@ Examples:
40445
40746
  args.description = opts.description;
40446
40747
  if (opts.expirationDate !== void 0)
40447
40748
  args.expiration_date = opts.expirationDate;
40749
+ if (opts.productScope !== void 0)
40750
+ args.product_scope = opts.productScope;
40448
40751
  if (opts.repeat !== void 0)
40449
40752
  args.repeat = opts.repeat;
40450
40753
  if (opts.type !== void 0)
@@ -40461,6 +40764,8 @@ Examples:
40461
40764
  args.product_ids = JSON.parse(opts.productIds);
40462
40765
  if (opts.duration !== void 0)
40463
40766
  args.duration = JSON.parse(opts.duration);
40767
+ if (opts.properties !== void 0)
40768
+ args.properties = JSON.parse(opts.properties);
40464
40769
  await ctx.execute({
40465
40770
  method: "POST",
40466
40771
  path: "/v1/coupons",
@@ -40486,7 +40791,7 @@ Examples:
40486
40791
  queryParamKeys: []
40487
40792
  });
40488
40793
  });
40489
- resource.command("update").description(`Update an existing coupon's name, discount rules, or restrictions.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `Coupon name.`).option("--description <value>", `Coupon description.`).option("--expiration-date <value>", `Date corresponding to the expiration of the coupon.`).option("--redemption-limit <number>", `Maximum number of subscriptions to which a single coupon can be applied.`).option("--product-ids <json>", `List of product IDs the coupon can be applied to. If empty, the coupon can be applied to any product.`).option("--repeat <value>", `Default repeat behaviour applied when the coupon is attached to a subscription. Valid values: \`once\`, \`forever\`, \`duration\`. Can be overridden at attach time.`).option("--duration <json>", `Default duration applied when \`repeat\` is \`duration\`. Required when \`repeat\` is \`duration\`, must be null otherwise.`).requiredOption("--type <value>", `type`).option("--discount-amount <number>", `Amount to apply as a discount on the total amount (excluding taxes) of a subscription. Expressed in the currency's smallest unit.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--discount-percent <number>", `Percentage to apply as a discount on the amount (excluding taxes) of a product.`).addHelpText("after", `
40794
+ resource.command("update").description(`Update an existing coupon's name, discount rules, or restrictions.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `Coupon name.`).option("--description <value>", `Coupon description.`).option("--expiration-date <value>", `Date corresponding to the expiration of the coupon.`).option("--redemption-limit <number>", `Maximum number of subscriptions to which a single coupon can be applied.`).option("--product-ids <json>", `Products the coupon is scoped to, read together with \`product_scope\`: the only discounted products when \`include\`, the products never discounted when \`exclude\`, empty when \`all\`.`).option("--product-scope <value>", `Which products the coupon discounts. \`all\`: every product (\`product_ids\` must be empty). \`include\`: only the products in \`product_ids\`. \`exclude\`: every product except those in \`product_ids\` (lines without a product stay discounted). \`include\` and \`exclude\` require a non-empty \`product_ids\`. When omitted on create/update, it is inferred: \`include\` if \`product_ids\` is non-empty, \`all\` otherwise. Integrations that read \`product_ids\` without \`product_scope\` will misread an \`exclude\` list as the products the coupon applies to.`).option("--repeat <value>", `Default repeat behaviour applied when the coupon is attached to a subscription. Valid values: \`once\`, \`forever\`, \`duration\`. Can be overridden at attach time.`).option("--duration <json>", `Default duration applied when \`repeat\` is \`duration\`. Required when \`repeat\` is \`duration\`, must be null otherwise.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).requiredOption("--type <value>", `type`).option("--discount-amount <number>", `Amount to apply as a discount on the total amount (excluding taxes) of a subscription. Expressed in the currency's smallest unit.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--discount-percent <number>", `Percentage to apply as a discount on the amount (excluding taxes) of a product.`).addHelpText("after", `
40490
40795
  Examples:
40491
40796
  hyperline coupons update --id <id> --name <name> --type <type>
40492
40797
  hyperline coupons update --id <id> --name <name> --type <type> --description <description> --expiration-date <expiration_date>
@@ -40505,6 +40810,8 @@ Examples:
40505
40810
  args.description = opts.description;
40506
40811
  if (opts.expirationDate !== void 0)
40507
40812
  args.expiration_date = opts.expirationDate;
40813
+ if (opts.productScope !== void 0)
40814
+ args.product_scope = opts.productScope;
40508
40815
  if (opts.repeat !== void 0)
40509
40816
  args.repeat = opts.repeat;
40510
40817
  if (opts.type !== void 0)
@@ -40521,6 +40828,8 @@ Examples:
40521
40828
  args.product_ids = JSON.parse(opts.productIds);
40522
40829
  if (opts.duration !== void 0)
40523
40830
  args.duration = JSON.parse(opts.duration);
40831
+ if (opts.properties !== void 0)
40832
+ args.properties = JSON.parse(opts.properties);
40524
40833
  await ctx.execute({
40525
40834
  method: "PUT",
40526
40835
  path: "/v1/coupons/{id}",
@@ -40752,7 +41061,7 @@ Examples:
40752
41061
  queryParamKeys: []
40753
41062
  });
40754
41063
  });
40755
- resource.command("create-custom-property").description(`Create a new custom property definition with a name, type (string, number, boolean, date, select), and optional default value.`).requiredOption("--name <value>", `name`).requiredOption("--type <value>", `type`).requiredOption("--slug <value>", `slug`).requiredOption("--entities <json>", `entities`).option("--api-only", `api_only`).option("--required", `required`).option("--authorized-values <json>", `authorized_values`).addHelpText("after", `
41064
+ resource.command("create-custom-property").description(`Create a new custom property definition with a name, type (text, email, number, boolean, date, select, multi_select), and optional default value.`).requiredOption("--name <value>", `name`).requiredOption("--type <value>", `type`).requiredOption("--slug <value>", `slug`).requiredOption("--entities <json>", `entities`).option("--api-only", `api_only`).option("--required", `required`).option("--authorized-values <json>", `authorized_values`).option("--default-value <json>", `Value set on entities created without an explicit value for this custom property. On existing entities without a value, it also satisfies \`required\`. Must match the custom property type, and one of \`authorized_values\` for \`select\` and \`multi_select\` types. Dates are ISO 8601 strings. Email defaults must be valid email addresses. Null means no default value.`).addHelpText("after", `
40756
41065
  Examples:
40757
41066
  hyperline custom-properties create-custom-property --name <name> --type <type> --slug <slug> --entities <entities>
40758
41067
  hyperline custom-properties create-custom-property --name <name> --type <type> --slug <slug> --entities <entities> --api-only --required
@@ -40777,6 +41086,8 @@ Examples:
40777
41086
  args.entities = JSON.parse(opts.entities);
40778
41087
  if (opts.authorizedValues !== void 0)
40779
41088
  args.authorized_values = JSON.parse(opts.authorizedValues);
41089
+ if (opts.defaultValue !== void 0)
41090
+ args.default_value = JSON.parse(opts.defaultValue);
40780
41091
  await ctx.execute({
40781
41092
  method: "POST",
40782
41093
  path: "/v1/custom-properties",
@@ -40784,7 +41095,7 @@ Examples:
40784
41095
  queryParamKeys: []
40785
41096
  });
40786
41097
  });
40787
- resource.command("update-custom-property").description(`Update an existing custom property definition by ID.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `name`).requiredOption("--type <value>", `type`).requiredOption("--slug <value>", `slug`).requiredOption("--entities <json>", `entities`).option("--api-only", `api_only`).option("--required", `required`).option("--authorized-values <json>", `authorized_values`).addHelpText("after", `
41098
+ resource.command("update-custom-property").description(`Update an existing custom property definition by ID.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `name`).requiredOption("--type <value>", `type`).requiredOption("--slug <value>", `slug`).requiredOption("--entities <json>", `entities`).option("--api-only", `api_only`).option("--required", `required`).option("--authorized-values <json>", `authorized_values`).option("--default-value <json>", `Value set on entities created without an explicit value for this custom property. On existing entities without a value, it also satisfies \`required\`. Must match the custom property type, and one of \`authorized_values\` for \`select\` and \`multi_select\` types. Dates are ISO 8601 strings. Email defaults must be valid email addresses. Null means no default value.`).addHelpText("after", `
40788
41099
  Examples:
40789
41100
  hyperline custom-properties update-custom-property --id <id> --name <name> --type <type> --slug <slug> --entities <entities>
40790
41101
  hyperline custom-properties update-custom-property --id <id> --name <name> --type <type> --slug <slug> --entities <entities> --api-only --required
@@ -40811,6 +41122,8 @@ Examples:
40811
41122
  args.entities = JSON.parse(opts.entities);
40812
41123
  if (opts.authorizedValues !== void 0)
40813
41124
  args.authorized_values = JSON.parse(opts.authorizedValues);
41125
+ if (opts.defaultValue !== void 0)
41126
+ args.default_value = JSON.parse(opts.defaultValue);
40814
41127
  await ctx.execute({
40815
41128
  method: "PUT",
40816
41129
  path: "/v1/custom-properties/{id}",
@@ -40849,7 +41162,15 @@ Examples:
40849
41162
  // build/commands/generated/customers.js
40850
41163
  function registerCustomersCommands(parent) {
40851
41164
  const resource = parent.command("customers").description("Manage customers");
40852
- resource.command("list").description(`List customers with optional filters for name, type, status, currency, country, external_id, billing_email, search, tax_id, subscription_status, invoicing_entity_id, segment_id, custom_properties, payment_method_type, integration_entity_id, created_at, and updated_at. Sortable by created_at or updated_at. Paginated with limit/cursor.`).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("--order <value>", `Sort direction.`).option("--sort <value>", `Field used to sort the results.`).option("--name <value>", `name`).option("--name.not <value>", `name__not`).option("--name.is-null <value>", `name__isNull`).option("--name.is-not-null <value>", `name__isNotNull`).option("--name.equals <value>", `name__equals`).option("--name.contains <value>", `name__contains`).option("--name.starts-with <value>", `name__startsWith`).option("--name.end-with <value>", `name__endWith`).option("--type <value>", `type`).option("--type.in <value>", `type__in`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--country <value>", `country`).option("--country.not <value>", `country__not`).option("--country.is-null <value>", `country__isNull`).option("--country.is-not-null <value>", `country__isNotNull`).option("--country.equals <value>", `country__equals`).option("--country.contains <value>", `country__contains`).option("--country.starts-with <value>", `country__startsWith`).option("--country.end-with <value>", `country__endWith`).option("--external-id <value>", `external_id`).option("--external-id.not <value>", `external_id__not`).option("--external-id.is-null <value>", `external_id__isNull`).option("--external-id.is-not-null <value>", `external_id__isNotNull`).option("--external-id.equals <value>", `external_id__equals`).option("--external-id.contains <value>", `external_id__contains`).option("--external-id.starts-with <value>", `external_id__startsWith`).option("--external-id.end-with <value>", `external_id__endWith`).option("--billing-email <value>", `billing_email`).option("--billing-email.not <value>", `billing_email__not`).option("--billing-email.is-null <value>", `billing_email__isNull`).option("--billing-email.is-not-null <value>", `billing_email__isNotNull`).option("--billing-email.equals <value>", `billing_email__equals`).option("--billing-email.contains <value>", `billing_email__contains`).option("--billing-email.starts-with <value>", `billing_email__startsWith`).option("--billing-email.end-with <value>", `billing_email__endWith`).option("--search <value>", `search`).option("--tax-id <value>", `tax_id`).option("--tax-id.not <value>", `tax_id__not`).option("--tax-id.is-null <value>", `tax_id__isNull`).option("--tax-id.is-not-null <value>", `tax_id__isNotNull`).option("--tax-id.equals <value>", `tax_id__equals`).option("--tax-id.contains <value>", `tax_id__contains`).option("--tax-id.starts-with <value>", `tax_id__startsWith`).option("--tax-id.end-with <value>", `tax_id__endWith`).option("--subscription-status <value>", `subscription_status`).option("--subscription-status.in <value>", `subscription_status__in`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--invoicing-entity-id.not <value>", `invoicing_entity_id__not`).option("--invoicing-entity-id.is-null <value>", `invoicing_entity_id__isNull`).option("--invoicing-entity-id.is-not-null <value>", `invoicing_entity_id__isNotNull`).option("--invoicing-entity-id.equals <value>", `invoicing_entity_id__equals`).option("--invoicing-entity-id.contains <value>", `invoicing_entity_id__contains`).option("--invoicing-entity-id.starts-with <value>", `invoicing_entity_id__startsWith`).option("--invoicing-entity-id.end-with <value>", `invoicing_entity_id__endWith`).option("--segment-id <value>", `segment_id`).option("--custom-properties <value>", `custom_properties`).option("--payment-method-type <value>", `payment_method_type`).option("--payment-method-type.in <value>", `payment_method_type__in`).option("--integration-entity-id <value>", `integration_entity_id`).option("--created-at <value>", `created_at`).option("--created-at.not <value>", `created_at__not`).option("--created-at.is-null <value>", `created_at__isNull`).option("--created-at.is-not-null <value>", `created_at__isNotNull`).option("--created-at.equals <value>", `created_at__equals`).option("--created-at.lt <value>", `created_at__lt`).option("--created-at.lte <value>", `created_at__lte`).option("--created-at.gt <value>", `created_at__gt`).option("--created-at.gte <value>", `created_at__gte`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
41165
+ resource.command("list").description(`List customers with optional filters for name, type, status, currency, country, external_id, billing_email, search, tax_id, tax_id_status, subscription_status, invoicing_entity_id, segment_id, custom_properties, payment_method_type, integration_entity_id, created_at, and updated_at. Sortable by created_at or updated_at. Paginated with limit/cursor.`).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("--order <value>", `Sort direction.`).option("--sort <value>", `Field used to sort the results.`).option("--tax-id-status <value>", `
41166
+ Verification status of the customer tax ID.
41167
+
41168
+ - \`valid\`: Tax ID has been verified and is valid.
41169
+ - \`invalid\`: Tax ID has been verified and is invalid.
41170
+ - \`mismatch\`: Tax ID is valid but is for a different country than the customer's country.
41171
+ - \`unverified\`: Tax ID has not been verified yet.
41172
+ - \`unsupported\`: Tax ID verification for this type not supported yet.
41173
+ `).option("--name <value>", `name`).option("--name.not <value>", `name__not`).option("--name.is-null <value>", `name__isNull`).option("--name.is-not-null <value>", `name__isNotNull`).option("--name.equals <value>", `name__equals`).option("--name.contains <value>", `name__contains`).option("--name.starts-with <value>", `name__startsWith`).option("--name.end-with <value>", `name__endWith`).option("--type <value>", `type`).option("--type.in <value>", `type__in`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--country <value>", `country`).option("--country.not <value>", `country__not`).option("--country.is-null <value>", `country__isNull`).option("--country.is-not-null <value>", `country__isNotNull`).option("--country.equals <value>", `country__equals`).option("--country.contains <value>", `country__contains`).option("--country.starts-with <value>", `country__startsWith`).option("--country.end-with <value>", `country__endWith`).option("--external-id <value>", `external_id`).option("--external-id.not <value>", `external_id__not`).option("--external-id.is-null <value>", `external_id__isNull`).option("--external-id.is-not-null <value>", `external_id__isNotNull`).option("--external-id.equals <value>", `external_id__equals`).option("--external-id.contains <value>", `external_id__contains`).option("--external-id.starts-with <value>", `external_id__startsWith`).option("--external-id.end-with <value>", `external_id__endWith`).option("--billing-email <value>", `billing_email`).option("--billing-email.not <value>", `billing_email__not`).option("--billing-email.is-null <value>", `billing_email__isNull`).option("--billing-email.is-not-null <value>", `billing_email__isNotNull`).option("--billing-email.equals <value>", `billing_email__equals`).option("--billing-email.contains <value>", `billing_email__contains`).option("--billing-email.starts-with <value>", `billing_email__startsWith`).option("--billing-email.end-with <value>", `billing_email__endWith`).option("--search <value>", `search`).option("--tax-id <value>", `tax_id`).option("--tax-id.not <value>", `tax_id__not`).option("--tax-id.is-null <value>", `tax_id__isNull`).option("--tax-id.is-not-null <value>", `tax_id__isNotNull`).option("--tax-id.equals <value>", `tax_id__equals`).option("--tax-id.contains <value>", `tax_id__contains`).option("--tax-id.starts-with <value>", `tax_id__startsWith`).option("--tax-id.end-with <value>", `tax_id__endWith`).option("--subscription-status <value>", `subscription_status`).option("--subscription-status.in <value>", `subscription_status__in`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--invoicing-entity-id.not <value>", `invoicing_entity_id__not`).option("--invoicing-entity-id.is-null <value>", `invoicing_entity_id__isNull`).option("--invoicing-entity-id.is-not-null <value>", `invoicing_entity_id__isNotNull`).option("--invoicing-entity-id.equals <value>", `invoicing_entity_id__equals`).option("--invoicing-entity-id.contains <value>", `invoicing_entity_id__contains`).option("--invoicing-entity-id.starts-with <value>", `invoicing_entity_id__startsWith`).option("--invoicing-entity-id.end-with <value>", `invoicing_entity_id__endWith`).option("--segment-id <value>", `segment_id`).option("--custom-properties <value>", `custom_properties`).option("--payment-method-type <value>", `payment_method_type`).option("--payment-method-type.in <value>", `payment_method_type__in`).option("--integration-entity-id <value>", `integration_entity_id`).option("--created-at <value>", `created_at`).option("--created-at.not <value>", `created_at__not`).option("--created-at.is-null <value>", `created_at__isNull`).option("--created-at.is-not-null <value>", `created_at__isNotNull`).option("--created-at.equals <value>", `created_at__equals`).option("--created-at.lt <value>", `created_at__lt`).option("--created-at.lte <value>", `created_at__lte`).option("--created-at.gt <value>", `created_at__gt`).option("--created-at.gte <value>", `created_at__gte`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
40853
41174
  Examples:
40854
41175
  hyperline customers list
40855
41176
  hyperline customers list --limit <limit> --cursor <cursor>`).action(async (opts) => {
@@ -40867,6 +41188,8 @@ Examples:
40867
41188
  args.order = opts.order;
40868
41189
  if (opts.sort !== void 0)
40869
41190
  args.sort = opts.sort;
41191
+ if (opts.taxIdStatus !== void 0)
41192
+ args.tax_id_status = opts.taxIdStatus;
40870
41193
  if (opts.name !== void 0)
40871
41194
  args.name = opts.name;
40872
41195
  if (opts["name.not"] !== void 0)
@@ -41051,6 +41374,7 @@ Examples:
41051
41374
  "include_total",
41052
41375
  "order",
41053
41376
  "sort",
41377
+ "tax_id_status",
41054
41378
  "name",
41055
41379
  "name__not",
41056
41380
  "name__isNull",
@@ -41168,7 +41492,7 @@ Customer type.
41168
41492
 
41169
41493
  - \`taxable\`: Taxes are automatically determined for the customer.
41170
41494
  - \`exempt\`: The customer is exempt from tax.
41171
- `).option("--registration-number <value>", `Customer registration number.`).option("--external-id <value>", `ID of the customer in your system. This helps matching your customer with the one on Hyperline.`).option("--domain <value>", `Customer domain. If not defined, it is inferred from the billing email.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity this customer will be attached to.`).option("--billing-address <json>", `Customer billing address.`).option("--shipping-address <json>", `Customer shipping address.`).option("--billing-email <value>", `Email to which all communications will be sent.`).option("--invoice-emails <json>", `Emails to which invoices will be sent (e.g. payer, finance team, accounting firm). If not defined, invoices will be sent to the \`billing_email\`; otherwise, they won't be sent to the \`billing_email\`.`).option("--language <value>", `Language used for invoices, emails, and hosted pages.`).option("--timezone <value>", `Customer timezone.`).option("--available-payment-methods <json>", `List of payment methods you allow your customer to pay with. You customer will be able to select one of them in their portal page and those will be the default options when creating a checkout session.`).option("--payment-method-type <value>", `Default payment method type used to pay subscriptions and one-off invoices.`).option("--bank-account <json>", `Custom bank account for the customer. If not defined and customer paying by bank transfer, the bank accounts configured in your account settings will be used.`).option("--custom-payment-delay <number>", `Custom payment terms in days. If not defined, the default one defined on the related invoicing entity will be used.`).option("--custom-payment-initiation-delay <number>", `Custom initiation delay in days before triggering payment. If not defined, the default one defined on the related invoicing entity will be used.`).option("--organisation-id <value>", `Parent organization ID to which the client is attached.`).option("--organisation-invoicing <value>", `
41495
+ `).option("--registration-number <value>", `Customer registration number.`).option("--einvoicing-code <value>", `Customer electronic invoicing code, used to route their e-invoices to the relevant platform (e.g. Chorus Pro routing code or Peppol identifier).`).option("--external-id <value>", `ID of the customer in your system. This helps matching your customer with the one on Hyperline.`).option("--domain <value>", `Customer domain. If not defined, it is inferred from the billing email.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity this customer will be attached to.`).option("--billing-address <json>", `Customer billing address.`).option("--shipping-address <json>", `Customer shipping address.`).option("--billing-email <value>", `Email to which all communications will be sent.`).option("--invoice-emails <json>", `Emails to which invoices will be sent (e.g. payer, finance team, accounting firm). If not defined, invoices will be sent to the \`billing_email\`; otherwise, they won't be sent to the \`billing_email\`.`).option("--language <value>", `Language used for invoices, emails, and hosted pages.`).option("--timezone <value>", `Customer timezone.`).option("--available-payment-methods <json>", `List of payment methods you allow your customer to pay with. You customer will be able to select one of them in their portal page and those will be the default options when creating a checkout session.`).option("--payment-method-type <value>", `Default payment method type used to pay subscriptions and one-off invoices.`).option("--bank-account <json>", `Custom bank account for the customer. If not defined and customer paying by bank transfer, the bank accounts configured in your account settings will be used.`).option("--custom-payment-delay <number>", `Custom payment terms in days. If not defined, the default one defined on the related invoicing entity will be used.`).option("--custom-payment-initiation-delay <number>", `Custom initiation delay in days before triggering payment. If not defined, the default one defined on the related invoicing entity will be used.`).option("--organisation-id <value>", `Parent organization ID to which the client is attached.`).option("--organisation-invoicing <value>", `
41172
41496
  How customer invoices are issued from the parent organisation.
41173
41497
 
41174
41498
  - \`none\`: Invoices will keep being issued from this customer.
@@ -41197,6 +41521,8 @@ Examples:
41197
41521
  args.taxability = opts.taxability;
41198
41522
  if (opts.registrationNumber !== void 0)
41199
41523
  args.registration_number = opts.registrationNumber;
41524
+ if (opts.einvoicingCode !== void 0)
41525
+ args.einvoicing_code = opts.einvoicingCode;
41200
41526
  if (opts.externalId !== void 0)
41201
41527
  args.external_id = opts.externalId;
41202
41528
  if (opts.domain !== void 0)
@@ -41303,7 +41629,7 @@ Customer type.
41303
41629
 
41304
41630
  - \`taxable\`: Taxes are automatically determined for the customer.
41305
41631
  - \`exempt\`: The customer is exempt from tax.
41306
- `).option("--registration-number <value>", `Customer registration number.`).option("--is-government-affiliated", `Indicates if the customer is affiliated with a government entity.`).option("--external-id <value>", `ID of the customer in your system. This helps matching your customer with the one on Hyperline.`).option("--domain <value>", `Customer domain. If not defined, it is inferred from the billing email.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity this customer will be attached to.`).option("--billing-address <json>", `Customer billing address.`).option("--shipping-address <json>", `Customer shipping address.`).option("--billing-email <value>", `Email to which all communications will be sent.`).option("--invoice-emails <json>", `Emails to which invoices will be sent (e.g. payer, finance team, accounting firm). If not defined, invoices will be sent to the \`billing_email\`; otherwise, they won't be sent to the \`billing_email\`.`).option("--language <value>", `Language used for invoices, emails, and hosted pages.`).option("--timezone <value>", `Customer timezone.`).option("--available-payment-methods <json>", `List of payment methods you allow your customer to pay with. You customer will be able to select one of them in their portal page and those will be the default options when creating a checkout session.`).option("--payment-method-type <value>", `Default payment method type used to pay subscriptions and one-off invoices.`).option("--payment-method-id <value>", `ID of the default payment method of the customer. Only applies to card and direct debit.`).option("--bank-account <json>", `Custom bank account for the customer. If not defined and customer paying by bank transfer, the bank accounts configured in your account settings will be used.`).option("--custom-payment-delay <number>", `Custom payment terms in days. If not defined, the default one defined on the related invoicing entity will be used.`).option("--custom-payment-initiation-delay <number>", `Custom initiation delay in days before triggering payment. If not defined, the default one defined on the related invoicing entity will be used.`).option("--organisation-id <value>", `Parent organization ID to which the client is attached.`).option("--organisation-invoicing <value>", `
41632
+ `).option("--registration-number <value>", `Customer registration number.`).option("--is-government-affiliated", `Indicates if the customer is affiliated with a government entity.`).option("--einvoicing-code <value>", `Customer electronic invoicing code, used to route their e-invoices to the relevant platform (e.g. Chorus Pro routing code or Peppol identifier).`).option("--external-id <value>", `ID of the customer in your system. This helps matching your customer with the one on Hyperline.`).option("--domain <value>", `Customer domain. If not defined, it is inferred from the billing email.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity this customer will be attached to.`).option("--billing-address <json>", `Customer billing address.`).option("--shipping-address <json>", `Customer shipping address.`).option("--billing-email <value>", `Email to which all communications will be sent.`).option("--invoice-emails <json>", `Emails to which invoices will be sent (e.g. payer, finance team, accounting firm). If not defined, invoices will be sent to the \`billing_email\`; otherwise, they won't be sent to the \`billing_email\`.`).option("--language <value>", `Language used for invoices, emails, and hosted pages.`).option("--timezone <value>", `Customer timezone.`).option("--available-payment-methods <json>", `List of payment methods you allow your customer to pay with. You customer will be able to select one of them in their portal page and those will be the default options when creating a checkout session.`).option("--payment-method-type <value>", `Default payment method type used to pay subscriptions and one-off invoices.`).option("--payment-method-id <value>", `ID of the default payment method of the customer. Only applies to card and direct debit.`).option("--bank-account <json>", `Custom bank account for the customer. If not defined and customer paying by bank transfer, the bank accounts configured in your account settings will be used.`).option("--custom-payment-delay <number>", `Custom payment terms in days. If not defined, the default one defined on the related invoicing entity will be used.`).option("--custom-payment-initiation-delay <number>", `Custom initiation delay in days before triggering payment. If not defined, the default one defined on the related invoicing entity will be used.`).option("--organisation-id <value>", `Parent organization ID to which the client is attached.`).option("--organisation-invoicing <value>", `
41307
41633
  How customer invoices are issued from the parent organisation.
41308
41634
 
41309
41635
  - \`none\`: Invoices will keep being issued from this customer.
@@ -41334,6 +41660,8 @@ Examples:
41334
41660
  args.taxability = opts.taxability;
41335
41661
  if (opts.registrationNumber !== void 0)
41336
41662
  args.registration_number = opts.registrationNumber;
41663
+ if (opts.einvoicingCode !== void 0)
41664
+ args.einvoicing_code = opts.einvoicingCode;
41337
41665
  if (opts.externalId !== void 0)
41338
41666
  args.external_id = opts.externalId;
41339
41667
  if (opts.domain !== void 0)
@@ -41587,7 +41915,7 @@ Examples:
41587
41915
  queryParamKeys: []
41588
41916
  });
41589
41917
  });
41590
- resource.command("create-customer-address").description(`Create a shipping address with type shipping; billing creation is rejected because a customer can have at most one billing address, managed through the customer endpoint.`).requiredOption("--customer-id <value>", `customerId parameter`).option("--name <value>", `Address name.`).option("--line1 <value>", `Address first line.`).option("--line2 <value>", `Address second line (optional).`).option("--city <value>", `Address city.`).option("--zip <value>", `Address ZIP code.`).option("--state <value>", `Only for US country. Second part of subdivision code in ISO format. See [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US).`).option("--country <value>", `Two-letter country code in ISO format. See [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).`).requiredOption("--type <value>", `Only shipping addresses can be created here. A customer has at most one active billing address, managed through the customer or by updating its address ID.`).addHelpText("after", `
41918
+ resource.command("create-customer-address").description(`Create a shipping address with type shipping; billing creation is rejected because a customer can have at most one billing address, managed through the customer endpoint.`).requiredOption("--customer-id <value>", `customerId parameter`).requiredOption("--type <value>", `Only shipping addresses can be created here. A customer has at most one active billing address, managed through the customer or by updating its address ID.`).option("--name <value>", `Address name.`).option("--line1 <value>", `Address first line.`).option("--line2 <value>", `Address second line (optional).`).option("--city <value>", `Address city.`).option("--zip <value>", `Address ZIP code.`).option("--state <value>", `Only for US country. Second part of subdivision code in ISO format. See [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US).`).option("--country <value>", `Two-letter country code in ISO format. See [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).`).option("--tax-id <value>", `Tax ID override for a shipping address. Null or blank inherits the customer's tax ID; omission on update preserves the override. Billing addresses cannot have an override.`).addHelpText("after", `
41591
41919
  Examples:
41592
41920
  hyperline customers-address create-customer-address --customer-id <customerId> --type <type>
41593
41921
  hyperline customers-address create-customer-address --customer-id <customerId> --type <type> --name <name> --line1 <line1>
@@ -41600,6 +41928,8 @@ Examples:
41600
41928
  const args = {};
41601
41929
  if (opts.customerId !== void 0)
41602
41930
  args.customerId = opts.customerId;
41931
+ if (opts.type !== void 0)
41932
+ args.type = opts.type;
41603
41933
  if (opts.name !== void 0)
41604
41934
  args.name = opts.name;
41605
41935
  if (opts.line1 !== void 0)
@@ -41614,8 +41944,8 @@ Examples:
41614
41944
  args.state = opts.state;
41615
41945
  if (opts.country !== void 0)
41616
41946
  args.country = opts.country;
41617
- if (opts.type !== void 0)
41618
- args.type = opts.type;
41947
+ if (opts.taxId !== void 0)
41948
+ args.tax_id = opts.taxId;
41619
41949
  await ctx.execute({
41620
41950
  method: "POST",
41621
41951
  path: "/v1/customers/{customerId}/addresses",
@@ -41623,7 +41953,7 @@ Examples:
41623
41953
  queryParamKeys: []
41624
41954
  });
41625
41955
  });
41626
- resource.command("update-customer-address").description(`Update a billing or shipping address by ID; billing changes also update the customer billing-address projection.`).requiredOption("--customer-id <value>", `customerId parameter`).requiredOption("--address-id <value>", `addressId parameter`).option("--name <value>", `Address name.`).option("--line1 <value>", `Address first line.`).option("--line2 <value>", `Address second line (optional).`).option("--city <value>", `Address city.`).option("--zip <value>", `Address ZIP code.`).option("--state <value>", `Only for US country. Second part of subdivision code in ISO format. See [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US).`).option("--country <value>", `Two-letter country code in ISO format. See [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).`).addHelpText("after", `
41956
+ resource.command("update-customer-address").description(`Update a billing or shipping address by ID; billing changes also update the customer billing-address projection.`).requiredOption("--customer-id <value>", `customerId parameter`).requiredOption("--address-id <value>", `addressId parameter`).option("--name <value>", `Address name.`).option("--line1 <value>", `Address first line.`).option("--line2 <value>", `Address second line (optional).`).option("--city <value>", `Address city.`).option("--zip <value>", `Address ZIP code.`).option("--state <value>", `Only for US country. Second part of subdivision code in ISO format. See [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US).`).option("--country <value>", `Two-letter country code in ISO format. See [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).`).option("--tax-id <value>", `Tax ID override for a shipping address. Null or blank inherits the customer's tax ID; omission on update preserves the override. Billing addresses cannot have an override.`).addHelpText("after", `
41627
41957
  Examples:
41628
41958
  hyperline customers-address update-customer-address --customer-id <customerId> --address-id <addressId>
41629
41959
  hyperline customers-address update-customer-address --customer-id <customerId> --address-id <addressId> --name <name> --line1 <line1>
@@ -41652,6 +41982,8 @@ Examples:
41652
41982
  args.state = opts.state;
41653
41983
  if (opts.country !== void 0)
41654
41984
  args.country = opts.country;
41985
+ if (opts.taxId !== void 0)
41986
+ args.tax_id = opts.taxId;
41655
41987
  await ctx.execute({
41656
41988
  method: "PATCH",
41657
41989
  path: "/v1/customers/{customerId}/addresses/{addressId}",
@@ -41834,7 +42166,7 @@ Examples:
41834
42166
  queryParamKeys: []
41835
42167
  });
41836
42168
  });
41837
- resource.command("list-customer-credit-transactions").description(`List all transactions (purchases, topups, usages) for a specific credit product. Paginated with take/skip and optional filters.`).requiredOption("--id <value>", `id parameter`).requiredOption("--product-id <value>", `productId parameter`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--type <value>", `type`).option("--invoice-id <value>", `invoice_id`).option("--created-at <value>", `created_at`).addHelpText("after", `
42169
+ resource.command("list-customer-credit-transactions").description(`List all transactions (topups, usages, expirations) for a specific credit product. Paginated with take/skip and optional filters.`).requiredOption("--id <value>", `id parameter`).requiredOption("--product-id <value>", `productId parameter`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--type <value>", `type`).option("--invoice-id <value>", `invoice_id`).option("--created-at <value>", `created_at`).addHelpText("after", `
41838
42170
  Examples:
41839
42171
  hyperline customers-credits list-customer-credit-transactions --id <id> --product-id <productId>
41840
42172
  hyperline customers-credits list-customer-credit-transactions --id <id> --product-id <productId> --take <take> --type <type>`).action(async (opts) => {
@@ -41923,7 +42255,7 @@ Examples:
41923
42255
  queryParamKeys: []
41924
42256
  });
41925
42257
  });
41926
- 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", `
42258
+ 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", `
41927
42259
  Examples:
41928
42260
  hyperline customers-credits purchase-customer-credits --id <id> --product-id <productId> --credit-count <credit_count>
41929
42261
  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>
@@ -42005,6 +42337,54 @@ Examples:
42005
42337
  queryParamKeys: []
42006
42338
  });
42007
42339
  });
42340
+ 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", `
42341
+ Examples:
42342
+ hyperline customers-credits get-customer-credit-portal-settings --id <id> --product-id <productId>`).action(async (opts) => {
42343
+ const ctx = resource.parent?.opts()._ctx;
42344
+ if (!ctx) {
42345
+ process.stderr.write("Error: Not authenticated\n");
42346
+ process.exit(1);
42347
+ }
42348
+ const args = {};
42349
+ if (opts.id !== void 0)
42350
+ args.id = opts.id;
42351
+ if (opts.productId !== void 0)
42352
+ args.productId = opts.productId;
42353
+ await ctx.execute({
42354
+ method: "GET",
42355
+ path: "/v1/customers/{id}/credits/{productId}/portal-settings",
42356
+ args,
42357
+ queryParamKeys: []
42358
+ });
42359
+ });
42360
+ 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", `
42361
+ Examples:
42362
+ hyperline customers-credits update-customer-credit-portal-settings --id <id> --product-id <productId> --enabled
42363
+ 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>
42364
+ hyperline customers-credits update-customer-credit-portal-settings --id <id> --product-id <productId> --enabled --output json`).action(async (opts) => {
42365
+ const ctx = resource.parent?.opts()._ctx;
42366
+ if (!ctx) {
42367
+ process.stderr.write("Error: Not authenticated\n");
42368
+ process.exit(1);
42369
+ }
42370
+ const args = {};
42371
+ if (opts.id !== void 0)
42372
+ args.id = opts.id;
42373
+ if (opts.productId !== void 0)
42374
+ args.productId = opts.productId;
42375
+ if (opts.priceConfigurationId !== void 0)
42376
+ args.price_configuration_id = opts.priceConfigurationId;
42377
+ if (opts.enabled !== void 0)
42378
+ args.enabled = true;
42379
+ if (opts.customPriceConfiguration !== void 0)
42380
+ args.custom_price_configuration = JSON.parse(opts.customPriceConfiguration);
42381
+ await ctx.execute({
42382
+ method: "PUT",
42383
+ path: "/v1/customers/{id}/credits/{productId}/portal-settings",
42384
+ args,
42385
+ queryParamKeys: []
42386
+ });
42387
+ });
42008
42388
  }
42009
42389
 
42010
42390
  // build/commands/generated/customers-payment-methods.js
@@ -42960,7 +43340,7 @@ Payment method strategy used to charge the invoice. Only applies to \`to_pay\` s
42960
43340
 
42961
43341
  - \`current\`: Use the current default payment method of the customer.
42962
43342
  - \`external\`: Manage the payment of the invoice outside of Hyperline.
42963
- `).option("--payment-method-id <value>", `ID of the default payment method used to pay the invoice. Transactions related to the invoice may use different payment methods.`).option("--bank-account-id <value>", `ID of the bank account displayed on the invoice. Transactions related to the invoice may use different bank accounts.`).option("--subscription-id <value>", `ID of the subscription related to the invoice.`).option("--emitted-at <value>", `Issue date of the invoice.`).option("--due-at <value>", `Due date of the invoice. Computed from the issue date and the payment delay configured in your settings.`).option("--settled-at <value>", `Date the invoice was fully paid.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).option("--custom-properties <json>", `Values for custom properties defined for the \`invoice\` entity, keyed by slug.`).option("--additional-display-fields <json>", `Ordered additional fields displayed on the invoice PDF. Invoice and customer custom properties are referenced by slug.`).requiredOption("--line-items <json>", `line_items`).option("--transactions <json>", `transactions`).option("--coupons <json>", `coupons`).addHelpText("after", `
43343
+ `).option("--payment-method-id <value>", `ID of the default payment method used to pay the invoice. Transactions related to the invoice may use different payment methods.`).option("--bank-account-id <value>", `ID of the bank account displayed on the invoice. Transactions related to the invoice may use different bank accounts.`).option("--subscription-id <value>", `ID of the subscription related to the invoice.`).option("--emitted-at <value>", `Issue date of the invoice.`).option("--due-at <value>", `Due date of the invoice. Computed from the issue date and the payment delay configured in your settings.`).option("--settled-at <value>", `Date the invoice was fully paid.`).option("--issuing-method <value>", `Set to \`scheduled\` to finalize the draft invoice automatically on its issue date (\`emitted_at\`), resolved to the start of that day in the customer timezone. Requires \`status\` to be \`draft\` and an issue date after today. Default to \`manual\`.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).option("--custom-properties <json>", `Values for custom properties defined for the \`invoice\` entity, keyed by slug.`).option("--additional-display-fields <json>", `Ordered additional fields displayed on the invoice PDF. Invoice and customer custom properties are referenced by slug.`).requiredOption("--line-items <json>", `line_items`).option("--transactions <json>", `transactions`).option("--coupons <json>", `coupons`).addHelpText("after", `
42964
43344
  Examples:
42965
43345
  hyperline invoices create-invoice --customer-id <customer_id> --line-items <line_items>
42966
43346
  hyperline invoices create-invoice --customer-id <customer_id> --line-items <line_items> --currency <currency> --status <status>
@@ -43011,6 +43391,8 @@ Examples:
43011
43391
  args.due_at = opts.dueAt;
43012
43392
  if (opts.settledAt !== void 0)
43013
43393
  args.settled_at = opts.settledAt;
43394
+ if (opts.issuingMethod !== void 0)
43395
+ args.issuing_method = opts.issuingMethod;
43014
43396
  if (opts.properties !== void 0)
43015
43397
  args.properties = JSON.parse(opts.properties);
43016
43398
  if (opts.customProperties !== void 0)
@@ -43132,7 +43514,7 @@ Examples:
43132
43514
  queryParamKeys: []
43133
43515
  });
43134
43516
  });
43135
- resource.command("void").description(`Void an invoice in to_pay status. Automatically generates a corresponding credit note. Optionally send an email notification.`).requiredOption("--id <value>", `id parameter`).option("--send-email", `Indicates if an email for the generated credit note should be sent to the customer.`).addHelpText("after", `
43517
+ resource.command("void").description(`Void an invoice in to_pay status. Automatically generates a corresponding credit note. A zero-priced paid invoice can also be voided, without a credit note. Optionally send an email notification.`).requiredOption("--id <value>", `id parameter`).option("--send-email", `Indicates if an email for the generated credit note should be sent to the customer.`).addHelpText("after", `
43136
43518
  Examples:
43137
43519
  hyperline invoices void --id <id>
43138
43520
  hyperline invoices void --id <id> --send-email
@@ -43200,7 +43582,7 @@ Examples:
43200
43582
 
43201
43583
  - \`auto\`: Tax is automatically computed and applied.
43202
43584
  - \`not_eligible\`: Tax collection is disabled for the invoice.
43203
- `).option("--line-items <json>", `line_items`).option("--coupons <json>", `coupons`).option("--payment-method-type <value>", `payment_method_type`).option("--payment-method-id <value>", `ID of the default payment method used to pay the invoice. Transactions related to the invoice may use different payment methods.`).option("--bank-account-id <value>", `ID of the bank account displayed on the invoice. Transactions related to the invoice may use different bank accounts.`).option("--subscription-id <value>", `ID of the subscription related to the invoice.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).option("--custom-properties <json>", `Values for custom properties defined for the \`invoice\` entity, keyed by slug.`).option("--additional-display-fields <json>", `Ordered additional fields displayed on the invoice PDF. Invoice and customer custom properties are referenced by slug.`).option("--customer <json>", `Override customer details on the invoice. Only allowed for draft or grace period invoices.`).addHelpText("after", `
43585
+ `).option("--issuing-method <value>", `Set to \`scheduled\` to finalize the draft invoice automatically on its issue date (\`emitted_at\`), in the invoice timezone. The issue date must be after today. Set to \`manual\` to unschedule the invoice.`).option("--emitted-at <value>", `Issue date of the draft invoice. For a scheduled invoice, the day on which it is automatically finalized.`).option("--line-items <json>", `line_items`).option("--coupons <json>", `coupons`).option("--payment-method-type <value>", `payment_method_type`).option("--payment-method-id <value>", `ID of the default payment method used to pay the invoice. Transactions related to the invoice may use different payment methods.`).option("--bank-account-id <value>", `ID of the bank account displayed on the invoice. Transactions related to the invoice may use different bank accounts.`).option("--subscription-id <value>", `ID of the subscription related to the invoice.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).option("--custom-properties <json>", `Values for custom properties defined for the \`invoice\` entity, keyed by slug.`).option("--additional-display-fields <json>", `Ordered additional fields displayed on the invoice PDF. Invoice and customer custom properties are referenced by slug.`).option("--customer <json>", `Override customer details on the invoice. Only allowed for draft or grace period invoices.`).addHelpText("after", `
43204
43586
  Examples:
43205
43587
  hyperline invoices update --id <id>
43206
43588
  hyperline invoices update --id <id> --type <type> --document-name <document_name>
@@ -43229,6 +43611,10 @@ Examples:
43229
43611
  args.footer = opts.footer;
43230
43612
  if (opts.taxScheme !== void 0)
43231
43613
  args.tax_scheme = opts.taxScheme;
43614
+ if (opts.issuingMethod !== void 0)
43615
+ args.issuing_method = opts.issuingMethod;
43616
+ if (opts.emittedAt !== void 0)
43617
+ args.emitted_at = opts.emittedAt;
43232
43618
  if (opts.paymentMethodType !== void 0)
43233
43619
  args.payment_method_type = opts.paymentMethodType;
43234
43620
  if (opts.paymentMethodId !== void 0)
@@ -43437,7 +43823,7 @@ Examples:
43437
43823
  queryParamKeys: []
43438
43824
  });
43439
43825
  });
43440
- 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", `
43826
+ 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", `
43441
43827
  Examples:
43442
43828
  hyperline invoicing-entities create-invoicing-entity --name <name> --country <country> --currency <currency> --accounting-currency <accounting_currency>
43443
43829
  hyperline invoicing-entities create-invoicing-entity --name <name> --country <country> --currency <currency> --accounting-currency <accounting_currency> --is-default --trade-name <trade_name>
@@ -43520,6 +43906,8 @@ Examples:
43520
43906
  args.credit_note_wallet_refund_enabled = true;
43521
43907
  if (opts.standaloneCreditNoteCreationEnabled !== void 0)
43522
43908
  args.standalone_credit_note_creation_enabled = true;
43909
+ if (opts.fxConversionDisplayEnabled !== void 0)
43910
+ args.fx_conversion_display_enabled = true;
43523
43911
  await ctx.execute({
43524
43912
  method: "POST",
43525
43913
  path: "/v1/invoicing-entities",
@@ -43527,7 +43915,7 @@ Examples:
43527
43915
  queryParamKeys: []
43528
43916
  });
43529
43917
  });
43530
- 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", `
43918
+ 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", `
43531
43919
  Examples:
43532
43920
  hyperline invoicing-entities update-invoicing-entity --id <id>
43533
43921
  hyperline invoicing-entities update-invoicing-entity --id <id> --name <name> --registration-number <registration_number>
@@ -43602,6 +43990,8 @@ Examples:
43602
43990
  args.credit_note_wallet_refund_enabled = true;
43603
43991
  if (opts.standaloneCreditNoteCreationEnabled !== void 0)
43604
43992
  args.standalone_credit_note_creation_enabled = true;
43993
+ if (opts.fxConversionDisplayEnabled !== void 0)
43994
+ args.fx_conversion_display_enabled = true;
43605
43995
  await ctx.execute({
43606
43996
  method: "PUT",
43607
43997
  path: "/v1/invoicing-entities/{id}",
@@ -43922,6 +44312,46 @@ Examples:
43922
44312
  queryParamKeys: []
43923
44313
  });
43924
44314
  });
44315
+ 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("--aggregator-filter-id <value>", `ID of an existing metering filter of the product's aggregator to attach to this price configuration, instead of creating a new one with \`metering_filter\`.`).option("--allow-on-portal", `allow_on_portal`).addHelpText("after", `
44316
+ Examples:
44317
+ hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id>
44318
+ 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>
44319
+ hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id> --output json`).action(async (opts) => {
44320
+ const ctx = resource.parent?.opts()._ctx;
44321
+ if (!ctx) {
44322
+ process.stderr.write("Error: Not authenticated\n");
44323
+ process.exit(1);
44324
+ }
44325
+ const args = {};
44326
+ if (opts.currency !== void 0)
44327
+ args.currency = opts.currency;
44328
+ if (opts.priceBookId !== void 0)
44329
+ args.price_book_id = opts.priceBookId;
44330
+ if (opts.type !== void 0)
44331
+ args.type = opts.type;
44332
+ if (opts.productId !== void 0)
44333
+ args.product_id = opts.productId;
44334
+ if (opts.aggregatorFilterId !== void 0)
44335
+ args.aggregator_filter_id = opts.aggregatorFilterId;
44336
+ if (opts.allowOnPortal !== void 0)
44337
+ args.allow_on_portal = true;
44338
+ if (opts.countries !== void 0)
44339
+ args.countries = JSON.parse(opts.countries);
44340
+ if (opts.billingInterval !== void 0)
44341
+ args.billing_interval = JSON.parse(opts.billingInterval);
44342
+ if (opts.commitmentInterval !== void 0)
44343
+ args.commitment_interval = JSON.parse(opts.commitmentInterval);
44344
+ if (opts.prices !== void 0)
44345
+ args.prices = JSON.parse(opts.prices);
44346
+ if (opts.meteringFilter !== void 0)
44347
+ args.metering_filter = JSON.parse(opts.meteringFilter);
44348
+ await ctx.execute({
44349
+ method: "POST",
44350
+ path: "/v1/price-configurations",
44351
+ args,
44352
+ queryParamKeys: []
44353
+ });
44354
+ });
43925
44355
  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", `
43926
44356
  Examples:
43927
44357
  hyperline price-configurations update-prices --id <id>
@@ -44316,12 +44746,12 @@ Quote status.
44316
44746
  - \`draft\`: The quote is a draft.
44317
44747
  - \`approved\`: The quote is approved and ready to be sent to the customer.
44318
44748
  - \`pending_signature\`: The quote is awaiting the customer's signature.
44319
- `).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.
44749
+ `).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("--contract-value <number>", `What the customer pays over the contract, each coupon counted on the invoices it applies to. Computed from the subscription for \`subscription\` and \`subscription_update\` quotes, unless set manually. Not set on \`one_off\` quotes. When specified, overrides the computed 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.
44320
44750
 
44321
44751
  - \`all\`: Display all pricing tiers.
44322
44752
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
44323
44753
  - \`none\`: Hide all pricing tiers.
44324
- `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--display-subscription-on-update <value>", `Display subscription details on subscription update quotes.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--template-id <value>", `ID of the quote template. If not specified, a subscription configuration or an \`invoice\` payload must be defined.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--subscription <json>", `Subscription configuration constituting the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided, a draft invoice is created and linked to the quote. Cannot be combined with \`subscription\` or \`template_id\`.`).addHelpText("after", `
44754
+ `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-discounts-on-total <value>", `Display discounts on the totals, with product prices before discount. Totals then follow the contract value, so discounts with a limited duration are included.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--template-id <value>", `ID of the quote template. If not specified, a subscription configuration or an \`invoice\` payload must be defined.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--subscription <json>", `Subscription configuration constituting the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided, a draft invoice is created and linked to the quote. Cannot be combined with \`subscription\` or \`template_id\`.`).addHelpText("after", `
44325
44755
  Examples:
44326
44756
  hyperline quotes create --customer-id <customer_id>
44327
44757
  hyperline quotes create --customer-id <customer_id> --status <status> --owner-email <owner_email>
@@ -44360,12 +44790,14 @@ Examples:
44360
44790
  args.display_price_tiers = opts.displayPriceTiers;
44361
44791
  if (opts.displayPhaseValue !== void 0)
44362
44792
  args.display_phase_value = opts.displayPhaseValue;
44793
+ if (opts.displayDiscountsOnTotal !== void 0)
44794
+ args.display_discounts_on_total = opts.displayDiscountsOnTotal;
44363
44795
  if (opts.displayFirstInvoiceAmount !== void 0)
44364
44796
  args.display_first_invoice_amount = opts.displayFirstInvoiceAmount;
44365
44797
  if (opts.displayDocumentsInPreview !== void 0)
44366
44798
  args.display_documents_in_preview = opts.displayDocumentsInPreview;
44367
- if (opts.displaySubscriptionOnUpdate !== void 0)
44368
- args.display_subscription_on_update = opts.displaySubscriptionOnUpdate;
44799
+ if (opts.subscriptionUpdateDisplay !== void 0)
44800
+ args.subscription_update_display = opts.subscriptionUpdateDisplay;
44369
44801
  if (opts.generateDraftInvoices !== void 0)
44370
44802
  args.generate_draft_invoices = opts.generateDraftInvoices;
44371
44803
  if (opts.templateId !== void 0)
@@ -44374,6 +44806,8 @@ Examples:
44374
44806
  args.expires_at = opts.expiresAt;
44375
44807
  if (opts.amount !== void 0)
44376
44808
  args.amount = Number(opts.amount);
44809
+ if (opts.contractValue !== void 0)
44810
+ args.contract_value = Number(opts.contractValue);
44377
44811
  if (opts.collectCustomPropertyIds !== void 0)
44378
44812
  args.collect_custom_property_ids = JSON.parse(opts.collectCustomPropertyIds);
44379
44813
  if (opts.contractClauseIds !== void 0)
@@ -44389,7 +44823,7 @@ Examples:
44389
44823
  queryParamKeys: []
44390
44824
  });
44391
44825
  });
44392
- resource.command("list").description(`List quotes with optional filters for id, number, status, customer_id, template_id, crm_opportunity_id, type, and updated_at. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--id <value>", `id`).option("--id.not <value>", `id__not`).option("--id.is-null <value>", `id__isNull`).option("--id.is-not-null <value>", `id__isNotNull`).option("--id.equals <value>", `id__equals`).option("--id.contains <value>", `id__contains`).option("--id.starts-with <value>", `id__startsWith`).option("--id.end-with <value>", `id__endWith`).option("--number <value>", `number`).option("--number.not <value>", `number__not`).option("--number.is-null <value>", `number__isNull`).option("--number.is-not-null <value>", `number__isNotNull`).option("--number.equals <value>", `number__equals`).option("--number.contains <value>", `number__contains`).option("--number.starts-with <value>", `number__startsWith`).option("--number.end-with <value>", `number__endWith`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--template-id <value>", `template_id`).option("--template-id.not <value>", `template_id__not`).option("--template-id.is-null <value>", `template_id__isNull`).option("--template-id.is-not-null <value>", `template_id__isNotNull`).option("--template-id.equals <value>", `template_id__equals`).option("--template-id.contains <value>", `template_id__contains`).option("--template-id.starts-with <value>", `template_id__startsWith`).option("--template-id.end-with <value>", `template_id__endWith`).option("--crm-opportunity-id <value>", `crm_opportunity_id`).option("--crm-opportunity-id.not <value>", `crm_opportunity_id__not`).option("--crm-opportunity-id.is-null <value>", `crm_opportunity_id__isNull`).option("--crm-opportunity-id.is-not-null <value>", `crm_opportunity_id__isNotNull`).option("--crm-opportunity-id.equals <value>", `crm_opportunity_id__equals`).option("--crm-opportunity-id.contains <value>", `crm_opportunity_id__contains`).option("--crm-opportunity-id.starts-with <value>", `crm_opportunity_id__startsWith`).option("--crm-opportunity-id.end-with <value>", `crm_opportunity_id__endWith`).option("--type <value>", `type`).option("--type.not <value>", `type__not`).option("--type.is-null <value>", `type__isNull`).option("--type.is-not-null <value>", `type__isNotNull`).option("--type.equals <value>", `type__equals`).option("--type.contains <value>", `type__contains`).option("--type.starts-with <value>", `type__startsWith`).option("--type.end-with <value>", `type__endWith`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
44826
+ resource.command("list").description(`List quotes with optional filters for id, number, status, customer_id, template_id, crm_opportunity_id, type, and updated_at. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--id <value>", `id`).option("--id.not <value>", `id__not`).option("--id.is-null <value>", `id__isNull`).option("--id.is-not-null <value>", `id__isNotNull`).option("--id.equals <value>", `id__equals`).option("--id.contains <value>", `id__contains`).option("--id.starts-with <value>", `id__startsWith`).option("--id.end-with <value>", `id__endWith`).option("--number <value>", `number`).option("--number.not <value>", `number__not`).option("--number.is-null <value>", `number__isNull`).option("--number.is-not-null <value>", `number__isNotNull`).option("--number.equals <value>", `number__equals`).option("--number.contains <value>", `number__contains`).option("--number.starts-with <value>", `number__startsWith`).option("--number.end-with <value>", `number__endWith`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--template-id <value>", `template_id`).option("--template-id.not <value>", `template_id__not`).option("--template-id.is-null <value>", `template_id__isNull`).option("--template-id.is-not-null <value>", `template_id__isNotNull`).option("--template-id.equals <value>", `template_id__equals`).option("--template-id.contains <value>", `template_id__contains`).option("--template-id.starts-with <value>", `template_id__startsWith`).option("--template-id.end-with <value>", `template_id__endWith`).option("--crm-opportunity-id <value>", `crm_opportunity_id`).option("--crm-opportunity-id.not <value>", `crm_opportunity_id__not`).option("--crm-opportunity-id.is-null <value>", `crm_opportunity_id__isNull`).option("--crm-opportunity-id.is-not-null <value>", `crm_opportunity_id__isNotNull`).option("--crm-opportunity-id.equals <value>", `crm_opportunity_id__equals`).option("--crm-opportunity-id.contains <value>", `crm_opportunity_id__contains`).option("--crm-opportunity-id.starts-with <value>", `crm_opportunity_id__startsWith`).option("--crm-opportunity-id.end-with <value>", `crm_opportunity_id__endWith`).option("--type <value>", `type`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
44393
44827
  Examples:
44394
44828
  hyperline quotes list
44395
44829
  hyperline quotes list --take <take> --id <id>`).action(async (opts) => {
@@ -44485,20 +44919,6 @@ Examples:
44485
44919
  args.crm_opportunity_id__endWith = opts["crmOpportunityId.endWith"];
44486
44920
  if (opts.type !== void 0)
44487
44921
  args.type = opts.type;
44488
- if (opts["type.not"] !== void 0)
44489
- args.type__not = opts["type.not"];
44490
- if (opts["type.isNull"] !== void 0)
44491
- args.type__isNull = opts["type.isNull"];
44492
- if (opts["type.isNotNull"] !== void 0)
44493
- args.type__isNotNull = opts["type.isNotNull"];
44494
- if (opts["type.equals"] !== void 0)
44495
- args.type__equals = opts["type.equals"];
44496
- if (opts["type.contains"] !== void 0)
44497
- args.type__contains = opts["type.contains"];
44498
- if (opts["type.startsWith"] !== void 0)
44499
- args.type__startsWith = opts["type.startsWith"];
44500
- if (opts["type.endWith"] !== void 0)
44501
- args.type__endWith = opts["type.endWith"];
44502
44922
  if (opts.updatedAt !== void 0)
44503
44923
  args.updated_at = opts.updatedAt;
44504
44924
  if (opts["updatedAt.not"] !== void 0)
@@ -44571,13 +44991,6 @@ Examples:
44571
44991
  "crm_opportunity_id__startsWith",
44572
44992
  "crm_opportunity_id__endWith",
44573
44993
  "type",
44574
- "type__not",
44575
- "type__isNull",
44576
- "type__isNotNull",
44577
- "type__equals",
44578
- "type__contains",
44579
- "type__startsWith",
44580
- "type__endWith",
44581
44994
  "updated_at",
44582
44995
  "updated_at__not",
44583
44996
  "updated_at__isNull",
@@ -44608,12 +45021,12 @@ Examples:
44608
45021
  queryParamKeys: []
44609
45022
  });
44610
45023
  });
44611
- 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.
45024
+ 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("--contract-value <number>", `What the customer pays over the contract, each coupon counted on the invoices it applies to. Computed from the subscription for \`subscription\` and \`subscription_update\` quotes, unless set manually. Not set on \`one_off\` quotes. When specified, overrides the computed value. Set to \`null\` to go back to the computed 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.
44612
45025
 
44613
45026
  - \`all\`: Display all pricing tiers.
44614
45027
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
44615
45028
  - \`none\`: Hide all pricing tiers.
44616
- `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--display-subscription-on-update <value>", `Display subscription details on subscription update quotes.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--crm-opportunity-id <value>", `ID of the related opportunity/deal in the connected CRM.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Set to \`null\` to clear the expiration.`).option("--subscription <json>", `Subscription configuration constituting the quote. When provided on a draft quote, it creates or replaces the draft subscription attached to the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided on a draft one-off quote, it deletes the previous draft invoice and creates a fresh one linked to the quote. \`invoice.invoicing_entity_id\` is ignored on update \u2014 the quote's existing invoicing entity is reused.`).addHelpText("after", `
45029
+ `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-discounts-on-total <value>", `Display discounts on the totals, with product prices before discount. Totals then follow the contract value, so discounts with a limited duration are included.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--crm-opportunity-id <value>", `ID of the related opportunity/deal in the connected CRM.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Set to \`null\` to clear the expiration.`).option("--subscription <json>", `Subscription configuration constituting the quote. When provided on a draft quote, it creates or replaces the draft subscription attached to the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided on a draft one-off quote, it deletes the previous draft invoice and creates a fresh one linked to the quote. \`invoice.invoicing_entity_id\` is ignored on update \u2014 the quote's existing invoicing entity is reused.`).addHelpText("after", `
44617
45030
  Examples:
44618
45031
  hyperline quotes update --id <id>
44619
45032
  hyperline quotes update --id <id> --owner-email <owner_email> --catalog-version-id <catalog_version_id>
@@ -44648,12 +45061,14 @@ Examples:
44648
45061
  args.display_price_tiers = opts.displayPriceTiers;
44649
45062
  if (opts.displayPhaseValue !== void 0)
44650
45063
  args.display_phase_value = opts.displayPhaseValue;
45064
+ if (opts.displayDiscountsOnTotal !== void 0)
45065
+ args.display_discounts_on_total = opts.displayDiscountsOnTotal;
44651
45066
  if (opts.displayFirstInvoiceAmount !== void 0)
44652
45067
  args.display_first_invoice_amount = opts.displayFirstInvoiceAmount;
44653
45068
  if (opts.displayDocumentsInPreview !== void 0)
44654
45069
  args.display_documents_in_preview = opts.displayDocumentsInPreview;
44655
- if (opts.displaySubscriptionOnUpdate !== void 0)
44656
- args.display_subscription_on_update = opts.displaySubscriptionOnUpdate;
45070
+ if (opts.subscriptionUpdateDisplay !== void 0)
45071
+ args.subscription_update_display = opts.subscriptionUpdateDisplay;
44657
45072
  if (opts.generateDraftInvoices !== void 0)
44658
45073
  args.generate_draft_invoices = opts.generateDraftInvoices;
44659
45074
  if (opts.crmOpportunityId !== void 0)
@@ -44662,6 +45077,8 @@ Examples:
44662
45077
  args.expires_at = opts.expiresAt;
44663
45078
  if (opts.amount !== void 0)
44664
45079
  args.amount = Number(opts.amount);
45080
+ if (opts.contractValue !== void 0)
45081
+ args.contract_value = Number(opts.contractValue);
44665
45082
  if (opts.collectCustomPropertyIds !== void 0)
44666
45083
  args.collect_custom_property_ids = JSON.parse(opts.collectCustomPropertyIds);
44667
45084
  if (opts.contractClauseIds !== void 0)
@@ -44677,6 +45094,25 @@ Examples:
44677
45094
  queryParamKeys: []
44678
45095
  });
44679
45096
  });
45097
+ resource.command("duplicate").description(`Create a draft duplicate of an existing quote, including its linked invoice or subscription configuration.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45098
+ Examples:
45099
+ hyperline quotes duplicate --id <id>
45100
+ hyperline quotes duplicate --id <id> --output json`).action(async (opts) => {
45101
+ const ctx = resource.parent?.opts()._ctx;
45102
+ if (!ctx) {
45103
+ process.stderr.write("Error: Not authenticated\n");
45104
+ process.exit(1);
45105
+ }
45106
+ const args = {};
45107
+ if (opts.id !== void 0)
45108
+ args.id = opts.id;
45109
+ await ctx.execute({
45110
+ method: "POST",
45111
+ path: "/v1/quotes/{id}/duplicate",
45112
+ args,
45113
+ queryParamKeys: []
45114
+ });
45115
+ });
44680
45116
  resource.command("download").description(`Download the PDF of a quote. Supports locale parameter for localization.`).requiredOption("--id <value>", `id parameter`).option("--locale <value>", `Locale as a supported language code and an uppercase ISO 3166-1 alpha-2 country code, separated by a hyphen.`).addHelpText("after", `
44681
45117
  Examples:
44682
45118
  hyperline quotes download --id <id>
@@ -44698,10 +45134,11 @@ Examples:
44698
45134
  queryParamKeys: ["locale"]
44699
45135
  });
44700
45136
  });
44701
- 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", `
45137
+ 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", `
44702
45138
  Examples:
44703
- hyperline quotes approve --id <id>
44704
- hyperline quotes approve --id <id> --output json`).action(async (opts) => {
45139
+ hyperline quotes finalize --id <id>
45140
+ hyperline quotes finalize --id <id> --requester-comment <requester_comment>
45141
+ hyperline quotes finalize --id <id> --output json`).action(async (opts) => {
44705
45142
  const ctx = resource.parent?.opts()._ctx;
44706
45143
  if (!ctx) {
44707
45144
  process.stderr.write("Error: Not authenticated\n");
@@ -44710,17 +45147,19 @@ Examples:
44710
45147
  const args = {};
44711
45148
  if (opts.id !== void 0)
44712
45149
  args.id = opts.id;
45150
+ if (opts.requesterComment !== void 0)
45151
+ args.requester_comment = opts.requesterComment;
44713
45152
  await ctx.execute({
44714
45153
  method: "POST",
44715
- path: "/v1/quotes/{id}/approve",
45154
+ path: "/v1/quotes/{id}/finalize",
44716
45155
  args,
44717
45156
  queryParamKeys: []
44718
45157
  });
44719
45158
  });
44720
- 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", `
45159
+ resource.command("redraft").description(`Switch a quote back to draft so its subscription or invoice configuration can be updated. Works on quotes pending approval, with changes requested, approved, or awaiting signature. Cancels pending approval requests and the signature request; the quote must then be finalized again.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
44721
45160
  Examples:
44722
- hyperline quotes finalize --id <id>
44723
- hyperline quotes finalize --id <id> --output json`).action(async (opts) => {
45161
+ hyperline quotes redraft --id <id>
45162
+ hyperline quotes redraft --id <id> --output json`).action(async (opts) => {
44724
45163
  const ctx = resource.parent?.opts()._ctx;
44725
45164
  if (!ctx) {
44726
45165
  process.stderr.write("Error: Not authenticated\n");
@@ -44731,16 +45170,63 @@ Examples:
44731
45170
  args.id = opts.id;
44732
45171
  await ctx.execute({
44733
45172
  method: "POST",
44734
- path: "/v1/quotes/{id}/finalize",
45173
+ path: "/v1/quotes/{id}/redraft",
45174
+ args,
45175
+ queryParamKeys: []
45176
+ });
45177
+ });
45178
+ 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", `
45179
+ Examples:
45180
+ hyperline quotes send --id <id>
45181
+ hyperline quotes send --id <id> --email <email> --message <message>
45182
+ hyperline quotes send --id <id> --output json`).action(async (opts) => {
45183
+ const ctx = resource.parent?.opts()._ctx;
45184
+ if (!ctx) {
45185
+ process.stderr.write("Error: Not authenticated\n");
45186
+ process.exit(1);
45187
+ }
45188
+ const args = {};
45189
+ if (opts.id !== void 0)
45190
+ args.id = opts.id;
45191
+ if (opts.email !== void 0)
45192
+ args.email = opts.email;
45193
+ if (opts.message !== void 0)
45194
+ args.message = opts.message;
45195
+ await ctx.execute({
45196
+ method: "POST",
45197
+ path: "/v1/quotes/{id}/send",
45198
+ args,
45199
+ queryParamKeys: []
45200
+ });
45201
+ });
45202
+ 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", `
45203
+ Examples:
45204
+ hyperline quotes list-quote-signers --id <id>`).action(async (opts) => {
45205
+ const ctx = resource.parent?.opts()._ctx;
45206
+ if (!ctx) {
45207
+ process.stderr.write("Error: Not authenticated\n");
45208
+ process.exit(1);
45209
+ }
45210
+ const args = {};
45211
+ if (opts.id !== void 0)
45212
+ args.id = opts.id;
45213
+ await ctx.execute({
45214
+ method: "GET",
45215
+ path: "/v1/quotes/{id}/signers",
44735
45216
  args,
44736
45217
  queryParamKeys: []
44737
45218
  });
44738
45219
  });
44739
- 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", `
45220
+ 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>", `
45221
+ Signature workflow of the quote, replaced as a whole.
45222
+
45223
+ 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.
45224
+
45225
+ 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.
45226
+ `).addHelpText("after", `
44740
45227
  Examples:
44741
- hyperline quotes send --id <id> --email <email>
44742
- hyperline quotes send --id <id> --email <email> --message <message>
44743
- hyperline quotes send --id <id> --email <email> --output json`).action(async (opts) => {
45228
+ hyperline quotes set-quote-signers --id <id> --signers <signers>
45229
+ hyperline quotes set-quote-signers --id <id> --signers <signers> --output json`).action(async (opts) => {
44744
45230
  const ctx = resource.parent?.opts()._ctx;
44745
45231
  if (!ctx) {
44746
45232
  process.stderr.write("Error: Not authenticated\n");
@@ -44749,13 +45235,11 @@ Examples:
44749
45235
  const args = {};
44750
45236
  if (opts.id !== void 0)
44751
45237
  args.id = opts.id;
44752
- if (opts.email !== void 0)
44753
- args.email = opts.email;
44754
- if (opts.message !== void 0)
44755
- args.message = opts.message;
45238
+ if (opts.signers !== void 0)
45239
+ args.signers = JSON.parse(opts.signers);
44756
45240
  await ctx.execute({
44757
- method: "POST",
44758
- path: "/v1/quotes/{id}/send",
45241
+ method: "PUT",
45242
+ path: "/v1/quotes/{id}/signers",
44759
45243
  args,
44760
45244
  queryParamKeys: []
44761
45245
  });
@@ -44843,6 +45327,48 @@ Examples:
44843
45327
  });
44844
45328
  }
44845
45329
 
45330
+ // build/commands/generated/quotes-approvals.js
45331
+ function registerQuotes_ApprovalsCommands(parent) {
45332
+ const resource = parent.command("quotes-approvals").description("Manage quotes > approvals");
45333
+ 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", `
45334
+ Examples:
45335
+ hyperline quotes-approvals approve-quote --id <id>
45336
+ hyperline quotes-approvals approve-quote --id <id> --output json`).action(async (opts) => {
45337
+ const ctx = resource.parent?.opts()._ctx;
45338
+ if (!ctx) {
45339
+ process.stderr.write("Error: Not authenticated\n");
45340
+ process.exit(1);
45341
+ }
45342
+ const args = {};
45343
+ if (opts.id !== void 0)
45344
+ args.id = opts.id;
45345
+ await ctx.execute({
45346
+ method: "POST",
45347
+ path: "/v1/quotes/{id}/approve",
45348
+ args,
45349
+ queryParamKeys: []
45350
+ });
45351
+ });
45352
+ 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", `
45353
+ Examples:
45354
+ hyperline quotes-approvals get-quote-approvals --id <id>`).action(async (opts) => {
45355
+ const ctx = resource.parent?.opts()._ctx;
45356
+ if (!ctx) {
45357
+ process.stderr.write("Error: Not authenticated\n");
45358
+ process.exit(1);
45359
+ }
45360
+ const args = {};
45361
+ if (opts.id !== void 0)
45362
+ args.id = opts.id;
45363
+ await ctx.execute({
45364
+ method: "GET",
45365
+ path: "/v1/quotes/{id}/approvals",
45366
+ args,
45367
+ queryParamKeys: []
45368
+ });
45369
+ });
45370
+ }
45371
+
44846
45372
  // build/commands/generated/quotes-templates.js
44847
45373
  function registerQuotes_TemplatesCommands(parent) {
44848
45374
  const resource = parent.command("quotes-templates").description("Manage quotes > templates");
@@ -45042,7 +45568,7 @@ Examples:
45042
45568
  queryParamKeys: []
45043
45569
  });
45044
45570
  });
45045
- 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", `
45571
+ 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", `
45046
45572
  Examples:
45047
45573
  hyperline subscriptions cancel --id <id>
45048
45574
  hyperline subscriptions cancel --id <id> --cancel-at <cancel_at> --reason <reason>
@@ -45070,9 +45596,10 @@ Examples:
45070
45596
  queryParamKeys: []
45071
45597
  });
45072
45598
  });
45073
- resource.command("reinstate").description(`Reinstate a subscription that is scheduled for cancellation, reverting it to active status.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45599
+ 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", `
45074
45600
  Examples:
45075
45601
  hyperline subscriptions reinstate --id <id>
45602
+ hyperline subscriptions reinstate --id <id> --reactivate-at <reactivate_at> --invoicing-mode <invoicing_mode>
45076
45603
  hyperline subscriptions reinstate --id <id> --output json`).action(async (opts) => {
45077
45604
  const ctx = resource.parent?.opts()._ctx;
45078
45605
  if (!ctx) {
@@ -45082,6 +45609,12 @@ Examples:
45082
45609
  const args = {};
45083
45610
  if (opts.id !== void 0)
45084
45611
  args.id = opts.id;
45612
+ if (opts.reactivateAt !== void 0)
45613
+ args.reactivate_at = opts.reactivateAt;
45614
+ if (opts.invoicingMode !== void 0)
45615
+ args.invoicing_mode = opts.invoicingMode;
45616
+ if (opts.chargeLineItems !== void 0)
45617
+ args.charge_line_items = JSON.parse(opts.chargeLineItems);
45085
45618
  await ctx.execute({
45086
45619
  method: "POST",
45087
45620
  path: "/v1/subscriptions/{id}/reinstate",
@@ -45089,7 +45622,7 @@ Examples:
45089
45622
  queryParamKeys: []
45090
45623
  });
45091
45624
  });
45092
- 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", `
45625
+ 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", `
45093
45626
  Examples:
45094
45627
  hyperline subscriptions pause --id <id>
45095
45628
  hyperline subscriptions pause --id <id> --reactivate-at <reactivate_at>
@@ -45130,9 +45663,10 @@ Examples:
45130
45663
  queryParamKeys: []
45131
45664
  });
45132
45665
  });
45133
- resource.command("reactivate").description(`Resume a paused subscription, restarting billing from the current date.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45666
+ 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", `
45134
45667
  Examples:
45135
45668
  hyperline subscriptions reactivate --id <id>
45669
+ hyperline subscriptions reactivate --id <id> --reactivate-at <reactivate_at> --invoicing-mode <invoicing_mode>
45136
45670
  hyperline subscriptions reactivate --id <id> --output json`).action(async (opts) => {
45137
45671
  const ctx = resource.parent?.opts()._ctx;
45138
45672
  if (!ctx) {
@@ -45142,6 +45676,12 @@ Examples:
45142
45676
  const args = {};
45143
45677
  if (opts.id !== void 0)
45144
45678
  args.id = opts.id;
45679
+ if (opts.reactivateAt !== void 0)
45680
+ args.reactivate_at = opts.reactivateAt;
45681
+ if (opts.invoicingMode !== void 0)
45682
+ args.invoicing_mode = opts.invoicingMode;
45683
+ if (opts.chargeLineItems !== void 0)
45684
+ args.charge_line_items = JSON.parse(opts.chargeLineItems);
45145
45685
  await ctx.execute({
45146
45686
  method: "POST",
45147
45687
  path: "/v1/subscriptions/{id}/reactivate",
@@ -45328,7 +45868,7 @@ Examples:
45328
45868
  queryParamKeys: []
45329
45869
  });
45330
45870
  });
45331
- resource.command("list").description(`List subscriptions with filters for activation_strategy, status, currency, plan_id, original_quote_id, integration_entity_id, customer_id, invoicing_entity_id, purchase_order, updated_at, custom_properties. Draft, voided, cancelled and archived excluded by default (status=all applies the same exclusion); status=any returns every status. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--activation-strategy <value>", `activation_strategy`).option("--activation-strategy.in <value>", `activation_strategy__in`).option("--status <value>", `
45871
+ resource.command("list").description(`List subscriptions with filters for activation_strategy, status, currency, plan_id, original_quote_id, integration_entity_id, customer_id, invoicing_entity_id, purchase_order, updated_at, cancel_at, custom_properties, and the active contract: contract_start__gte/__lte, contract_end__gte/__lte, renew_automatically. For upcoming renewals, combine contract_end__gte/__lte with renew_automatically, plus cancel_at for scheduled cancellations. Draft, voided, cancelled and archived excluded by default (status=all applies the same exclusion); status=any returns every status. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--activation-strategy <value>", `activation_strategy`).option("--activation-strategy.in <value>", `activation_strategy__in`).option("--status <value>", `
45332
45872
  Subscription status filter.
45333
45873
 
45334
45874
  - \`active\`, \`pending\`, \`paused\`, \`errored\`, \`cancelled\`, \`draft\`, \`voided\`, \`archived\`: match that status.
@@ -45337,7 +45877,7 @@ Subscription status filter.
45337
45877
  - \`any\`: every status, no exclusion.
45338
45878
 
45339
45879
  Use \`status__in\` with comma-separated values to combine statuses. When the filter is omitted, \`draft\`, \`voided\`, \`cancelled\` and \`archived\` subscriptions are excluded.
45340
- `).option("--status.in <value>", `Comma-separated list of subscription statuses to include. Same values as \`status\`.`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--plan-id <value>", `plan_id`).option("--plan-id.not <value>", `plan_id__not`).option("--plan-id.is-null <value>", `plan_id__isNull`).option("--plan-id.is-not-null <value>", `plan_id__isNotNull`).option("--plan-id.equals <value>", `plan_id__equals`).option("--plan-id.contains <value>", `plan_id__contains`).option("--plan-id.starts-with <value>", `plan_id__startsWith`).option("--plan-id.end-with <value>", `plan_id__endWith`).option("--original-quote-id <value>", `original_quote_id`).option("--original-quote-id.not <value>", `original_quote_id__not`).option("--original-quote-id.is-null <value>", `original_quote_id__isNull`).option("--original-quote-id.is-not-null <value>", `original_quote_id__isNotNull`).option("--original-quote-id.equals <value>", `original_quote_id__equals`).option("--original-quote-id.contains <value>", `original_quote_id__contains`).option("--original-quote-id.starts-with <value>", `original_quote_id__startsWith`).option("--original-quote-id.end-with <value>", `original_quote_id__endWith`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--purchase-order <value>", `purchase_order`).option("--purchase-order.not <value>", `purchase_order__not`).option("--purchase-order.is-null <value>", `purchase_order__isNull`).option("--purchase-order.is-not-null <value>", `purchase_order__isNotNull`).option("--purchase-order.equals <value>", `purchase_order__equals`).option("--purchase-order.contains <value>", `purchase_order__contains`).option("--purchase-order.starts-with <value>", `purchase_order__startsWith`).option("--purchase-order.end-with <value>", `purchase_order__endWith`).option("--custom-properties <value>", `custom_properties`).option("--invoice-drafts <value>", `invoice_drafts`).option("--integration-entity-id <value>", `integration_entity_id`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
45880
+ `).option("--status.in <value>", `Comma-separated list of subscription statuses to include. Same values as \`status\`.`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--plan-id <value>", `plan_id`).option("--plan-id.not <value>", `plan_id__not`).option("--plan-id.is-null <value>", `plan_id__isNull`).option("--plan-id.is-not-null <value>", `plan_id__isNotNull`).option("--plan-id.equals <value>", `plan_id__equals`).option("--plan-id.contains <value>", `plan_id__contains`).option("--plan-id.starts-with <value>", `plan_id__startsWith`).option("--plan-id.end-with <value>", `plan_id__endWith`).option("--original-quote-id <value>", `original_quote_id`).option("--original-quote-id.not <value>", `original_quote_id__not`).option("--original-quote-id.is-null <value>", `original_quote_id__isNull`).option("--original-quote-id.is-not-null <value>", `original_quote_id__isNotNull`).option("--original-quote-id.equals <value>", `original_quote_id__equals`).option("--original-quote-id.contains <value>", `original_quote_id__contains`).option("--original-quote-id.starts-with <value>", `original_quote_id__startsWith`).option("--original-quote-id.end-with <value>", `original_quote_id__endWith`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--purchase-order <value>", `purchase_order`).option("--purchase-order.not <value>", `purchase_order__not`).option("--purchase-order.is-null <value>", `purchase_order__isNull`).option("--purchase-order.is-not-null <value>", `purchase_order__isNotNull`).option("--purchase-order.equals <value>", `purchase_order__equals`).option("--purchase-order.contains <value>", `purchase_order__contains`).option("--purchase-order.starts-with <value>", `purchase_order__startsWith`).option("--purchase-order.end-with <value>", `purchase_order__endWith`).option("--custom-properties <value>", `custom_properties`).option("--invoice-drafts <value>", `invoice_drafts`).option("--integration-entity-id <value>", `integration_entity_id`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).option("--cancel-at <value>", `cancel_at`).option("--cancel-at.not <value>", `cancel_at__not`).option("--cancel-at.is-null <value>", `cancel_at__isNull`).option("--cancel-at.is-not-null <value>", `cancel_at__isNotNull`).option("--cancel-at.equals <value>", `cancel_at__equals`).option("--cancel-at.lt <value>", `cancel_at__lt`).option("--cancel-at.lte <value>", `cancel_at__lte`).option("--cancel-at.gt <value>", `cancel_at__gt`).option("--cancel-at.gte <value>", `cancel_at__gte`).option("--contract-start.gte <value>", `Return only subscriptions whose active contract starts on or after this date.`).option("--contract-start.lte <value>", `Return only subscriptions whose active contract starts on or before this date.`).option("--contract-end.gte <value>", `Return only subscriptions whose active contract ends on or after this date.`).option("--contract-end.lte <value>", `Return only subscriptions whose active contract ends on or before this date.`).option("--renew-automatically <value>", `Return only subscriptions whose active contract renews automatically (\`true\`) or not (\`false\`).`).addHelpText("after", `
45341
45881
  Examples:
45342
45882
  hyperline subscriptions list
45343
45883
  hyperline subscriptions list --take <take> --activation-strategy <activation_strategy>`).action(async (opts) => {
@@ -45461,6 +46001,34 @@ Examples:
45461
46001
  args.updated_at__gt = opts["updatedAt.gt"];
45462
46002
  if (opts["updatedAt.gte"] !== void 0)
45463
46003
  args.updated_at__gte = opts["updatedAt.gte"];
46004
+ if (opts.cancelAt !== void 0)
46005
+ args.cancel_at = opts.cancelAt;
46006
+ if (opts["cancelAt.not"] !== void 0)
46007
+ args.cancel_at__not = opts["cancelAt.not"];
46008
+ if (opts["cancelAt.isNull"] !== void 0)
46009
+ args.cancel_at__isNull = opts["cancelAt.isNull"];
46010
+ if (opts["cancelAt.isNotNull"] !== void 0)
46011
+ args.cancel_at__isNotNull = opts["cancelAt.isNotNull"];
46012
+ if (opts["cancelAt.equals"] !== void 0)
46013
+ args.cancel_at__equals = opts["cancelAt.equals"];
46014
+ if (opts["cancelAt.lt"] !== void 0)
46015
+ args.cancel_at__lt = opts["cancelAt.lt"];
46016
+ if (opts["cancelAt.lte"] !== void 0)
46017
+ args.cancel_at__lte = opts["cancelAt.lte"];
46018
+ if (opts["cancelAt.gt"] !== void 0)
46019
+ args.cancel_at__gt = opts["cancelAt.gt"];
46020
+ if (opts["cancelAt.gte"] !== void 0)
46021
+ args.cancel_at__gte = opts["cancelAt.gte"];
46022
+ if (opts["contractStart.gte"] !== void 0)
46023
+ args.contract_start__gte = opts["contractStart.gte"];
46024
+ if (opts["contractStart.lte"] !== void 0)
46025
+ args.contract_start__lte = opts["contractStart.lte"];
46026
+ if (opts["contractEnd.gte"] !== void 0)
46027
+ args.contract_end__gte = opts["contractEnd.gte"];
46028
+ if (opts["contractEnd.lte"] !== void 0)
46029
+ args.contract_end__lte = opts["contractEnd.lte"];
46030
+ if (opts.renewAutomatically !== void 0)
46031
+ args.renew_automatically = opts.renewAutomatically;
45464
46032
  if (opts.take !== void 0)
45465
46033
  args.take = Number(opts.take);
45466
46034
  if (opts.skip !== void 0)
@@ -45528,7 +46096,21 @@ Examples:
45528
46096
  "updated_at__lt",
45529
46097
  "updated_at__lte",
45530
46098
  "updated_at__gt",
45531
- "updated_at__gte"
46099
+ "updated_at__gte",
46100
+ "cancel_at",
46101
+ "cancel_at__not",
46102
+ "cancel_at__isNull",
46103
+ "cancel_at__isNotNull",
46104
+ "cancel_at__equals",
46105
+ "cancel_at__lt",
46106
+ "cancel_at__lte",
46107
+ "cancel_at__gt",
46108
+ "cancel_at__gte",
46109
+ "contract_start__gte",
46110
+ "contract_start__lte",
46111
+ "contract_end__gte",
46112
+ "contract_end__lte",
46113
+ "renew_automatically"
45532
46114
  ]
45533
46115
  });
45534
46116
  });
@@ -46725,10 +47307,11 @@ function registerAllCommands(program2) {
46725
47307
  registerAccounting_ReportsCommands(program2);
46726
47308
  registerAccounting_Revenue_RecognitionCommands(program2);
46727
47309
  registerAccounting_RulesCommands(program2);
46728
- registerAgentsCommands(program2);
46729
47310
  registerCustom_PropertiesCommands(program2);
46730
47311
  registerAggregatorsCommands(program2);
46731
47312
  registerAggregators_UsageCommands(program2);
47313
+ registerAi_BillingCommands(program2);
47314
+ registerAi_CostsCommands(program2);
46732
47315
  registerAnalyticsCommands(program2);
46733
47316
  registerBank_AccountsCommands(program2);
46734
47317
  registerCompaniesCommands(program2);
@@ -46747,11 +47330,13 @@ function registerAllCommands(program2) {
46747
47330
  registerInvoicesCommands(program2);
46748
47331
  registerInvoices_TransactionsCommands(program2);
46749
47332
  registerInvoicing_EntitiesCommands(program2);
47333
+ registerAi_MonitoringCommands(program2);
46750
47334
  registerPaymentsCommands(program2);
46751
47335
  registerProductsCommands(program2);
46752
47336
  registerPrice_ConfigurationsCommands(program2);
46753
47337
  registerQuotesCommands(program2);
46754
47338
  registerQuotes_TemplatesCommands(program2);
47339
+ registerQuotes_ApprovalsCommands(program2);
46755
47340
  registerSubscriptions_TemplatesCommands(program2);
46756
47341
  registerSubscriptionsCommands(program2);
46757
47342
  registerSubscriptions_TransitionsCommands(program2);
@@ -62715,6 +63300,25 @@ var DomainSchema = external_exports.string().trim().toLowerCase().regex(/^(?!:\/
62715
63300
  example: "acme.com"
62716
63301
  });
62717
63302
 
63303
+ // ../hyperline-lib/build/http/dto/emailStatus.js
63304
+ var EmailStatusSchema = external_exports.enum([
63305
+ "sent",
63306
+ "delivered",
63307
+ "opened",
63308
+ "clicked",
63309
+ "spammed",
63310
+ "bounced",
63311
+ "queued",
63312
+ "drafted",
63313
+ "attempted",
63314
+ "failed",
63315
+ "undeliverable",
63316
+ "converted",
63317
+ "suppressed",
63318
+ "unsubscribed",
63319
+ "dropped"
63320
+ ]);
63321
+
62718
63322
  // ../hyperline-lib/build/http/dto/error.js
62719
63323
  var ErrorSchema = external_exports.object({
62720
63324
  message: external_exports.string()
@@ -62743,23 +63347,26 @@ var languages = [
62743
63347
 
62744
63348
  // ../hyperline-i18n/build/locales/de.js
62745
63349
  var de = {
62746
- "accounting.invoicePosted.entryDescription": "Buchungseintrag f\xFCr Rechnung {{invoiceId}}",
62747
- "accounting.transactionSettled.entryDescription": "Zahlungsabwicklung f\xFCr Rechnung {{invoiceId}}",
62748
- "accounting.transactionRefunded.entryDescription": "R\xFCckerstattung f\xFCr Rechnung {{invoiceId}}",
62749
63350
  "accounting.creditNotePosted.entryDescription": "Gutschrift {{creditNoteId}} f\xFCr Rechnung {{invoiceId}}",
62750
- "accounting.standaloneCreditNotePosted.entryDescription": "Gutschrift {{creditNoteId}}",
63351
+ "accounting.invoicePosted.entryDescription": "Buchungseintrag f\xFCr Rechnung {{invoiceId}}",
63352
+ "accounting.revrec.closedPeriodFallbackNote": " (in die n\xE4chste offene Periode gebucht \u2013 Zielperiode geschlossen; urspr\xFCngliches Datum {{originalDate}})",
62751
63353
  "accounting.revrec.creditLineDescription": "Umsatz realisieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62752
63354
  "accounting.revrec.debitLineDescription": "Abgrenzungsposten reduzieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62753
63355
  "accounting.revrec.discountCreditLineDescription": "Erl\xF6sminderung (Rabatt) erfassen \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62754
- "accounting.revrec.closedPeriodFallbackNote": " (in die n\xE4chste offene Periode gebucht \u2013 Zielperiode geschlossen; urspr\xFCngliches Datum {{originalDate}})",
62755
63356
  "accounting.revrec.discountDebitLineDescription": "Abgegrenzten Rabatt reduzieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62756
63357
  "accounting.revrec.entryDescription": "Umsatzrealisierung f\xFCr Zeitplan {{scheduleId}}, Zeitraum {{periodStart}} - {{periodEnd}}",
63358
+ "accounting.standaloneCreditNotePosted.entryDescription": "Gutschrift {{creditNoteId}}",
63359
+ "accounting.transactionChargedBack.entryDescription": "R\xFCckbuchung f\xFCr Rechnung {{invoiceId}}",
63360
+ "accounting.transactionRefunded.entryDescription": "R\xFCckerstattung f\xFCr Rechnung {{invoiceId}}",
63361
+ "accounting.transactionSettled.entryDescription": "Zahlungsabwicklung f\xFCr Rechnung {{invoiceId}}",
62757
63362
  "creditNotes.refundChargeName": "R\xFCckerstattung f\xFCr die Rechnung",
62758
63363
  "credits.bundleOf": "{{productName}} - Paket mit {{creditCount}} Guthaben",
62759
63364
  "credits.unitsOf": "{{productName}} - {{creditCount}} Guthaben",
62760
63365
  "einvoicing.paymentFromWallet": "Zahlung aus Guthaben",
62761
63366
  "einvoicing.paymentProcessed": "Zahlung verarbeitet",
62762
63367
  "einvoicing.paymentReceived": "Zahlung erhalten",
63368
+ "invoices.minimumFee.adjustmentName": "Anpassung der Mindestgeb\xFChr",
63369
+ "invoices.minimumFee.name": "Mindestgeb\xFChr",
62763
63370
  "invoices.outstandingProduct.description": "Unbezahlter Betrag der Rechnung{{invoiceNumber}} vom {{date}}",
62764
63371
  "invoices.outstandingProduct.descriptionPeriod": "Unbezahlter Betrag der Rechnung{{invoiceNumber}} vom {{periodStart}} bis {{periodEnd}}",
62765
63372
  "invoices.outstandingProduct.name": "Offener Saldo",
@@ -62767,9 +63374,9 @@ var de = {
62767
63374
  "invoices.prorata.paymentForItemFullPeriod": "Zahlung f\xFCr",
62768
63375
  "invoices.prorata.refundForItem": "Anteilig erstatteter Betrag f\xFCr",
62769
63376
  "invoices.prorata.refundForItemFullPeriod": "Erstattung f\xFCr",
62770
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 abgelaufenes Guthaben",
62771
63377
  "subscriptions.closingChargeName": "Abschlussgeb\xFChr f\xFCr das Abonnement",
62772
63378
  "subscriptions.correction": "Vorperiodische Anpassung",
63379
+ "subscriptions.reinstatementRechargeName": "Wiederherstellungsgeb\xFChr f\xFCr den stornierten Zeitraum",
62773
63380
  "subscriptions.updates.addCoupon": "Gutschein hinzuf\xFCgen {{couponName}}",
62774
63381
  "subscriptions.updates.addProduct": "{{productName}} hinzuf\xFCgen",
62775
63382
  "subscriptions.updates.removeCoupon": "Gutschein entfernen {{couponName}}",
@@ -62784,7 +63391,8 @@ var de = {
62784
63391
  "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",
62785
63392
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Diese Position wurde f\xFCr den anteiligen Zeitraum in Rechnung gestellt",
62786
63393
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Betrag von {{amount}} f\xFCr den anteiligen Zeitraum nicht in Rechnung gestellt",
62787
- "subscriptions.updates.updatePrices": "Preise f\xFCr {{productName}} aktualisieren"
63394
+ "subscriptions.updates.updatePrices": "Preise f\xFCr {{productName}} aktualisieren",
63395
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 abgelaufenes Guthaben"
62788
63396
  };
62789
63397
 
62790
63398
  // ../hyperline-i18n/build/locales/en.js
@@ -62792,6 +63400,8 @@ var en = {
62792
63400
  "creditNotes.refundChargeName": "Refund for invoice",
62793
63401
  "credits.bundleOf": "{{productName}} - Pack of {{creditCount}} credits",
62794
63402
  "credits.unitsOf": "{{productName}} - {{creditCount}} credits",
63403
+ "invoices.minimumFee.adjustmentName": "Minimum fee adjustment",
63404
+ "invoices.minimumFee.name": "Minimum fee",
62795
63405
  "invoices.outstandingProduct.description": "Unpaid amount from the invoice{{invoiceNumber}} emitted on {{date}}",
62796
63406
  "invoices.outstandingProduct.descriptionPeriod": "Unpaid amount from the invoice{{invoiceNumber}} from {{periodStart}} to {{periodEnd}}",
62797
63407
  "invoices.outstandingProduct.name": "Outstanding balance",
@@ -62801,6 +63411,7 @@ var en = {
62801
63411
  "invoices.prorata.refundForItemFullPeriod": "Refund for",
62802
63412
  "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 expired balance",
62803
63413
  "subscriptions.closingChargeName": "Closing fee for subscription",
63414
+ "subscriptions.reinstatementRechargeName": "Reinstatement recharge of canceled period",
62804
63415
  "subscriptions.correction": "Adjustment previous period",
62805
63416
  "subscriptions.updates.addCoupon": "Add coupon {{couponName}}",
62806
63417
  "subscriptions.updates.addProduct": "Add {{productName}}",
@@ -62820,6 +63431,7 @@ var en = {
62820
63431
  "accounting.invoicePosted.entryDescription": "Posting entry for Invoice {{invoiceId}} issued",
62821
63432
  "accounting.transactionSettled.entryDescription": "Payment settlement for Invoice {{invoiceId}}",
62822
63433
  "accounting.transactionRefunded.entryDescription": "Refund for Invoice {{invoiceId}}",
63434
+ "accounting.transactionChargedBack.entryDescription": "Chargeback for Invoice {{invoiceId}}",
62823
63435
  "accounting.creditNotePosted.entryDescription": "Credit note {{creditNoteId}} for Invoice {{invoiceId}}",
62824
63436
  "accounting.standaloneCreditNotePosted.entryDescription": "Credit note {{creditNoteId}}",
62825
63437
  "accounting.revrec.entryDescription": "Revenue recognition for schedule {{scheduleId}}, period {{periodStart}} - {{periodEnd}}",
@@ -62835,23 +63447,26 @@ var en = {
62835
63447
 
62836
63448
  // ../hyperline-i18n/build/locales/es.js
62837
63449
  var es = {
62838
- "accounting.invoicePosted.entryDescription": "Asiento contable para la factura {{invoiceId}}",
62839
- "accounting.transactionSettled.entryDescription": "Liquidaci\xF3n de pago para la factura {{invoiceId}}",
62840
- "accounting.transactionRefunded.entryDescription": "Reembolso de la factura {{invoiceId}}",
62841
63450
  "accounting.creditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}} para la factura {{invoiceId}}",
62842
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63451
+ "accounting.invoicePosted.entryDescription": "Asiento contable para la factura {{invoiceId}}",
63452
+ "accounting.revrec.closedPeriodFallbackNote": " (registrado en el pr\xF3ximo per\xEDodo abierto \u2014 per\xEDodo contable de destino cerrado; fecha original {{originalDate}})",
62843
63453
  "accounting.revrec.creditLineDescription": "Reconocer ingresos \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62844
63454
  "accounting.revrec.debitLineDescription": "Disminuci\xF3n de ingresos diferidos \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62845
63455
  "accounting.revrec.discountCreditLineDescription": "Reconocer contra-ingresos (descuento) \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62846
- "accounting.revrec.closedPeriodFallbackNote": " (registrado en el pr\xF3ximo per\xEDodo abierto \u2014 per\xEDodo contable de destino cerrado; fecha original {{originalDate}})",
62847
63456
  "accounting.revrec.discountDebitLineDescription": "Disminuci\xF3n de descuento diferido \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62848
63457
  "accounting.revrec.entryDescription": "Reconocimiento de ingresos para el cronograma {{scheduleId}}, per\xEDodo {{periodStart}} - {{periodEnd}}",
63458
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63459
+ "accounting.transactionChargedBack.entryDescription": "Contracargo de la factura {{invoiceId}}",
63460
+ "accounting.transactionRefunded.entryDescription": "Reembolso de la factura {{invoiceId}}",
63461
+ "accounting.transactionSettled.entryDescription": "Liquidaci\xF3n de pago para la factura {{invoiceId}}",
62849
63462
  "creditNotes.refundChargeName": "Reembolso por factura",
62850
63463
  "credits.bundleOf": "{{productName}} - Paquete de {{creditCount}} cr\xE9ditos",
62851
63464
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9ditos",
62852
63465
  "einvoicing.paymentFromWallet": "Pago desde el monedero",
62853
63466
  "einvoicing.paymentProcessed": "Pago procesado",
62854
63467
  "einvoicing.paymentReceived": "Pago recibido",
63468
+ "invoices.minimumFee.adjustmentName": "Ajuste del cargo m\xEDnimo",
63469
+ "invoices.minimumFee.name": "Cargo m\xEDnimo",
62855
63470
  "invoices.outstandingProduct.description": "Monto pendiente de la factura{{invoiceNumber}} emitida el {{date}}",
62856
63471
  "invoices.outstandingProduct.descriptionPeriod": "Monto pendiente de la factura{{invoiceNumber}} del {{periodStart}} al {{periodEnd}}",
62857
63472
  "invoices.outstandingProduct.name": "Saldo pendiente",
@@ -62859,9 +63474,9 @@ var es = {
62859
63474
  "invoices.prorata.paymentForItemFullPeriod": "Pago por",
62860
63475
  "invoices.prorata.refundForItem": "Reembolso prorrateado por",
62861
63476
  "invoices.prorata.refundForItemFullPeriod": "Reembolso por",
62862
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo caducado",
62863
63477
  "subscriptions.closingChargeName": "Cargo por cierre de suscripci\xF3n",
62864
63478
  "subscriptions.correction": "Ajuste del periodo anterior",
63479
+ "subscriptions.reinstatementRechargeName": "Recarga de reinstalaci\xF3n del per\xEDodo cancelado",
62865
63480
  "subscriptions.updates.addCoupon": "A\xF1adir cup\xF3n {{couponName}}",
62866
63481
  "subscriptions.updates.addProduct": "A\xF1adir {{productName}}",
62867
63482
  "subscriptions.updates.removeCoupon": "Eliminar cup\xF3n {{couponName}}",
@@ -62876,28 +63491,32 @@ var es = {
62876
63491
  "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",
62877
63492
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Esta l\xEDnea ha sido facturada para el per\xEDodo prorrateado",
62878
63493
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Importe de {{amount}} no facturado para el per\xEDodo prorrateado",
62879
- "subscriptions.updates.updatePrices": "Actualizar precios para {{productName}}"
63494
+ "subscriptions.updates.updatePrices": "Actualizar precios para {{productName}}",
63495
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo caducado"
62880
63496
  };
62881
63497
 
62882
63498
  // ../hyperline-i18n/build/locales/fr.js
62883
63499
  var fr = {
63500
+ "accounting.creditNotePosted.entryDescription": "Avoir {{creditNoteId}} pour la facture {{invoiceId}}",
63501
+ "accounting.invoicePosted.entryDescription": "\xC9criture de comptabilisation pour la facture {{invoiceId}}",
63502
+ "accounting.revrec.closedPeriodFallbackNote": " (comptabilis\xE9 sur la prochaine p\xE9riode ouverte \u2014 p\xE9riode comptable cible cl\xF4tur\xE9e ; date d'origine {{originalDate}})",
62884
63503
  "accounting.revrec.creditLineDescription": "Reconnaissance du chiffre d'affaires \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62885
63504
  "accounting.revrec.debitLineDescription": "Diminution des produits constat\xE9s d'avance \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62886
63505
  "accounting.revrec.discountCreditLineDescription": "Reconnaissance du contre-revenu (remise) \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62887
- "accounting.revrec.closedPeriodFallbackNote": " (comptabilis\xE9 sur la prochaine p\xE9riode ouverte \u2014 p\xE9riode comptable cible cl\xF4tur\xE9e ; date d'origine {{originalDate}})",
62888
63506
  "accounting.revrec.discountDebitLineDescription": "Diminution des remises diff\xE9r\xE9es \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62889
- "accounting.invoicePosted.entryDescription": "\xC9criture de comptabilisation pour la facture {{invoiceId}}",
62890
- "accounting.transactionSettled.entryDescription": "R\xE8glement de la facture {{invoiceId}}",
62891
- "accounting.transactionRefunded.entryDescription": "Remboursement de la facture {{invoiceId}}",
62892
- "accounting.creditNotePosted.entryDescription": "Avoir {{creditNoteId}} pour la facture {{invoiceId}}",
62893
- "accounting.standaloneCreditNotePosted.entryDescription": "Avoir {{creditNoteId}}",
62894
63507
  "accounting.revrec.entryDescription": "Reconnaissance du chiffre d'affaires pour l'\xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodStart}} - {{periodEnd}}",
63508
+ "accounting.standaloneCreditNotePosted.entryDescription": "Avoir {{creditNoteId}}",
63509
+ "accounting.transactionChargedBack.entryDescription": "R\xE9trofacturation de la facture {{invoiceId}}",
63510
+ "accounting.transactionRefunded.entryDescription": "Remboursement de la facture {{invoiceId}}",
63511
+ "accounting.transactionSettled.entryDescription": "R\xE8glement de la facture {{invoiceId}}",
62895
63512
  "creditNotes.refundChargeName": "Remboursement pour facture",
62896
63513
  "credits.bundleOf": "{{productName}} - Pack de {{creditCount}} cr\xE9dits",
62897
63514
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9dits",
62898
63515
  "einvoicing.paymentFromWallet": "Paiement depuis le portefeuille",
62899
63516
  "einvoicing.paymentProcessed": "Paiement effectu\xE9",
62900
63517
  "einvoicing.paymentReceived": "Paiement re\xE7u",
63518
+ "invoices.minimumFee.adjustmentName": "Ajustement des frais minimums",
63519
+ "invoices.minimumFee.name": "Frais minimums",
62901
63520
  "invoices.outstandingProduct.description": "Montant impay\xE9 de la facture{{invoiceNumber}} \xE9mise le {{date}}",
62902
63521
  "invoices.outstandingProduct.descriptionPeriod": "Montant impay\xE9 de la facture{{invoiceNumber}} du {{periodStart}} au {{periodEnd}}",
62903
63522
  "invoices.outstandingProduct.name": "Solde impay\xE9",
@@ -62905,9 +63524,9 @@ var fr = {
62905
63524
  "invoices.prorata.paymentForItemFullPeriod": "Paiement pour",
62906
63525
  "invoices.prorata.refundForItem": "Remboursement au prorata pour",
62907
63526
  "invoices.prorata.refundForItemFullPeriod": "Remboursement pour",
62908
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 solde expir\xE9",
62909
63527
  "subscriptions.closingChargeName": "Frais de cl\xF4ture pour abonnement",
62910
63528
  "subscriptions.correction": "Ajustement p\xE9riode pr\xE9c\xE9dente",
63529
+ "subscriptions.reinstatementRechargeName": "Recharge de r\xE9tablissement de la p\xE9riode annul\xE9e",
62911
63530
  "subscriptions.updates.addCoupon": "Ajout du coupon {{couponName}}",
62912
63531
  "subscriptions.updates.addProduct": "Ajout {{productName}}",
62913
63532
  "subscriptions.updates.removeCoupon": "Retrait du coupon {{couponName}}",
@@ -62922,28 +63541,32 @@ var fr = {
62922
63541
  "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",
62923
63542
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Cette ligne a \xE9t\xE9 factur\xE9e pour la p\xE9riode proratis\xE9e",
62924
63543
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Montant de {{amount}} non factur\xE9 pour la p\xE9riode proratis\xE9e",
62925
- "subscriptions.updates.updatePrices": "Mise \xE0 jour des prix pour {{productName}}"
63544
+ "subscriptions.updates.updatePrices": "Mise \xE0 jour des prix pour {{productName}}",
63545
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 solde expir\xE9"
62926
63546
  };
62927
63547
 
62928
63548
  // ../hyperline-i18n/build/locales/it.js
62929
63549
  var it = {
62930
- "accounting.invoicePosted.entryDescription": "Registrazione contabile per la fattura {{invoiceId}}",
62931
- "accounting.transactionSettled.entryDescription": "Regolamento pagamento per la fattura {{invoiceId}}",
62932
- "accounting.transactionRefunded.entryDescription": "Rimborso per la fattura {{invoiceId}}",
62933
63550
  "accounting.creditNotePosted.entryDescription": "Nota di credito {{creditNoteId}} per la fattura {{invoiceId}}",
62934
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota di credito {{creditNoteId}}",
63551
+ "accounting.invoicePosted.entryDescription": "Registrazione contabile per la fattura {{invoiceId}}",
63552
+ "accounting.revrec.closedPeriodFallbackNote": " (registrato nel prossimo periodo aperto \u2014 periodo contabile di destinazione chiuso; data originale {{originalDate}})",
62935
63553
  "accounting.revrec.creditLineDescription": "Riconoscere i ricavi \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
62936
63554
  "accounting.revrec.debitLineDescription": "Diminuzione dei ricavi differiti \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
62937
63555
  "accounting.revrec.discountCreditLineDescription": "Riconoscere il contra-ricavo (sconto) \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
62938
- "accounting.revrec.closedPeriodFallbackNote": " (registrato nel prossimo periodo aperto \u2014 periodo contabile di destinazione chiuso; data originale {{originalDate}})",
62939
63556
  "accounting.revrec.discountDebitLineDescription": "Diminuzione dello sconto differito \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
62940
63557
  "accounting.revrec.entryDescription": "Riconoscimento dei ricavi per il programma {{scheduleId}}, periodo {{periodStart}} - {{periodEnd}}",
63558
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota di credito {{creditNoteId}}",
63559
+ "accounting.transactionChargedBack.entryDescription": "Riaddebito per la fattura {{invoiceId}}",
63560
+ "accounting.transactionRefunded.entryDescription": "Rimborso per la fattura {{invoiceId}}",
63561
+ "accounting.transactionSettled.entryDescription": "Regolamento pagamento per la fattura {{invoiceId}}",
62941
63562
  "creditNotes.refundChargeName": "Rimborso per fattura",
62942
63563
  "credits.bundleOf": "{{productName}} - Pacchetto di {{creditCount}} crediti",
62943
63564
  "credits.unitsOf": "{{productName}} - {{creditCount}} crediti",
62944
63565
  "einvoicing.paymentFromWallet": "Pagamento dal portafoglio",
62945
63566
  "einvoicing.paymentProcessed": "Pagamento elaborato",
62946
63567
  "einvoicing.paymentReceived": "Pagamento ricevuto",
63568
+ "invoices.minimumFee.adjustmentName": "Adeguamento all\u2019importo minimo",
63569
+ "invoices.minimumFee.name": "Importo minimo",
62947
63570
  "invoices.outstandingProduct.description": "Importo insoluto della fattura{{invoiceNumber}} emessa il {{date}}",
62948
63571
  "invoices.outstandingProduct.descriptionPeriod": "Importo insoluto della fattura{{invoiceNumber}} dal {{periodStart}} al {{periodEnd}}",
62949
63572
  "invoices.outstandingProduct.name": "Saldo insoluto",
@@ -62951,9 +63574,9 @@ var it = {
62951
63574
  "invoices.prorata.paymentForItemFullPeriod": "Pagamento per",
62952
63575
  "invoices.prorata.refundForItem": "Rimborso proporzionale per",
62953
63576
  "invoices.prorata.refundForItemFullPeriod": "Rimborso per",
62954
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo scaduto",
62955
63577
  "subscriptions.closingChargeName": "Costo di chiusura per abbonamento",
62956
63578
  "subscriptions.correction": "Correzione periodo precedente",
63579
+ "subscriptions.reinstatementRechargeName": "Ricarica di reintegrazione del periodo annullato",
62957
63580
  "subscriptions.updates.addCoupon": "Aggiungi coupon {{couponName}}",
62958
63581
  "subscriptions.updates.addProduct": "Aggiungi {{productName}}",
62959
63582
  "subscriptions.updates.removeCoupon": "Rimuovi coupon {{couponName}}",
@@ -62968,14 +63591,32 @@ var it = {
62968
63591
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Importo di {{amount}} (con un minimo impegnato di {{committedCount}}) non fatturato per il periodo proporzionato",
62969
63592
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Questa voce \xE8 stata fatturata per il periodo proporzionato",
62970
63593
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Importo di {{amount}} non fatturato per il periodo proporzionato",
62971
- "subscriptions.updates.updatePrices": "Aggiorna prezzi per {{productName}}"
63594
+ "subscriptions.updates.updatePrices": "Aggiorna prezzi per {{productName}}",
63595
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo scaduto"
62972
63596
  };
62973
63597
 
62974
63598
  // ../hyperline-i18n/build/locales/lt.js
62975
63599
  var lt = {
63600
+ "accounting.creditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}} s\u0105skaitai fakt\u016Brai {{invoiceId}}",
63601
+ "accounting.invoicePosted.entryDescription": "I\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros {{invoiceId}} registravimo \u012Fra\u0161as",
63602
+ "accounting.revrec.closedPeriodFallbackNote": " (u\u017Eregistruota kitame atvirame laikotarpyje, nes tikslinis apskaitos laikotarpis u\u017Edarytas; pradin\u0117 data {{originalDate}})",
63603
+ "accounting.revrec.creditLineDescription": "Pajam\u0173 pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63604
+ "accounting.revrec.debitLineDescription": "Atid\u0117t\u0173j\u0173 pajam\u0173 suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63605
+ "accounting.revrec.discountCreditLineDescription": "Pajamas ma\u017Einan\u010Dios sumos (nuolaidos) pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63606
+ "accounting.revrec.discountDebitLineDescription": "Atid\u0117tosios nuolaidos suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63607
+ "accounting.revrec.entryDescription": "Pajam\u0173 pripa\u017Einimas pagal grafik\u0105 {{scheduleId}}, laikotarpis {{periodStart}}\u2013{{periodEnd}}",
63608
+ "accounting.standaloneCreditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}}",
63609
+ "accounting.transactionChargedBack.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} u\u017Egin\u010Dyto mok\u0117jimo gr\u0105\u017Einimas",
63610
+ "accounting.transactionRefunded.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} gr\u0105\u017Einimas",
63611
+ "accounting.transactionSettled.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} mok\u0117jimo sudengimas",
62976
63612
  "creditNotes.refundChargeName": "S\u0105skaitos fakt\u016Bros gr\u0105\u017Einimas",
62977
63613
  "credits.bundleOf": "{{productName}} \u2013 {{creditCount}} kredit\u0173 paketas",
62978
63614
  "credits.unitsOf": "{{productName}} \u2013 {{creditCount}} kredit\u0173",
63615
+ "einvoicing.paymentFromWallet": "Mok\u0117jimas i\u0161 pinigin\u0117s",
63616
+ "einvoicing.paymentProcessed": "Mok\u0117jimas apdorotas",
63617
+ "einvoicing.paymentReceived": "Mok\u0117jimas gautas",
63618
+ "invoices.minimumFee.adjustmentName": "Minimalaus mokes\u010Dio koregavimas",
63619
+ "invoices.minimumFee.name": "Minimalus mokestis",
62979
63620
  "invoices.outstandingProduct.description": "Neapmok\u0117ta {{date}} i\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros{{invoiceNumber}} suma",
62980
63621
  "invoices.outstandingProduct.descriptionPeriod": "Neapmok\u0117ta s\u0105skaitos fakt\u016Bros{{invoiceNumber}} suma u\u017E laikotarp\u012F nuo {{periodStart}} iki {{periodEnd}}",
62981
63622
  "invoices.outstandingProduct.name": "Neapmok\u0117tas likutis",
@@ -62983,59 +63624,49 @@ var lt = {
62983
63624
  "invoices.prorata.paymentForItemFullPeriod": "Mok\u0117jimas u\u017E",
62984
63625
  "invoices.prorata.refundForItem": "Proporcingas gr\u0105\u017Einimas u\u017E",
62985
63626
  "invoices.prorata.refundForItemFullPeriod": "Gr\u0105\u017Einimas u\u017E",
62986
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 nebegaliojantis likutis",
62987
63627
  "subscriptions.closingChargeName": "Prenumeratos u\u017Ebaigimo mokestis",
62988
63628
  "subscriptions.correction": "Ankstesnio laikotarpio koregavimas",
63629
+ "subscriptions.reinstatementRechargeName": "Atnaujinimo \u012Fmokos u\u017E nutraukt\u0105 laikotarp\u012F",
62989
63630
  "subscriptions.updates.addCoupon": "Prid\u0117ti kupon\u0105 {{couponName}}",
62990
63631
  "subscriptions.updates.addProduct": "Prid\u0117ti {{productName}}",
62991
63632
  "subscriptions.updates.removeCoupon": "Pa\u0161alinti kupon\u0105 {{couponName}}",
62992
63633
  "subscriptions.updates.removeProduct": "Pa\u0161alinti {{productName}}",
62993
63634
  "subscriptions.updates.unit": "vnt.",
62994
- "subscriptions.updates.updatePrices": "Atnaujinti {{productName}} kainas",
62995
63635
  "subscriptions.updates.updateCount": "Atnaujinti {{productName}} kiek\u012F ({{previousCount}} \u2192 {{newCount}} {{unit}})",
62996
- "subscriptions.updates.updateCount.description.prorata.committed.invoiced": "Pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
62997
- "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
62998
- "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 proporcingam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
62999
- "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63000
63636
  "subscriptions.updates.updateCount.description.full.committed.invoiced": "Visam laikotarpiui pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
63001
63637
  "subscriptions.updates.updateCount.description.full.committed.not_invoiced": "Visam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
63002
63638
  "subscriptions.updates.updateCount.description.full.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 visam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63003
63639
  "subscriptions.updates.updateCount.description.full.not_committed.not_invoiced": "Visam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63004
- "accounting.invoicePosted.entryDescription": "I\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros {{invoiceId}} registravimo \u012Fra\u0161as",
63005
- "accounting.transactionSettled.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} mok\u0117jimo sudengimas",
63006
- "accounting.transactionRefunded.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} gr\u0105\u017Einimas",
63007
- "accounting.creditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}} s\u0105skaitai fakt\u016Brai {{invoiceId}}",
63008
- "accounting.standaloneCreditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}}",
63009
- "accounting.revrec.entryDescription": "Pajam\u0173 pripa\u017Einimas pagal grafik\u0105 {{scheduleId}}, laikotarpis {{periodStart}}\u2013{{periodEnd}}",
63010
- "accounting.revrec.debitLineDescription": "Atid\u0117t\u0173j\u0173 pajam\u0173 suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63011
- "accounting.revrec.creditLineDescription": "Pajam\u0173 pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63012
- "accounting.revrec.discountDebitLineDescription": "Atid\u0117tosios nuolaidos suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63013
- "accounting.revrec.discountCreditLineDescription": "Pajamas ma\u017Einan\u010Dios sumos (nuolaidos) pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63014
- "accounting.revrec.closedPeriodFallbackNote": " (u\u017Eregistruota kitame atvirame laikotarpyje, nes tikslinis apskaitos laikotarpis u\u017Edarytas; pradin\u0117 data {{originalDate}})",
63015
- "einvoicing.paymentProcessed": "Mok\u0117jimas apdorotas",
63016
- "einvoicing.paymentReceived": "Mok\u0117jimas gautas",
63017
- "einvoicing.paymentFromWallet": "Mok\u0117jimas i\u0161 pinigin\u0117s"
63640
+ "subscriptions.updates.updateCount.description.prorata.committed.invoiced": "Pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
63641
+ "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
63642
+ "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 proporcingam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63643
+ "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63644
+ "subscriptions.updates.updatePrices": "Atnaujinti {{productName}} kainas",
63645
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 nebegaliojantis likutis"
63018
63646
  };
63019
63647
 
63020
63648
  // ../hyperline-i18n/build/locales/nl.js
63021
63649
  var nl = {
63022
- "accounting.invoicePosted.entryDescription": "Boekingsregel voor factuur {{invoiceId}}",
63023
- "accounting.transactionSettled.entryDescription": "Betalingsafwikkeling voor factuur {{invoiceId}}",
63024
- "accounting.transactionRefunded.entryDescription": "Terugbetaling voor factuur {{invoiceId}}",
63025
63650
  "accounting.creditNotePosted.entryDescription": "Creditnota {{creditNoteId}} voor factuur {{invoiceId}}",
63026
- "accounting.standaloneCreditNotePosted.entryDescription": "Creditnota {{creditNoteId}}",
63651
+ "accounting.invoicePosted.entryDescription": "Boekingsregel voor factuur {{invoiceId}}",
63652
+ "accounting.revrec.closedPeriodFallbackNote": " (geboekt in de volgende open periode \u2014 doelboekingsperiode gesloten; oorspronkelijke datum {{originalDate}})",
63027
63653
  "accounting.revrec.creditLineDescription": "Omzet erkennen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63028
63654
  "accounting.revrec.debitLineDescription": "Uitgestelde omzet verlagen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63029
63655
  "accounting.revrec.discountCreditLineDescription": "Omzetvermindering (korting) erkennen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63030
- "accounting.revrec.closedPeriodFallbackNote": " (geboekt in de volgende open periode \u2014 doelboekingsperiode gesloten; oorspronkelijke datum {{originalDate}})",
63031
63656
  "accounting.revrec.discountDebitLineDescription": "Uitgestelde korting verlagen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63032
63657
  "accounting.revrec.entryDescription": "Omzeterkenning voor schema {{scheduleId}}, periode {{periodStart}} - {{periodEnd}}",
63658
+ "accounting.standaloneCreditNotePosted.entryDescription": "Creditnota {{creditNoteId}}",
63659
+ "accounting.transactionChargedBack.entryDescription": "Terugboeking voor factuur {{invoiceId}}",
63660
+ "accounting.transactionRefunded.entryDescription": "Terugbetaling voor factuur {{invoiceId}}",
63661
+ "accounting.transactionSettled.entryDescription": "Betalingsafwikkeling voor factuur {{invoiceId}}",
63033
63662
  "creditNotes.refundChargeName": "Terugbetaling voor factuur",
63034
63663
  "credits.bundleOf": "{{productName}} - Bundel van {{creditCount}} credits",
63035
63664
  "credits.unitsOf": "{{productName}} - {{creditCount}} credits",
63036
63665
  "einvoicing.paymentFromWallet": "Betaling uit tegoed",
63037
63666
  "einvoicing.paymentProcessed": "Betaling verwerkt",
63038
63667
  "einvoicing.paymentReceived": "Betaling ontvangen",
63668
+ "invoices.minimumFee.adjustmentName": "Aanpassing minimumbedrag",
63669
+ "invoices.minimumFee.name": "Minimumbedrag",
63039
63670
  "invoices.outstandingProduct.description": "Onbetaald bedrag van de factuur{{invoiceNumber}} uitgegeven op {{date}}",
63040
63671
  "invoices.outstandingProduct.descriptionPeriod": "Onbetaald bedrag van de factuur{{invoiceNumber}} van {{periodStart}} tot {{periodEnd}}",
63041
63672
  "invoices.outstandingProduct.name": "Openstaand saldo",
@@ -63043,9 +63674,9 @@ var nl = {
63043
63674
  "invoices.prorata.paymentForItemFullPeriod": "Betaling voor",
63044
63675
  "invoices.prorata.refundForItem": "Gedeeltelijke terugbetaling voor",
63045
63676
  "invoices.prorata.refundForItemFullPeriod": "Terugbetaling voor",
63046
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 verlopen saldo",
63047
63677
  "subscriptions.closingChargeName": "Afsluitkosten voor abonnement",
63048
63678
  "subscriptions.correction": "Aanpassing vorige periode",
63679
+ "subscriptions.reinstatementRechargeName": "Herstelkosten van geannuleerde periode",
63049
63680
  "subscriptions.updates.addCoupon": "Coupon toevoegen {{couponName}}",
63050
63681
  "subscriptions.updates.addProduct": "{{productName}} toevoegen",
63051
63682
  "subscriptions.updates.removeCoupon": "Coupon verwijderen {{couponName}}",
@@ -63060,28 +63691,32 @@ var nl = {
63060
63691
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Bedrag van {{amount}} (met een minimaal toegezegd aantal van {{committedCount}}) niet gefactureerd voor de geproportioneerde periode",
63061
63692
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Deze regel is gefactureerd voor de geproportioneerde periode",
63062
63693
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Bedrag van {{amount}} niet gefactureerd voor de geproportioneerde periode",
63063
- "subscriptions.updates.updatePrices": "Prijzen bijwerken voor {{productName}}"
63694
+ "subscriptions.updates.updatePrices": "Prijzen bijwerken voor {{productName}}",
63695
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 verlopen saldo"
63064
63696
  };
63065
63697
 
63066
63698
  // ../hyperline-i18n/build/locales/pl.js
63067
63699
  var pl = {
63068
- "accounting.invoicePosted.entryDescription": "Zapis ksi\u0119gowy dla faktury {{invoiceId}}",
63069
- "accounting.transactionSettled.entryDescription": "Rozliczenie p\u0142atno\u015Bci dla faktury {{invoiceId}}",
63070
- "accounting.transactionRefunded.entryDescription": "Zwrot za faktur\u0119 {{invoiceId}}",
63071
63700
  "accounting.creditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}} dla faktury {{invoiceId}}",
63072
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}}",
63701
+ "accounting.invoicePosted.entryDescription": "Zapis ksi\u0119gowy dla faktury {{invoiceId}}",
63702
+ "accounting.revrec.closedPeriodFallbackNote": " (zaksi\u0119gowano w nast\u0119pnym otwartym okresie \u2014 docelowy okres ksi\u0119gowy zamkni\u0119ty; pierwotna data {{originalDate}})",
63073
63703
  "accounting.revrec.creditLineDescription": "Rozpoznanie przychodu \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63074
63704
  "accounting.revrec.debitLineDescription": "Zmniejszenie przychod\xF3w przysz\u0142ych okres\xF3w \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63075
63705
  "accounting.revrec.discountCreditLineDescription": "Rozpoznanie kontra-przychodu (rabat) \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63076
- "accounting.revrec.closedPeriodFallbackNote": " (zaksi\u0119gowano w nast\u0119pnym otwartym okresie \u2014 docelowy okres ksi\u0119gowy zamkni\u0119ty; pierwotna data {{originalDate}})",
63077
63706
  "accounting.revrec.discountDebitLineDescription": "Zmniejszenie odroczonego rabatu \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63078
63707
  "accounting.revrec.entryDescription": "Rozpoznanie przychodu dla harmonogramu {{scheduleId}}, okres {{periodStart}} - {{periodEnd}}",
63708
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}}",
63709
+ "accounting.transactionChargedBack.entryDescription": "Obci\u0105\u017Cenie zwrotne za faktur\u0119 {{invoiceId}}",
63710
+ "accounting.transactionRefunded.entryDescription": "Zwrot za faktur\u0119 {{invoiceId}}",
63711
+ "accounting.transactionSettled.entryDescription": "Rozliczenie p\u0142atno\u015Bci dla faktury {{invoiceId}}",
63079
63712
  "creditNotes.refundChargeName": "Zwrot za faktur\u0119",
63080
63713
  "credits.bundleOf": "{{productName}} - Pakiet {{creditCount}} kredyt\xF3w",
63081
63714
  "credits.unitsOf": "{{productName}} - {{creditCount}} kredyt\xF3w",
63082
63715
  "einvoicing.paymentFromWallet": "P\u0142atno\u015B\u0107 z portfela",
63083
63716
  "einvoicing.paymentProcessed": "P\u0142atno\u015B\u0107 przetworzona",
63084
63717
  "einvoicing.paymentReceived": "P\u0142atno\u015B\u0107 otrzymana",
63718
+ "invoices.minimumFee.adjustmentName": "Wyr\xF3wnanie do op\u0142aty minimalnej",
63719
+ "invoices.minimumFee.name": "Op\u0142ata minimalna",
63085
63720
  "invoices.outstandingProduct.description": "Nieop\u0142acona kwota z faktury{{invoiceNumber}} wystawionej {{date}}",
63086
63721
  "invoices.outstandingProduct.descriptionPeriod": "Nieop\u0142acona kwota z faktury{{invoiceNumber}} od {{periodStart}} do {{periodEnd}}",
63087
63722
  "invoices.outstandingProduct.name": "Niezap\u0142acone saldo",
@@ -63089,9 +63724,9 @@ var pl = {
63089
63724
  "invoices.prorata.paymentForItemFullPeriod": "P\u0142atno\u015B\u0107 za",
63090
63725
  "invoices.prorata.refundForItem": "Zwrot proporcjonalny za",
63091
63726
  "invoices.prorata.refundForItemFullPeriod": "Zwrot za",
63092
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 wygas\u0142e saldo",
63093
63727
  "subscriptions.closingChargeName": "Op\u0142ata za zamkni\u0119cie subskrypcji",
63094
63728
  "subscriptions.correction": "Korekta poprzedniego okresu",
63729
+ "subscriptions.reinstatementRechargeName": "Op\u0142ata za przywr\xF3cenie anulowanego okresu",
63095
63730
  "subscriptions.updates.addCoupon": "Dodaj kupon {{couponName}}",
63096
63731
  "subscriptions.updates.addProduct": "Dodaj {{productName}}",
63097
63732
  "subscriptions.updates.removeCoupon": "Usu\u0144 kupon {{couponName}}",
@@ -63106,28 +63741,32 @@ var pl = {
63106
63741
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Kwota {{amount}} (z minimaln\u0105 zobowi\u0105zan\u0105 ilo\u015Bci\u0105 {{committedCount}}) niefakturowana za okres proporcjonalny",
63107
63742
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Ta pozycja zosta\u0142a zafakturowana za okres proporcjonalny",
63108
63743
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Kwota {{amount}} niefakturowana za okres proporcjonalny",
63109
- "subscriptions.updates.updatePrices": "Aktualizuj ceny dla {{productName}}"
63744
+ "subscriptions.updates.updatePrices": "Aktualizuj ceny dla {{productName}}",
63745
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 wygas\u0142e saldo"
63110
63746
  };
63111
63747
 
63112
63748
  // ../hyperline-i18n/build/locales/pt.js
63113
63749
  var pt = {
63114
- "accounting.invoicePosted.entryDescription": "Lan\xE7amento cont\xE1bil para a fatura {{invoiceId}}",
63115
- "accounting.transactionSettled.entryDescription": "Liquida\xE7\xE3o de pagamento para a fatura {{invoiceId}}",
63116
- "accounting.transactionRefunded.entryDescription": "Reembolso da fatura {{invoiceId}}",
63117
63750
  "accounting.creditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}} para a fatura {{invoiceId}}",
63118
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63751
+ "accounting.invoicePosted.entryDescription": "Lan\xE7amento cont\xE1bil para a fatura {{invoiceId}}",
63752
+ "accounting.revrec.closedPeriodFallbackNote": " (lan\xE7ado no pr\xF3ximo per\xEDodo aberto \u2014 per\xEDodo cont\xE1bil de destino fechado; data original {{originalDate}})",
63119
63753
  "accounting.revrec.creditLineDescription": "Reconhecer receita \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63120
63754
  "accounting.revrec.debitLineDescription": "Diminui\xE7\xE3o da receita diferida \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63121
63755
  "accounting.revrec.discountCreditLineDescription": "Reconhecer contra-receita (desconto) \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63122
- "accounting.revrec.closedPeriodFallbackNote": " (lan\xE7ado no pr\xF3ximo per\xEDodo aberto \u2014 per\xEDodo cont\xE1bil de destino fechado; data original {{originalDate}})",
63123
63756
  "accounting.revrec.discountDebitLineDescription": "Diminui\xE7\xE3o do desconto diferido \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63124
63757
  "accounting.revrec.entryDescription": "Reconhecimento de receita para o cronograma {{scheduleId}}, per\xEDodo {{periodStart}} - {{periodEnd}}",
63758
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63759
+ "accounting.transactionChargedBack.entryDescription": "Estorno da fatura {{invoiceId}}",
63760
+ "accounting.transactionRefunded.entryDescription": "Reembolso da fatura {{invoiceId}}",
63761
+ "accounting.transactionSettled.entryDescription": "Liquida\xE7\xE3o de pagamento para a fatura {{invoiceId}}",
63125
63762
  "creditNotes.refundChargeName": "Reembolso pela fatura",
63126
63763
  "credits.bundleOf": "{{productName}} - Pacote de {{creditCount}} cr\xE9ditos",
63127
63764
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9ditos",
63128
63765
  "einvoicing.paymentFromWallet": "Pagamento da carteira",
63129
63766
  "einvoicing.paymentProcessed": "Pagamento processado",
63130
63767
  "einvoicing.paymentReceived": "Pagamento recebido",
63768
+ "invoices.minimumFee.adjustmentName": "Ajuste do valor m\xEDnimo",
63769
+ "invoices.minimumFee.name": "Valor m\xEDnimo",
63131
63770
  "invoices.outstandingProduct.description": "Valor em aberto da fatura{{invoiceNumber}} emitida em {{date}}",
63132
63771
  "invoices.outstandingProduct.descriptionPeriod": "Valor em aberto da fatura{{invoiceNumber}} de {{periodStart}} a {{periodEnd}}",
63133
63772
  "invoices.outstandingProduct.name": "Saldo em aberto",
@@ -63135,9 +63774,9 @@ var pt = {
63135
63774
  "invoices.prorata.paymentForItemFullPeriod": "Pagamento por",
63136
63775
  "invoices.prorata.refundForItem": "Reembolso proporcional por",
63137
63776
  "invoices.prorata.refundForItemFullPeriod": "Reembolso por",
63138
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo expirado",
63139
63777
  "subscriptions.closingChargeName": "Taxa de encerramento da assinatura",
63140
63778
  "subscriptions.correction": "Ajuste do per\xEDodo anterior",
63779
+ "subscriptions.reinstatementRechargeName": "Recarga de reintegra\xE7\xE3o do per\xEDodo cancelado",
63141
63780
  "subscriptions.updates.addCoupon": "Adicionar cupom {{couponName}}",
63142
63781
  "subscriptions.updates.addProduct": "Adicionar {{productName}}",
63143
63782
  "subscriptions.updates.removeCoupon": "Remover cupom {{couponName}}",
@@ -63152,7 +63791,8 @@ var pt = {
63152
63791
  "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",
63153
63792
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Esta linha foi faturada para o per\xEDodo proporcional",
63154
63793
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Valor de {{amount}} n\xE3o faturado para o per\xEDodo proporcional",
63155
- "subscriptions.updates.updatePrices": "Atualizar pre\xE7os para {{productName}}"
63794
+ "subscriptions.updates.updatePrices": "Atualizar pre\xE7os para {{productName}}",
63795
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo expirado"
63156
63796
  };
63157
63797
 
63158
63798
  // ../hyperline-i18n/build/language.js
@@ -63315,6 +63955,223 @@ import * as winston from "winston";
63315
63955
 
63316
63956
  // ../hyperline-monitoring/build/logger/formatting/format.js
63317
63957
  import prune from "json-prune";
63958
+
63959
+ // ../hyperline-monitoring/build/logger/formatting/logRedaction.js
63960
+ var REDACTED_KEY_NAMES = /* @__PURE__ */ new Set([
63961
+ "accesstoken",
63962
+ "apitoken",
63963
+ "assertion",
63964
+ "authorization",
63965
+ "authtoken",
63966
+ "cardnumber",
63967
+ "clientassertion",
63968
+ "codeverifier",
63969
+ "connectionurl",
63970
+ "consumerkey",
63971
+ "cookie",
63972
+ "credential",
63973
+ "credentials",
63974
+ "iban",
63975
+ "idtoken",
63976
+ "privatekey",
63977
+ "publictoken",
63978
+ "refreshtoken",
63979
+ "sessiontoken",
63980
+ "token",
63981
+ "tokenid",
63982
+ "verificationcode"
63983
+ ]);
63984
+ var REDACTED_KEY_SUFFIX_PATTERN = /(secret|password|passphrase|apikey)$/;
63985
+ var REDACTED_KEY_CANDIDATE_PATTERN = /token|key|secret|pass|assertion|verifier|credential|authorization|cookie|iban|cardnumber|code|connectionurl/i;
63986
+ var URL_ONLY_REDACTED_KEYS = /* @__PURE__ */ new Set(["key"]);
63987
+ var OAUTH_CODE_KEY = "code";
63988
+ var OAUTH_CODE_CONTEXT_KEYS = ["state", "grant_type"];
63989
+ var REDACTED_VALUE = "<redacted>";
63990
+ var TRUNCATED_VALUE = "[TRUNCATED: not redacted]";
63991
+ var TRUNCATED_KEY = "[TRUNCATED]";
63992
+ var MAX_REDACTION_DEPTH = 6;
63993
+ var MAX_ARRAY_ENTRIES = 50;
63994
+ var MAX_PARSED_STRING_LENGTH = 16384;
63995
+ var MAX_VISITED_NODES = 5e3;
63996
+ var MAX_CONTAINER_ENTRIES = 1e3;
63997
+ var MAX_STRING_CHARACTERS = 256e3;
63998
+ function redactLogBody({ body }) {
63999
+ return redactValue({
64000
+ value: body,
64001
+ depth: MAX_REDACTION_DEPTH,
64002
+ budget: {
64003
+ remainingNodes: MAX_VISITED_NODES,
64004
+ remainingChars: MAX_STRING_CHARACTERS
64005
+ }
64006
+ });
64007
+ }
64008
+ function redactLogUrl({ url: url2 }) {
64009
+ const queryIndex = url2.indexOf("?");
64010
+ if (queryIndex === -1) {
64011
+ return url2;
64012
+ }
64013
+ if (url2.length > MAX_PARSED_STRING_LENGTH) {
64014
+ return `${url2.slice(0, queryIndex)}?${TRUNCATED_VALUE}`;
64015
+ }
64016
+ const redactedQuery = redactFormEncoded({
64017
+ text: url2.slice(queryIndex + 1),
64018
+ extraRedactedKeys: URL_ONLY_REDACTED_KEYS
64019
+ });
64020
+ return redactedQuery === void 0 ? url2 : `${url2.slice(0, queryIndex)}?${redactedQuery}`;
64021
+ }
64022
+ function redactValue({ value, depth, budget }) {
64023
+ if (isOpaqueObject({ value })) {
64024
+ return replaceOpaqueObject({ value });
64025
+ }
64026
+ if (typeof value === "string") {
64027
+ if (value.length > budget.remainingChars) {
64028
+ return TRUNCATED_VALUE;
64029
+ }
64030
+ budget.remainingChars -= value.length;
64031
+ }
64032
+ if (depth <= 0 || budget.remainingNodes <= 0) {
64033
+ return isInspectable({ value }) ? TRUNCATED_VALUE : value;
64034
+ }
64035
+ budget.remainingNodes -= 1;
64036
+ if (typeof value === "string") {
64037
+ return redactString({ text: value, budget });
64038
+ }
64039
+ if (value instanceof URLSearchParams) {
64040
+ return redactValue({ value: value.toString(), depth, budget });
64041
+ }
64042
+ if (Array.isArray(value)) {
64043
+ return redactArray({ items: value, depth, budget });
64044
+ }
64045
+ if (isPlainObject2(value)) {
64046
+ return redactObject({ record: value, depth, budget });
64047
+ }
64048
+ return value;
64049
+ }
64050
+ function isOpaqueObject({ value }) {
64051
+ return typeof value === "object" && value !== null && !Array.isArray(value) && !isPlainObject2(value) && !(value instanceof URLSearchParams);
64052
+ }
64053
+ function replaceOpaqueObject({ value }) {
64054
+ if (typeof value !== "object" || value === null || value instanceof Date) {
64055
+ return value;
64056
+ }
64057
+ if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {
64058
+ return `[BINARY ${value.byteLength} bytes]`;
64059
+ }
64060
+ if (value instanceof Blob) {
64061
+ return `[BINARY ${value.size} bytes]`;
64062
+ }
64063
+ if (value instanceof FormData || typeof Reflect.get(value, "pipe") === "function") {
64064
+ return "[BINARY stream]";
64065
+ }
64066
+ return TRUNCATED_VALUE;
64067
+ }
64068
+ function redactArray({ items, depth, budget }) {
64069
+ const isTruncated = items.length > MAX_ARRAY_ENTRIES;
64070
+ const keptItems = isTruncated ? items.slice(0, MAX_ARRAY_ENTRIES) : items;
64071
+ let redactedItems;
64072
+ for (const [index, item] of keptItems.entries()) {
64073
+ const redactedItem = redactValue({ value: item, depth: depth - 1, budget });
64074
+ if (redactedItem !== item) {
64075
+ redactedItems ??= [...keptItems];
64076
+ redactedItems[index] = redactedItem;
64077
+ }
64078
+ }
64079
+ const result = redactedItems ?? keptItems;
64080
+ return isTruncated ? [...result, TRUNCATED_VALUE] : result;
64081
+ }
64082
+ function redactObject({ record: record2, depth, budget }) {
64083
+ const redactedEntries = /* @__PURE__ */ new Map();
64084
+ const carriesOAuthCode = OAUTH_CODE_CONTEXT_KEYS.some((contextKey) => Object.hasOwn(record2, contextKey));
64085
+ const keptKeys = [];
64086
+ let isTruncated = false;
64087
+ for (const key in record2) {
64088
+ if (!Object.hasOwn(record2, key)) {
64089
+ continue;
64090
+ }
64091
+ if (keptKeys.length >= MAX_CONTAINER_ENTRIES || key.length > budget.remainingChars) {
64092
+ isTruncated = true;
64093
+ break;
64094
+ }
64095
+ budget.remainingChars -= key.length;
64096
+ keptKeys.push(key);
64097
+ const nestedValue = record2[key];
64098
+ const isSensitiveKey = isRedactedKey({ key }) || carriesOAuthCode && key === OAUTH_CODE_KEY;
64099
+ const shouldRedact = isSensitiveKey && nestedValue != null && typeof nestedValue !== "boolean";
64100
+ if (shouldRedact) {
64101
+ budget.remainingNodes -= 1;
64102
+ }
64103
+ const redactedNestedValue = shouldRedact ? REDACTED_VALUE : redactValue({ value: nestedValue, depth: depth - 1, budget });
64104
+ if (redactedNestedValue !== nestedValue) {
64105
+ redactedEntries.set(key, redactedNestedValue);
64106
+ }
64107
+ }
64108
+ if (isTruncated) {
64109
+ const keptRecord = {};
64110
+ for (const key of keptKeys) {
64111
+ keptRecord[key] = redactedEntries.has(key) ? redactedEntries.get(key) : record2[key];
64112
+ }
64113
+ keptRecord[TRUNCATED_KEY] = TRUNCATED_VALUE;
64114
+ return keptRecord;
64115
+ }
64116
+ return redactedEntries.size === 0 ? record2 : { ...record2, ...Object.fromEntries(redactedEntries) };
64117
+ }
64118
+ function redactString({ text, budget }) {
64119
+ if (text.length > MAX_PARSED_STRING_LENGTH) {
64120
+ return TRUNCATED_VALUE;
64121
+ }
64122
+ if (!isInspectable({ value: text })) {
64123
+ return text;
64124
+ }
64125
+ const trimmedText = text.trim();
64126
+ if (trimmedText.startsWith("{") || trimmedText.startsWith("[")) {
64127
+ try {
64128
+ const parsedValue = JSON.parse(trimmedText);
64129
+ const redactedValue = redactValue({
64130
+ value: parsedValue,
64131
+ depth: MAX_REDACTION_DEPTH,
64132
+ budget
64133
+ });
64134
+ return redactedValue === parsedValue ? text : JSON.stringify(redactedValue);
64135
+ } catch {
64136
+ return REDACTED_KEY_CANDIDATE_PATTERN.test(text) ? TRUNCATED_VALUE : redactFormEncoded({ text }) ?? text;
64137
+ }
64138
+ }
64139
+ return redactFormEncoded({ text }) ?? text;
64140
+ }
64141
+ function redactFormEncoded({ text, extraRedactedKeys }) {
64142
+ if (!text.includes("=") || !REDACTED_KEY_CANDIDATE_PATTERN.test(text)) {
64143
+ return void 0;
64144
+ }
64145
+ const params = new URLSearchParams(text);
64146
+ const carriesOAuthCode = OAUTH_CODE_CONTEXT_KEYS.some((contextKey) => params.has(contextKey));
64147
+ let hasRedactedParam = false;
64148
+ for (const key of new Set(params.keys())) {
64149
+ if (isRedactedKey({ key }) || extraRedactedKeys?.has(key.toLowerCase()) || carriesOAuthCode && key === OAUTH_CODE_KEY) {
64150
+ params.set(key, REDACTED_VALUE);
64151
+ hasRedactedParam = true;
64152
+ }
64153
+ }
64154
+ return hasRedactedParam ? params.toString() : void 0;
64155
+ }
64156
+ function isRedactedKey({ key }) {
64157
+ const normalizedKey = key.toLowerCase().replace(/[_-]/g, "");
64158
+ return REDACTED_KEY_NAMES.has(normalizedKey) || REDACTED_KEY_SUFFIX_PATTERN.test(normalizedKey);
64159
+ }
64160
+ function isInspectable({ value }) {
64161
+ if (typeof value === "string") {
64162
+ return value.length > MAX_PARSED_STRING_LENGTH || /^\s*[{[]/.test(value) || value.includes("=") && REDACTED_KEY_CANDIDATE_PATTERN.test(value);
64163
+ }
64164
+ return value instanceof URLSearchParams || Array.isArray(value) || isPlainObject2(value);
64165
+ }
64166
+ function isPlainObject2(value) {
64167
+ if (typeof value !== "object" || value === null) {
64168
+ return false;
64169
+ }
64170
+ const prototype = Object.getPrototypeOf(value);
64171
+ return prototype === Object.prototype || prototype === null;
64172
+ }
64173
+
64174
+ // ../hyperline-monitoring/build/logger/formatting/format.js
63318
64175
  var REDACTED_HEADER_KEY_PATTERN = /authorization|authenticate|cookie|secret|token|credential|signature|jwt|api[_-]?key|access[_-]?token|refresh[_-]?token|private[_-]?key/i;
63319
64176
  function jsonFormat(info) {
63320
64177
  const prunedInfo = JSON.parse(prune(info));
@@ -63375,14 +64232,106 @@ function transformPrune(info) {
63375
64232
  });
63376
64233
  return info;
63377
64234
  }
64235
+ var MAX_AXIOS_ERROR_DEPTH = 5;
64236
+ var MAX_AXIOS_ERROR_CONTAINER_ENTRIES = 1e3;
64237
+ var MAX_AXIOS_ERROR_VISITED_NODES = 5e3;
64238
+ var REDACTED_BODY_KEYS = /* @__PURE__ */ new Set(["requestBody", "responseBody"]);
63378
64239
  function transformAxiosError(info) {
63379
- Object.entries(info).forEach(([key, value]) => {
63380
- if (typeof value === "object" && value?.name === "AxiosError") {
63381
- info[key] = formatAxiosError(value);
64240
+ let walk;
64241
+ for (const [key, value] of Object.entries(info)) {
64242
+ if (typeof value !== "object" || value === null || REDACTED_BODY_KEYS.has(key)) {
64243
+ continue;
63382
64244
  }
63383
- });
64245
+ walk ??= {
64246
+ formatted: /* @__PURE__ */ new Map(),
64247
+ remainingNodes: MAX_AXIOS_ERROR_VISITED_NODES
64248
+ };
64249
+ const formattedValue = formatNestedAxiosErrors({
64250
+ value,
64251
+ depth: MAX_AXIOS_ERROR_DEPTH,
64252
+ walk
64253
+ });
64254
+ if (formattedValue !== value) {
64255
+ info[key] = formattedValue;
64256
+ }
64257
+ }
63384
64258
  return info;
63385
64259
  }
64260
+ function formatNestedAxiosErrors({ value, depth, walk }) {
64261
+ if (typeof value !== "object" || value === null) {
64262
+ return value;
64263
+ }
64264
+ if (walk.formatted.has(value)) {
64265
+ return walk.formatted.get(value);
64266
+ }
64267
+ if (Reflect.get(value, "name") === "AxiosError") {
64268
+ const formattedError = walk.remainingNodes > 0 ? formatAxiosError(value) : summarizeAxiosError({ error: value });
64269
+ walk.remainingNodes -= 1;
64270
+ walk.formatted.set(value, formattedError);
64271
+ return formattedError;
64272
+ }
64273
+ const isWalkable = Array.isArray(value) || value instanceof Error || isPlainRecord(value);
64274
+ if (!isWalkable || depth <= 0 || walk.remainingNodes <= 0) {
64275
+ return value;
64276
+ }
64277
+ walk.formatted.set(value, "[Circular]");
64278
+ walk.remainingNodes -= 1;
64279
+ const formattedValue = formatWalkableValue({ value, depth, walk });
64280
+ walk.formatted.set(value, formattedValue);
64281
+ return formattedValue;
64282
+ }
64283
+ function summarizeAxiosError({ error: error48 }) {
64284
+ return {
64285
+ name: Reflect.get(error48, "name"),
64286
+ message: Reflect.get(error48, "message"),
64287
+ code: Reflect.get(error48, "code")
64288
+ };
64289
+ }
64290
+ function formatWalkableValue({ value, depth, walk }) {
64291
+ if (Array.isArray(value)) {
64292
+ if (value.length > MAX_AXIOS_ERROR_CONTAINER_ENTRIES) {
64293
+ return value;
64294
+ }
64295
+ let formattedItems;
64296
+ for (const [index, item] of value.entries()) {
64297
+ const formattedItem = formatNestedAxiosErrors({
64298
+ value: item,
64299
+ depth: depth - 1,
64300
+ walk
64301
+ });
64302
+ if (formattedItem !== item) {
64303
+ formattedItems ??= [...value];
64304
+ formattedItems[index] = formattedItem;
64305
+ }
64306
+ }
64307
+ return formattedItems ?? value;
64308
+ }
64309
+ const keys = Object.keys(value);
64310
+ if (keys.length > MAX_AXIOS_ERROR_CONTAINER_ENTRIES) {
64311
+ return value;
64312
+ }
64313
+ const formattedEntries = /* @__PURE__ */ new Map();
64314
+ for (const key of keys) {
64315
+ const nestedValue = Reflect.get(value, key);
64316
+ const formattedNestedValue = formatNestedAxiosErrors({
64317
+ value: nestedValue,
64318
+ depth: depth - 1,
64319
+ walk
64320
+ });
64321
+ if (formattedNestedValue !== nestedValue) {
64322
+ formattedEntries.set(key, formattedNestedValue);
64323
+ }
64324
+ }
64325
+ if (formattedEntries.size === 0) {
64326
+ return value;
64327
+ }
64328
+ return {
64329
+ ...value,
64330
+ // Error properties are not enumerable, so the spread would drop them.
64331
+ ...value instanceof Error ? { name: value.name, message: value.message, stack: value.stack } : {},
64332
+ ...Object.fromEntries(formattedEntries)
64333
+ };
64334
+ }
63386
64335
  function formatAxiosError(error48) {
63387
64336
  if (!isRecord(error48) || error48.name !== "AxiosError") {
63388
64337
  return error48;
@@ -63395,9 +64344,9 @@ function formatAxiosError(error48) {
63395
64344
  code: error48.code,
63396
64345
  request: {
63397
64346
  method: request?.method,
63398
- url: request?.url,
64347
+ url: typeof request?.url === "string" ? redactLogUrl({ url: request.url }) : request?.url,
63399
64348
  baseURL: request?.baseURL,
63400
- params: request?.params,
64349
+ params: redactLogBody({ body: request?.params }),
63401
64350
  headers: redactHeaders({ headers: request?.headers }),
63402
64351
  "axios-retry": request?.["axios-retry"]
63403
64352
  },
@@ -63405,7 +64354,7 @@ function formatAxiosError(error48) {
63405
64354
  status: response?.status,
63406
64355
  statusText: response?.statusText,
63407
64356
  headers: redactHeaders({ headers: response?.headers }),
63408
- data: response?.data
64357
+ data: redactLogBody({ body: response?.data })
63409
64358
  }
63410
64359
  };
63411
64360
  }
@@ -63418,6 +64367,10 @@ function redactHeaders({ headers }) {
63418
64367
  REDACTED_HEADER_KEY_PATTERN.test(headerKey) ? "<redacted>" : headerValue
63419
64368
  ]));
63420
64369
  }
64370
+ function isPlainRecord(value) {
64371
+ const prototype = Object.getPrototypeOf(value);
64372
+ return prototype === Object.prototype || prototype === null;
64373
+ }
63421
64374
  function isRecord(value) {
63422
64375
  return typeof value === "object" && value !== null && !Array.isArray(value);
63423
64376
  }
@@ -63447,7 +64400,7 @@ function logHttpResponse(logger2, response, responseTime, extra) {
63447
64400
  const responseMetadata = {
63448
64401
  statusCode,
63449
64402
  responseTime,
63450
- responseBody,
64403
+ responseBody: redactLogBody({ body: responseBody }),
63451
64404
  // Redacted so secrets (authorization/cookie/token/…) never reach the logs
63452
64405
  // while diagnostic headers (e.g. rate-limit headers on a 429) stay visible.
63453
64406
  responseHeaders: responseHeaders === void 0 ? void 0 : redactHeaders({ headers: responseHeaders })
@@ -63460,14 +64413,15 @@ function logHttpResponse(logger2, response, responseTime, extra) {
63460
64413
  }
63461
64414
  function transform2(request) {
63462
64415
  const method = request.method.toUpperCase();
63463
- const message = `${method} ${request.originalUrl}`;
64416
+ const originalUrl = redactLogUrl({ url: request.originalUrl });
64417
+ const message = `${method} ${originalUrl}`;
63464
64418
  const metadata = {};
63465
64419
  metadata.method = method;
63466
- metadata.url = request.url;
63467
- metadata.path = request.path;
64420
+ metadata.url = redactLogUrl({ url: request.url });
64421
+ metadata.path = redactLogUrl({ url: request.path });
63468
64422
  metadata.hostname = request.hostname;
63469
- metadata.originalUrl = request.originalUrl;
63470
- metadata.requestBody = request.body && typeof request.body === "object" && "apiKey" in request.body ? { ...request.body, apiKey: "<redacted>" } : request.body;
64423
+ metadata.originalUrl = originalUrl;
64424
+ metadata.requestBody = redactLogBody({ body: request.body });
63471
64425
  metadata.routePath = transformUrlIntoRoutePath(request);
63472
64426
  metadata.apiKeyEnd = request.headers["authorization"]?.slice(-6);
63473
64427
  return { message, metadata };
@@ -63514,7 +64468,16 @@ function buildLoggerFactory({ config: config4, context }) {
63514
64468
  const internalLogger = winston.createLogger({
63515
64469
  transports: transports2,
63516
64470
  defaultMeta,
63517
- format: winston.format.combine(winston.format.splat(), winston.format(addMetadata({ getCorrelationId, getExecutionContext }))(), winston.format(transformErrorEnrich)({ depth: 5 }), winston.format(transformPrune)(), winston.format(transformAxiosError)(), winston.format.timestamp()),
64471
+ format: winston.format.combine(
64472
+ winston.format.splat(),
64473
+ winston.format(addMetadata({ getCorrelationId, getExecutionContext }))(),
64474
+ // Before pruning: json-prune would otherwise serialize a binary
64475
+ // `response.data` byte by byte before it is summarised (#6006).
64476
+ winston.format(transformAxiosError)(),
64477
+ winston.format(transformErrorEnrich)({ depth: 5 }),
64478
+ winston.format(transformPrune)(),
64479
+ winston.format.timestamp()
64480
+ ),
63518
64481
  exitOnError: false
63519
64482
  });
63520
64483
  function createLogger3({ serviceName }) {
@@ -65846,6 +66809,8 @@ var usStates = [
65846
66809
 
65847
66810
  // ../hyperline-lib/build/utils/dates.js
65848
66811
  var import_shared2 = __toESM(require_shared(), 1);
66812
+ var PERIOD_BOUND_DRIFT_TOLERANCE_MS = 2 * 60 * 1e3;
66813
+ var DST_SHIFT_MS = 60 * 60 * 1e3;
65849
66814
 
65850
66815
  // ../hyperline-lib/build/utils/document.js
65851
66816
  var import_shared3 = __toESM(require_shared(), 1);
@@ -65857,6 +66822,24 @@ import * as https from "node:https";
65857
66822
  import { createHash as createHash2 } from "node:crypto";
65858
66823
  import { deepEqual } from "fast-equals";
65859
66824
 
66825
+ // ../hyperline-lib/build/utils/realignDatesToTimezone.js
66826
+ var import_shared4 = __toESM(require_shared(), 1);
66827
+ var MILLISECONDS_PER_HOUR = 60 * 60 * 1e3;
66828
+ var MILLISECONDS_PER_DAY = 24 * MILLISECONDS_PER_HOUR;
66829
+ var LAST_MILLISECOND_OF_DAY = MILLISECONDS_PER_DAY - 1;
66830
+ var dateRealignmentModeSchema = external_exports.enum([
66831
+ "utc_midnight_import",
66832
+ "dst_hour_drift",
66833
+ "month_start_drift",
66834
+ "manual_phase_end_midnight"
66835
+ ]).default("utc_midnight_import");
66836
+ var DST_HOUR_SHIFT_BY_LOCAL_MILLISECOND_OF_DAY = /* @__PURE__ */ new Map([
66837
+ [23 * MILLISECONDS_PER_HOUR, MILLISECONDS_PER_HOUR],
66838
+ [LAST_MILLISECOND_OF_DAY - MILLISECONDS_PER_HOUR, MILLISECONDS_PER_HOUR],
66839
+ [MILLISECONDS_PER_HOUR, -MILLISECONDS_PER_HOUR],
66840
+ [MILLISECONDS_PER_HOUR - 1, -MILLISECONDS_PER_HOUR]
66841
+ ]);
66842
+
65860
66843
  // ../hyperline-lib/build/utils/api/filterBuilder.js
65861
66844
  var baseAuthorizedOperators = ["not", "isNull", "isNotNull"];
65862
66845
  var booleanAuthorizedOperators = [
@@ -65923,7 +66906,7 @@ var isAxiosError = axios.isAxiosError;
65923
66906
 
65924
66907
  // ../hyperline-lib/build/httpClient/httpClient.js
65925
66908
  import axios2 from "axios";
65926
- import axiosRetry, { isNetworkOrIdempotentRequestError } from "axios-retry";
66909
+ import axiosRetry, { isNetworkOrIdempotentRequestError, retryAfter } from "axios-retry";
65927
66910
  import { AxiosError } from "axios";
65928
66911
  var recommendedRetryConfig = {
65929
66912
  retries: 3,
@@ -65991,12 +66974,13 @@ function isTooManyRequestsError(error48) {
65991
66974
  return error48.response?.status === 429;
65992
66975
  }
65993
66976
  var toLogRequest = (config4) => {
66977
+ const url2 = config4.url ?? "";
65994
66978
  return {
65995
66979
  method: config4.method ?? "",
65996
- url: config4.url ?? "",
65997
- path: config4.url ?? "",
66980
+ url: url2,
66981
+ path: url2,
65998
66982
  hostname: config4.baseURL ?? "",
65999
- originalUrl: `${config4.baseURL ?? ""}${config4.url}`,
66983
+ originalUrl: `${config4.baseURL ?? ""}${url2}`,
66000
66984
  body: config4.data,
66001
66985
  headers: {}
66002
66986
  };