@hyperline/cli 0.1.0-build.1.cf10148 → 0.1.0-build.1.cf27365

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.
@@ -34985,10 +34985,10 @@ var require_shared = __commonJS({
34985
34985
  ZodId: () => ZodId,
34986
34986
  ZodTranslationsSchemaFn: () => ZodTranslationsSchemaFn
34987
34987
  });
34988
- var import_zod22 = require_lib();
34988
+ var import_zod23 = require_lib();
34989
34989
  var countryIds2 = ["all", ...countries.map(({ id }) => id)];
34990
- var ZodId = import_zod22.z.enum(countryIds2);
34991
- var ZodTranslationsSchemaFn = (schema) => import_zod22.z.record(import_zod22.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_zod23 = require_lib();
36291
- var ZodCurrencyId = import_zod23.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_zod23.z.string().or(import_zod23.z.number().transform((number4) => number4)).transform((number4) => number4);
36295
- var ZodNumberCurrencyPositiveValue = import_zod23.z.number().min(0).transform((number4) => number4).transform((number4) => number4);
36296
- var ZodNumberCurrencyPositiveValueExcludingZero = import_zod23.z.number().gt(0).transform((number4) => number4).transform((number4) => number4);
36297
- var ZodCurrencyMap = import_zod23.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.",
@@ -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({
@@ -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("--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.`).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,22 @@ 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);
39081
39102
  if (opts.customPropertyFilters !== void 0)
39082
39103
  args.custom_property_filters = JSON.parse(opts.customPropertyFilters);
39083
39104
  await ctx.execute({
@@ -39087,7 +39108,7 @@ Examples:
39087
39108
  queryParamKeys: []
39088
39109
  });
39089
39110
  });
39090
- 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. 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("--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("--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.`).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", `
39091
39112
  Examples:
39092
39113
  hyperline accounting-rules update --id <id>
39093
39114
  hyperline accounting-rules update --id <id> --name <name> --category <category>
@@ -39126,8 +39147,24 @@ Examples:
39126
39147
  args.output_tax_ledger_account_id = opts.outputTaxLedgerAccountId;
39127
39148
  if (opts.uncollectibleDebitLedgerAccountId !== void 0)
39128
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;
39129
39158
  if (opts.customerCreditsLedgerAccountId !== void 0)
39130
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;
39131
39168
  if (opts.journalId !== void 0)
39132
39169
  args.journal_id = opts.journalId;
39133
39170
  if (opts.entityType !== void 0)
@@ -39146,12 +39183,22 @@ Examples:
39146
39183
  args.currencies = JSON.parse(opts.currencies);
39147
39184
  if (opts.countries !== void 0)
39148
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);
39149
39192
  if (opts.couponIds !== void 0)
39150
39193
  args.coupon_ids = JSON.parse(opts.couponIds);
39151
39194
  if (opts.clientProviderIds !== void 0)
39152
39195
  args.client_provider_ids = JSON.parse(opts.clientProviderIds);
39153
39196
  if (opts.paymentMethodTypes !== void 0)
39154
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);
39155
39202
  if (opts.customPropertyFilters !== void 0)
39156
39203
  args.custom_property_filters = JSON.parse(opts.customPropertyFilters);
39157
39204
  await ctx.execute({
@@ -39187,7 +39234,7 @@ Examples:
39187
39234
  queryParamKeys: []
39188
39235
  });
39189
39236
  });
39190
- 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.`).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", `
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", `
39191
39238
  Examples:
39192
39239
  hyperline accounting-rules resolve --ledger-id <ledger_id> --category <category>
39193
39240
  hyperline accounting-rules resolve --ledger-id <ledger_id> --category <category> --product-id <product_id> --product-type <product_type>
@@ -39210,8 +39257,22 @@ Examples:
39210
39257
  args.currency = opts.currency;
39211
39258
  if (opts.country !== void 0)
39212
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;
39213
39266
  if (opts.customerId !== void 0)
39214
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;
39215
39276
  if (opts.invoiceType !== void 0)
39216
39277
  args.invoice_type = opts.invoiceType;
39217
39278
  if (opts.intervalPeriod !== void 0)
@@ -39229,164 +39290,158 @@ Examples:
39229
39290
  });
39230
39291
  }
39231
39292
 
39232
- // build/commands/generated/agents.js
39233
- function registerAgentsCommands(parent) {
39234
- const resource = parent.command("agents").description("Manage agents");
39235
- resource.command("list-agent-plans").description(`List AI agent billing plans: workspace-level offers carrying a billing mode (wallet/credits/windows), rate card, allowance windows, markups and per-seat credit grants. Filter by mode; paginated with take/skip.`).option("--mode <value>", `Billing mode.
39236
-
39237
- - wallet: Charges a monetary wallet.
39238
- - credits: Consumes a credit balance.
39239
- - windows: Meters weighted units against rolling allowances.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
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", `
39240
39297
  Examples:
39241
- hyperline agents list-agent-plans
39242
- 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) => {
39243
39300
  const ctx = resource.parent?.opts()._ctx;
39244
39301
  if (!ctx) {
39245
39302
  process.stderr.write("Error: Not authenticated\n");
39246
39303
  process.exit(1);
39247
39304
  }
39248
39305
  const args = {};
39249
- if (opts.mode !== void 0)
39250
- args.mode = opts.mode;
39251
39306
  if (opts.take !== void 0)
39252
39307
  args.take = Number(opts.take);
39253
39308
  if (opts.skip !== void 0)
39254
39309
  args.skip = Number(opts.skip);
39255
39310
  await ctx.execute({
39256
39311
  method: "GET",
39257
- path: "/v1/agents/plans",
39312
+ path: "/v1/aggregators",
39258
39313
  args,
39259
- queryParamKeys: ["mode", "take", "skip"]
39314
+ queryParamKeys: ["take", "skip"]
39260
39315
  });
39261
39316
  });
39262
- resource.command("create-agent-plan").description(`Create an AI agent billing plan: name, billing mode (wallet/credits/windows), rate card reference, allowance windows, markups, per-seat credit grants and overage stance. Past-limit usage is priced EITHER by overage_markup_percent over the base rates OR by overage_rate_card_id, a currency rate card whose own rates are the overage price \u2014 never both. Metered overage mints the plan's invoice container.`).requiredOption("--name <value>", `Human-readable resource name.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--overage-mode <value>", `Behavior when credits or an allowance are exhausted. Policy values may inherit the attached plan.
39263
-
39264
- - refuse: Rejects the call that crosses the boundary without deducting usage.
39265
- - metered: Prices the whole call as monetary overage, using the overage card or USD provider cost plus markup.`).option("--markup-percent <value>", `Percentage added to resolved cost. Null on writes means no override; an attached plan may supply the value.`).option("--overage-markup-percent <value>", `Percentage added to provider cost for overage. Mutually exclusive with overage_rate_card_id.`).option("--overage-rate-card-id <value>", `Currency rate card used to price overage directly. Null means provider cost plus the resolved overage markup.`).option("--windows <json>", `Rolling allowances. Required for windows plans; each window meters every call. A plan replacement replaces the entire array.`).option("--per-seat-credits <value>", `Credits granted per seat per billing period. Null grants no credits.`).option("--grant-rollover-enabled", `Whether granted credits survive renewal. Purchased credits always roll over.`).option("--settlement-interval-minutes <number>", `Settlement interval in minutes. Null means no interval override. Mutually exclusive with settlement_schedule.`).option("--settlement-schedule <value>", `Calendar settlement schedule. Null clears the override; mutually exclusive with settlement_interval_minutes.
39266
-
39267
- - calendar_month: Settles at the end of each UTC calendar month.`).requiredOption("--mode <value>", `Billing mode.
39268
-
39269
- - wallet: Charges a monetary wallet.
39270
- - credits: Consumes a credit balance.
39271
- - windows: Meters weighted units against rolling allowances.`).addHelpText("after", `
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", `
39272
39318
  Examples:
39273
- hyperline agents create-agent-plan --name <name> --mode <mode>
39274
- hyperline agents create-agent-plan --name <name> --mode <mode> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39275
- hyperline agents create-agent-plan --name <name> --mode <mode> --output json`).action(async (opts) => {
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) => {
39276
39322
  const ctx = resource.parent?.opts()._ctx;
39277
39323
  if (!ctx) {
39278
39324
  process.stderr.write("Error: Not authenticated\n");
39279
39325
  process.exit(1);
39280
39326
  }
39281
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;
39282
39332
  if (opts.name !== void 0)
39283
39333
  args.name = opts.name;
39284
- if (opts.rateCardId !== void 0)
39285
- args.rate_card_id = opts.rateCardId;
39286
- if (opts.overageMode !== void 0)
39287
- args.overage_mode = opts.overageMode;
39288
- if (opts.markupPercent !== void 0)
39289
- args.markup_percent = opts.markupPercent;
39290
- if (opts.overageMarkupPercent !== void 0)
39291
- args.overage_markup_percent = opts.overageMarkupPercent;
39292
- if (opts.overageRateCardId !== void 0)
39293
- args.overage_rate_card_id = opts.overageRateCardId;
39294
- if (opts.perSeatCredits !== void 0)
39295
- args.per_seat_credits = opts.perSeatCredits;
39296
- if (opts.settlementSchedule !== void 0)
39297
- args.settlement_schedule = opts.settlementSchedule;
39298
- if (opts.mode !== void 0)
39299
- args.mode = opts.mode;
39300
- if (opts.settlementIntervalMinutes !== void 0)
39301
- args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39302
- if (opts.grantRolloverEnabled !== void 0)
39303
- args.grant_rollover_enabled = true;
39304
- if (opts.windows !== void 0)
39305
- args.windows = JSON.parse(opts.windows);
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);
39306
39358
  await ctx.execute({
39307
39359
  method: "POST",
39308
- path: "/v1/agents/plans",
39360
+ path: "/v1/aggregators",
39309
39361
  args,
39310
39362
  queryParamKeys: []
39311
39363
  });
39312
39364
  });
39313
- resource.command("get-agent-plan").description(`Get one AI agent billing plan by id, with its embedded rate card, window definitions, markups, per-seat grants and minted catalog object ids.`).requiredOption("--plan-id <value>", `plan_id parameter`).addHelpText("after", `
39365
+ resource.command("get").description(`Retrieve a specific aggregator by ID.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
39314
39366
  Examples:
39315
- hyperline agents get-agent-plan --plan-id <plan_id>`).action(async (opts) => {
39367
+ hyperline aggregators get --id <id>`).action(async (opts) => {
39316
39368
  const ctx = resource.parent?.opts()._ctx;
39317
39369
  if (!ctx) {
39318
39370
  process.stderr.write("Error: Not authenticated\n");
39319
39371
  process.exit(1);
39320
39372
  }
39321
39373
  const args = {};
39322
- if (opts.planId !== void 0)
39323
- args.plan_id = opts.planId;
39374
+ if (opts.id !== void 0)
39375
+ args.id = opts.id;
39324
39376
  await ctx.execute({
39325
39377
  method: "GET",
39326
- path: "/v1/agents/plans/{plan_id}",
39378
+ path: "/v1/aggregators/{id}",
39327
39379
  args,
39328
39380
  queryParamKeys: []
39329
39381
  });
39330
39382
  });
39331
- resource.command("replace-agent-plan").description(`Replace an AI agent billing plan (whole-row semantics). Changes take effect on the next call for every customer on the plan; mode is immutable. Overage is priced by overage_markup_percent or by overage_rate_card_id, never both.`).requiredOption("--plan-id <value>", `plan_id parameter`).requiredOption("--name <value>", `Human-readable resource name.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--overage-mode <value>", `Behavior when credits or an allowance are exhausted. Policy values may inherit the attached plan.
39332
-
39333
- - refuse: Rejects the call that crosses the boundary without deducting usage.
39334
- - metered: Prices the whole call as monetary overage, using the overage card or USD provider cost plus markup.`).option("--markup-percent <value>", `Percentage added to resolved cost. Null on writes means no override; an attached plan may supply the value.`).option("--overage-markup-percent <value>", `Percentage added to provider cost for overage. Mutually exclusive with overage_rate_card_id.`).option("--overage-rate-card-id <value>", `Currency rate card used to price overage directly. Null means provider cost plus the resolved overage markup.`).option("--windows <json>", `Rolling allowances. Required for windows plans; each window meters every call. A plan replacement replaces the entire array.`).option("--per-seat-credits <value>", `Credits granted per seat per billing period. Null grants no credits.`).option("--grant-rollover-enabled", `Whether granted credits survive renewal. Purchased credits always roll over.`).option("--settlement-interval-minutes <number>", `Settlement interval in minutes. Null means no interval override. Mutually exclusive with settlement_schedule.`).option("--settlement-schedule <value>", `Calendar settlement schedule. Null clears the override; mutually exclusive with settlement_interval_minutes.
39335
-
39336
- - calendar_month: Settles at the end of each UTC calendar month.`).addHelpText("after", `
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", `
39337
39384
  Examples:
39338
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name>
39339
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name> --rate-card-id <rate_card_id> --overage-mode <overage_mode>
39340
- hyperline agents replace-agent-plan --plan-id <plan_id> --name <name> --output json`).action(async (opts) => {
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) => {
39341
39388
  const ctx = resource.parent?.opts()._ctx;
39342
39389
  if (!ctx) {
39343
39390
  process.stderr.write("Error: Not authenticated\n");
39344
39391
  process.exit(1);
39345
39392
  }
39346
39393
  const args = {};
39347
- if (opts.planId !== void 0)
39348
- 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;
39349
39400
  if (opts.name !== void 0)
39350
39401
  args.name = opts.name;
39351
- if (opts.rateCardId !== void 0)
39352
- args.rate_card_id = opts.rateCardId;
39353
- if (opts.overageMode !== void 0)
39354
- args.overage_mode = opts.overageMode;
39355
- if (opts.markupPercent !== void 0)
39356
- args.markup_percent = opts.markupPercent;
39357
- if (opts.overageMarkupPercent !== void 0)
39358
- args.overage_markup_percent = opts.overageMarkupPercent;
39359
- if (opts.overageRateCardId !== void 0)
39360
- args.overage_rate_card_id = opts.overageRateCardId;
39361
- if (opts.perSeatCredits !== void 0)
39362
- args.per_seat_credits = opts.perSeatCredits;
39363
- if (opts.settlementSchedule !== void 0)
39364
- args.settlement_schedule = opts.settlementSchedule;
39365
- if (opts.settlementIntervalMinutes !== void 0)
39366
- args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39367
- if (opts.grantRolloverEnabled !== void 0)
39368
- args.grant_rollover_enabled = true;
39369
- if (opts.windows !== void 0)
39370
- args.windows = JSON.parse(opts.windows);
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);
39371
39426
  await ctx.execute({
39372
39427
  method: "PUT",
39373
- path: "/v1/agents/plans/{plan_id}",
39428
+ path: "/v1/aggregators/{id}",
39374
39429
  args,
39375
39430
  queryParamKeys: []
39376
39431
  });
39377
39432
  });
39378
- resource.command("delete-agent-plan").description(`Delete an AI agent billing plan. Refused (409, plan_in_use) while any customer is still attached to it.`).requiredOption("--plan-id <value>", `plan_id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
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", `
39379
39434
  Examples:
39380
- hyperline agents delete-agent-plan --plan-id <plan_id>
39381
- hyperline agents delete-agent-plan --plan-id <plan_id> --output json`).action(async (opts) => {
39435
+ hyperline aggregators delete --id <id>
39436
+ hyperline aggregators delete --id <id> --output json`).action(async (opts) => {
39382
39437
  const ctx = resource.parent?.opts()._ctx;
39383
39438
  if (!ctx) {
39384
39439
  process.stderr.write("Error: Not authenticated\n");
39385
39440
  process.exit(1);
39386
39441
  }
39387
39442
  const args = {};
39388
- if (opts.planId !== void 0)
39389
- args.plan_id = opts.planId;
39443
+ if (opts.id !== void 0)
39444
+ args.id = opts.id;
39390
39445
  if (!opts.yes) {
39391
39446
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39392
39447
  if (!confirmed) {
@@ -39396,113 +39451,182 @@ Examples:
39396
39451
  }
39397
39452
  await ctx.execute({
39398
39453
  method: "DELETE",
39399
- path: "/v1/agents/plans/{plan_id}",
39454
+ path: "/v1/aggregators/{id}",
39400
39455
  args,
39401
39456
  queryParamKeys: []
39402
39457
  });
39403
39458
  });
39404
- resource.command("get-agent-default-plan").description(`Get the workspace's default AI agent billing plan marker (plan id and auto_apply flag). 404 when none is set.`).addHelpText("after", `
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", `
39405
39465
  Examples:
39406
- hyperline agents get-agent-default-plan`).action(async (_opts) => {
39466
+ hyperline aggregators-usage get-aggregator-usage --id <id>`).action(async (opts) => {
39407
39467
  const ctx = resource.parent?.opts()._ctx;
39408
39468
  if (!ctx) {
39409
39469
  process.stderr.write("Error: Not authenticated\n");
39410
39470
  process.exit(1);
39411
39471
  }
39412
39472
  const args = {};
39473
+ if (opts.id !== void 0)
39474
+ args.id = opts.id;
39413
39475
  await ctx.execute({
39414
39476
  method: "GET",
39415
- path: "/v1/agents/default-plan",
39477
+ path: "/v1/aggregators/{id}/usage",
39416
39478
  args,
39417
39479
  queryParamKeys: []
39418
39480
  });
39419
39481
  });
39420
- resource.command("set-agent-default-plan").description(`Mark one plan as the workspace's default AI agent billing plan (body: plan_id, optional auto_apply). Replaces the previous marker; 404 when the plan is not this workspace's.`).requiredOption("--plan-id <value>", `Billing plan reference. On policy writes, omission preserves the current plan and null detaches it.`).option("--auto-apply", `Whether eligible newly ingested customers receive the default plan automatically.`).addHelpText("after", `
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", `
39421
39483
  Examples:
39422
- hyperline agents set-agent-default-plan --plan-id <plan_id>
39423
- hyperline agents set-agent-default-plan --plan-id <plan_id> --auto-apply
39424
- hyperline agents set-agent-default-plan --plan-id <plan_id> --output json`).action(async (opts) => {
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) => {
39425
39486
  const ctx = resource.parent?.opts()._ctx;
39426
39487
  if (!ctx) {
39427
39488
  process.stderr.write("Error: Not authenticated\n");
39428
39489
  process.exit(1);
39429
39490
  }
39430
39491
  const args = {};
39431
- if (opts.planId !== void 0)
39432
- args.plan_id = opts.planId;
39433
- if (opts.autoApply !== void 0)
39434
- args.auto_apply = true;
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;
39435
39502
  await ctx.execute({
39436
- method: "PUT",
39437
- path: "/v1/agents/default-plan",
39503
+ method: "GET",
39504
+ path: "/v1/aggregators/{id}/usage/timeseries",
39438
39505
  args,
39439
- queryParamKeys: []
39506
+ queryParamKeys: [
39507
+ "start_date",
39508
+ "end_date",
39509
+ "aggregator_filter_id",
39510
+ "group_by"
39511
+ ]
39440
39512
  });
39441
39513
  });
39442
- resource.command("clear-agent-default-plan").description(`Clear the workspace's default AI agent billing plan marker. The plan itself is untouched. 404 when none is set.`).option("--yes", "Skip confirmation").addHelpText("after", `
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", `
39443
39515
  Examples:
39444
- hyperline agents clear-agent-default-plan
39445
- 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) => {
39446
39518
  const ctx = resource.parent?.opts()._ctx;
39447
39519
  if (!ctx) {
39448
39520
  process.stderr.write("Error: Not authenticated\n");
39449
39521
  process.exit(1);
39450
39522
  }
39451
39523
  const args = {};
39452
- if (!opts.yes) {
39453
- const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39454
- if (!confirmed) {
39455
- process.stdout.write("Aborted.\n");
39456
- return;
39457
- }
39458
- }
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);
39459
39536
  await ctx.execute({
39460
- method: "DELETE",
39461
- path: "/v1/agents/default-plan",
39537
+ method: "GET",
39538
+ path: "/v1/aggregators/{id}/usage/group-by-customer",
39462
39539
  args,
39463
- queryParamKeys: []
39540
+ queryParamKeys: [
39541
+ "start_date",
39542
+ "end_date",
39543
+ "aggregator_filter_id",
39544
+ "take",
39545
+ "skip"
39546
+ ]
39464
39547
  });
39465
39548
  });
39466
- resource.command("list-agent-rate-cards").description(`List AI rate cards: named pricing row sets in credits, window units or currency. Shows what plans/policies/products depend on each. Filter by denomination, currency or name search; paginated with take/skip.`).option("--denomination <value>", `Unit in which rate-card prices are expressed.
39467
-
39468
- - credits: Credit counts.
39469
- - units: Weighted rolling-allowance units.
39470
- - currency: Major units of the specified currency.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--search <value>", `search`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
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", `
39471
39550
  Examples:
39472
- hyperline agents list-agent-rate-cards
39473
- 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) => {
39474
39553
  const ctx = resource.parent?.opts()._ctx;
39475
39554
  if (!ctx) {
39476
39555
  process.stderr.write("Error: Not authenticated\n");
39477
39556
  process.exit(1);
39478
39557
  }
39479
39558
  const args = {};
39480
- if (opts.denomination !== void 0)
39481
- args.denomination = opts.denomination;
39482
- if (opts.currency !== void 0)
39483
- args.currency = opts.currency;
39484
- if (opts.search !== void 0)
39485
- args.search = opts.search;
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;
39486
39567
  if (opts.take !== void 0)
39487
39568
  args.take = Number(opts.take);
39488
39569
  if (opts.skip !== void 0)
39489
39570
  args.skip = Number(opts.skip);
39490
39571
  await ctx.execute({
39491
39572
  method: "GET",
39492
- path: "/v1/agents/rate-cards",
39573
+ path: "/v1/aggregators/{id}/usage/events",
39493
39574
  args,
39494
- queryParamKeys: ["denomination", "currency", "search", "take", "skip"]
39575
+ queryParamKeys: [
39576
+ "start_date",
39577
+ "end_date",
39578
+ "aggregator_filter_id",
39579
+ "take",
39580
+ "skip"
39581
+ ]
39495
39582
  });
39496
39583
  });
39497
- resource.command("create-agent-rate-card").description(`Create an AI rate card with llm rows (per-1M input/output token rates) and item rows (per-unit rates), a denomination (credits/units/currency) and an optional USD fallback conversion.`).requiredOption("--name <value>", `Human-readable resource name.`).option("--fallback-per-usd <value>", `Credits, allowance units, or major currency units per USD of provider cost. Null leaves unmatched usage unpriced.`).requiredOption("--rows <json>", `All pricing rows on the card; replacement replaces the complete list.`).requiredOption("--denomination <value>", `Unit in which rate-card prices are expressed.
39584
+ }
39498
39585
 
39499
- - credits: Credit counts.
39500
- - units: Weighted rolling-allowance units.
39501
- - currency: Major units of the specified currency.`).option("--currency <value>", `ISO 4217 currency code for monetary values. Null for counts or historical amounts without recorded currency.`).addHelpText("after", `
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", `
39502
39594
  Examples:
39503
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination>
39504
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --fallback-per-usd <fallback_per_usd> --currency <currency>
39505
- hyperline agents create-agent-rate-card --name <name> --rows <rows> --denomination <denomination> --output json`).action(async (opts) => {
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", `
39626
+ Examples:
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) => {
39506
39630
  const ctx = resource.parent?.opts()._ctx;
39507
39631
  if (!ctx) {
39508
39632
  process.stderr.write("Error: Not authenticated\n");
@@ -39511,77 +39635,83 @@ Examples:
39511
39635
  const args = {};
39512
39636
  if (opts.name !== void 0)
39513
39637
  args.name = opts.name;
39514
- if (opts.fallbackPerUsd !== void 0)
39515
- args.fallback_per_usd = opts.fallbackPerUsd;
39516
- if (opts.denomination !== void 0)
39517
- args.denomination = opts.denomination;
39518
- if (opts.currency !== void 0)
39519
- args.currency = opts.currency;
39520
- if (opts.rows !== void 0)
39521
- args.rows = JSON.parse(opts.rows);
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);
39522
39660
  await ctx.execute({
39523
39661
  method: "POST",
39524
- path: "/v1/agents/rate-cards",
39662
+ path: "/v1/ai/billing/plans",
39525
39663
  args,
39526
39664
  queryParamKeys: []
39527
39665
  });
39528
39666
  });
39529
- resource.command("get-agent-rate-card").description(`Get one AI rate card by id with all its pricing rows and usage counts (plans, policies, credit product).`).requiredOption("--rate-card-id <value>", `rate_card_id parameter`).addHelpText("after", `
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", `
39530
39668
  Examples:
39531
- 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) => {
39532
39670
  const ctx = resource.parent?.opts()._ctx;
39533
39671
  if (!ctx) {
39534
39672
  process.stderr.write("Error: Not authenticated\n");
39535
39673
  process.exit(1);
39536
39674
  }
39537
39675
  const args = {};
39538
- if (opts.rateCardId !== void 0)
39539
- args.rate_card_id = opts.rateCardId;
39540
39676
  await ctx.execute({
39541
39677
  method: "GET",
39542
- path: "/v1/agents/rate-cards/{rate_card_id}",
39678
+ path: "/v1/ai/billing/plans/default",
39543
39679
  args,
39544
39680
  queryParamKeys: []
39545
39681
  });
39546
39682
  });
39547
- resource.command("replace-agent-rate-card").description(`Replace an AI rate card's rows, name, description and USD fallback (whole-card semantics). Denomination and currency are immutable.`).requiredOption("--rate-card-id <value>", `rate_card_id parameter`).requiredOption("--name <value>", `Human-readable resource name.`).option("--fallback-per-usd <value>", `Credits, allowance units, or major currency units per USD of provider cost. Null leaves unmatched usage unpriced.`).requiredOption("--rows <json>", `All pricing rows on the card; replacement replaces the complete list.`).addHelpText("after", `
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", `
39548
39684
  Examples:
39549
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows>
39550
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows> --fallback-per-usd <fallback_per_usd>
39551
- hyperline agents replace-agent-rate-card --rate-card-id <rate_card_id> --name <name> --rows <rows> --output json`).action(async (opts) => {
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) => {
39552
39688
  const ctx = resource.parent?.opts()._ctx;
39553
39689
  if (!ctx) {
39554
39690
  process.stderr.write("Error: Not authenticated\n");
39555
39691
  process.exit(1);
39556
39692
  }
39557
39693
  const args = {};
39558
- if (opts.rateCardId !== void 0)
39559
- args.rate_card_id = opts.rateCardId;
39560
- if (opts.name !== void 0)
39561
- args.name = opts.name;
39562
- if (opts.fallbackPerUsd !== void 0)
39563
- args.fallback_per_usd = opts.fallbackPerUsd;
39564
- if (opts.rows !== void 0)
39565
- args.rows = JSON.parse(opts.rows);
39694
+ if (opts.planId !== void 0)
39695
+ args.plan_id = opts.planId;
39696
+ if (opts.autoApply !== void 0)
39697
+ args.auto_apply = true;
39566
39698
  await ctx.execute({
39567
39699
  method: "PUT",
39568
- path: "/v1/agents/rate-cards/{rate_card_id}",
39700
+ path: "/v1/ai/billing/plans/default",
39569
39701
  args,
39570
39702
  queryParamKeys: []
39571
39703
  });
39572
39704
  });
39573
- resource.command("delete-agent-rate-card").description(`Delete an AI rate card. Refused (409, rate_card_in_use) while any plan, credit product or customer policy still uses it.`).requiredOption("--rate-card-id <value>", `rate_card_id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
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", `
39574
39706
  Examples:
39575
- hyperline agents delete-agent-rate-card --rate-card-id <rate_card_id>
39576
- hyperline agents delete-agent-rate-card --rate-card-id <rate_card_id> --output json`).action(async (opts) => {
39707
+ hyperline ai-billing clear-agent-default-plan
39708
+ hyperline ai-billing clear-agent-default-plan --output json`).action(async (opts) => {
39577
39709
  const ctx = resource.parent?.opts()._ctx;
39578
39710
  if (!ctx) {
39579
39711
  process.stderr.write("Error: Not authenticated\n");
39580
39712
  process.exit(1);
39581
39713
  }
39582
39714
  const args = {};
39583
- if (opts.rateCardId !== void 0)
39584
- args.rate_card_id = opts.rateCardId;
39585
39715
  if (!opts.yes) {
39586
39716
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39587
39717
  if (!confirmed) {
@@ -39591,139 +39721,221 @@ Examples:
39591
39721
  }
39592
39722
  await ctx.execute({
39593
39723
  method: "DELETE",
39594
- path: "/v1/agents/rate-cards/{rate_card_id}",
39724
+ path: "/v1/ai/billing/plans/default",
39595
39725
  args,
39596
39726
  queryParamKeys: []
39597
39727
  });
39598
39728
  });
39599
- resource.command("list-agent-credit-products").description(`List the credit products AI agent usage can draw down, with their purchasable packs and default rate cards. Customer pot balances live on the customer credits endpoints.`).addHelpText("after", `
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", `
39600
39730
  Examples:
39601
- hyperline agents list-agent-credit-products`).action(async (_opts) => {
39731
+ hyperline ai-billing get-agent-plan --id <id>`).action(async (opts) => {
39602
39732
  const ctx = resource.parent?.opts()._ctx;
39603
39733
  if (!ctx) {
39604
39734
  process.stderr.write("Error: Not authenticated\n");
39605
39735
  process.exit(1);
39606
39736
  }
39607
39737
  const args = {};
39738
+ if (opts.id !== void 0)
39739
+ args.id = opts.id;
39608
39740
  await ctx.execute({
39609
39741
  method: "GET",
39610
- path: "/v1/agents/credit-products",
39742
+ path: "/v1/ai/billing/plans/{id}",
39611
39743
  args,
39612
39744
  queryParamKeys: []
39613
39745
  });
39614
39746
  });
39615
- resource.command("list-agent-cost-catalog").description(`List the AI cost catalog: registry model prices merged with this workspace's negotiated overrides, its own custom cost items (source custom), and the unpriced pairs its telemetry has carried (source unlisted). Rates are USD decimal strings. Pass enabled_only=true for just the enabled catalog.`).option("--enabled-only <value>", `enabled_only`).addHelpText("after", `
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", `
39616
39753
  Examples:
39617
- hyperline agents list-agent-cost-catalog
39618
- hyperline agents list-agent-cost-catalog --enabled-only <enabled_only>`).action(async (opts) => {
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) => {
39619
39757
  const ctx = resource.parent?.opts()._ctx;
39620
39758
  if (!ctx) {
39621
39759
  process.stderr.write("Error: Not authenticated\n");
39622
39760
  process.exit(1);
39623
39761
  }
39624
39762
  const args = {};
39625
- if (opts.enabledOnly !== void 0)
39626
- args.enabled_only = opts.enabledOnly;
39763
+ if (opts.id !== void 0)
39764
+ args.id = opts.id;
39765
+ if (opts.name !== void 0)
39766
+ args.name = opts.name;
39767
+ if (opts.rateCardId !== void 0)
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;
39806
+ if (!opts.yes) {
39807
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39808
+ if (!confirmed) {
39809
+ process.stdout.write("Aborted.\n");
39810
+ return;
39811
+ }
39812
+ }
39813
+ await ctx.execute({
39814
+ method: "DELETE",
39815
+ path: "/v1/ai/billing/plans/{id}",
39816
+ args,
39817
+ queryParamKeys: []
39818
+ });
39819
+ });
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", `
39825
+ Examples:
39826
+ hyperline ai-billing list-agent-rate-cards
39827
+ hyperline ai-billing list-agent-rate-cards --denomination <denomination> --currency <currency>`).action(async (opts) => {
39828
+ const ctx = resource.parent?.opts()._ctx;
39829
+ if (!ctx) {
39830
+ process.stderr.write("Error: Not authenticated\n");
39831
+ process.exit(1);
39832
+ }
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);
39627
39844
  await ctx.execute({
39628
39845
  method: "GET",
39629
- path: "/v1/agents/cost-catalog",
39846
+ path: "/v1/ai/billing/rate-cards",
39630
39847
  args,
39631
- queryParamKeys: ["enabled_only"]
39848
+ queryParamKeys: ["denomination", "currency", "search", "take", "skip"]
39632
39849
  });
39633
39850
  });
39634
- resource.command("create-agent-cost-catalog-item").description(`Create a custom AI cost item so a non-LLM vendor call is priced instead of landing unpriced at $0. provider/item must match hyperline.cost({ vendor, item }) verbatim and each dimensions[].key must match the unit the SDK sends. Re-creating an existing open item returns it unchanged (200); a pair the global registry already prices is refused \u2014 use the overrides endpoint for that.`).requiredOption("--provider <value>", `AI model provider, or the vendor of a custom cost item. This is not an integration connection.`).requiredOption("--item <value>", `Custom item name matching the usage payload.`).requiredOption("--dimensions <json>", `Additional billable dimensions; each key matches a usage_extra key and rates use the owning card's units or USD for cost-catalog dimensions.`).addHelpText("after", `
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", `
39635
39856
  Examples:
39636
- hyperline agents create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions>
39637
- hyperline agents create-agent-cost-catalog-item --provider <provider> --item <item> --dimensions <dimensions> --output json`).action(async (opts) => {
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) => {
39638
39860
  const ctx = resource.parent?.opts()._ctx;
39639
39861
  if (!ctx) {
39640
39862
  process.stderr.write("Error: Not authenticated\n");
39641
39863
  process.exit(1);
39642
39864
  }
39643
39865
  const args = {};
39644
- if (opts.provider !== void 0)
39645
- args.provider = opts.provider;
39646
- if (opts.item !== void 0)
39647
- args.item = opts.item;
39648
- if (opts.dimensions !== void 0)
39649
- args.dimensions = JSON.parse(opts.dimensions);
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);
39650
39876
  await ctx.execute({
39651
39877
  method: "POST",
39652
- path: "/v1/agents/cost-catalog/items",
39878
+ path: "/v1/ai/billing/rate-cards",
39653
39879
  args,
39654
39880
  queryParamKeys: []
39655
39881
  });
39656
39882
  });
39657
- resource.command("delete-agent-cost-catalog-item").description(`Close a custom AI cost item by its custom_item_id. History is kept; new calls on that pair go back to unpriced. An override id passed here is a 404.`).requiredOption("--item-id <value>", `item_id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
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", `
39658
39884
  Examples:
39659
- hyperline agents delete-agent-cost-catalog-item --item-id <item_id>
39660
- hyperline agents delete-agent-cost-catalog-item --item-id <item_id> --output json`).action(async (opts) => {
39885
+ hyperline ai-billing get-agent-rate-card --id <id>`).action(async (opts) => {
39661
39886
  const ctx = resource.parent?.opts()._ctx;
39662
39887
  if (!ctx) {
39663
39888
  process.stderr.write("Error: Not authenticated\n");
39664
39889
  process.exit(1);
39665
39890
  }
39666
39891
  const args = {};
39667
- if (opts.itemId !== void 0)
39668
- args.item_id = opts.itemId;
39669
- if (!opts.yes) {
39670
- const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39671
- if (!confirmed) {
39672
- process.stdout.write("Aborted.\n");
39673
- return;
39674
- }
39675
- }
39892
+ if (opts.id !== void 0)
39893
+ args.id = opts.id;
39676
39894
  await ctx.execute({
39677
- method: "DELETE",
39678
- path: "/v1/agents/cost-catalog/items/{item_id}",
39895
+ method: "GET",
39896
+ path: "/v1/ai/billing/rate-cards/{id}",
39679
39897
  args,
39680
39898
  queryParamKeys: []
39681
39899
  });
39682
39900
  });
39683
- resource.command("upsert-agent-cost-catalog-override").description(`Set this workspace's negotiated price for a registry AI model (input/output/cached/cache-write USD per 1M tokens, plus optional dimensions). Replaces any open override immediately; historical calls keep their original rate. A pair the registry does not know is refused \u2014 create a custom cost item instead.`).requiredOption("--provider <value>", `AI model provider, or the vendor of a custom cost item. This is not an integration connection.`).requiredOption("--model <value>", `Model identifier, or custom item identifier. Null on wildcard pricing rows.`).requiredOption("--input-per-m-tokens <value>", `Provider cost in USD per million input tokens, as an exact decimal string.`).requiredOption("--output-per-m-tokens <value>", `Provider cost in USD per million output tokens, as an exact decimal string.`).option("--cached-input-per-m-tokens <value>", `Provider cost in USD per million cached input tokens, as an exact decimal string.`).option("--cache-write-per-m-tokens <value>", `Provider cost in USD per million cache write tokens, as an exact decimal string.`).option("--dimensions <json>", `Additional billable dimensions; each key matches a usage_extra key and rates use the owning card's units or USD for cost-catalog dimensions.`).addHelpText("after", `
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", `
39684
39902
  Examples:
39685
- hyperline agents upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens>
39686
- hyperline agents upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens> --cached-input-per-m-tokens <cached_input_per_m_tokens> --cache-write-per-m-tokens <cache_write_per_m_tokens>
39687
- hyperline agents upsert-agent-cost-catalog-override --provider <provider> --model <model> --input-per-m-tokens <input_per_m_tokens> --output-per-m-tokens <output_per_m_tokens> --output json`).action(async (opts) => {
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) => {
39688
39906
  const ctx = resource.parent?.opts()._ctx;
39689
39907
  if (!ctx) {
39690
39908
  process.stderr.write("Error: Not authenticated\n");
39691
39909
  process.exit(1);
39692
39910
  }
39693
39911
  const args = {};
39694
- if (opts.provider !== void 0)
39695
- args.provider = opts.provider;
39696
- if (opts.model !== void 0)
39697
- args.model = opts.model;
39698
- if (opts.inputPerMTokens !== void 0)
39699
- args.input_per_m_tokens = opts.inputPerMTokens;
39700
- if (opts.outputPerMTokens !== void 0)
39701
- args.output_per_m_tokens = opts.outputPerMTokens;
39702
- if (opts.cachedInputPerMTokens !== void 0)
39703
- args.cached_input_per_m_tokens = opts.cachedInputPerMTokens;
39704
- if (opts.cacheWritePerMTokens !== void 0)
39705
- args.cache_write_per_m_tokens = opts.cacheWritePerMTokens;
39706
- if (opts.dimensions !== void 0)
39707
- args.dimensions = JSON.parse(opts.dimensions);
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);
39708
39920
  await ctx.execute({
39709
39921
  method: "PUT",
39710
- path: "/v1/agents/cost-catalog/overrides",
39922
+ path: "/v1/ai/billing/rate-cards/{id}",
39711
39923
  args,
39712
39924
  queryParamKeys: []
39713
39925
  });
39714
39926
  });
39715
- resource.command("delete-agent-cost-catalog-override").description(`Close this workspace's negotiated price override by its override.id; pricing falls back to the global registry rate. A custom cost item id passed here is a 404.`).requiredOption("--override-id <value>", `override_id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
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", `
39716
39928
  Examples:
39717
- hyperline agents delete-agent-cost-catalog-override --override-id <override_id>
39718
- hyperline agents delete-agent-cost-catalog-override --override-id <override_id> --output json`).action(async (opts) => {
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) => {
39719
39931
  const ctx = resource.parent?.opts()._ctx;
39720
39932
  if (!ctx) {
39721
39933
  process.stderr.write("Error: Not authenticated\n");
39722
39934
  process.exit(1);
39723
39935
  }
39724
39936
  const args = {};
39725
- if (opts.overrideId !== void 0)
39726
- args.override_id = opts.overrideId;
39937
+ if (opts.id !== void 0)
39938
+ args.id = opts.id;
39727
39939
  if (!opts.yes) {
39728
39940
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39729
39941
  if (!confirmed) {
@@ -39733,51 +39945,158 @@ Examples:
39733
39945
  }
39734
39946
  await ctx.execute({
39735
39947
  method: "DELETE",
39736
- path: "/v1/agents/cost-catalog/overrides/{override_id}",
39948
+ path: "/v1/ai/billing/rate-cards/{id}",
39737
39949
  args,
39738
39950
  queryParamKeys: []
39739
39951
  });
39740
39952
  });
39741
- resource.command("list-agent-customer-policies").description(`List all AI billing policies (scopes) for one customer: the default shared pool plus per-agent overrides. Accepts Hyperline or external customer ids.`).requiredOption("--customer-id <value>", `customer_id parameter`).addHelpText("after", `
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", `
39742
39954
  Examples:
39743
- hyperline agents list-agent-customer-policies --customer-id <customer_id>`).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) => {
39744
39957
  const ctx = resource.parent?.opts()._ctx;
39745
39958
  if (!ctx) {
39746
39959
  process.stderr.write("Error: Not authenticated\n");
39747
39960
  process.exit(1);
39748
39961
  }
39749
39962
  const args = {};
39750
- if (opts.customerId !== void 0)
39751
- args.customer_id = opts.customerId;
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);
39752
39969
  await ctx.execute({
39753
39970
  method: "GET",
39754
- path: "/v1/agents/customers/{customer_id}/policies",
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",
39755
39990
  args,
39756
39991
  queryParamKeys: []
39757
39992
  });
39758
39993
  });
39759
- resource.command("get-agent-customer-policy").description(`Get one customer's AI billing policy \u2014 the default shared pool, or one agent's own scope via the agent query param.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).addHelpText("after", `
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", `
39760
40004
  Examples:
39761
- hyperline agents get-agent-customer-policy --customer-id <customer_id>
39762
- hyperline agents get-agent-customer-policy --customer-id <customer_id> --agent <agent>`).action(async (opts) => {
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) => {
39763
40008
  const ctx = resource.parent?.opts()._ctx;
39764
40009
  if (!ctx) {
39765
40010
  process.stderr.write("Error: Not authenticated\n");
39766
40011
  process.exit(1);
39767
40012
  }
39768
40013
  const args = {};
39769
- if (opts.customerId !== void 0)
39770
- args.customer_id = opts.customerId;
39771
- if (opts.agent !== void 0)
39772
- args.agent = opts.agent;
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);
40046
+ await ctx.execute({
40047
+ method: "PUT",
40048
+ path: "/v1/ai/billing/customers/{id}/policies/default",
40049
+ args,
40050
+ queryParamKeys: []
40051
+ });
40052
+ });
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", `
40054
+ Examples:
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) => {
40057
+ const ctx = resource.parent?.opts()._ctx;
40058
+ if (!ctx) {
40059
+ process.stderr.write("Error: Not authenticated\n");
40060
+ process.exit(1);
40061
+ }
40062
+ const args = {};
40063
+ if (opts.id !== void 0)
40064
+ args.id = opts.id;
40065
+ if (!opts.yes) {
40066
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
40067
+ if (!confirmed) {
40068
+ process.stdout.write("Aborted.\n");
40069
+ return;
40070
+ }
40071
+ }
40072
+ await ctx.execute({
40073
+ method: "DELETE",
40074
+ path: "/v1/ai/billing/customers/{id}/policies/default",
40075
+ args,
40076
+ queryParamKeys: []
40077
+ });
40078
+ });
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", `
40080
+ Examples:
40081
+ hyperline ai-billing get-agent-customer-billing-policy --id <id> --agent-slug <agent_slug>`).action(async (opts) => {
40082
+ const ctx = resource.parent?.opts()._ctx;
40083
+ if (!ctx) {
40084
+ process.stderr.write("Error: Not authenticated\n");
40085
+ process.exit(1);
40086
+ }
40087
+ const args = {};
40088
+ if (opts.id !== void 0)
40089
+ args.id = opts.id;
40090
+ if (opts.agentSlug !== void 0)
40091
+ args.agent_slug = opts.agentSlug;
39773
40092
  await ctx.execute({
39774
40093
  method: "GET",
39775
- path: "/v1/agents/customers/{customer_id}/policy",
40094
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39776
40095
  args,
39777
- queryParamKeys: ["agent"]
40096
+ queryParamKeys: []
39778
40097
  });
39779
40098
  });
39780
- resource.command("upsert-agent-customer-policy").description(`Create or replace one customer's AI billing policy (whole-row). Pass plan_id to attach the customer to a billing plan \u2014 this also attaches the plan's overage invoice container to their subscription. Past-limit usage is priced by overage_markup_percent over the base rates, or by overage_rate_card_id (a currency rate card whose rates ARE the overage price) \u2014 never both. Wallet/credit pots are auto-opened empty.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).requiredOption("--mode <value>", `Billing mode.
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.
39781
40100
 
39782
40101
  - wallet: Charges a monetary wallet.
39783
40102
  - credits: Consumes a credit balance.
@@ -39786,21 +40105,21 @@ Examples:
39786
40105
  - refuse: Rejects the call that crosses the boundary without deducting usage.
39787
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.
39788
40107
 
39789
- - calendar_month: Settles at the end of each UTC calendar month.`).option("--credit-rates <json>", `Inline credit pricing. Mutually exclusive with rate_card_id. Omitted rates may be supplied by a plan or product default.`).option("--window-rates <json>", `Window definitions and optional inline unit rates. An attached plan may supply omitted definitions; rate_card_id may supply unit rates.`).option("--rate-card-id <value>", `Rate card reference. On policy writes, omission preserves the current reference and null detaches it; on plan replacement omission clears it.`).option("--plan-id <value>", `Billing plan reference. On policy writes, omission preserves the current plan and null detaches it.`).requiredOption("--blocked", `Whether spending is disabled for this billing scope.`).addHelpText("after", `
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", `
39790
40109
  Examples:
39791
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked
39792
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked --agent <agent> --wallet-id <wallet_id>
39793
- hyperline agents upsert-agent-customer-policy --customer-id <customer_id> --mode <mode> --blocked --output json`).action(async (opts) => {
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) => {
39794
40113
  const ctx = resource.parent?.opts()._ctx;
39795
40114
  if (!ctx) {
39796
40115
  process.stderr.write("Error: Not authenticated\n");
39797
40116
  process.exit(1);
39798
40117
  }
39799
40118
  const args = {};
39800
- if (opts.customerId !== void 0)
39801
- args.customer_id = opts.customerId;
39802
- if (opts.agent !== void 0)
39803
- args.agent = opts.agent;
40119
+ if (opts.id !== void 0)
40120
+ args.id = opts.id;
40121
+ if (opts.agentSlug !== void 0)
40122
+ args.agent_slug = opts.agentSlug;
39804
40123
  if (opts.mode !== void 0)
39805
40124
  args.mode = opts.mode;
39806
40125
  if (opts.walletId !== void 0)
@@ -39829,32 +40148,29 @@ Examples:
39829
40148
  args.settlement_interval_minutes = Number(opts.settlementIntervalMinutes);
39830
40149
  if (opts.blocked !== void 0)
39831
40150
  args.blocked = true;
39832
- if (opts.creditRates !== void 0)
39833
- args.credit_rates = JSON.parse(opts.creditRates);
39834
- if (opts.windowRates !== void 0)
39835
- args.window_rates = JSON.parse(opts.windowRates);
40151
+ if (opts.windows !== void 0)
40152
+ args.windows = JSON.parse(opts.windows);
39836
40153
  await ctx.execute({
39837
40154
  method: "PUT",
39838
- path: "/v1/agents/customers/{customer_id}/policy",
40155
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39839
40156
  args,
39840
- queryParamKeys: ["agent"]
40157
+ queryParamKeys: []
39841
40158
  });
39842
40159
  });
39843
- resource.command("delete-agent-customer-policy").description(`Delete one customer's AI billing policy scope. Refused (409) while it owes unsettled consumption or while agent overrides still depend on it.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).option("--yes", "Skip confirmation").addHelpText("after", `
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", `
39844
40161
  Examples:
39845
- hyperline agents delete-agent-customer-policy --customer-id <customer_id>
39846
- hyperline agents delete-agent-customer-policy --customer-id <customer_id> --agent <agent>
39847
- hyperline agents delete-agent-customer-policy --customer-id <customer_id> --output json`).action(async (opts) => {
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) => {
39848
40164
  const ctx = resource.parent?.opts()._ctx;
39849
40165
  if (!ctx) {
39850
40166
  process.stderr.write("Error: Not authenticated\n");
39851
40167
  process.exit(1);
39852
40168
  }
39853
40169
  const args = {};
39854
- if (opts.customerId !== void 0)
39855
- args.customer_id = opts.customerId;
39856
- if (opts.agent !== void 0)
39857
- args.agent = opts.agent;
40170
+ if (opts.id !== void 0)
40171
+ args.id = opts.id;
40172
+ if (opts.agentSlug !== void 0)
40173
+ args.agent_slug = opts.agentSlug;
39858
40174
  if (!opts.yes) {
39859
40175
  const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
39860
40176
  if (!confirmed) {
@@ -39864,87 +40180,87 @@ Examples:
39864
40180
  }
39865
40181
  await ctx.execute({
39866
40182
  method: "DELETE",
39867
- path: "/v1/agents/customers/{customer_id}/policy",
40183
+ path: "/v1/ai/billing/customers/{id}/policies/agents/{agent_slug}",
39868
40184
  args,
39869
- queryParamKeys: ["agent"]
40185
+ queryParamKeys: []
39870
40186
  });
39871
40187
  });
39872
- resource.command("apply-agent-default-plan").description(`Apply the workspace's default AI agent billing plan to one customer (by id or external id). Idempotent; refuses (409) if the customer already has a different billing policy, 404 when no default plan is set.`).requiredOption("--customer-id <value>", `customer_id parameter`).addHelpText("after", `
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", `
39873
40189
  Examples:
39874
- hyperline agents apply-agent-default-plan --customer-id <customer_id>
39875
- hyperline agents apply-agent-default-plan --customer-id <customer_id> --output json`).action(async (opts) => {
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) => {
39876
40192
  const ctx = resource.parent?.opts()._ctx;
39877
40193
  if (!ctx) {
39878
40194
  process.stderr.write("Error: Not authenticated\n");
39879
40195
  process.exit(1);
39880
40196
  }
39881
40197
  const args = {};
39882
- if (opts.customerId !== void 0)
39883
- args.customer_id = opts.customerId;
40198
+ if (opts.id !== void 0)
40199
+ args.id = opts.id;
39884
40200
  await ctx.execute({
39885
40201
  method: "POST",
39886
- path: "/v1/agents/customers/{customer_id}/apply-default-plan",
40202
+ path: "/v1/ai/billing/customers/{id}/apply-default-plan",
39887
40203
  args,
39888
40204
  queryParamKeys: []
39889
40205
  });
39890
40206
  });
39891
- resource.command("get-agent-customer-balance").description(`Get one customer's live AI balance, shaped by their billing mode: wallet shadow balance, credit pot, or rolling window meters with reset times. Includes per-agent scopes and overage state.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).addHelpText("after", `
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", `
39892
40208
  Examples:
39893
- hyperline agents get-agent-customer-balance --customer-id <customer_id>
39894
- hyperline agents get-agent-customer-balance --customer-id <customer_id> --agent <agent>`).action(async (opts) => {
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) => {
39895
40211
  const ctx = resource.parent?.opts()._ctx;
39896
40212
  if (!ctx) {
39897
40213
  process.stderr.write("Error: Not authenticated\n");
39898
40214
  process.exit(1);
39899
40215
  }
39900
40216
  const args = {};
39901
- if (opts.customerId !== void 0)
39902
- args.customer_id = opts.customerId;
39903
- if (opts.agent !== void 0)
39904
- args.agent = opts.agent;
40217
+ if (opts.id !== void 0)
40218
+ args.id = opts.id;
40219
+ if (opts.agentSlug !== void 0)
40220
+ args.agent_slug = opts.agentSlug;
39905
40221
  await ctx.execute({
39906
40222
  method: "GET",
39907
- path: "/v1/agents/customers/{customer_id}/balance",
40223
+ path: "/v1/ai/billing/customers/{id}/balance",
39908
40224
  args,
39909
- queryParamKeys: ["agent"]
40225
+ queryParamKeys: ["agent_slug"]
39910
40226
  });
39911
40227
  });
39912
- resource.command("reset-agent-customer-windows").description(`Reset one customer's open AI allowance windows so their next call starts a fresh full allowance. Windows-mode scopes only.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent scope identifier. Null on scoped results denotes the customer's shared pool.`).addHelpText("after", `
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", `
39913
40229
  Examples:
39914
- hyperline agents reset-agent-customer-windows --customer-id <customer_id>
39915
- hyperline agents reset-agent-customer-windows --customer-id <customer_id> --agent <agent>
39916
- hyperline agents reset-agent-customer-windows --customer-id <customer_id> --output json`).action(async (opts) => {
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) => {
39917
40233
  const ctx = resource.parent?.opts()._ctx;
39918
40234
  if (!ctx) {
39919
40235
  process.stderr.write("Error: Not authenticated\n");
39920
40236
  process.exit(1);
39921
40237
  }
39922
40238
  const args = {};
39923
- if (opts.customerId !== void 0)
39924
- args.customer_id = opts.customerId;
39925
- if (opts.agent !== void 0)
39926
- args.agent = opts.agent;
40239
+ if (opts.id !== void 0)
40240
+ args.id = opts.id;
40241
+ if (opts.agentSlug !== void 0)
40242
+ args.agent_slug = opts.agentSlug;
39927
40243
  await ctx.execute({
39928
40244
  method: "POST",
39929
- path: "/v1/agents/customers/{customer_id}/windows/reset",
40245
+ path: "/v1/ai/billing/customers/{id}/windows/reset",
39930
40246
  args,
39931
- queryParamKeys: ["agent"]
40247
+ queryParamKeys: ["agent_slug"]
39932
40248
  });
39933
40249
  });
39934
- resource.command("list-agent-customer-consumption").description(`List one customer's AI consumption ledger entries, newest first, with amounts, denominations and overage flags. Filter by agent scope, overage, and from/to time range; paginated with take/skip.`).requiredOption("--customer-id <value>", `customer_id parameter`).option("--agent <value>", `Agent slug. An empty string selects the shared pool; omission includes all scopes.`).option("--overage <value>", `Filter by overage status. Omit to include both ordinary and overage entries.`).option("--from <value>", `UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--to <value>", `UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
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", `
39935
40251
  Examples:
39936
- hyperline agents list-agent-customer-consumption --customer-id <customer_id>
39937
- hyperline agents list-agent-customer-consumption --customer-id <customer_id> --agent <agent> --overage <overage>`).action(async (opts) => {
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) => {
39938
40254
  const ctx = resource.parent?.opts()._ctx;
39939
40255
  if (!ctx) {
39940
40256
  process.stderr.write("Error: Not authenticated\n");
39941
40257
  process.exit(1);
39942
40258
  }
39943
40259
  const args = {};
39944
- if (opts.customerId !== void 0)
39945
- args.customer_id = opts.customerId;
39946
- if (opts.agent !== void 0)
39947
- args.agent = opts.agent;
40260
+ if (opts.id !== void 0)
40261
+ args.id = opts.id;
40262
+ if (opts.agentSlug !== void 0)
40263
+ args.agent_slug = opts.agentSlug;
39948
40264
  if (opts.overage !== void 0)
39949
40265
  args.overage = opts.overage;
39950
40266
  if (opts.from !== void 0)
@@ -39957,175 +40273,131 @@ Examples:
39957
40273
  args.skip = Number(opts.skip);
39958
40274
  await ctx.execute({
39959
40275
  method: "GET",
39960
- path: "/v1/agents/customers/{customer_id}/consumption",
40276
+ path: "/v1/ai/billing/customers/{id}/consumption",
39961
40277
  args,
39962
- queryParamKeys: ["agent", "overage", "from", "to", "take", "skip"]
40278
+ queryParamKeys: ["agent_slug", "overage", "from", "to", "take", "skip"]
39963
40279
  });
39964
40280
  });
39965
- resource.command("get-agent-customer-overview").description(`Get one customer's full AI billing overview: default policy, per-agent scopes, balances and billed consumption totals in one read.`).requiredOption("--customer-id <value>", `customer_id parameter`).addHelpText("after", `
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", `
39966
40282
  Examples:
39967
- 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) => {
39968
40284
  const ctx = resource.parent?.opts()._ctx;
39969
40285
  if (!ctx) {
39970
40286
  process.stderr.write("Error: Not authenticated\n");
39971
40287
  process.exit(1);
39972
40288
  }
39973
40289
  const args = {};
39974
- if (opts.customerId !== void 0)
39975
- args.customer_id = opts.customerId;
40290
+ if (opts.id !== void 0)
40291
+ args.id = opts.id;
39976
40292
  await ctx.execute({
39977
40293
  method: "GET",
39978
- path: "/v1/agents/customers/{customer_id}/overview",
40294
+ path: "/v1/ai/billing/products/{id}/rate-card",
39979
40295
  args,
39980
40296
  queryParamKeys: []
39981
40297
  });
39982
40298
  });
39983
- }
39984
-
39985
- // build/commands/generated/aggregators.js
39986
- function registerAggregatorsCommands(parent) {
39987
- const resource = parent.command("aggregators").description("Manage aggregators");
39988
- resource.command("list").description(`List all aggregators with pagination. Aggregators define how billable events are counted or summed to compute usage.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
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", `
39989
40300
  Examples:
39990
- hyperline aggregators list
39991
- 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) => {
39992
40303
  const ctx = resource.parent?.opts()._ctx;
39993
40304
  if (!ctx) {
39994
40305
  process.stderr.write("Error: Not authenticated\n");
39995
40306
  process.exit(1);
39996
40307
  }
39997
40308
  const args = {};
39998
- if (opts.take !== void 0)
39999
- args.take = Number(opts.take);
40000
- if (opts.skip !== void 0)
40001
- args.skip = Number(opts.skip);
40309
+ if (opts.id !== void 0)
40310
+ args.id = opts.id;
40311
+ if (opts.rateCardId !== void 0)
40312
+ args.rate_card_id = opts.rateCardId;
40002
40313
  await ctx.execute({
40003
- method: "GET",
40004
- path: "/v1/aggregators",
40314
+ method: "PUT",
40315
+ path: "/v1/ai/billing/products/{id}/rate-card",
40005
40316
  args,
40006
- queryParamKeys: ["take", "skip"]
40317
+ queryParamKeys: []
40007
40318
  });
40008
40319
  });
40009
- resource.command("create").description(`Create a new aggregator that counts or sums billable events. Aggregators can then be linked to products via aggregator_id.`).requiredOption("--entity <value>", `The billable event entity to aggregate.`).option("--type <value>", `The type of aggregator.`).option("--where <json>", `Filter conditions for the aggregation.`).option("--name <value>", `Name of the aggregator.`).option("--description <value>", `Description of the aggregator.`).option("--allow-negative-values", `Whether the aggregator can produce negative values.`).option("--aggregate-on-customers-enabled", `Whether the aggregator should aggregate on customers.`).option("--custom-event-name <value>", `Custom event name for the aggregator.`).option("--exposed-event-keys <json>", `Event keys exposed by the aggregator.`).option("--unit-name <value>", `Display name of the unit being measured (e.g. 'user', 'request'). Used as fallback for products attached to this aggregator.`).option("--default-interval-count <number>", `Default interval count for usage periods.`).option("--default-interval-period <value>", `Default interval period for usage periods.`).option("--thresholds <json>", `Thresholds for the aggregator.`).requiredOption("--operation <value>", `The aggregation operation to perform.`).option("--property <value>", `The property to sum.`).addHelpText("after", `
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", `
40010
40321
  Examples:
40011
- hyperline aggregators create --entity <entity> --operation <operation>
40012
- hyperline aggregators create --entity <entity> --operation <operation> --type <type> --where <where>
40013
- hyperline aggregators create --entity <entity> --operation <operation> --output json`).action(async (opts) => {
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) => {
40014
40324
  const ctx = resource.parent?.opts()._ctx;
40015
40325
  if (!ctx) {
40016
40326
  process.stderr.write("Error: Not authenticated\n");
40017
40327
  process.exit(1);
40018
40328
  }
40019
40329
  const args = {};
40020
- if (opts.entity !== void 0)
40021
- args.entity = opts.entity;
40022
- if (opts.type !== void 0)
40023
- args.type = opts.type;
40024
- if (opts.name !== void 0)
40025
- args.name = opts.name;
40026
- if (opts.description !== void 0)
40027
- args.description = opts.description;
40028
- if (opts.customEventName !== void 0)
40029
- args.custom_event_name = opts.customEventName;
40030
- if (opts.unitName !== void 0)
40031
- args.unit_name = opts.unitName;
40032
- if (opts.defaultIntervalPeriod !== void 0)
40033
- args.default_interval_period = opts.defaultIntervalPeriod;
40034
- if (opts.operation !== void 0)
40035
- args.operation = opts.operation;
40036
- if (opts.property !== void 0)
40037
- args.property = opts.property;
40038
- if (opts.defaultIntervalCount !== void 0)
40039
- args.default_interval_count = Number(opts.defaultIntervalCount);
40040
- if (opts.allowNegativeValues !== void 0)
40041
- args.allow_negative_values = true;
40042
- if (opts.aggregateOnCustomersEnabled !== void 0)
40043
- args.aggregate_on_customers_enabled = true;
40044
- if (opts.where !== void 0)
40045
- args.where = JSON.parse(opts.where);
40046
- if (opts.exposedEventKeys !== void 0)
40047
- args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
40048
- if (opts.thresholds !== void 0)
40049
- args.thresholds = JSON.parse(opts.thresholds);
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
+ }
40050
40339
  await ctx.execute({
40051
- method: "POST",
40052
- path: "/v1/aggregators",
40340
+ method: "DELETE",
40341
+ path: "/v1/ai/billing/products/{id}/rate-card",
40053
40342
  args,
40054
40343
  queryParamKeys: []
40055
40344
  });
40056
40345
  });
40057
- 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", `
40058
40352
  Examples:
40059
- 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) => {
40060
40355
  const ctx = resource.parent?.opts()._ctx;
40061
40356
  if (!ctx) {
40062
40357
  process.stderr.write("Error: Not authenticated\n");
40063
40358
  process.exit(1);
40064
40359
  }
40065
40360
  const args = {};
40066
- if (opts.id !== void 0)
40067
- 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);
40068
40367
  await ctx.execute({
40069
40368
  method: "GET",
40070
- path: "/v1/aggregators/{id}",
40369
+ path: "/v1/ai/billing/costs",
40071
40370
  args,
40072
- queryParamKeys: []
40371
+ queryParamKeys: ["take", "skip", "enabled_only"]
40073
40372
  });
40074
40373
  });
40075
- resource.command("update").description(`Update an existing aggregator's configuration.`).requiredOption("--id <value>", `id parameter`).option("--entity <value>", `The billable event entity to aggregate.`).option("--type <value>", `The type of aggregator.`).option("--where <json>", `Filter conditions for the aggregation.`).option("--name <value>", `Name of the aggregator.`).option("--description <value>", `Description of the aggregator.`).option("--allow-negative-values", `Whether the aggregator can produce negative values.`).option("--aggregate-on-customers-enabled", `Whether the aggregator should aggregate on customers.`).option("--custom-event-name <value>", `Custom event name for the aggregator.`).option("--exposed-event-keys <json>", `Event keys exposed by the aggregator.`).option("--unit-name <value>", `Display name of the unit being measured (e.g. 'user', 'request'). Used as fallback for products attached to this aggregator.`).option("--default-interval-count <number>", `Default interval count for usage periods.`).option("--default-interval-period <value>", `Default interval period for usage periods.`).option("--thresholds <json>", `Thresholds for the aggregator. Replaces existing thresholds.`).option("--operation <value>", `The aggregation operation to perform.`).option("--property <value>", `The property to sum. Required when operation is 'sum'.`).addHelpText("after", `
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", `
40076
40375
  Examples:
40077
- hyperline aggregators update --id <id>
40078
- hyperline aggregators update --id <id> --entity <entity> --type <type>
40079
- hyperline aggregators update --id <id> --output json`).action(async (opts) => {
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) => {
40080
40378
  const ctx = resource.parent?.opts()._ctx;
40081
40379
  if (!ctx) {
40082
40380
  process.stderr.write("Error: Not authenticated\n");
40083
40381
  process.exit(1);
40084
40382
  }
40085
40383
  const args = {};
40086
- if (opts.id !== void 0)
40087
- args.id = opts.id;
40088
- if (opts.entity !== void 0)
40089
- args.entity = opts.entity;
40090
- if (opts.type !== void 0)
40091
- args.type = opts.type;
40092
- if (opts.name !== void 0)
40093
- args.name = opts.name;
40094
- if (opts.description !== void 0)
40095
- args.description = opts.description;
40096
- if (opts.customEventName !== void 0)
40097
- args.custom_event_name = opts.customEventName;
40098
- if (opts.unitName !== void 0)
40099
- args.unit_name = opts.unitName;
40100
- if (opts.defaultIntervalPeriod !== void 0)
40101
- args.default_interval_period = opts.defaultIntervalPeriod;
40102
- if (opts.operation !== void 0)
40103
- args.operation = opts.operation;
40104
- if (opts.property !== void 0)
40105
- args.property = opts.property;
40106
- if (opts.defaultIntervalCount !== void 0)
40107
- args.default_interval_count = Number(opts.defaultIntervalCount);
40108
- if (opts.allowNegativeValues !== void 0)
40109
- args.allow_negative_values = true;
40110
- if (opts.aggregateOnCustomersEnabled !== void 0)
40111
- args.aggregate_on_customers_enabled = true;
40112
- if (opts.where !== void 0)
40113
- args.where = JSON.parse(opts.where);
40114
- if (opts.exposedEventKeys !== void 0)
40115
- args.exposed_event_keys = JSON.parse(opts.exposedEventKeys);
40116
- if (opts.thresholds !== void 0)
40117
- args.thresholds = JSON.parse(opts.thresholds);
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);
40118
40390
  await ctx.execute({
40119
- method: "PUT",
40120
- path: "/v1/aggregators/{id}",
40391
+ method: "POST",
40392
+ path: "/v1/ai/billing/costs/items",
40121
40393
  args,
40122
40394
  queryParamKeys: []
40123
40395
  });
40124
40396
  });
40125
- resource.command("delete").description(`Delete an aggregator by ID. Will fail if the aggregator is linked to a product.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
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", `
40126
40398
  Examples:
40127
- hyperline aggregators delete --id <id>
40128
- 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) => {
40129
40401
  const ctx = resource.parent?.opts()._ctx;
40130
40402
  if (!ctx) {
40131
40403
  process.stderr.write("Error: Not authenticated\n");
@@ -40143,38 +40415,47 @@ Examples:
40143
40415
  }
40144
40416
  await ctx.execute({
40145
40417
  method: "DELETE",
40146
- path: "/v1/aggregators/{id}",
40418
+ path: "/v1/ai/billing/costs/items/{id}",
40147
40419
  args,
40148
40420
  queryParamKeys: []
40149
40421
  });
40150
40422
  });
40151
- }
40152
-
40153
- // build/commands/generated/aggregators-usage.js
40154
- function registerAggregators_UsageCommands(parent) {
40155
- const resource = parent.command("aggregators-usage").description("Manage aggregators > usage");
40156
- resource.command("get-aggregator-usage").description(`Retrieve a usage row for an aggregator. Use the timeseries, group-by-customer or events endpoints to query metering data.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
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", `
40157
40424
  Examples:
40158
- 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) => {
40159
40428
  const ctx = resource.parent?.opts()._ctx;
40160
40429
  if (!ctx) {
40161
40430
  process.stderr.write("Error: Not authenticated\n");
40162
40431
  process.exit(1);
40163
40432
  }
40164
40433
  const args = {};
40165
- if (opts.id !== void 0)
40166
- args.id = opts.id;
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);
40167
40448
  await ctx.execute({
40168
- method: "GET",
40169
- path: "/v1/aggregators/{id}/usage",
40449
+ method: "PUT",
40450
+ path: "/v1/ai/billing/costs/overrides",
40170
40451
  args,
40171
40452
  queryParamKeys: []
40172
40453
  });
40173
40454
  });
40174
- resource.command("get-aggregator-usage-timeseries").description(`Get client-wide usage for an aggregator bucketed by month/day/hour over a period.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--group-by <value>", `Bucket size for the timeseries.`).addHelpText("after", `
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", `
40175
40456
  Examples:
40176
- hyperline aggregators-usage get-aggregator-usage-timeseries --id <id>
40177
- hyperline aggregators-usage get-aggregator-usage-timeseries --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
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) => {
40178
40459
  const ctx = resource.parent?.opts()._ctx;
40179
40460
  if (!ctx) {
40180
40461
  process.stderr.write("Error: Not authenticated\n");
@@ -40183,30 +40464,24 @@ Examples:
40183
40464
  const args = {};
40184
40465
  if (opts.id !== void 0)
40185
40466
  args.id = opts.id;
40186
- if (opts.startDate !== void 0)
40187
- args.start_date = opts.startDate;
40188
- if (opts.endDate !== void 0)
40189
- args.end_date = opts.endDate;
40190
- if (opts.aggregatorFilterId !== void 0)
40191
- args.aggregator_filter_id = opts.aggregatorFilterId;
40192
- if (opts.groupBy !== void 0)
40193
- args.group_by = opts.groupBy;
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
+ }
40194
40474
  await ctx.execute({
40195
- method: "GET",
40196
- path: "/v1/aggregators/{id}/usage/timeseries",
40475
+ method: "DELETE",
40476
+ path: "/v1/ai/billing/costs/overrides/{id}",
40197
40477
  args,
40198
- queryParamKeys: [
40199
- "start_date",
40200
- "end_date",
40201
- "aggregator_filter_id",
40202
- "group_by"
40203
- ]
40478
+ queryParamKeys: []
40204
40479
  });
40205
40480
  });
40206
- resource.command("get-aggregator-usage-group-by-customer").description(`Per-customer total usage for an aggregator over a period, ranked by total. Paginated with take/skip.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
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", `
40207
40482
  Examples:
40208
- hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id>
40209
- hyperline aggregators-usage get-aggregator-usage-group-by-customer --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
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) => {
40210
40485
  const ctx = resource.parent?.opts()._ctx;
40211
40486
  if (!ctx) {
40212
40487
  process.stderr.write("Error: Not authenticated\n");
@@ -40215,33 +40490,66 @@ Examples:
40215
40490
  const args = {};
40216
40491
  if (opts.id !== void 0)
40217
40492
  args.id = opts.id;
40218
- if (opts.startDate !== void 0)
40219
- args.start_date = opts.startDate;
40220
- if (opts.endDate !== void 0)
40221
- args.end_date = opts.endDate;
40222
- if (opts.aggregatorFilterId !== void 0)
40223
- args.aggregator_filter_id = opts.aggregatorFilterId;
40224
- if (opts.take !== void 0)
40225
- args.take = Number(opts.take);
40226
- if (opts.skip !== void 0)
40227
- args.skip = Number(opts.skip);
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);
40499
+ await ctx.execute({
40500
+ method: "PUT",
40501
+ path: "/v1/ai/billing/costs/items/{id}",
40502
+ args,
40503
+ queryParamKeys: []
40504
+ });
40505
+ });
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. Only completed analyses unless status is set.`).option("--limit <number>", `Maximum number of items to return (1-100).`).option("--cursor <value>", `Opaque cursor returned in the previous response's \`next_cursor\`. Omit to fetch the first page.`).option("--include-total <value>", `Set to \`true\` to include \`total\` in the response.`).option("--customer-id <value>", `Return only analyses of this customer. Accepts the Hyperline ID or your own external ID.`).option("--status <value>", `Return only analyses with this status. Defaults to \`completed\`, the analyses that carry a score.`).option("--created-at.gte <value>", `Return only analyses created at or after this date.`).option("--created-at.lte <value>", `Return only analyses created at or before this date.`).addHelpText("after", `
40512
+ Examples:
40513
+ hyperline ai-monitoring list-monitoring-analyses
40514
+ hyperline ai-monitoring list-monitoring-analyses --limit <limit> --cursor <cursor>`).action(async (opts) => {
40515
+ const ctx = resource.parent?.opts()._ctx;
40516
+ if (!ctx) {
40517
+ process.stderr.write("Error: Not authenticated\n");
40518
+ process.exit(1);
40519
+ }
40520
+ const args = {};
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.status !== void 0)
40528
+ args.status = opts.status;
40529
+ if (opts["createdAt.gte"] !== void 0)
40530
+ args.created_at__gte = opts["createdAt.gte"];
40531
+ if (opts["createdAt.lte"] !== void 0)
40532
+ args.created_at__lte = opts["createdAt.lte"];
40533
+ if (opts.limit !== void 0)
40534
+ args.limit = Number(opts.limit);
40228
40535
  await ctx.execute({
40229
40536
  method: "GET",
40230
- path: "/v1/aggregators/{id}/usage/group-by-customer",
40537
+ path: "/v1/agents/monitoring/analyses",
40231
40538
  args,
40232
40539
  queryParamKeys: [
40233
- "start_date",
40234
- "end_date",
40235
- "aggregator_filter_id",
40236
- "take",
40237
- "skip"
40540
+ "limit",
40541
+ "cursor",
40542
+ "include_total",
40543
+ "customer_id",
40544
+ "status",
40545
+ "created_at__gte",
40546
+ "created_at__lte"
40238
40547
  ]
40239
40548
  });
40240
40549
  });
40241
- resource.command("get-aggregator-usage-events").description(`List raw billable events for an aggregator across every customer of the client. Paginated with take/skip.`).requiredOption("--id <value>", `id parameter`).option("--start-date <value>", `ISO-8601 date string.`).option("--end-date <value>", `ISO-8601 date string.`).option("--aggregator-filter-id <value>", `Optional aggregator filter ID. When set, restricts the result to events matching that filter's config. Must belong to the aggregator in the path.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
40550
+ 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", `
40242
40551
  Examples:
40243
- hyperline aggregators-usage get-aggregator-usage-events --id <id>
40244
- hyperline aggregators-usage get-aggregator-usage-events --id <id> --start-date <start_date> --end-date <end_date>`).action(async (opts) => {
40552
+ hyperline ai-monitoring get-monitoring-analysis --id <id>`).action(async (opts) => {
40245
40553
  const ctx = resource.parent?.opts()._ctx;
40246
40554
  if (!ctx) {
40247
40555
  process.stderr.write("Error: Not authenticated\n");
@@ -40250,27 +40558,11 @@ Examples:
40250
40558
  const args = {};
40251
40559
  if (opts.id !== void 0)
40252
40560
  args.id = opts.id;
40253
- if (opts.startDate !== void 0)
40254
- args.start_date = opts.startDate;
40255
- if (opts.endDate !== void 0)
40256
- args.end_date = opts.endDate;
40257
- if (opts.aggregatorFilterId !== void 0)
40258
- args.aggregator_filter_id = opts.aggregatorFilterId;
40259
- if (opts.take !== void 0)
40260
- args.take = Number(opts.take);
40261
- if (opts.skip !== void 0)
40262
- args.skip = Number(opts.skip);
40263
40561
  await ctx.execute({
40264
40562
  method: "GET",
40265
- path: "/v1/aggregators/{id}/usage/events",
40563
+ path: "/v1/agents/monitoring/analyses/{id}",
40266
40564
  args,
40267
- queryParamKeys: [
40268
- "start_date",
40269
- "end_date",
40270
- "aggregator_filter_id",
40271
- "take",
40272
- "skip"
40273
- ]
40565
+ queryParamKeys: []
40274
40566
  });
40275
40567
  });
40276
40568
  }
@@ -40762,7 +41054,7 @@ Examples:
40762
41054
  queryParamKeys: []
40763
41055
  });
40764
41056
  });
40765
- resource.command("create-custom-property").description(`Create a new custom property definition with a name, type (text, 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. Null means no default value.`).addHelpText("after", `
41057
+ 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", `
40766
41058
  Examples:
40767
41059
  hyperline custom-properties create-custom-property --name <name> --type <type> --slug <slug> --entities <entities>
40768
41060
  hyperline custom-properties create-custom-property --name <name> --type <type> --slug <slug> --entities <entities> --api-only --required
@@ -40796,7 +41088,7 @@ Examples:
40796
41088
  queryParamKeys: []
40797
41089
  });
40798
41090
  });
40799
- 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. Null means no default value.`).addHelpText("after", `
41091
+ 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", `
40800
41092
  Examples:
40801
41093
  hyperline custom-properties update-custom-property --id <id> --name <name> --type <type> --slug <slug> --entities <entities>
40802
41094
  hyperline custom-properties update-custom-property --id <id> --name <name> --type <type> --slug <slug> --entities <entities> --api-only --required
@@ -41945,7 +42237,7 @@ Examples:
41945
42237
  queryParamKeys: []
41946
42238
  });
41947
42239
  });
41948
- resource.command("purchase-customer-credits").description(`Purchase credits for a customer. This generates an invoice and charges the customer. Returns the invoice ID and new balance.`).requiredOption("--id <value>", `id parameter`).requiredOption("--product-id <value>", `productId parameter`).requiredOption("--credit-count <number>", `Value indicating a number of credits to add. If \`price_id\` is defined, this value must correspond to a full credit pack for the price.`).option("--amount-excluding-tax <number>", `Custom amount for the added credits. Either \`amount_excluding_tax\` or \`price_id\` must be defined. Expressed in currency's smallest unit.`).option("--price-id <value>", `Price ID used to add credits. The price must be of type \`bundle\`. Either \`amount_excluding_tax\` or \`price_id\` must be defined.`).option("--expires-at <value>", `Expiration date for credits linked to this transaction. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).addHelpText("after", `
42240
+ resource.command("purchase-customer-credits").description(`Purchase credits for a customer. This generates an invoice and charges the customer's card immediately, granting the credits only once paid. Requires a card payment method (otherwise fails with reason \`payment_method_not_supported\`). Returns the invoice ID and new balance.`).requiredOption("--id <value>", `id parameter`).requiredOption("--product-id <value>", `productId parameter`).requiredOption("--credit-count <number>", `Value indicating a number of credits to add. If \`price_id\` is defined, this value must correspond to a full credit pack for the price.`).option("--amount-excluding-tax <number>", `Custom amount for the added credits. Either \`amount_excluding_tax\` or \`price_id\` must be defined. Expressed in currency's smallest unit.`).option("--price-id <value>", `Price ID used to add credits. The price must be of type \`bundle\`. Either \`amount_excluding_tax\` or \`price_id\` must be defined.`).option("--expires-at <value>", `Expiration date for credits linked to this transaction. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).addHelpText("after", `
41949
42241
  Examples:
41950
42242
  hyperline customers-credits purchase-customer-credits --id <id> --product-id <productId> --credit-count <credit_count>
41951
42243
  hyperline customers-credits purchase-customer-credits --id <id> --product-id <productId> --credit-count <credit_count> --amount-excluding-tax <amount_excluding_tax> --price-id <price_id>
@@ -42027,6 +42319,54 @@ Examples:
42027
42319
  queryParamKeys: []
42028
42320
  });
42029
42321
  });
42322
+ 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", `
42323
+ Examples:
42324
+ hyperline customers-credits get-customer-credit-portal-settings --id <id> --product-id <productId>`).action(async (opts) => {
42325
+ const ctx = resource.parent?.opts()._ctx;
42326
+ if (!ctx) {
42327
+ process.stderr.write("Error: Not authenticated\n");
42328
+ process.exit(1);
42329
+ }
42330
+ const args = {};
42331
+ if (opts.id !== void 0)
42332
+ args.id = opts.id;
42333
+ if (opts.productId !== void 0)
42334
+ args.productId = opts.productId;
42335
+ await ctx.execute({
42336
+ method: "GET",
42337
+ path: "/v1/customers/{id}/credits/{productId}/portal-settings",
42338
+ args,
42339
+ queryParamKeys: []
42340
+ });
42341
+ });
42342
+ 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", `
42343
+ Examples:
42344
+ hyperline customers-credits update-customer-credit-portal-settings --id <id> --product-id <productId> --enabled
42345
+ 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>
42346
+ hyperline customers-credits update-customer-credit-portal-settings --id <id> --product-id <productId> --enabled --output json`).action(async (opts) => {
42347
+ const ctx = resource.parent?.opts()._ctx;
42348
+ if (!ctx) {
42349
+ process.stderr.write("Error: Not authenticated\n");
42350
+ process.exit(1);
42351
+ }
42352
+ const args = {};
42353
+ if (opts.id !== void 0)
42354
+ args.id = opts.id;
42355
+ if (opts.productId !== void 0)
42356
+ args.productId = opts.productId;
42357
+ if (opts.priceConfigurationId !== void 0)
42358
+ args.price_configuration_id = opts.priceConfigurationId;
42359
+ if (opts.enabled !== void 0)
42360
+ args.enabled = true;
42361
+ if (opts.customPriceConfiguration !== void 0)
42362
+ args.custom_price_configuration = JSON.parse(opts.customPriceConfiguration);
42363
+ await ctx.execute({
42364
+ method: "PUT",
42365
+ path: "/v1/customers/{id}/credits/{productId}/portal-settings",
42366
+ args,
42367
+ queryParamKeys: []
42368
+ });
42369
+ });
42030
42370
  }
42031
42371
 
42032
42372
  // build/commands/generated/customers-payment-methods.js
@@ -43156,7 +43496,7 @@ Examples:
43156
43496
  queryParamKeys: []
43157
43497
  });
43158
43498
  });
43159
- 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", `
43499
+ 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", `
43160
43500
  Examples:
43161
43501
  hyperline invoices void --id <id>
43162
43502
  hyperline invoices void --id <id> --send-email
@@ -43465,7 +43805,7 @@ Examples:
43465
43805
  queryParamKeys: []
43466
43806
  });
43467
43807
  });
43468
- resource.command("create-invoicing-entity").description(`Create a new invoicing entity with company details, address, and tax configuration. Used as the sender on invoices.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).requiredOption("--name <value>", `The name of the invoicing entity.`).option("--trade-name <value>", `The trade name of the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).requiredOption("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).requiredOption("--currency <value>", `The currency code that the invoicing entity operates in.`).requiredOption("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--next-invoice-number <number>", `The next invoice number to be used.`).option("--next-credit-note-number <number>", `The next credit note number to be used.`).option("--next-document-number <number>", `The next document number to be used.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--quote-footer <value>", `The footer text to be used in quotes.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity.`).addHelpText("after", `
43808
+ resource.command("create-invoicing-entity").description(`Create a new invoicing entity with company details, address, and tax configuration. Used as the sender on invoices.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).requiredOption("--name <value>", `The name of the invoicing entity.`).option("--trade-name <value>", `The trade name of the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).requiredOption("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).requiredOption("--currency <value>", `The currency code that the invoicing entity operates in.`).requiredOption("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--next-invoice-number <number>", `The next invoice number to be used.`).option("--next-credit-note-number <number>", `The next credit note number to be used.`).option("--next-document-number <number>", `The next document number to be used.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--quote-footer <value>", `The footer text to be used in quotes.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity. Defaults to \`true\`.`).option("--fx-conversion-display-enabled", `Whether the exchange rate and converted amount in the accounting currency are displayed on the invoice PDF when the invoice currency differs from the accounting currency. The conversion data is still stored and returned by the API when disabled. Defaults to \`true\`.`).addHelpText("after", `
43469
43809
  Examples:
43470
43810
  hyperline invoicing-entities create-invoicing-entity --name <name> --country <country> --currency <currency> --accounting-currency <accounting_currency>
43471
43811
  hyperline invoicing-entities create-invoicing-entity --name <name> --country <country> --currency <currency> --accounting-currency <accounting_currency> --is-default --trade-name <trade_name>
@@ -43548,6 +43888,8 @@ Examples:
43548
43888
  args.credit_note_wallet_refund_enabled = true;
43549
43889
  if (opts.standaloneCreditNoteCreationEnabled !== void 0)
43550
43890
  args.standalone_credit_note_creation_enabled = true;
43891
+ if (opts.fxConversionDisplayEnabled !== void 0)
43892
+ args.fx_conversion_display_enabled = true;
43551
43893
  await ctx.execute({
43552
43894
  method: "POST",
43553
43895
  path: "/v1/invoicing-entities",
@@ -43555,7 +43897,7 @@ Examples:
43555
43897
  queryParamKeys: []
43556
43898
  });
43557
43899
  });
43558
- resource.command("update-invoicing-entity").description(`Update an existing invoicing entity's details (address, tax ID, branding, etc.).`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `The name of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).option("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).option("--currency <value>", `The currency code that the invoicing entity operates in.`).option("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity.`).addHelpText("after", `
43900
+ resource.command("update-invoicing-entity").description(`Update an existing invoicing entity's details (address, tax ID, branding, etc.).`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `The name of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).option("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).option("--currency <value>", `The currency code that the invoicing entity operates in.`).option("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity. Defaults to \`true\`.`).option("--fx-conversion-display-enabled", `Whether the exchange rate and converted amount in the accounting currency are displayed on the invoice PDF when the invoice currency differs from the accounting currency. The conversion data is still stored and returned by the API when disabled. Defaults to \`true\`.`).addHelpText("after", `
43559
43901
  Examples:
43560
43902
  hyperline invoicing-entities update-invoicing-entity --id <id>
43561
43903
  hyperline invoicing-entities update-invoicing-entity --id <id> --name <name> --registration-number <registration_number>
@@ -43630,6 +43972,8 @@ Examples:
43630
43972
  args.credit_note_wallet_refund_enabled = true;
43631
43973
  if (opts.standaloneCreditNoteCreationEnabled !== void 0)
43632
43974
  args.standalone_credit_note_creation_enabled = true;
43975
+ if (opts.fxConversionDisplayEnabled !== void 0)
43976
+ args.fx_conversion_display_enabled = true;
43633
43977
  await ctx.execute({
43634
43978
  method: "PUT",
43635
43979
  path: "/v1/invoicing-entities/{id}",
@@ -43944,8 +44288,46 @@ Examples:
43944
44288
  if (opts.id !== void 0)
43945
44289
  args.id = opts.id;
43946
44290
  await ctx.execute({
43947
- method: "GET",
43948
- path: "/v1/price-configurations/{id}",
44291
+ method: "GET",
44292
+ path: "/v1/price-configurations/{id}",
44293
+ args,
44294
+ queryParamKeys: []
44295
+ });
44296
+ });
44297
+ resource.command("create").description(`Create a new price configuration on an existing product. Specify the product_id, pricing type (fee, volume, bulk, packaged, bps, bundle), currency, billing interval, and price tiers. Supports metering_filter for dynamic products.`).requiredOption("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--countries <json>", `Countries this price configuration is eligible in. Omit or send \`null\` to make it eligible in every country. An empty array restricts it to customers that have no country set.`).option("--price-book-id <value>", `ID of the price book to which this price configuration belongs to. If null, the price configuration belongs to the default price book.`).requiredOption("--billing-interval <json>", `Billing interval on which the price configuration is eligible.`).option("--commitment-interval <json>", `Commitment interval on which the price configuration is eligible.`).requiredOption("--type <value>", `type`).requiredOption("--prices <json>", `Price tiers of the price configuration. If fixed amount, only one price is available.`).requiredOption("--product-id <value>", `ID of the product to add the price configuration to.`).option("--metering-filter <json>", `Filter to scope which billable events are eligible for this price configuration.`).option("--allow-on-portal", `allow_on_portal`).addHelpText("after", `
44298
+ Examples:
44299
+ hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id>
44300
+ 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>
44301
+ hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id> --output json`).action(async (opts) => {
44302
+ const ctx = resource.parent?.opts()._ctx;
44303
+ if (!ctx) {
44304
+ process.stderr.write("Error: Not authenticated\n");
44305
+ process.exit(1);
44306
+ }
44307
+ const args = {};
44308
+ if (opts.currency !== void 0)
44309
+ args.currency = opts.currency;
44310
+ if (opts.priceBookId !== void 0)
44311
+ args.price_book_id = opts.priceBookId;
44312
+ if (opts.type !== void 0)
44313
+ args.type = opts.type;
44314
+ if (opts.productId !== void 0)
44315
+ args.product_id = opts.productId;
44316
+ if (opts.allowOnPortal !== void 0)
44317
+ args.allow_on_portal = true;
44318
+ if (opts.countries !== void 0)
44319
+ args.countries = JSON.parse(opts.countries);
44320
+ if (opts.billingInterval !== void 0)
44321
+ args.billing_interval = JSON.parse(opts.billingInterval);
44322
+ if (opts.commitmentInterval !== void 0)
44323
+ args.commitment_interval = JSON.parse(opts.commitmentInterval);
44324
+ if (opts.prices !== void 0)
44325
+ args.prices = JSON.parse(opts.prices);
44326
+ if (opts.meteringFilter !== void 0)
44327
+ args.metering_filter = JSON.parse(opts.meteringFilter);
44328
+ await ctx.execute({
44329
+ method: "POST",
44330
+ path: "/v1/price-configurations",
43949
44331
  args,
43950
44332
  queryParamKeys: []
43951
44333
  });
@@ -44148,7 +44530,7 @@ How the periodic credit allowance is granted for partial billing periods.
44148
44530
 
44149
44531
  - \`prorated\` (default): the granted credits are prorated to the elapsed period.
44150
44532
  - \`full_allowance\`: the full allowance is always granted (the invoice remains prorated).
44151
- `).option("--credits-balance-auto-creation-enabled <value>", `Default for the \`credits_balance_auto_creation_enabled\` setting of subscription products using this credit product: whether the customer credit balance is created as soon as the product is added to a subscription. \`true\` when unset. A subscription product can override it.`).option("--portal-top-up-auto-activation-enabled <value>", `Whether portal top-ups are enabled for the customer when a credit balance of this product is created for them, from a subscription or manually. Portal top-ups must also be enabled in the hosted pages settings to show on the portal. \`false\` when unset.`).option("--display-mode <value>", `How bundle items are displayed on invoices.`).option("--exclusive-items-enabled", `When true, only one item in the bundle can be active at a time.`).option("--bundle-items <json>", `Products included in this bundle. Percentages must sum to 100.`).addHelpText("after", `
44533
+ `).option("--credits-balance-auto-creation-enabled <value>", `Default for the \`credits_balance_auto_creation_enabled\` setting of subscription products using this credit product: whether the customer credit balance is created as soon as the product is added to a subscription. \`true\` when unset. A subscription product can override it.`).option("--display-mode <value>", `How bundle items are displayed on invoices.`).option("--exclusive-items-enabled", `When true, only one item in the bundle can be active at a time.`).option("--bundle-items <json>", `Products included in this bundle. Percentages must sum to 100.`).addHelpText("after", `
44152
44534
  Examples:
44153
44535
  hyperline products create --name <name> --type <type> --price-configurations <price_configurations>
44154
44536
  hyperline products create --name <name> --type <type> --price-configurations <price_configurations> --description <description> --description-display-interval-dates
@@ -44175,8 +44557,6 @@ Examples:
44175
44557
  args.credits_grant_mode = opts.creditsGrantMode;
44176
44558
  if (opts.creditsBalanceAutoCreationEnabled !== void 0)
44177
44559
  args.credits_balance_auto_creation_enabled = opts.creditsBalanceAutoCreationEnabled;
44178
- if (opts.portalTopUpAutoActivationEnabled !== void 0)
44179
- args.portal_top_up_auto_activation_enabled = opts.portalTopUpAutoActivationEnabled;
44180
44560
  if (opts.displayMode !== void 0)
44181
44561
  args.display_mode = opts.displayMode;
44182
44562
  if (opts.lowCreditsThreshold !== void 0)
@@ -44346,7 +44726,7 @@ Quote status.
44346
44726
  - \`draft\`: The quote is a draft.
44347
44727
  - \`approved\`: The quote is approved and ready to be sent to the customer.
44348
44728
  - \`pending_signature\`: The quote is awaiting the customer's signature.
44349
- `).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner. If not specified, the Hyperline account owner will be assigned.`).requiredOption("--customer-id <value>", `ID of the customer.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity attached to the quote.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. For subscription quotes, defaults to the computed subscription value if not specified. For one-off quotes, this field is ignored \u2014 the amount is always derived from the linked invoice's \`amount_excluding_tax\`.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
44729
+ `).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.
44350
44730
 
44351
44731
  - \`all\`: Display all pricing tiers.
44352
44732
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
@@ -44404,6 +44784,8 @@ Examples:
44404
44784
  args.expires_at = opts.expiresAt;
44405
44785
  if (opts.amount !== void 0)
44406
44786
  args.amount = Number(opts.amount);
44787
+ if (opts.contractValue !== void 0)
44788
+ args.contract_value = Number(opts.contractValue);
44407
44789
  if (opts.collectCustomPropertyIds !== void 0)
44408
44790
  args.collect_custom_property_ids = JSON.parse(opts.collectCustomPropertyIds);
44409
44791
  if (opts.contractClauseIds !== void 0)
@@ -44638,7 +45020,7 @@ Examples:
44638
45020
  queryParamKeys: []
44639
45021
  });
44640
45022
  });
44641
- resource.command("update").description(`Update quote-level fields before a quote is finalized. On draft quotes, pass \`subscription\` inline \u2014 the full configuration, not a reference to an existing subscription \u2014 to create or replace the draft subscription configuration, or pass \`invoice\` on a one-off quote to replace the linked draft invoice. For quotes created from \`template_id\`, use this tool for subscription overrides such as dates, contract terms, products, phases, coupons, discounts, prices, seats, and subscription custom properties. Omit \`terms\`, \`comments\`, and \`contract_clause_ids\` unless deliberately overriding template content. Discover product and price configuration IDs with \`get_catalog_context\`.`).requiredOption("--id <value>", `id parameter`).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. Set to \`null\` to clear the manually set value.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
45023
+ 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.
44642
45024
 
44643
45025
  - \`all\`: Display all pricing tiers.
44644
45026
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
@@ -44692,6 +45074,8 @@ Examples:
44692
45074
  args.expires_at = opts.expiresAt;
44693
45075
  if (opts.amount !== void 0)
44694
45076
  args.amount = Number(opts.amount);
45077
+ if (opts.contractValue !== void 0)
45078
+ args.contract_value = Number(opts.contractValue);
44695
45079
  if (opts.collectCustomPropertyIds !== void 0)
44696
45080
  args.collect_custom_property_ids = JSON.parse(opts.collectCustomPropertyIds);
44697
45081
  if (opts.contractClauseIds !== void 0)
@@ -44707,10 +45091,10 @@ Examples:
44707
45091
  queryParamKeys: []
44708
45092
  });
44709
45093
  });
44710
- 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", `
45094
+ 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", `
44711
45095
  Examples:
44712
- hyperline quotes download --id <id>
44713
- hyperline quotes download --id <id> --locale <locale>`).action(async (opts) => {
45096
+ hyperline quotes duplicate --id <id>
45097
+ hyperline quotes duplicate --id <id> --output json`).action(async (opts) => {
44714
45098
  const ctx = resource.parent?.opts()._ctx;
44715
45099
  if (!ctx) {
44716
45100
  process.stderr.write("Error: Not authenticated\n");
@@ -44719,19 +45103,17 @@ Examples:
44719
45103
  const args = {};
44720
45104
  if (opts.id !== void 0)
44721
45105
  args.id = opts.id;
44722
- if (opts.locale !== void 0)
44723
- args.locale = opts.locale;
44724
45106
  await ctx.execute({
44725
- method: "GET",
44726
- path: "/v1/quotes/{id}/download",
45107
+ method: "POST",
45108
+ path: "/v1/quotes/{id}/duplicate",
44727
45109
  args,
44728
- queryParamKeys: ["locale"]
45110
+ queryParamKeys: []
44729
45111
  });
44730
45112
  });
44731
- 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", `
45113
+ 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", `
44732
45114
  Examples:
44733
- hyperline quotes approve --id <id>
44734
- hyperline quotes approve --id <id> --output json`).action(async (opts) => {
45115
+ hyperline quotes download --id <id>
45116
+ hyperline quotes download --id <id> --locale <locale>`).action(async (opts) => {
44735
45117
  const ctx = resource.parent?.opts()._ctx;
44736
45118
  if (!ctx) {
44737
45119
  process.stderr.write("Error: Not authenticated\n");
@@ -44740,16 +45122,19 @@ Examples:
44740
45122
  const args = {};
44741
45123
  if (opts.id !== void 0)
44742
45124
  args.id = opts.id;
45125
+ if (opts.locale !== void 0)
45126
+ args.locale = opts.locale;
44743
45127
  await ctx.execute({
44744
- method: "POST",
44745
- path: "/v1/quotes/{id}/approve",
45128
+ method: "GET",
45129
+ path: "/v1/quotes/{id}/download",
44746
45130
  args,
44747
- queryParamKeys: []
45131
+ queryParamKeys: ["locale"]
44748
45132
  });
44749
45133
  });
44750
- 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", `
45134
+ resource.command("finalize").description(`Finalize a draft quote. The quote is submitted for approval when approval is required, otherwise it becomes approved and ready to be sent for signature.`).requiredOption("--id <value>", `id parameter`).option("--requester-comment <value>", `Internal comment supplied by the requester for approvers; not displayed on the customer-facing quote.`).addHelpText("after", `
44751
45135
  Examples:
44752
45136
  hyperline quotes finalize --id <id>
45137
+ hyperline quotes finalize --id <id> --requester-comment <requester_comment>
44753
45138
  hyperline quotes finalize --id <id> --output json`).action(async (opts) => {
44754
45139
  const ctx = resource.parent?.opts()._ctx;
44755
45140
  if (!ctx) {
@@ -44759,6 +45144,8 @@ Examples:
44759
45144
  const args = {};
44760
45145
  if (opts.id !== void 0)
44761
45146
  args.id = opts.id;
45147
+ if (opts.requesterComment !== void 0)
45148
+ args.requester_comment = opts.requesterComment;
44762
45149
  await ctx.execute({
44763
45150
  method: "POST",
44764
45151
  path: "/v1/quotes/{id}/finalize",
@@ -44766,11 +45153,11 @@ Examples:
44766
45153
  queryParamKeys: []
44767
45154
  });
44768
45155
  });
44769
- 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", `
45156
+ resource.command("send").description(`Send a quote by email for customer signature. Requires the quote to be approved first.`).requiredOption("--id <value>", `id parameter`).option("--email <value>", `Email address to which the quote will be sent for signature. Required unless the quote has signers, in which case the email goes to the signers of the current step and this field is ignored.`).option("--message <value>", `Custom message used in the email content.`).addHelpText("after", `
44770
45157
  Examples:
44771
- hyperline quotes send --id <id> --email <email>
45158
+ hyperline quotes send --id <id>
44772
45159
  hyperline quotes send --id <id> --email <email> --message <message>
44773
- hyperline quotes send --id <id> --email <email> --output json`).action(async (opts) => {
45160
+ hyperline quotes send --id <id> --output json`).action(async (opts) => {
44774
45161
  const ctx = resource.parent?.opts()._ctx;
44775
45162
  if (!ctx) {
44776
45163
  process.stderr.write("Error: Not authenticated\n");
@@ -44790,6 +45177,51 @@ Examples:
44790
45177
  queryParamKeys: []
44791
45178
  });
44792
45179
  });
45180
+ 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", `
45181
+ Examples:
45182
+ hyperline quotes list-quote-signers --id <id>`).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
+ await ctx.execute({
45192
+ method: "GET",
45193
+ path: "/v1/quotes/{id}/signers",
45194
+ args,
45195
+ queryParamKeys: []
45196
+ });
45197
+ });
45198
+ 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>", `
45199
+ Signature workflow of the quote, replaced as a whole.
45200
+
45201
+ 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.
45202
+
45203
+ 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.
45204
+ `).addHelpText("after", `
45205
+ Examples:
45206
+ hyperline quotes set-quote-signers --id <id> --signers <signers>
45207
+ hyperline quotes set-quote-signers --id <id> --signers <signers> --output json`).action(async (opts) => {
45208
+ const ctx = resource.parent?.opts()._ctx;
45209
+ if (!ctx) {
45210
+ process.stderr.write("Error: Not authenticated\n");
45211
+ process.exit(1);
45212
+ }
45213
+ const args = {};
45214
+ if (opts.id !== void 0)
45215
+ args.id = opts.id;
45216
+ if (opts.signers !== void 0)
45217
+ args.signers = JSON.parse(opts.signers);
45218
+ await ctx.execute({
45219
+ method: "PUT",
45220
+ path: "/v1/quotes/{id}/signers",
45221
+ args,
45222
+ queryParamKeys: []
45223
+ });
45224
+ });
44793
45225
  resource.command("sign").description(`Manually mark a quote as signed externally. Optionally upload a signed PDF. Bypasses the built-in Hyperline signature flow.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
44794
45226
  Examples:
44795
45227
  hyperline quotes sign --id <id>
@@ -44873,6 +45305,48 @@ Examples:
44873
45305
  });
44874
45306
  }
44875
45307
 
45308
+ // build/commands/generated/quotes-approvals.js
45309
+ function registerQuotes_ApprovalsCommands(parent) {
45310
+ const resource = parent.command("quotes-approvals").description("Manage quotes > approvals");
45311
+ 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", `
45312
+ Examples:
45313
+ hyperline quotes-approvals approve-quote --id <id>
45314
+ hyperline quotes-approvals approve-quote --id <id> --output json`).action(async (opts) => {
45315
+ const ctx = resource.parent?.opts()._ctx;
45316
+ if (!ctx) {
45317
+ process.stderr.write("Error: Not authenticated\n");
45318
+ process.exit(1);
45319
+ }
45320
+ const args = {};
45321
+ if (opts.id !== void 0)
45322
+ args.id = opts.id;
45323
+ await ctx.execute({
45324
+ method: "POST",
45325
+ path: "/v1/quotes/{id}/approve",
45326
+ args,
45327
+ queryParamKeys: []
45328
+ });
45329
+ });
45330
+ 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", `
45331
+ Examples:
45332
+ hyperline quotes-approvals get-quote-approvals --id <id>`).action(async (opts) => {
45333
+ const ctx = resource.parent?.opts()._ctx;
45334
+ if (!ctx) {
45335
+ process.stderr.write("Error: Not authenticated\n");
45336
+ process.exit(1);
45337
+ }
45338
+ const args = {};
45339
+ if (opts.id !== void 0)
45340
+ args.id = opts.id;
45341
+ await ctx.execute({
45342
+ method: "GET",
45343
+ path: "/v1/quotes/{id}/approvals",
45344
+ args,
45345
+ queryParamKeys: []
45346
+ });
45347
+ });
45348
+ }
45349
+
44876
45350
  // build/commands/generated/quotes-templates.js
44877
45351
  function registerQuotes_TemplatesCommands(parent) {
44878
45352
  const resource = parent.command("quotes-templates").description("Manage quotes > templates");
@@ -45072,7 +45546,7 @@ Examples:
45072
45546
  queryParamKeys: []
45073
45547
  });
45074
45548
  });
45075
- 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", `
45549
+ 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", `
45076
45550
  Examples:
45077
45551
  hyperline subscriptions cancel --id <id>
45078
45552
  hyperline subscriptions cancel --id <id> --cancel-at <cancel_at> --reason <reason>
@@ -45100,9 +45574,10 @@ Examples:
45100
45574
  queryParamKeys: []
45101
45575
  });
45102
45576
  });
45103
- resource.command("reinstate").description(`Reinstate a subscription that is scheduled for cancellation, reverting it to active status.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45577
+ 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", `
45104
45578
  Examples:
45105
45579
  hyperline subscriptions reinstate --id <id>
45580
+ hyperline subscriptions reinstate --id <id> --reactivate-at <reactivate_at> --invoicing-mode <invoicing_mode>
45106
45581
  hyperline subscriptions reinstate --id <id> --output json`).action(async (opts) => {
45107
45582
  const ctx = resource.parent?.opts()._ctx;
45108
45583
  if (!ctx) {
@@ -45112,6 +45587,12 @@ Examples:
45112
45587
  const args = {};
45113
45588
  if (opts.id !== void 0)
45114
45589
  args.id = opts.id;
45590
+ if (opts.reactivateAt !== void 0)
45591
+ args.reactivate_at = opts.reactivateAt;
45592
+ if (opts.invoicingMode !== void 0)
45593
+ args.invoicing_mode = opts.invoicingMode;
45594
+ if (opts.chargeLineItems !== void 0)
45595
+ args.charge_line_items = JSON.parse(opts.chargeLineItems);
45115
45596
  await ctx.execute({
45116
45597
  method: "POST",
45117
45598
  path: "/v1/subscriptions/{id}/reinstate",
@@ -45119,7 +45600,7 @@ Examples:
45119
45600
  queryParamKeys: []
45120
45601
  });
45121
45602
  });
45122
- 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", `
45603
+ 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", `
45123
45604
  Examples:
45124
45605
  hyperline subscriptions pause --id <id>
45125
45606
  hyperline subscriptions pause --id <id> --reactivate-at <reactivate_at>
@@ -45160,9 +45641,10 @@ Examples:
45160
45641
  queryParamKeys: []
45161
45642
  });
45162
45643
  });
45163
- resource.command("reactivate").description(`Resume a paused subscription, restarting billing from the current date.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45644
+ 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", `
45164
45645
  Examples:
45165
45646
  hyperline subscriptions reactivate --id <id>
45647
+ hyperline subscriptions reactivate --id <id> --reactivate-at <reactivate_at> --invoicing-mode <invoicing_mode>
45166
45648
  hyperline subscriptions reactivate --id <id> --output json`).action(async (opts) => {
45167
45649
  const ctx = resource.parent?.opts()._ctx;
45168
45650
  if (!ctx) {
@@ -45172,6 +45654,12 @@ Examples:
45172
45654
  const args = {};
45173
45655
  if (opts.id !== void 0)
45174
45656
  args.id = opts.id;
45657
+ if (opts.reactivateAt !== void 0)
45658
+ args.reactivate_at = opts.reactivateAt;
45659
+ if (opts.invoicingMode !== void 0)
45660
+ args.invoicing_mode = opts.invoicingMode;
45661
+ if (opts.chargeLineItems !== void 0)
45662
+ args.charge_line_items = JSON.parse(opts.chargeLineItems);
45175
45663
  await ctx.execute({
45176
45664
  method: "POST",
45177
45665
  path: "/v1/subscriptions/{id}/reactivate",
@@ -46755,10 +47243,11 @@ function registerAllCommands(program2) {
46755
47243
  registerAccounting_ReportsCommands(program2);
46756
47244
  registerAccounting_Revenue_RecognitionCommands(program2);
46757
47245
  registerAccounting_RulesCommands(program2);
46758
- registerAgentsCommands(program2);
46759
47246
  registerCustom_PropertiesCommands(program2);
46760
47247
  registerAggregatorsCommands(program2);
46761
47248
  registerAggregators_UsageCommands(program2);
47249
+ registerAi_BillingCommands(program2);
47250
+ registerAi_CostsCommands(program2);
46762
47251
  registerAnalyticsCommands(program2);
46763
47252
  registerBank_AccountsCommands(program2);
46764
47253
  registerCompaniesCommands(program2);
@@ -46777,11 +47266,13 @@ function registerAllCommands(program2) {
46777
47266
  registerInvoicesCommands(program2);
46778
47267
  registerInvoices_TransactionsCommands(program2);
46779
47268
  registerInvoicing_EntitiesCommands(program2);
47269
+ registerAi_MonitoringCommands(program2);
46780
47270
  registerPaymentsCommands(program2);
46781
47271
  registerProductsCommands(program2);
46782
47272
  registerPrice_ConfigurationsCommands(program2);
46783
47273
  registerQuotesCommands(program2);
46784
47274
  registerQuotes_TemplatesCommands(program2);
47275
+ registerQuotes_ApprovalsCommands(program2);
46785
47276
  registerSubscriptions_TemplatesCommands(program2);
46786
47277
  registerSubscriptionsCommands(program2);
46787
47278
  registerSubscriptions_TransitionsCommands(program2);
@@ -62792,23 +63283,26 @@ var languages = [
62792
63283
 
62793
63284
  // ../hyperline-i18n/build/locales/de.js
62794
63285
  var de = {
62795
- "accounting.invoicePosted.entryDescription": "Buchungseintrag f\xFCr Rechnung {{invoiceId}}",
62796
- "accounting.transactionSettled.entryDescription": "Zahlungsabwicklung f\xFCr Rechnung {{invoiceId}}",
62797
- "accounting.transactionRefunded.entryDescription": "R\xFCckerstattung f\xFCr Rechnung {{invoiceId}}",
62798
63286
  "accounting.creditNotePosted.entryDescription": "Gutschrift {{creditNoteId}} f\xFCr Rechnung {{invoiceId}}",
62799
- "accounting.standaloneCreditNotePosted.entryDescription": "Gutschrift {{creditNoteId}}",
63287
+ "accounting.invoicePosted.entryDescription": "Buchungseintrag f\xFCr Rechnung {{invoiceId}}",
63288
+ "accounting.revrec.closedPeriodFallbackNote": " (in die n\xE4chste offene Periode gebucht \u2013 Zielperiode geschlossen; urspr\xFCngliches Datum {{originalDate}})",
62800
63289
  "accounting.revrec.creditLineDescription": "Umsatz realisieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62801
63290
  "accounting.revrec.debitLineDescription": "Abgrenzungsposten reduzieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62802
63291
  "accounting.revrec.discountCreditLineDescription": "Erl\xF6sminderung (Rabatt) erfassen \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62803
- "accounting.revrec.closedPeriodFallbackNote": " (in die n\xE4chste offene Periode gebucht \u2013 Zielperiode geschlossen; urspr\xFCngliches Datum {{originalDate}})",
62804
63292
  "accounting.revrec.discountDebitLineDescription": "Abgegrenzten Rabatt reduzieren \u2013 Zeitplan {{scheduleId}}, Zeitraum {{periodDate}}",
62805
63293
  "accounting.revrec.entryDescription": "Umsatzrealisierung f\xFCr Zeitplan {{scheduleId}}, Zeitraum {{periodStart}} - {{periodEnd}}",
63294
+ "accounting.standaloneCreditNotePosted.entryDescription": "Gutschrift {{creditNoteId}}",
63295
+ "accounting.transactionChargedBack.entryDescription": "R\xFCckbuchung f\xFCr Rechnung {{invoiceId}}",
63296
+ "accounting.transactionRefunded.entryDescription": "R\xFCckerstattung f\xFCr Rechnung {{invoiceId}}",
63297
+ "accounting.transactionSettled.entryDescription": "Zahlungsabwicklung f\xFCr Rechnung {{invoiceId}}",
62806
63298
  "creditNotes.refundChargeName": "R\xFCckerstattung f\xFCr die Rechnung",
62807
63299
  "credits.bundleOf": "{{productName}} - Paket mit {{creditCount}} Guthaben",
62808
63300
  "credits.unitsOf": "{{productName}} - {{creditCount}} Guthaben",
62809
63301
  "einvoicing.paymentFromWallet": "Zahlung aus Guthaben",
62810
63302
  "einvoicing.paymentProcessed": "Zahlung verarbeitet",
62811
63303
  "einvoicing.paymentReceived": "Zahlung erhalten",
63304
+ "invoices.minimumFee.adjustmentName": "Anpassung der Mindestgeb\xFChr",
63305
+ "invoices.minimumFee.name": "Mindestgeb\xFChr",
62812
63306
  "invoices.outstandingProduct.description": "Unbezahlter Betrag der Rechnung{{invoiceNumber}} vom {{date}}",
62813
63307
  "invoices.outstandingProduct.descriptionPeriod": "Unbezahlter Betrag der Rechnung{{invoiceNumber}} vom {{periodStart}} bis {{periodEnd}}",
62814
63308
  "invoices.outstandingProduct.name": "Offener Saldo",
@@ -62816,9 +63310,9 @@ var de = {
62816
63310
  "invoices.prorata.paymentForItemFullPeriod": "Zahlung f\xFCr",
62817
63311
  "invoices.prorata.refundForItem": "Anteilig erstatteter Betrag f\xFCr",
62818
63312
  "invoices.prorata.refundForItemFullPeriod": "Erstattung f\xFCr",
62819
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 abgelaufenes Guthaben",
62820
63313
  "subscriptions.closingChargeName": "Abschlussgeb\xFChr f\xFCr das Abonnement",
62821
63314
  "subscriptions.correction": "Vorperiodische Anpassung",
63315
+ "subscriptions.reinstatementRechargeName": "Wiederherstellungsgeb\xFChr f\xFCr den stornierten Zeitraum",
62822
63316
  "subscriptions.updates.addCoupon": "Gutschein hinzuf\xFCgen {{couponName}}",
62823
63317
  "subscriptions.updates.addProduct": "{{productName}} hinzuf\xFCgen",
62824
63318
  "subscriptions.updates.removeCoupon": "Gutschein entfernen {{couponName}}",
@@ -62833,7 +63327,8 @@ var de = {
62833
63327
  "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",
62834
63328
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Diese Position wurde f\xFCr den anteiligen Zeitraum in Rechnung gestellt",
62835
63329
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Betrag von {{amount}} f\xFCr den anteiligen Zeitraum nicht in Rechnung gestellt",
62836
- "subscriptions.updates.updatePrices": "Preise f\xFCr {{productName}} aktualisieren"
63330
+ "subscriptions.updates.updatePrices": "Preise f\xFCr {{productName}} aktualisieren",
63331
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 abgelaufenes Guthaben"
62837
63332
  };
62838
63333
 
62839
63334
  // ../hyperline-i18n/build/locales/en.js
@@ -62841,6 +63336,8 @@ var en = {
62841
63336
  "creditNotes.refundChargeName": "Refund for invoice",
62842
63337
  "credits.bundleOf": "{{productName}} - Pack of {{creditCount}} credits",
62843
63338
  "credits.unitsOf": "{{productName}} - {{creditCount}} credits",
63339
+ "invoices.minimumFee.adjustmentName": "Minimum fee adjustment",
63340
+ "invoices.minimumFee.name": "Minimum fee",
62844
63341
  "invoices.outstandingProduct.description": "Unpaid amount from the invoice{{invoiceNumber}} emitted on {{date}}",
62845
63342
  "invoices.outstandingProduct.descriptionPeriod": "Unpaid amount from the invoice{{invoiceNumber}} from {{periodStart}} to {{periodEnd}}",
62846
63343
  "invoices.outstandingProduct.name": "Outstanding balance",
@@ -62850,6 +63347,7 @@ var en = {
62850
63347
  "invoices.prorata.refundForItemFullPeriod": "Refund for",
62851
63348
  "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 expired balance",
62852
63349
  "subscriptions.closingChargeName": "Closing fee for subscription",
63350
+ "subscriptions.reinstatementRechargeName": "Reinstatement recharge of canceled period",
62853
63351
  "subscriptions.correction": "Adjustment previous period",
62854
63352
  "subscriptions.updates.addCoupon": "Add coupon {{couponName}}",
62855
63353
  "subscriptions.updates.addProduct": "Add {{productName}}",
@@ -62869,6 +63367,7 @@ var en = {
62869
63367
  "accounting.invoicePosted.entryDescription": "Posting entry for Invoice {{invoiceId}} issued",
62870
63368
  "accounting.transactionSettled.entryDescription": "Payment settlement for Invoice {{invoiceId}}",
62871
63369
  "accounting.transactionRefunded.entryDescription": "Refund for Invoice {{invoiceId}}",
63370
+ "accounting.transactionChargedBack.entryDescription": "Chargeback for Invoice {{invoiceId}}",
62872
63371
  "accounting.creditNotePosted.entryDescription": "Credit note {{creditNoteId}} for Invoice {{invoiceId}}",
62873
63372
  "accounting.standaloneCreditNotePosted.entryDescription": "Credit note {{creditNoteId}}",
62874
63373
  "accounting.revrec.entryDescription": "Revenue recognition for schedule {{scheduleId}}, period {{periodStart}} - {{periodEnd}}",
@@ -62884,23 +63383,26 @@ var en = {
62884
63383
 
62885
63384
  // ../hyperline-i18n/build/locales/es.js
62886
63385
  var es = {
62887
- "accounting.invoicePosted.entryDescription": "Asiento contable para la factura {{invoiceId}}",
62888
- "accounting.transactionSettled.entryDescription": "Liquidaci\xF3n de pago para la factura {{invoiceId}}",
62889
- "accounting.transactionRefunded.entryDescription": "Reembolso de la factura {{invoiceId}}",
62890
63386
  "accounting.creditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}} para la factura {{invoiceId}}",
62891
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63387
+ "accounting.invoicePosted.entryDescription": "Asiento contable para la factura {{invoiceId}}",
63388
+ "accounting.revrec.closedPeriodFallbackNote": " (registrado en el pr\xF3ximo per\xEDodo abierto \u2014 per\xEDodo contable de destino cerrado; fecha original {{originalDate}})",
62892
63389
  "accounting.revrec.creditLineDescription": "Reconocer ingresos \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62893
63390
  "accounting.revrec.debitLineDescription": "Disminuci\xF3n de ingresos diferidos \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62894
63391
  "accounting.revrec.discountCreditLineDescription": "Reconocer contra-ingresos (descuento) \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62895
- "accounting.revrec.closedPeriodFallbackNote": " (registrado en el pr\xF3ximo per\xEDodo abierto \u2014 per\xEDodo contable de destino cerrado; fecha original {{originalDate}})",
62896
63392
  "accounting.revrec.discountDebitLineDescription": "Disminuci\xF3n de descuento diferido \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
62897
63393
  "accounting.revrec.entryDescription": "Reconocimiento de ingresos para el cronograma {{scheduleId}}, per\xEDodo {{periodStart}} - {{periodEnd}}",
63394
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63395
+ "accounting.transactionChargedBack.entryDescription": "Contracargo de la factura {{invoiceId}}",
63396
+ "accounting.transactionRefunded.entryDescription": "Reembolso de la factura {{invoiceId}}",
63397
+ "accounting.transactionSettled.entryDescription": "Liquidaci\xF3n de pago para la factura {{invoiceId}}",
62898
63398
  "creditNotes.refundChargeName": "Reembolso por factura",
62899
63399
  "credits.bundleOf": "{{productName}} - Paquete de {{creditCount}} cr\xE9ditos",
62900
63400
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9ditos",
62901
63401
  "einvoicing.paymentFromWallet": "Pago desde el monedero",
62902
63402
  "einvoicing.paymentProcessed": "Pago procesado",
62903
63403
  "einvoicing.paymentReceived": "Pago recibido",
63404
+ "invoices.minimumFee.adjustmentName": "Ajuste del cargo m\xEDnimo",
63405
+ "invoices.minimumFee.name": "Cargo m\xEDnimo",
62904
63406
  "invoices.outstandingProduct.description": "Monto pendiente de la factura{{invoiceNumber}} emitida el {{date}}",
62905
63407
  "invoices.outstandingProduct.descriptionPeriod": "Monto pendiente de la factura{{invoiceNumber}} del {{periodStart}} al {{periodEnd}}",
62906
63408
  "invoices.outstandingProduct.name": "Saldo pendiente",
@@ -62908,9 +63410,9 @@ var es = {
62908
63410
  "invoices.prorata.paymentForItemFullPeriod": "Pago por",
62909
63411
  "invoices.prorata.refundForItem": "Reembolso prorrateado por",
62910
63412
  "invoices.prorata.refundForItemFullPeriod": "Reembolso por",
62911
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo caducado",
62912
63413
  "subscriptions.closingChargeName": "Cargo por cierre de suscripci\xF3n",
62913
63414
  "subscriptions.correction": "Ajuste del periodo anterior",
63415
+ "subscriptions.reinstatementRechargeName": "Recarga de reinstalaci\xF3n del per\xEDodo cancelado",
62914
63416
  "subscriptions.updates.addCoupon": "A\xF1adir cup\xF3n {{couponName}}",
62915
63417
  "subscriptions.updates.addProduct": "A\xF1adir {{productName}}",
62916
63418
  "subscriptions.updates.removeCoupon": "Eliminar cup\xF3n {{couponName}}",
@@ -62925,28 +63427,32 @@ var es = {
62925
63427
  "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",
62926
63428
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Esta l\xEDnea ha sido facturada para el per\xEDodo prorrateado",
62927
63429
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Importe de {{amount}} no facturado para el per\xEDodo prorrateado",
62928
- "subscriptions.updates.updatePrices": "Actualizar precios para {{productName}}"
63430
+ "subscriptions.updates.updatePrices": "Actualizar precios para {{productName}}",
63431
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo caducado"
62929
63432
  };
62930
63433
 
62931
63434
  // ../hyperline-i18n/build/locales/fr.js
62932
63435
  var fr = {
63436
+ "accounting.creditNotePosted.entryDescription": "Avoir {{creditNoteId}} pour la facture {{invoiceId}}",
63437
+ "accounting.invoicePosted.entryDescription": "\xC9criture de comptabilisation pour la facture {{invoiceId}}",
63438
+ "accounting.revrec.closedPeriodFallbackNote": " (comptabilis\xE9 sur la prochaine p\xE9riode ouverte \u2014 p\xE9riode comptable cible cl\xF4tur\xE9e ; date d'origine {{originalDate}})",
62933
63439
  "accounting.revrec.creditLineDescription": "Reconnaissance du chiffre d'affaires \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62934
63440
  "accounting.revrec.debitLineDescription": "Diminution des produits constat\xE9s d'avance \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62935
63441
  "accounting.revrec.discountCreditLineDescription": "Reconnaissance du contre-revenu (remise) \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62936
- "accounting.revrec.closedPeriodFallbackNote": " (comptabilis\xE9 sur la prochaine p\xE9riode ouverte \u2014 p\xE9riode comptable cible cl\xF4tur\xE9e ; date d'origine {{originalDate}})",
62937
63442
  "accounting.revrec.discountDebitLineDescription": "Diminution des remises diff\xE9r\xE9es \u2013 \xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodDate}}",
62938
- "accounting.invoicePosted.entryDescription": "\xC9criture de comptabilisation pour la facture {{invoiceId}}",
62939
- "accounting.transactionSettled.entryDescription": "R\xE8glement de la facture {{invoiceId}}",
62940
- "accounting.transactionRefunded.entryDescription": "Remboursement de la facture {{invoiceId}}",
62941
- "accounting.creditNotePosted.entryDescription": "Avoir {{creditNoteId}} pour la facture {{invoiceId}}",
62942
- "accounting.standaloneCreditNotePosted.entryDescription": "Avoir {{creditNoteId}}",
62943
63443
  "accounting.revrec.entryDescription": "Reconnaissance du chiffre d'affaires pour l'\xE9ch\xE9ancier {{scheduleId}}, p\xE9riode {{periodStart}} - {{periodEnd}}",
63444
+ "accounting.standaloneCreditNotePosted.entryDescription": "Avoir {{creditNoteId}}",
63445
+ "accounting.transactionChargedBack.entryDescription": "R\xE9trofacturation de la facture {{invoiceId}}",
63446
+ "accounting.transactionRefunded.entryDescription": "Remboursement de la facture {{invoiceId}}",
63447
+ "accounting.transactionSettled.entryDescription": "R\xE8glement de la facture {{invoiceId}}",
62944
63448
  "creditNotes.refundChargeName": "Remboursement pour facture",
62945
63449
  "credits.bundleOf": "{{productName}} - Pack de {{creditCount}} cr\xE9dits",
62946
63450
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9dits",
62947
63451
  "einvoicing.paymentFromWallet": "Paiement depuis le portefeuille",
62948
63452
  "einvoicing.paymentProcessed": "Paiement effectu\xE9",
62949
63453
  "einvoicing.paymentReceived": "Paiement re\xE7u",
63454
+ "invoices.minimumFee.adjustmentName": "Ajustement des frais minimums",
63455
+ "invoices.minimumFee.name": "Frais minimums",
62950
63456
  "invoices.outstandingProduct.description": "Montant impay\xE9 de la facture{{invoiceNumber}} \xE9mise le {{date}}",
62951
63457
  "invoices.outstandingProduct.descriptionPeriod": "Montant impay\xE9 de la facture{{invoiceNumber}} du {{periodStart}} au {{periodEnd}}",
62952
63458
  "invoices.outstandingProduct.name": "Solde impay\xE9",
@@ -62954,9 +63460,9 @@ var fr = {
62954
63460
  "invoices.prorata.paymentForItemFullPeriod": "Paiement pour",
62955
63461
  "invoices.prorata.refundForItem": "Remboursement au prorata pour",
62956
63462
  "invoices.prorata.refundForItemFullPeriod": "Remboursement pour",
62957
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 solde expir\xE9",
62958
63463
  "subscriptions.closingChargeName": "Frais de cl\xF4ture pour abonnement",
62959
63464
  "subscriptions.correction": "Ajustement p\xE9riode pr\xE9c\xE9dente",
63465
+ "subscriptions.reinstatementRechargeName": "Recharge de r\xE9tablissement de la p\xE9riode annul\xE9e",
62960
63466
  "subscriptions.updates.addCoupon": "Ajout du coupon {{couponName}}",
62961
63467
  "subscriptions.updates.addProduct": "Ajout {{productName}}",
62962
63468
  "subscriptions.updates.removeCoupon": "Retrait du coupon {{couponName}}",
@@ -62971,28 +63477,32 @@ var fr = {
62971
63477
  "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",
62972
63478
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Cette ligne a \xE9t\xE9 factur\xE9e pour la p\xE9riode proratis\xE9e",
62973
63479
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Montant de {{amount}} non factur\xE9 pour la p\xE9riode proratis\xE9e",
62974
- "subscriptions.updates.updatePrices": "Mise \xE0 jour des prix pour {{productName}}"
63480
+ "subscriptions.updates.updatePrices": "Mise \xE0 jour des prix pour {{productName}}",
63481
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 solde expir\xE9"
62975
63482
  };
62976
63483
 
62977
63484
  // ../hyperline-i18n/build/locales/it.js
62978
63485
  var it = {
62979
- "accounting.invoicePosted.entryDescription": "Registrazione contabile per la fattura {{invoiceId}}",
62980
- "accounting.transactionSettled.entryDescription": "Regolamento pagamento per la fattura {{invoiceId}}",
62981
- "accounting.transactionRefunded.entryDescription": "Rimborso per la fattura {{invoiceId}}",
62982
63486
  "accounting.creditNotePosted.entryDescription": "Nota di credito {{creditNoteId}} per la fattura {{invoiceId}}",
62983
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota di credito {{creditNoteId}}",
63487
+ "accounting.invoicePosted.entryDescription": "Registrazione contabile per la fattura {{invoiceId}}",
63488
+ "accounting.revrec.closedPeriodFallbackNote": " (registrato nel prossimo periodo aperto \u2014 periodo contabile di destinazione chiuso; data originale {{originalDate}})",
62984
63489
  "accounting.revrec.creditLineDescription": "Riconoscere i ricavi \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
62985
63490
  "accounting.revrec.debitLineDescription": "Diminuzione dei ricavi differiti \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
62986
63491
  "accounting.revrec.discountCreditLineDescription": "Riconoscere il contra-ricavo (sconto) \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
62987
- "accounting.revrec.closedPeriodFallbackNote": " (registrato nel prossimo periodo aperto \u2014 periodo contabile di destinazione chiuso; data originale {{originalDate}})",
62988
63492
  "accounting.revrec.discountDebitLineDescription": "Diminuzione dello sconto differito \u2013 programma {{scheduleId}}, periodo {{periodDate}}",
62989
63493
  "accounting.revrec.entryDescription": "Riconoscimento dei ricavi per il programma {{scheduleId}}, periodo {{periodStart}} - {{periodEnd}}",
63494
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota di credito {{creditNoteId}}",
63495
+ "accounting.transactionChargedBack.entryDescription": "Riaddebito per la fattura {{invoiceId}}",
63496
+ "accounting.transactionRefunded.entryDescription": "Rimborso per la fattura {{invoiceId}}",
63497
+ "accounting.transactionSettled.entryDescription": "Regolamento pagamento per la fattura {{invoiceId}}",
62990
63498
  "creditNotes.refundChargeName": "Rimborso per fattura",
62991
63499
  "credits.bundleOf": "{{productName}} - Pacchetto di {{creditCount}} crediti",
62992
63500
  "credits.unitsOf": "{{productName}} - {{creditCount}} crediti",
62993
63501
  "einvoicing.paymentFromWallet": "Pagamento dal portafoglio",
62994
63502
  "einvoicing.paymentProcessed": "Pagamento elaborato",
62995
63503
  "einvoicing.paymentReceived": "Pagamento ricevuto",
63504
+ "invoices.minimumFee.adjustmentName": "Adeguamento all\u2019importo minimo",
63505
+ "invoices.minimumFee.name": "Importo minimo",
62996
63506
  "invoices.outstandingProduct.description": "Importo insoluto della fattura{{invoiceNumber}} emessa il {{date}}",
62997
63507
  "invoices.outstandingProduct.descriptionPeriod": "Importo insoluto della fattura{{invoiceNumber}} dal {{periodStart}} al {{periodEnd}}",
62998
63508
  "invoices.outstandingProduct.name": "Saldo insoluto",
@@ -63000,9 +63510,9 @@ var it = {
63000
63510
  "invoices.prorata.paymentForItemFullPeriod": "Pagamento per",
63001
63511
  "invoices.prorata.refundForItem": "Rimborso proporzionale per",
63002
63512
  "invoices.prorata.refundForItemFullPeriod": "Rimborso per",
63003
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo scaduto",
63004
63513
  "subscriptions.closingChargeName": "Costo di chiusura per abbonamento",
63005
63514
  "subscriptions.correction": "Correzione periodo precedente",
63515
+ "subscriptions.reinstatementRechargeName": "Ricarica di reintegrazione del periodo annullato",
63006
63516
  "subscriptions.updates.addCoupon": "Aggiungi coupon {{couponName}}",
63007
63517
  "subscriptions.updates.addProduct": "Aggiungi {{productName}}",
63008
63518
  "subscriptions.updates.removeCoupon": "Rimuovi coupon {{couponName}}",
@@ -63017,14 +63527,32 @@ var it = {
63017
63527
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Importo di {{amount}} (con un minimo impegnato di {{committedCount}}) non fatturato per il periodo proporzionato",
63018
63528
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Questa voce \xE8 stata fatturata per il periodo proporzionato",
63019
63529
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Importo di {{amount}} non fatturato per il periodo proporzionato",
63020
- "subscriptions.updates.updatePrices": "Aggiorna prezzi per {{productName}}"
63530
+ "subscriptions.updates.updatePrices": "Aggiorna prezzi per {{productName}}",
63531
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo scaduto"
63021
63532
  };
63022
63533
 
63023
63534
  // ../hyperline-i18n/build/locales/lt.js
63024
63535
  var lt = {
63536
+ "accounting.creditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}} s\u0105skaitai fakt\u016Brai {{invoiceId}}",
63537
+ "accounting.invoicePosted.entryDescription": "I\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros {{invoiceId}} registravimo \u012Fra\u0161as",
63538
+ "accounting.revrec.closedPeriodFallbackNote": " (u\u017Eregistruota kitame atvirame laikotarpyje, nes tikslinis apskaitos laikotarpis u\u017Edarytas; pradin\u0117 data {{originalDate}})",
63539
+ "accounting.revrec.creditLineDescription": "Pajam\u0173 pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63540
+ "accounting.revrec.debitLineDescription": "Atid\u0117t\u0173j\u0173 pajam\u0173 suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63541
+ "accounting.revrec.discountCreditLineDescription": "Pajamas ma\u017Einan\u010Dios sumos (nuolaidos) pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63542
+ "accounting.revrec.discountDebitLineDescription": "Atid\u0117tosios nuolaidos suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63543
+ "accounting.revrec.entryDescription": "Pajam\u0173 pripa\u017Einimas pagal grafik\u0105 {{scheduleId}}, laikotarpis {{periodStart}}\u2013{{periodEnd}}",
63544
+ "accounting.standaloneCreditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}}",
63545
+ "accounting.transactionChargedBack.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} u\u017Egin\u010Dyto mok\u0117jimo gr\u0105\u017Einimas",
63546
+ "accounting.transactionRefunded.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} gr\u0105\u017Einimas",
63547
+ "accounting.transactionSettled.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} mok\u0117jimo sudengimas",
63025
63548
  "creditNotes.refundChargeName": "S\u0105skaitos fakt\u016Bros gr\u0105\u017Einimas",
63026
63549
  "credits.bundleOf": "{{productName}} \u2013 {{creditCount}} kredit\u0173 paketas",
63027
63550
  "credits.unitsOf": "{{productName}} \u2013 {{creditCount}} kredit\u0173",
63551
+ "einvoicing.paymentFromWallet": "Mok\u0117jimas i\u0161 pinigin\u0117s",
63552
+ "einvoicing.paymentProcessed": "Mok\u0117jimas apdorotas",
63553
+ "einvoicing.paymentReceived": "Mok\u0117jimas gautas",
63554
+ "invoices.minimumFee.adjustmentName": "Minimalaus mokes\u010Dio koregavimas",
63555
+ "invoices.minimumFee.name": "Minimalus mokestis",
63028
63556
  "invoices.outstandingProduct.description": "Neapmok\u0117ta {{date}} i\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros{{invoiceNumber}} suma",
63029
63557
  "invoices.outstandingProduct.descriptionPeriod": "Neapmok\u0117ta s\u0105skaitos fakt\u016Bros{{invoiceNumber}} suma u\u017E laikotarp\u012F nuo {{periodStart}} iki {{periodEnd}}",
63030
63558
  "invoices.outstandingProduct.name": "Neapmok\u0117tas likutis",
@@ -63032,59 +63560,49 @@ var lt = {
63032
63560
  "invoices.prorata.paymentForItemFullPeriod": "Mok\u0117jimas u\u017E",
63033
63561
  "invoices.prorata.refundForItem": "Proporcingas gr\u0105\u017Einimas u\u017E",
63034
63562
  "invoices.prorata.refundForItemFullPeriod": "Gr\u0105\u017Einimas u\u017E",
63035
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 nebegaliojantis likutis",
63036
63563
  "subscriptions.closingChargeName": "Prenumeratos u\u017Ebaigimo mokestis",
63037
63564
  "subscriptions.correction": "Ankstesnio laikotarpio koregavimas",
63565
+ "subscriptions.reinstatementRechargeName": "Atnaujinimo \u012Fmokos u\u017E nutraukt\u0105 laikotarp\u012F",
63038
63566
  "subscriptions.updates.addCoupon": "Prid\u0117ti kupon\u0105 {{couponName}}",
63039
63567
  "subscriptions.updates.addProduct": "Prid\u0117ti {{productName}}",
63040
63568
  "subscriptions.updates.removeCoupon": "Pa\u0161alinti kupon\u0105 {{couponName}}",
63041
63569
  "subscriptions.updates.removeProduct": "Pa\u0161alinti {{productName}}",
63042
63570
  "subscriptions.updates.unit": "vnt.",
63043
- "subscriptions.updates.updatePrices": "Atnaujinti {{productName}} kainas",
63044
63571
  "subscriptions.updates.updateCount": "Atnaujinti {{productName}} kiek\u012F ({{previousCount}} \u2192 {{newCount}} {{unit}})",
63045
- "subscriptions.updates.updateCount.description.prorata.committed.invoiced": "Pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
63046
- "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
63047
- "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 proporcingam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63048
- "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63049
63572
  "subscriptions.updates.updateCount.description.full.committed.invoiced": "Visam laikotarpiui pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
63050
63573
  "subscriptions.updates.updateCount.description.full.committed.not_invoiced": "Visam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
63051
63574
  "subscriptions.updates.updateCount.description.full.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 visam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63052
63575
  "subscriptions.updates.updateCount.description.full.not_committed.not_invoiced": "Visam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63053
- "accounting.invoicePosted.entryDescription": "I\u0161ra\u0161ytos s\u0105skaitos fakt\u016Bros {{invoiceId}} registravimo \u012Fra\u0161as",
63054
- "accounting.transactionSettled.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} mok\u0117jimo sudengimas",
63055
- "accounting.transactionRefunded.entryDescription": "S\u0105skaitos fakt\u016Bros {{invoiceId}} gr\u0105\u017Einimas",
63056
- "accounting.creditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}} s\u0105skaitai fakt\u016Brai {{invoiceId}}",
63057
- "accounting.standaloneCreditNotePosted.entryDescription": "Kreditin\u0117 s\u0105skaita {{creditNoteId}}",
63058
- "accounting.revrec.entryDescription": "Pajam\u0173 pripa\u017Einimas pagal grafik\u0105 {{scheduleId}}, laikotarpis {{periodStart}}\u2013{{periodEnd}}",
63059
- "accounting.revrec.debitLineDescription": "Atid\u0117t\u0173j\u0173 pajam\u0173 suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63060
- "accounting.revrec.creditLineDescription": "Pajam\u0173 pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63061
- "accounting.revrec.discountDebitLineDescription": "Atid\u0117tosios nuolaidos suma\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63062
- "accounting.revrec.discountCreditLineDescription": "Pajamas ma\u017Einan\u010Dios sumos (nuolaidos) pripa\u017Einimas \u2013 grafikas {{scheduleId}}, laikotarpis {{periodDate}}",
63063
- "accounting.revrec.closedPeriodFallbackNote": " (u\u017Eregistruota kitame atvirame laikotarpyje, nes tikslinis apskaitos laikotarpis u\u017Edarytas; pradin\u0117 data {{originalDate}})",
63064
- "einvoicing.paymentProcessed": "Mok\u0117jimas apdorotas",
63065
- "einvoicing.paymentReceived": "Mok\u0117jimas gautas",
63066
- "einvoicing.paymentFromWallet": "Mok\u0117jimas i\u0161 pinigin\u0117s"
63576
+ "subscriptions.updates.updateCount.description.prorata.committed.invoiced": "Pritaikytas minimalus \u012Fsipareigotas {{committedCount}} kiekis.",
63577
+ "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma (minimalus \u012Fsipareigotas kiekis \u2013 {{committedCount}})",
63578
+ "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 proporcingam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63579
+ "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63580
+ "subscriptions.updates.updatePrices": "Atnaujinti {{productName}} kainas",
63581
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 nebegaliojantis likutis"
63067
63582
  };
63068
63583
 
63069
63584
  // ../hyperline-i18n/build/locales/nl.js
63070
63585
  var nl = {
63071
- "accounting.invoicePosted.entryDescription": "Boekingsregel voor factuur {{invoiceId}}",
63072
- "accounting.transactionSettled.entryDescription": "Betalingsafwikkeling voor factuur {{invoiceId}}",
63073
- "accounting.transactionRefunded.entryDescription": "Terugbetaling voor factuur {{invoiceId}}",
63074
63586
  "accounting.creditNotePosted.entryDescription": "Creditnota {{creditNoteId}} voor factuur {{invoiceId}}",
63075
- "accounting.standaloneCreditNotePosted.entryDescription": "Creditnota {{creditNoteId}}",
63587
+ "accounting.invoicePosted.entryDescription": "Boekingsregel voor factuur {{invoiceId}}",
63588
+ "accounting.revrec.closedPeriodFallbackNote": " (geboekt in de volgende open periode \u2014 doelboekingsperiode gesloten; oorspronkelijke datum {{originalDate}})",
63076
63589
  "accounting.revrec.creditLineDescription": "Omzet erkennen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63077
63590
  "accounting.revrec.debitLineDescription": "Uitgestelde omzet verlagen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63078
63591
  "accounting.revrec.discountCreditLineDescription": "Omzetvermindering (korting) erkennen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63079
- "accounting.revrec.closedPeriodFallbackNote": " (geboekt in de volgende open periode \u2014 doelboekingsperiode gesloten; oorspronkelijke datum {{originalDate}})",
63080
63592
  "accounting.revrec.discountDebitLineDescription": "Uitgestelde korting verlagen \u2013 schema {{scheduleId}}, periode {{periodDate}}",
63081
63593
  "accounting.revrec.entryDescription": "Omzeterkenning voor schema {{scheduleId}}, periode {{periodStart}} - {{periodEnd}}",
63594
+ "accounting.standaloneCreditNotePosted.entryDescription": "Creditnota {{creditNoteId}}",
63595
+ "accounting.transactionChargedBack.entryDescription": "Terugboeking voor factuur {{invoiceId}}",
63596
+ "accounting.transactionRefunded.entryDescription": "Terugbetaling voor factuur {{invoiceId}}",
63597
+ "accounting.transactionSettled.entryDescription": "Betalingsafwikkeling voor factuur {{invoiceId}}",
63082
63598
  "creditNotes.refundChargeName": "Terugbetaling voor factuur",
63083
63599
  "credits.bundleOf": "{{productName}} - Bundel van {{creditCount}} credits",
63084
63600
  "credits.unitsOf": "{{productName}} - {{creditCount}} credits",
63085
63601
  "einvoicing.paymentFromWallet": "Betaling uit tegoed",
63086
63602
  "einvoicing.paymentProcessed": "Betaling verwerkt",
63087
63603
  "einvoicing.paymentReceived": "Betaling ontvangen",
63604
+ "invoices.minimumFee.adjustmentName": "Aanpassing minimumbedrag",
63605
+ "invoices.minimumFee.name": "Minimumbedrag",
63088
63606
  "invoices.outstandingProduct.description": "Onbetaald bedrag van de factuur{{invoiceNumber}} uitgegeven op {{date}}",
63089
63607
  "invoices.outstandingProduct.descriptionPeriod": "Onbetaald bedrag van de factuur{{invoiceNumber}} van {{periodStart}} tot {{periodEnd}}",
63090
63608
  "invoices.outstandingProduct.name": "Openstaand saldo",
@@ -63092,9 +63610,9 @@ var nl = {
63092
63610
  "invoices.prorata.paymentForItemFullPeriod": "Betaling voor",
63093
63611
  "invoices.prorata.refundForItem": "Gedeeltelijke terugbetaling voor",
63094
63612
  "invoices.prorata.refundForItemFullPeriod": "Terugbetaling voor",
63095
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 verlopen saldo",
63096
63613
  "subscriptions.closingChargeName": "Afsluitkosten voor abonnement",
63097
63614
  "subscriptions.correction": "Aanpassing vorige periode",
63615
+ "subscriptions.reinstatementRechargeName": "Herstelkosten van geannuleerde periode",
63098
63616
  "subscriptions.updates.addCoupon": "Coupon toevoegen {{couponName}}",
63099
63617
  "subscriptions.updates.addProduct": "{{productName}} toevoegen",
63100
63618
  "subscriptions.updates.removeCoupon": "Coupon verwijderen {{couponName}}",
@@ -63109,28 +63627,32 @@ var nl = {
63109
63627
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Bedrag van {{amount}} (met een minimaal toegezegd aantal van {{committedCount}}) niet gefactureerd voor de geproportioneerde periode",
63110
63628
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Deze regel is gefactureerd voor de geproportioneerde periode",
63111
63629
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Bedrag van {{amount}} niet gefactureerd voor de geproportioneerde periode",
63112
- "subscriptions.updates.updatePrices": "Prijzen bijwerken voor {{productName}}"
63630
+ "subscriptions.updates.updatePrices": "Prijzen bijwerken voor {{productName}}",
63631
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 verlopen saldo"
63113
63632
  };
63114
63633
 
63115
63634
  // ../hyperline-i18n/build/locales/pl.js
63116
63635
  var pl = {
63117
- "accounting.invoicePosted.entryDescription": "Zapis ksi\u0119gowy dla faktury {{invoiceId}}",
63118
- "accounting.transactionSettled.entryDescription": "Rozliczenie p\u0142atno\u015Bci dla faktury {{invoiceId}}",
63119
- "accounting.transactionRefunded.entryDescription": "Zwrot za faktur\u0119 {{invoiceId}}",
63120
63636
  "accounting.creditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}} dla faktury {{invoiceId}}",
63121
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}}",
63637
+ "accounting.invoicePosted.entryDescription": "Zapis ksi\u0119gowy dla faktury {{invoiceId}}",
63638
+ "accounting.revrec.closedPeriodFallbackNote": " (zaksi\u0119gowano w nast\u0119pnym otwartym okresie \u2014 docelowy okres ksi\u0119gowy zamkni\u0119ty; pierwotna data {{originalDate}})",
63122
63639
  "accounting.revrec.creditLineDescription": "Rozpoznanie przychodu \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63123
63640
  "accounting.revrec.debitLineDescription": "Zmniejszenie przychod\xF3w przysz\u0142ych okres\xF3w \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63124
63641
  "accounting.revrec.discountCreditLineDescription": "Rozpoznanie kontra-przychodu (rabat) \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63125
- "accounting.revrec.closedPeriodFallbackNote": " (zaksi\u0119gowano w nast\u0119pnym otwartym okresie \u2014 docelowy okres ksi\u0119gowy zamkni\u0119ty; pierwotna data {{originalDate}})",
63126
63642
  "accounting.revrec.discountDebitLineDescription": "Zmniejszenie odroczonego rabatu \u2013 harmonogram {{scheduleId}}, okres {{periodDate}}",
63127
63643
  "accounting.revrec.entryDescription": "Rozpoznanie przychodu dla harmonogramu {{scheduleId}}, okres {{periodStart}} - {{periodEnd}}",
63644
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota kredytowa {{creditNoteId}}",
63645
+ "accounting.transactionChargedBack.entryDescription": "Obci\u0105\u017Cenie zwrotne za faktur\u0119 {{invoiceId}}",
63646
+ "accounting.transactionRefunded.entryDescription": "Zwrot za faktur\u0119 {{invoiceId}}",
63647
+ "accounting.transactionSettled.entryDescription": "Rozliczenie p\u0142atno\u015Bci dla faktury {{invoiceId}}",
63128
63648
  "creditNotes.refundChargeName": "Zwrot za faktur\u0119",
63129
63649
  "credits.bundleOf": "{{productName}} - Pakiet {{creditCount}} kredyt\xF3w",
63130
63650
  "credits.unitsOf": "{{productName}} - {{creditCount}} kredyt\xF3w",
63131
63651
  "einvoicing.paymentFromWallet": "P\u0142atno\u015B\u0107 z portfela",
63132
63652
  "einvoicing.paymentProcessed": "P\u0142atno\u015B\u0107 przetworzona",
63133
63653
  "einvoicing.paymentReceived": "P\u0142atno\u015B\u0107 otrzymana",
63654
+ "invoices.minimumFee.adjustmentName": "Wyr\xF3wnanie do op\u0142aty minimalnej",
63655
+ "invoices.minimumFee.name": "Op\u0142ata minimalna",
63134
63656
  "invoices.outstandingProduct.description": "Nieop\u0142acona kwota z faktury{{invoiceNumber}} wystawionej {{date}}",
63135
63657
  "invoices.outstandingProduct.descriptionPeriod": "Nieop\u0142acona kwota z faktury{{invoiceNumber}} od {{periodStart}} do {{periodEnd}}",
63136
63658
  "invoices.outstandingProduct.name": "Niezap\u0142acone saldo",
@@ -63138,9 +63660,9 @@ var pl = {
63138
63660
  "invoices.prorata.paymentForItemFullPeriod": "P\u0142atno\u015B\u0107 za",
63139
63661
  "invoices.prorata.refundForItem": "Zwrot proporcjonalny za",
63140
63662
  "invoices.prorata.refundForItemFullPeriod": "Zwrot za",
63141
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 wygas\u0142e saldo",
63142
63663
  "subscriptions.closingChargeName": "Op\u0142ata za zamkni\u0119cie subskrypcji",
63143
63664
  "subscriptions.correction": "Korekta poprzedniego okresu",
63665
+ "subscriptions.reinstatementRechargeName": "Op\u0142ata za przywr\xF3cenie anulowanego okresu",
63144
63666
  "subscriptions.updates.addCoupon": "Dodaj kupon {{couponName}}",
63145
63667
  "subscriptions.updates.addProduct": "Dodaj {{productName}}",
63146
63668
  "subscriptions.updates.removeCoupon": "Usu\u0144 kupon {{couponName}}",
@@ -63155,28 +63677,32 @@ var pl = {
63155
63677
  "subscriptions.updates.updateCount.description.prorata.committed.not_invoiced": "Kwota {{amount}} (z minimaln\u0105 zobowi\u0105zan\u0105 ilo\u015Bci\u0105 {{committedCount}}) niefakturowana za okres proporcjonalny",
63156
63678
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Ta pozycja zosta\u0142a zafakturowana za okres proporcjonalny",
63157
63679
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Kwota {{amount}} niefakturowana za okres proporcjonalny",
63158
- "subscriptions.updates.updatePrices": "Aktualizuj ceny dla {{productName}}"
63680
+ "subscriptions.updates.updatePrices": "Aktualizuj ceny dla {{productName}}",
63681
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 wygas\u0142e saldo"
63159
63682
  };
63160
63683
 
63161
63684
  // ../hyperline-i18n/build/locales/pt.js
63162
63685
  var pt = {
63163
- "accounting.invoicePosted.entryDescription": "Lan\xE7amento cont\xE1bil para a fatura {{invoiceId}}",
63164
- "accounting.transactionSettled.entryDescription": "Liquida\xE7\xE3o de pagamento para a fatura {{invoiceId}}",
63165
- "accounting.transactionRefunded.entryDescription": "Reembolso da fatura {{invoiceId}}",
63166
63686
  "accounting.creditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}} para a fatura {{invoiceId}}",
63167
- "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63687
+ "accounting.invoicePosted.entryDescription": "Lan\xE7amento cont\xE1bil para a fatura {{invoiceId}}",
63688
+ "accounting.revrec.closedPeriodFallbackNote": " (lan\xE7ado no pr\xF3ximo per\xEDodo aberto \u2014 per\xEDodo cont\xE1bil de destino fechado; data original {{originalDate}})",
63168
63689
  "accounting.revrec.creditLineDescription": "Reconhecer receita \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63169
63690
  "accounting.revrec.debitLineDescription": "Diminui\xE7\xE3o da receita diferida \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63170
63691
  "accounting.revrec.discountCreditLineDescription": "Reconhecer contra-receita (desconto) \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63171
- "accounting.revrec.closedPeriodFallbackNote": " (lan\xE7ado no pr\xF3ximo per\xEDodo aberto \u2014 per\xEDodo cont\xE1bil de destino fechado; data original {{originalDate}})",
63172
63692
  "accounting.revrec.discountDebitLineDescription": "Diminui\xE7\xE3o do desconto diferido \u2013 cronograma {{scheduleId}}, per\xEDodo {{periodDate}}",
63173
63693
  "accounting.revrec.entryDescription": "Reconhecimento de receita para o cronograma {{scheduleId}}, per\xEDodo {{periodStart}} - {{periodEnd}}",
63694
+ "accounting.standaloneCreditNotePosted.entryDescription": "Nota de cr\xE9dito {{creditNoteId}}",
63695
+ "accounting.transactionChargedBack.entryDescription": "Estorno da fatura {{invoiceId}}",
63696
+ "accounting.transactionRefunded.entryDescription": "Reembolso da fatura {{invoiceId}}",
63697
+ "accounting.transactionSettled.entryDescription": "Liquida\xE7\xE3o de pagamento para a fatura {{invoiceId}}",
63174
63698
  "creditNotes.refundChargeName": "Reembolso pela fatura",
63175
63699
  "credits.bundleOf": "{{productName}} - Pacote de {{creditCount}} cr\xE9ditos",
63176
63700
  "credits.unitsOf": "{{productName}} - {{creditCount}} cr\xE9ditos",
63177
63701
  "einvoicing.paymentFromWallet": "Pagamento da carteira",
63178
63702
  "einvoicing.paymentProcessed": "Pagamento processado",
63179
63703
  "einvoicing.paymentReceived": "Pagamento recebido",
63704
+ "invoices.minimumFee.adjustmentName": "Ajuste do valor m\xEDnimo",
63705
+ "invoices.minimumFee.name": "Valor m\xEDnimo",
63180
63706
  "invoices.outstandingProduct.description": "Valor em aberto da fatura{{invoiceNumber}} emitida em {{date}}",
63181
63707
  "invoices.outstandingProduct.descriptionPeriod": "Valor em aberto da fatura{{invoiceNumber}} de {{periodStart}} a {{periodEnd}}",
63182
63708
  "invoices.outstandingProduct.name": "Saldo em aberto",
@@ -63184,9 +63710,9 @@ var pt = {
63184
63710
  "invoices.prorata.paymentForItemFullPeriod": "Pagamento por",
63185
63711
  "invoices.prorata.refundForItem": "Reembolso proporcional por",
63186
63712
  "invoices.prorata.refundForItemFullPeriod": "Reembolso por",
63187
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo expirado",
63188
63713
  "subscriptions.closingChargeName": "Taxa de encerramento da assinatura",
63189
63714
  "subscriptions.correction": "Ajuste do per\xEDodo anterior",
63715
+ "subscriptions.reinstatementRechargeName": "Recarga de reintegra\xE7\xE3o do per\xEDodo cancelado",
63190
63716
  "subscriptions.updates.addCoupon": "Adicionar cupom {{couponName}}",
63191
63717
  "subscriptions.updates.addProduct": "Adicionar {{productName}}",
63192
63718
  "subscriptions.updates.removeCoupon": "Remover cupom {{couponName}}",
@@ -63201,7 +63727,8 @@ var pt = {
63201
63727
  "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",
63202
63728
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Esta linha foi faturada para o per\xEDodo proporcional",
63203
63729
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Valor de {{amount}} n\xE3o faturado para o per\xEDodo proporcional",
63204
- "subscriptions.updates.updatePrices": "Atualizar pre\xE7os para {{productName}}"
63730
+ "subscriptions.updates.updatePrices": "Atualizar pre\xE7os para {{productName}}",
63731
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo expirado"
63205
63732
  };
63206
63733
 
63207
63734
  // ../hyperline-i18n/build/language.js
@@ -65910,8 +66437,16 @@ import { deepEqual } from "fast-equals";
65910
66437
 
65911
66438
  // ../hyperline-lib/build/utils/realignDatesToTimezone.js
65912
66439
  var import_shared4 = __toESM(require_shared(), 1);
65913
- var MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1e3;
66440
+ var MILLISECONDS_PER_HOUR = 60 * 60 * 1e3;
66441
+ var MILLISECONDS_PER_DAY = 24 * MILLISECONDS_PER_HOUR;
65914
66442
  var LAST_MILLISECOND_OF_DAY = MILLISECONDS_PER_DAY - 1;
66443
+ var dateRealignmentModeSchema = external_exports.enum(["utc_midnight_import", "dst_hour_drift", "month_start_drift"]).default("utc_midnight_import");
66444
+ var DST_HOUR_SHIFT_BY_LOCAL_MILLISECOND_OF_DAY = /* @__PURE__ */ new Map([
66445
+ [23 * MILLISECONDS_PER_HOUR, MILLISECONDS_PER_HOUR],
66446
+ [LAST_MILLISECOND_OF_DAY - MILLISECONDS_PER_HOUR, MILLISECONDS_PER_HOUR],
66447
+ [MILLISECONDS_PER_HOUR, -MILLISECONDS_PER_HOUR],
66448
+ [MILLISECONDS_PER_HOUR - 1, -MILLISECONDS_PER_HOUR]
66449
+ ]);
65915
66450
 
65916
66451
  // ../hyperline-lib/build/utils/api/filterBuilder.js
65917
66452
  var baseAuthorizedOperators = ["not", "isNull", "isNotNull"];
@@ -65980,6 +66515,150 @@ var isAxiosError = axios.isAxiosError;
65980
66515
  // ../hyperline-lib/build/httpClient/httpClient.js
65981
66516
  import axios2 from "axios";
65982
66517
  import axiosRetry, { isNetworkOrIdempotentRequestError, retryAfter } from "axios-retry";
66518
+
66519
+ // ../hyperline-lib/build/httpClient/logRedaction.js
66520
+ var REDACTED_KEY_NAMES = /* @__PURE__ */ new Set([
66521
+ "accesstoken",
66522
+ "apikey",
66523
+ "apitoken",
66524
+ "assertion",
66525
+ "authtoken",
66526
+ "clientassertion",
66527
+ "codeverifier",
66528
+ "credentials",
66529
+ "idtoken",
66530
+ "privatekey",
66531
+ "refreshtoken",
66532
+ "sessiontoken",
66533
+ "token"
66534
+ ]);
66535
+ var REDACTED_KEY_SUFFIX_PATTERN = /(secret|password)$/;
66536
+ var REDACTED_KEY_CANDIDATE_PATTERN = /token|key|secret|password|assertion|verifier|credentials/i;
66537
+ var REDACTED_VALUE = "<redacted>";
66538
+ var MAX_REDACTION_DEPTH = 10;
66539
+ var MAX_PARSED_STRING_LENGTH = 16384;
66540
+ var MAX_VISITED_NODES = 1e3;
66541
+ var MAX_CONTAINER_ENTRIES = MAX_VISITED_NODES;
66542
+ function redactLogBody({ body }) {
66543
+ return redactValue({
66544
+ value: body,
66545
+ depth: MAX_REDACTION_DEPTH,
66546
+ budget: { remainingNodes: MAX_VISITED_NODES }
66547
+ });
66548
+ }
66549
+ function redactLogUrl({ url: url2 }) {
66550
+ const queryIndex = url2.indexOf("?");
66551
+ if (queryIndex === -1 || url2.length > MAX_PARSED_STRING_LENGTH) {
66552
+ return url2;
66553
+ }
66554
+ const redactedQuery = redactFormEncoded({ text: url2.slice(queryIndex + 1) });
66555
+ return redactedQuery === void 0 ? url2 : `${url2.slice(0, queryIndex)}?${redactedQuery}`;
66556
+ }
66557
+ function redactValue({ value, depth, budget }) {
66558
+ if (depth <= 0 || budget.remainingNodes <= 0) {
66559
+ return value;
66560
+ }
66561
+ budget.remainingNodes -= 1;
66562
+ if (typeof value === "string") {
66563
+ return redactString({ text: value, budget });
66564
+ }
66565
+ if (value instanceof URLSearchParams) {
66566
+ return redactFormEncoded({ text: value.toString() }) ?? value;
66567
+ }
66568
+ if (Array.isArray(value)) {
66569
+ return redactArray({ items: value, depth, budget });
66570
+ }
66571
+ if (isPlainObject2(value)) {
66572
+ return redactObject({ record: value, depth, budget });
66573
+ }
66574
+ return value;
66575
+ }
66576
+ function redactArray({ items, depth, budget }) {
66577
+ if (items.length > MAX_CONTAINER_ENTRIES) {
66578
+ return items;
66579
+ }
66580
+ let redactedItems;
66581
+ for (const [index, item] of items.entries()) {
66582
+ if (budget.remainingNodes <= 0) {
66583
+ break;
66584
+ }
66585
+ const redactedItem = redactValue({ value: item, depth: depth - 1, budget });
66586
+ if (redactedItem !== item) {
66587
+ redactedItems ??= [...items];
66588
+ redactedItems[index] = redactedItem;
66589
+ }
66590
+ }
66591
+ return redactedItems ?? items;
66592
+ }
66593
+ function redactObject({ record: record2, depth, budget }) {
66594
+ const redactedEntries = /* @__PURE__ */ new Map();
66595
+ let entryCount = 0;
66596
+ for (const key in record2) {
66597
+ if (!Object.hasOwn(record2, key)) {
66598
+ continue;
66599
+ }
66600
+ entryCount += 1;
66601
+ if (entryCount > MAX_CONTAINER_ENTRIES) {
66602
+ return record2;
66603
+ }
66604
+ if (budget.remainingNodes <= 0) {
66605
+ break;
66606
+ }
66607
+ const nestedValue = record2[key];
66608
+ const redactedNestedValue = isRedactedKey({ key }) && nestedValue != null ? REDACTED_VALUE : redactValue({ value: nestedValue, depth: depth - 1, budget });
66609
+ if (redactedNestedValue !== nestedValue) {
66610
+ redactedEntries.set(key, redactedNestedValue);
66611
+ }
66612
+ }
66613
+ return redactedEntries.size === 0 ? record2 : { ...record2, ...Object.fromEntries(redactedEntries) };
66614
+ }
66615
+ function redactString({ text, budget }) {
66616
+ if (text.length > MAX_PARSED_STRING_LENGTH) {
66617
+ return text;
66618
+ }
66619
+ const trimmedText = text.trim();
66620
+ if (trimmedText.startsWith("{") || trimmedText.startsWith("[")) {
66621
+ try {
66622
+ const parsedValue = JSON.parse(trimmedText);
66623
+ const redactedValue = redactValue({
66624
+ value: parsedValue,
66625
+ depth: MAX_REDACTION_DEPTH,
66626
+ budget
66627
+ });
66628
+ return redactedValue === parsedValue ? text : JSON.stringify(redactedValue);
66629
+ } catch {
66630
+ return text;
66631
+ }
66632
+ }
66633
+ return redactFormEncoded({ text }) ?? text;
66634
+ }
66635
+ function redactFormEncoded({ text }) {
66636
+ if (!text.includes("=") || !REDACTED_KEY_CANDIDATE_PATTERN.test(text)) {
66637
+ return void 0;
66638
+ }
66639
+ const params = new URLSearchParams(text);
66640
+ let hasRedactedParam = false;
66641
+ for (const key of new Set(params.keys())) {
66642
+ if (isRedactedKey({ key })) {
66643
+ params.set(key, REDACTED_VALUE);
66644
+ hasRedactedParam = true;
66645
+ }
66646
+ }
66647
+ return hasRedactedParam ? params.toString() : void 0;
66648
+ }
66649
+ function isRedactedKey({ key }) {
66650
+ const normalizedKey = key.toLowerCase().replace(/[_-]/g, "");
66651
+ return REDACTED_KEY_NAMES.has(normalizedKey) || REDACTED_KEY_SUFFIX_PATTERN.test(normalizedKey);
66652
+ }
66653
+ function isPlainObject2(value) {
66654
+ if (typeof value !== "object" || value === null) {
66655
+ return false;
66656
+ }
66657
+ const prototype = Object.getPrototypeOf(value);
66658
+ return prototype === Object.prototype || prototype === null;
66659
+ }
66660
+
66661
+ // ../hyperline-lib/build/httpClient/httpClient.js
65983
66662
  import { AxiosError } from "axios";
65984
66663
  var recommendedRetryConfig = {
65985
66664
  retries: 3,
@@ -66047,13 +66726,14 @@ function isTooManyRequestsError(error48) {
66047
66726
  return error48.response?.status === 429;
66048
66727
  }
66049
66728
  var toLogRequest = (config4) => {
66729
+ const url2 = redactLogUrl({ url: config4.url ?? "" });
66050
66730
  return {
66051
66731
  method: config4.method ?? "",
66052
- url: config4.url ?? "",
66053
- path: config4.url ?? "",
66732
+ url: url2,
66733
+ path: url2,
66054
66734
  hostname: config4.baseURL ?? "",
66055
- originalUrl: `${config4.baseURL ?? ""}${config4.url}`,
66056
- body: config4.data,
66735
+ originalUrl: `${config4.baseURL ?? ""}${url2}`,
66736
+ body: redactLogBody({ body: config4.data }),
66057
66737
  headers: {}
66058
66738
  };
66059
66739
  };