@hyperline/cli 0.1.0-build.1.7eb82b4 → 0.1.0-build.1.8040445

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.
@@ -40508,7 +40508,7 @@ Examples:
40508
40508
  // build/commands/generated/ai-monitoring.js
40509
40509
  function registerAi_MonitoringCommands(parent) {
40510
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", `
40511
+ resource.command("list-monitoring-analyses").description(`List customer health analyses from the monitoring agent, newest first: health score (0-100), tier, summary, per-dimension scores, risk factors and positive signals. Filter by customer (Hyperline or external ID) with limit=1 to get a customer's current health score, or by customer_id__in (up to 100 Hyperline IDs) for several customers; the first analysis per customer is its latest. Only completed analyses unless status is set.`).option("--limit <number>", `Maximum number of items to return (1-100).`).option("--cursor <value>", `Opaque cursor returned in the previous response's \`next_cursor\`. Omit to fetch the first page.`).option("--include-total <value>", `Set to \`true\` to include \`total\` in the response.`).option("--customer-id <value>", `Return only analyses of this customer. Accepts the Hyperline ID or your own external ID.`).option("--customer-id.in <value>", `Comma-separated list of up to 100 Hyperline customer IDs. Return only analyses of these customers. Cannot be combined with \`customer_id\`.`).option("--status <value>", `Return only analyses with this status. Defaults to \`completed\`, the analyses that carry a score.`).option("--created-at.gte <value>", `Return only analyses created at or after this date.`).option("--created-at.lte <value>", `Return only analyses created at or before this date.`).addHelpText("after", `
40512
40512
  Examples:
40513
40513
  hyperline ai-monitoring list-monitoring-analyses
40514
40514
  hyperline ai-monitoring list-monitoring-analyses --limit <limit> --cursor <cursor>`).action(async (opts) => {
@@ -40524,6 +40524,8 @@ Examples:
40524
40524
  args.include_total = opts.includeTotal;
40525
40525
  if (opts.customerId !== void 0)
40526
40526
  args.customer_id = opts.customerId;
40527
+ if (opts["customerId.in"] !== void 0)
40528
+ args.customer_id__in = opts["customerId.in"];
40527
40529
  if (opts.status !== void 0)
40528
40530
  args.status = opts.status;
40529
40531
  if (opts["createdAt.gte"] !== void 0)
@@ -40541,6 +40543,7 @@ Examples:
40541
40543
  "cursor",
40542
40544
  "include_total",
40543
40545
  "customer_id",
40546
+ "customer_id__in",
40544
40547
  "status",
40545
40548
  "created_at__gte",
40546
40549
  "created_at__lte"
@@ -40726,7 +40729,7 @@ Examples:
40726
40729
  queryParamKeys: ["take", "skip"]
40727
40730
  });
40728
40731
  });
40729
- resource.command("create").description(`Create a new coupon with discount rules. Supports percentage or fixed amount discounts, duration limits, and redemption restrictions.`).requiredOption("--name <value>", `Coupon name.`).option("--description <value>", `Coupon description.`).option("--expiration-date <value>", `Date corresponding to the expiration of the coupon.`).option("--redemption-limit <number>", `Maximum number of subscriptions to which a single coupon can be applied.`).option("--product-ids <json>", `List of product IDs the coupon can be applied to. If empty, the coupon can be applied to any product.`).option("--repeat <value>", `Default repeat behaviour applied when the coupon is attached to a subscription. Valid values: \`once\`, \`forever\`, \`duration\`. Can be overridden at attach time.`).option("--duration <json>", `Default duration applied when \`repeat\` is \`duration\`. Required when \`repeat\` is \`duration\`, must be null otherwise.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).requiredOption("--type <value>", `type`).option("--discount-amount <number>", `Amount to apply as a discount on the total amount (excluding taxes) of a subscription. Expressed in the currency's smallest unit.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--discount-percent <number>", `Percentage to apply as a discount on the amount (excluding taxes) of a product.`).addHelpText("after", `
40732
+ resource.command("create").description(`Create a new coupon with discount rules. Supports percentage or fixed amount discounts, duration limits, and redemption restrictions.`).requiredOption("--name <value>", `Coupon name.`).option("--description <value>", `Coupon description.`).option("--expiration-date <value>", `Date corresponding to the expiration of the coupon.`).option("--redemption-limit <number>", `Maximum number of subscriptions to which a single coupon can be applied.`).option("--product-ids <json>", `Products the coupon is scoped to, read together with \`product_scope\`: the only discounted products when \`include\`, the products never discounted when \`exclude\`, empty when \`all\`.`).option("--product-scope <value>", `Which products the coupon discounts. \`all\`: every product (\`product_ids\` must be empty). \`include\`: only the products in \`product_ids\`. \`exclude\`: every product except those in \`product_ids\` (lines without a product stay discounted). \`include\` and \`exclude\` require a non-empty \`product_ids\`. When omitted on create/update, it is inferred: \`include\` if \`product_ids\` is non-empty, \`all\` otherwise. Integrations that read \`product_ids\` without \`product_scope\` will misread an \`exclude\` list as the products the coupon applies to.`).option("--repeat <value>", `Default repeat behaviour applied when the coupon is attached to a subscription. Valid values: \`once\`, \`forever\`, \`duration\`. Can be overridden at attach time.`).option("--duration <json>", `Default duration applied when \`repeat\` is \`duration\`. Required when \`repeat\` is \`duration\`, must be null otherwise.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).requiredOption("--type <value>", `type`).option("--discount-amount <number>", `Amount to apply as a discount on the total amount (excluding taxes) of a subscription. Expressed in the currency's smallest unit.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--discount-percent <number>", `Percentage to apply as a discount on the amount (excluding taxes) of a product.`).addHelpText("after", `
40730
40733
  Examples:
40731
40734
  hyperline coupons create --name <name> --type <type>
40732
40735
  hyperline coupons create --name <name> --type <type> --description <description> --expiration-date <expiration_date>
@@ -40743,6 +40746,8 @@ Examples:
40743
40746
  args.description = opts.description;
40744
40747
  if (opts.expirationDate !== void 0)
40745
40748
  args.expiration_date = opts.expirationDate;
40749
+ if (opts.productScope !== void 0)
40750
+ args.product_scope = opts.productScope;
40746
40751
  if (opts.repeat !== void 0)
40747
40752
  args.repeat = opts.repeat;
40748
40753
  if (opts.type !== void 0)
@@ -40786,7 +40791,7 @@ Examples:
40786
40791
  queryParamKeys: []
40787
40792
  });
40788
40793
  });
40789
- resource.command("update").description(`Update an existing coupon's name, discount rules, or restrictions.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `Coupon name.`).option("--description <value>", `Coupon description.`).option("--expiration-date <value>", `Date corresponding to the expiration of the coupon.`).option("--redemption-limit <number>", `Maximum number of subscriptions to which a single coupon can be applied.`).option("--product-ids <json>", `List of product IDs the coupon can be applied to. If empty, the coupon can be applied to any product.`).option("--repeat <value>", `Default repeat behaviour applied when the coupon is attached to a subscription. Valid values: \`once\`, \`forever\`, \`duration\`. Can be overridden at attach time.`).option("--duration <json>", `Default duration applied when \`repeat\` is \`duration\`. Required when \`repeat\` is \`duration\`, must be null otherwise.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).requiredOption("--type <value>", `type`).option("--discount-amount <number>", `Amount to apply as a discount on the total amount (excluding taxes) of a subscription. Expressed in the currency's smallest unit.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--discount-percent <number>", `Percentage to apply as a discount on the amount (excluding taxes) of a product.`).addHelpText("after", `
40794
+ resource.command("update").description(`Update an existing coupon's name, discount rules, or restrictions.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `Coupon name.`).option("--description <value>", `Coupon description.`).option("--expiration-date <value>", `Date corresponding to the expiration of the coupon.`).option("--redemption-limit <number>", `Maximum number of subscriptions to which a single coupon can be applied.`).option("--product-ids <json>", `Products the coupon is scoped to, read together with \`product_scope\`: the only discounted products when \`include\`, the products never discounted when \`exclude\`, empty when \`all\`.`).option("--product-scope <value>", `Which products the coupon discounts. \`all\`: every product (\`product_ids\` must be empty). \`include\`: only the products in \`product_ids\`. \`exclude\`: every product except those in \`product_ids\` (lines without a product stay discounted). \`include\` and \`exclude\` require a non-empty \`product_ids\`. When omitted on create/update, it is inferred: \`include\` if \`product_ids\` is non-empty, \`all\` otherwise. Integrations that read \`product_ids\` without \`product_scope\` will misread an \`exclude\` list as the products the coupon applies to.`).option("--repeat <value>", `Default repeat behaviour applied when the coupon is attached to a subscription. Valid values: \`once\`, \`forever\`, \`duration\`. Can be overridden at attach time.`).option("--duration <json>", `Default duration applied when \`repeat\` is \`duration\`. Required when \`repeat\` is \`duration\`, must be null otherwise.`).option("--properties <json>", `Key/value pairs to store any metadata useful in your context.`).requiredOption("--type <value>", `type`).option("--discount-amount <number>", `Amount to apply as a discount on the total amount (excluding taxes) of a subscription. Expressed in the currency's smallest unit.`).option("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--discount-percent <number>", `Percentage to apply as a discount on the amount (excluding taxes) of a product.`).addHelpText("after", `
40790
40795
  Examples:
40791
40796
  hyperline coupons update --id <id> --name <name> --type <type>
40792
40797
  hyperline coupons update --id <id> --name <name> --type <type> --description <description> --expiration-date <expiration_date>
@@ -40805,6 +40810,8 @@ Examples:
40805
40810
  args.description = opts.description;
40806
40811
  if (opts.expirationDate !== void 0)
40807
40812
  args.expiration_date = opts.expirationDate;
40813
+ if (opts.productScope !== void 0)
40814
+ args.product_scope = opts.productScope;
40808
40815
  if (opts.repeat !== void 0)
40809
40816
  args.repeat = opts.repeat;
40810
40817
  if (opts.type !== void 0)
@@ -41155,7 +41162,15 @@ Examples:
41155
41162
  // build/commands/generated/customers.js
41156
41163
  function registerCustomersCommands(parent) {
41157
41164
  const resource = parent.command("customers").description("Manage customers");
41158
- resource.command("list").description(`List customers with optional filters for name, type, status, currency, country, external_id, billing_email, search, tax_id, subscription_status, invoicing_entity_id, segment_id, custom_properties, payment_method_type, integration_entity_id, created_at, and updated_at. Sortable by created_at or updated_at. Paginated with limit/cursor.`).option("--limit <number>", `Maximum number of items to return (1-100).`).option("--cursor <value>", `Opaque cursor returned in the previous response's \`next_cursor\`. Omit to fetch the first page.`).option("--include-total <value>", `Set to \`true\` to include \`total\` in the response.`).option("--order <value>", `Sort direction.`).option("--sort <value>", `Field used to sort the results.`).option("--name <value>", `name`).option("--name.not <value>", `name__not`).option("--name.is-null <value>", `name__isNull`).option("--name.is-not-null <value>", `name__isNotNull`).option("--name.equals <value>", `name__equals`).option("--name.contains <value>", `name__contains`).option("--name.starts-with <value>", `name__startsWith`).option("--name.end-with <value>", `name__endWith`).option("--type <value>", `type`).option("--type.in <value>", `type__in`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--country <value>", `country`).option("--country.not <value>", `country__not`).option("--country.is-null <value>", `country__isNull`).option("--country.is-not-null <value>", `country__isNotNull`).option("--country.equals <value>", `country__equals`).option("--country.contains <value>", `country__contains`).option("--country.starts-with <value>", `country__startsWith`).option("--country.end-with <value>", `country__endWith`).option("--external-id <value>", `external_id`).option("--external-id.not <value>", `external_id__not`).option("--external-id.is-null <value>", `external_id__isNull`).option("--external-id.is-not-null <value>", `external_id__isNotNull`).option("--external-id.equals <value>", `external_id__equals`).option("--external-id.contains <value>", `external_id__contains`).option("--external-id.starts-with <value>", `external_id__startsWith`).option("--external-id.end-with <value>", `external_id__endWith`).option("--billing-email <value>", `billing_email`).option("--billing-email.not <value>", `billing_email__not`).option("--billing-email.is-null <value>", `billing_email__isNull`).option("--billing-email.is-not-null <value>", `billing_email__isNotNull`).option("--billing-email.equals <value>", `billing_email__equals`).option("--billing-email.contains <value>", `billing_email__contains`).option("--billing-email.starts-with <value>", `billing_email__startsWith`).option("--billing-email.end-with <value>", `billing_email__endWith`).option("--search <value>", `search`).option("--tax-id <value>", `tax_id`).option("--tax-id.not <value>", `tax_id__not`).option("--tax-id.is-null <value>", `tax_id__isNull`).option("--tax-id.is-not-null <value>", `tax_id__isNotNull`).option("--tax-id.equals <value>", `tax_id__equals`).option("--tax-id.contains <value>", `tax_id__contains`).option("--tax-id.starts-with <value>", `tax_id__startsWith`).option("--tax-id.end-with <value>", `tax_id__endWith`).option("--subscription-status <value>", `subscription_status`).option("--subscription-status.in <value>", `subscription_status__in`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--invoicing-entity-id.not <value>", `invoicing_entity_id__not`).option("--invoicing-entity-id.is-null <value>", `invoicing_entity_id__isNull`).option("--invoicing-entity-id.is-not-null <value>", `invoicing_entity_id__isNotNull`).option("--invoicing-entity-id.equals <value>", `invoicing_entity_id__equals`).option("--invoicing-entity-id.contains <value>", `invoicing_entity_id__contains`).option("--invoicing-entity-id.starts-with <value>", `invoicing_entity_id__startsWith`).option("--invoicing-entity-id.end-with <value>", `invoicing_entity_id__endWith`).option("--segment-id <value>", `segment_id`).option("--custom-properties <value>", `custom_properties`).option("--payment-method-type <value>", `payment_method_type`).option("--payment-method-type.in <value>", `payment_method_type__in`).option("--integration-entity-id <value>", `integration_entity_id`).option("--created-at <value>", `created_at`).option("--created-at.not <value>", `created_at__not`).option("--created-at.is-null <value>", `created_at__isNull`).option("--created-at.is-not-null <value>", `created_at__isNotNull`).option("--created-at.equals <value>", `created_at__equals`).option("--created-at.lt <value>", `created_at__lt`).option("--created-at.lte <value>", `created_at__lte`).option("--created-at.gt <value>", `created_at__gt`).option("--created-at.gte <value>", `created_at__gte`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
41165
+ resource.command("list").description(`List customers with optional filters for name, type, status, currency, country, external_id, billing_email, search, tax_id, tax_id_status, subscription_status, invoicing_entity_id, segment_id, custom_properties, payment_method_type, integration_entity_id, created_at, and updated_at. Sortable by created_at or updated_at. Paginated with limit/cursor.`).option("--limit <number>", `Maximum number of items to return (1-100).`).option("--cursor <value>", `Opaque cursor returned in the previous response's \`next_cursor\`. Omit to fetch the first page.`).option("--include-total <value>", `Set to \`true\` to include \`total\` in the response.`).option("--order <value>", `Sort direction.`).option("--sort <value>", `Field used to sort the results.`).option("--tax-id-status <value>", `
41166
+ Verification status of the customer tax ID.
41167
+
41168
+ - \`valid\`: Tax ID has been verified and is valid.
41169
+ - \`invalid\`: Tax ID has been verified and is invalid.
41170
+ - \`mismatch\`: Tax ID is valid but is for a different country than the customer's country.
41171
+ - \`unverified\`: Tax ID has not been verified yet.
41172
+ - \`unsupported\`: Tax ID verification for this type not supported yet.
41173
+ `).option("--name <value>", `name`).option("--name.not <value>", `name__not`).option("--name.is-null <value>", `name__isNull`).option("--name.is-not-null <value>", `name__isNotNull`).option("--name.equals <value>", `name__equals`).option("--name.contains <value>", `name__contains`).option("--name.starts-with <value>", `name__startsWith`).option("--name.end-with <value>", `name__endWith`).option("--type <value>", `type`).option("--type.in <value>", `type__in`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--country <value>", `country`).option("--country.not <value>", `country__not`).option("--country.is-null <value>", `country__isNull`).option("--country.is-not-null <value>", `country__isNotNull`).option("--country.equals <value>", `country__equals`).option("--country.contains <value>", `country__contains`).option("--country.starts-with <value>", `country__startsWith`).option("--country.end-with <value>", `country__endWith`).option("--external-id <value>", `external_id`).option("--external-id.not <value>", `external_id__not`).option("--external-id.is-null <value>", `external_id__isNull`).option("--external-id.is-not-null <value>", `external_id__isNotNull`).option("--external-id.equals <value>", `external_id__equals`).option("--external-id.contains <value>", `external_id__contains`).option("--external-id.starts-with <value>", `external_id__startsWith`).option("--external-id.end-with <value>", `external_id__endWith`).option("--billing-email <value>", `billing_email`).option("--billing-email.not <value>", `billing_email__not`).option("--billing-email.is-null <value>", `billing_email__isNull`).option("--billing-email.is-not-null <value>", `billing_email__isNotNull`).option("--billing-email.equals <value>", `billing_email__equals`).option("--billing-email.contains <value>", `billing_email__contains`).option("--billing-email.starts-with <value>", `billing_email__startsWith`).option("--billing-email.end-with <value>", `billing_email__endWith`).option("--search <value>", `search`).option("--tax-id <value>", `tax_id`).option("--tax-id.not <value>", `tax_id__not`).option("--tax-id.is-null <value>", `tax_id__isNull`).option("--tax-id.is-not-null <value>", `tax_id__isNotNull`).option("--tax-id.equals <value>", `tax_id__equals`).option("--tax-id.contains <value>", `tax_id__contains`).option("--tax-id.starts-with <value>", `tax_id__startsWith`).option("--tax-id.end-with <value>", `tax_id__endWith`).option("--subscription-status <value>", `subscription_status`).option("--subscription-status.in <value>", `subscription_status__in`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--invoicing-entity-id.not <value>", `invoicing_entity_id__not`).option("--invoicing-entity-id.is-null <value>", `invoicing_entity_id__isNull`).option("--invoicing-entity-id.is-not-null <value>", `invoicing_entity_id__isNotNull`).option("--invoicing-entity-id.equals <value>", `invoicing_entity_id__equals`).option("--invoicing-entity-id.contains <value>", `invoicing_entity_id__contains`).option("--invoicing-entity-id.starts-with <value>", `invoicing_entity_id__startsWith`).option("--invoicing-entity-id.end-with <value>", `invoicing_entity_id__endWith`).option("--segment-id <value>", `segment_id`).option("--custom-properties <value>", `custom_properties`).option("--payment-method-type <value>", `payment_method_type`).option("--payment-method-type.in <value>", `payment_method_type__in`).option("--integration-entity-id <value>", `integration_entity_id`).option("--created-at <value>", `created_at`).option("--created-at.not <value>", `created_at__not`).option("--created-at.is-null <value>", `created_at__isNull`).option("--created-at.is-not-null <value>", `created_at__isNotNull`).option("--created-at.equals <value>", `created_at__equals`).option("--created-at.lt <value>", `created_at__lt`).option("--created-at.lte <value>", `created_at__lte`).option("--created-at.gt <value>", `created_at__gt`).option("--created-at.gte <value>", `created_at__gte`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
41159
41174
  Examples:
41160
41175
  hyperline customers list
41161
41176
  hyperline customers list --limit <limit> --cursor <cursor>`).action(async (opts) => {
@@ -41173,6 +41188,8 @@ Examples:
41173
41188
  args.order = opts.order;
41174
41189
  if (opts.sort !== void 0)
41175
41190
  args.sort = opts.sort;
41191
+ if (opts.taxIdStatus !== void 0)
41192
+ args.tax_id_status = opts.taxIdStatus;
41176
41193
  if (opts.name !== void 0)
41177
41194
  args.name = opts.name;
41178
41195
  if (opts["name.not"] !== void 0)
@@ -41357,6 +41374,7 @@ Examples:
41357
41374
  "include_total",
41358
41375
  "order",
41359
41376
  "sort",
41377
+ "tax_id_status",
41360
41378
  "name",
41361
41379
  "name__not",
41362
41380
  "name__isNull",
@@ -44294,7 +44312,7 @@ Examples:
44294
44312
  queryParamKeys: []
44295
44313
  });
44296
44314
  });
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", `
44315
+ resource.command("create").description(`Create a new price configuration on an existing product. Specify the product_id, pricing type (fee, volume, bulk, packaged, bps, bundle), currency, billing interval, and price tiers. Supports metering_filter for dynamic products.`).requiredOption("--currency <value>", `Currency code. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes).`).option("--countries <json>", `Countries this price configuration is eligible in. Omit or send \`null\` to make it eligible in every country. An empty array restricts it to customers that have no country set.`).option("--price-book-id <value>", `ID of the price book to which this price configuration belongs to. If null, the price configuration belongs to the default price book.`).requiredOption("--billing-interval <json>", `Billing interval on which the price configuration is eligible.`).option("--commitment-interval <json>", `Commitment interval on which the price configuration is eligible.`).requiredOption("--type <value>", `type`).requiredOption("--prices <json>", `Price tiers of the price configuration. If fixed amount, only one price is available.`).requiredOption("--product-id <value>", `ID of the product to add the price configuration to.`).option("--metering-filter <json>", `Filter to scope which billable events are eligible for this price configuration.`).option("--aggregator-filter-id <value>", `ID of an existing metering filter of the product's aggregator to attach to this price configuration, instead of creating a new one with \`metering_filter\`.`).option("--allow-on-portal", `allow_on_portal`).addHelpText("after", `
44298
44316
  Examples:
44299
44317
  hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id>
44300
44318
  hyperline price-configurations create --currency <currency> --billing-interval <billing_interval> --type <type> --prices <prices> --product-id <product_id> --countries <countries> --price-book-id <price_book_id>
@@ -44313,6 +44331,8 @@ Examples:
44313
44331
  args.type = opts.type;
44314
44332
  if (opts.productId !== void 0)
44315
44333
  args.product_id = opts.productId;
44334
+ if (opts.aggregatorFilterId !== void 0)
44335
+ args.aggregator_filter_id = opts.aggregatorFilterId;
44316
44336
  if (opts.allowOnPortal !== void 0)
44317
44337
  args.allow_on_portal = true;
44318
44338
  if (opts.countries !== void 0)
@@ -44731,7 +44751,7 @@ Quote status.
44731
44751
  - \`all\`: Display all pricing tiers.
44732
44752
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
44733
44753
  - \`none\`: Hide all pricing tiers.
44734
- `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--template-id <value>", `ID of the quote template. If not specified, a subscription configuration or an \`invoice\` payload must be defined.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--subscription <json>", `Subscription configuration constituting the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided, a draft invoice is created and linked to the quote. Cannot be combined with \`subscription\` or \`template_id\`.`).addHelpText("after", `
44754
+ `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-discounts-on-total <value>", `Display discounts on the totals, with product prices before discount. Totals then follow the contract value, so discounts with a limited duration are included.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--template-id <value>", `ID of the quote template. If not specified, a subscription configuration or an \`invoice\` payload must be defined.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--subscription <json>", `Subscription configuration constituting the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided, a draft invoice is created and linked to the quote. Cannot be combined with \`subscription\` or \`template_id\`.`).addHelpText("after", `
44735
44755
  Examples:
44736
44756
  hyperline quotes create --customer-id <customer_id>
44737
44757
  hyperline quotes create --customer-id <customer_id> --status <status> --owner-email <owner_email>
@@ -44770,6 +44790,8 @@ Examples:
44770
44790
  args.display_price_tiers = opts.displayPriceTiers;
44771
44791
  if (opts.displayPhaseValue !== void 0)
44772
44792
  args.display_phase_value = opts.displayPhaseValue;
44793
+ if (opts.displayDiscountsOnTotal !== void 0)
44794
+ args.display_discounts_on_total = opts.displayDiscountsOnTotal;
44773
44795
  if (opts.displayFirstInvoiceAmount !== void 0)
44774
44796
  args.display_first_invoice_amount = opts.displayFirstInvoiceAmount;
44775
44797
  if (opts.displayDocumentsInPreview !== void 0)
@@ -44801,7 +44823,7 @@ Examples:
44801
44823
  queryParamKeys: []
44802
44824
  });
44803
44825
  });
44804
- resource.command("list").description(`List quotes with optional filters for id, number, status, customer_id, template_id, crm_opportunity_id, type, and updated_at. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--id <value>", `id`).option("--id.not <value>", `id__not`).option("--id.is-null <value>", `id__isNull`).option("--id.is-not-null <value>", `id__isNotNull`).option("--id.equals <value>", `id__equals`).option("--id.contains <value>", `id__contains`).option("--id.starts-with <value>", `id__startsWith`).option("--id.end-with <value>", `id__endWith`).option("--number <value>", `number`).option("--number.not <value>", `number__not`).option("--number.is-null <value>", `number__isNull`).option("--number.is-not-null <value>", `number__isNotNull`).option("--number.equals <value>", `number__equals`).option("--number.contains <value>", `number__contains`).option("--number.starts-with <value>", `number__startsWith`).option("--number.end-with <value>", `number__endWith`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--template-id <value>", `template_id`).option("--template-id.not <value>", `template_id__not`).option("--template-id.is-null <value>", `template_id__isNull`).option("--template-id.is-not-null <value>", `template_id__isNotNull`).option("--template-id.equals <value>", `template_id__equals`).option("--template-id.contains <value>", `template_id__contains`).option("--template-id.starts-with <value>", `template_id__startsWith`).option("--template-id.end-with <value>", `template_id__endWith`).option("--crm-opportunity-id <value>", `crm_opportunity_id`).option("--crm-opportunity-id.not <value>", `crm_opportunity_id__not`).option("--crm-opportunity-id.is-null <value>", `crm_opportunity_id__isNull`).option("--crm-opportunity-id.is-not-null <value>", `crm_opportunity_id__isNotNull`).option("--crm-opportunity-id.equals <value>", `crm_opportunity_id__equals`).option("--crm-opportunity-id.contains <value>", `crm_opportunity_id__contains`).option("--crm-opportunity-id.starts-with <value>", `crm_opportunity_id__startsWith`).option("--crm-opportunity-id.end-with <value>", `crm_opportunity_id__endWith`).option("--type <value>", `type`).option("--type.not <value>", `type__not`).option("--type.is-null <value>", `type__isNull`).option("--type.is-not-null <value>", `type__isNotNull`).option("--type.equals <value>", `type__equals`).option("--type.contains <value>", `type__contains`).option("--type.starts-with <value>", `type__startsWith`).option("--type.end-with <value>", `type__endWith`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
44826
+ resource.command("list").description(`List quotes with optional filters for id, number, status, customer_id, template_id, crm_opportunity_id, type, and updated_at. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--id <value>", `id`).option("--id.not <value>", `id__not`).option("--id.is-null <value>", `id__isNull`).option("--id.is-not-null <value>", `id__isNotNull`).option("--id.equals <value>", `id__equals`).option("--id.contains <value>", `id__contains`).option("--id.starts-with <value>", `id__startsWith`).option("--id.end-with <value>", `id__endWith`).option("--number <value>", `number`).option("--number.not <value>", `number__not`).option("--number.is-null <value>", `number__isNull`).option("--number.is-not-null <value>", `number__isNotNull`).option("--number.equals <value>", `number__equals`).option("--number.contains <value>", `number__contains`).option("--number.starts-with <value>", `number__startsWith`).option("--number.end-with <value>", `number__endWith`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--template-id <value>", `template_id`).option("--template-id.not <value>", `template_id__not`).option("--template-id.is-null <value>", `template_id__isNull`).option("--template-id.is-not-null <value>", `template_id__isNotNull`).option("--template-id.equals <value>", `template_id__equals`).option("--template-id.contains <value>", `template_id__contains`).option("--template-id.starts-with <value>", `template_id__startsWith`).option("--template-id.end-with <value>", `template_id__endWith`).option("--crm-opportunity-id <value>", `crm_opportunity_id`).option("--crm-opportunity-id.not <value>", `crm_opportunity_id__not`).option("--crm-opportunity-id.is-null <value>", `crm_opportunity_id__isNull`).option("--crm-opportunity-id.is-not-null <value>", `crm_opportunity_id__isNotNull`).option("--crm-opportunity-id.equals <value>", `crm_opportunity_id__equals`).option("--crm-opportunity-id.contains <value>", `crm_opportunity_id__contains`).option("--crm-opportunity-id.starts-with <value>", `crm_opportunity_id__startsWith`).option("--crm-opportunity-id.end-with <value>", `crm_opportunity_id__endWith`).option("--type <value>", `type`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
44805
44827
  Examples:
44806
44828
  hyperline quotes list
44807
44829
  hyperline quotes list --take <take> --id <id>`).action(async (opts) => {
@@ -44897,20 +44919,6 @@ Examples:
44897
44919
  args.crm_opportunity_id__endWith = opts["crmOpportunityId.endWith"];
44898
44920
  if (opts.type !== void 0)
44899
44921
  args.type = opts.type;
44900
- if (opts["type.not"] !== void 0)
44901
- args.type__not = opts["type.not"];
44902
- if (opts["type.isNull"] !== void 0)
44903
- args.type__isNull = opts["type.isNull"];
44904
- if (opts["type.isNotNull"] !== void 0)
44905
- args.type__isNotNull = opts["type.isNotNull"];
44906
- if (opts["type.equals"] !== void 0)
44907
- args.type__equals = opts["type.equals"];
44908
- if (opts["type.contains"] !== void 0)
44909
- args.type__contains = opts["type.contains"];
44910
- if (opts["type.startsWith"] !== void 0)
44911
- args.type__startsWith = opts["type.startsWith"];
44912
- if (opts["type.endWith"] !== void 0)
44913
- args.type__endWith = opts["type.endWith"];
44914
44922
  if (opts.updatedAt !== void 0)
44915
44923
  args.updated_at = opts.updatedAt;
44916
44924
  if (opts["updatedAt.not"] !== void 0)
@@ -44983,13 +44991,6 @@ Examples:
44983
44991
  "crm_opportunity_id__startsWith",
44984
44992
  "crm_opportunity_id__endWith",
44985
44993
  "type",
44986
- "type__not",
44987
- "type__isNull",
44988
- "type__isNotNull",
44989
- "type__equals",
44990
- "type__contains",
44991
- "type__startsWith",
44992
- "type__endWith",
44993
44994
  "updated_at",
44994
44995
  "updated_at__not",
44995
44996
  "updated_at__isNull",
@@ -45025,7 +45026,7 @@ Examples:
45025
45026
  - \`all\`: Display all pricing tiers.
45026
45027
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
45027
45028
  - \`none\`: Hide all pricing tiers.
45028
- `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--crm-opportunity-id <value>", `ID of the related opportunity/deal in the connected CRM.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Set to \`null\` to clear the expiration.`).option("--subscription <json>", `Subscription configuration constituting the quote. When provided on a draft quote, it creates or replaces the draft subscription attached to the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided on a draft one-off quote, it deletes the previous draft invoice and creates a fresh one linked to the quote. \`invoice.invoicing_entity_id\` is ignored on update \u2014 the quote's existing invoicing entity is reused.`).addHelpText("after", `
45029
+ `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-discounts-on-total <value>", `Display discounts on the totals, with product prices before discount. Totals then follow the contract value, so discounts with a limited duration are included.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--crm-opportunity-id <value>", `ID of the related opportunity/deal in the connected CRM.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Set to \`null\` to clear the expiration.`).option("--subscription <json>", `Subscription configuration constituting the quote. When provided on a draft quote, it creates or replaces the draft subscription attached to the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided on a draft one-off quote, it deletes the previous draft invoice and creates a fresh one linked to the quote. \`invoice.invoicing_entity_id\` is ignored on update \u2014 the quote's existing invoicing entity is reused.`).addHelpText("after", `
45029
45030
  Examples:
45030
45031
  hyperline quotes update --id <id>
45031
45032
  hyperline quotes update --id <id> --owner-email <owner_email> --catalog-version-id <catalog_version_id>
@@ -45060,6 +45061,8 @@ Examples:
45060
45061
  args.display_price_tiers = opts.displayPriceTiers;
45061
45062
  if (opts.displayPhaseValue !== void 0)
45062
45063
  args.display_phase_value = opts.displayPhaseValue;
45064
+ if (opts.displayDiscountsOnTotal !== void 0)
45065
+ args.display_discounts_on_total = opts.displayDiscountsOnTotal;
45063
45066
  if (opts.displayFirstInvoiceAmount !== void 0)
45064
45067
  args.display_first_invoice_amount = opts.displayFirstInvoiceAmount;
45065
45068
  if (opts.displayDocumentsInPreview !== void 0)
@@ -45153,6 +45156,25 @@ Examples:
45153
45156
  queryParamKeys: []
45154
45157
  });
45155
45158
  });
45159
+ resource.command("redraft").description(`Switch a quote back to draft so its subscription or invoice configuration can be updated. Works on quotes pending approval, with changes requested, approved, or awaiting signature. Cancels pending approval requests and the signature request; the quote must then be finalized again.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
45160
+ Examples:
45161
+ hyperline quotes redraft --id <id>
45162
+ hyperline quotes redraft --id <id> --output json`).action(async (opts) => {
45163
+ const ctx = resource.parent?.opts()._ctx;
45164
+ if (!ctx) {
45165
+ process.stderr.write("Error: Not authenticated\n");
45166
+ process.exit(1);
45167
+ }
45168
+ const args = {};
45169
+ if (opts.id !== void 0)
45170
+ args.id = opts.id;
45171
+ await ctx.execute({
45172
+ method: "POST",
45173
+ path: "/v1/quotes/{id}/redraft",
45174
+ args,
45175
+ queryParamKeys: []
45176
+ });
45177
+ });
45156
45178
  resource.command("send").description(`Send a quote by email for customer signature. Requires the quote to be approved first.`).requiredOption("--id <value>", `id parameter`).option("--email <value>", `Email address to which the quote will be sent for signature. Required unless the quote has signers, in which case the email goes to the signers of the current step and this field is ignored.`).option("--message <value>", `Custom message used in the email content.`).addHelpText("after", `
45157
45179
  Examples:
45158
45180
  hyperline quotes send --id <id>
@@ -45846,7 +45868,7 @@ Examples:
45846
45868
  queryParamKeys: []
45847
45869
  });
45848
45870
  });
45849
- resource.command("list").description(`List subscriptions with filters for activation_strategy, status, currency, plan_id, original_quote_id, integration_entity_id, customer_id, invoicing_entity_id, purchase_order, updated_at, custom_properties. Draft, voided, cancelled and archived excluded by default (status=all applies the same exclusion); status=any returns every status. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--activation-strategy <value>", `activation_strategy`).option("--activation-strategy.in <value>", `activation_strategy__in`).option("--status <value>", `
45871
+ resource.command("list").description(`List subscriptions with filters for activation_strategy, status, currency, plan_id, original_quote_id, integration_entity_id, customer_id, invoicing_entity_id, purchase_order, updated_at, cancel_at, custom_properties, and the active contract: contract_start__gte/__lte, contract_end__gte/__lte, renew_automatically. For upcoming renewals, combine contract_end__gte/__lte with renew_automatically, plus cancel_at for scheduled cancellations. Draft, voided, cancelled and archived excluded by default (status=all applies the same exclusion); status=any returns every status. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--activation-strategy <value>", `activation_strategy`).option("--activation-strategy.in <value>", `activation_strategy__in`).option("--status <value>", `
45850
45872
  Subscription status filter.
45851
45873
 
45852
45874
  - \`active\`, \`pending\`, \`paused\`, \`errored\`, \`cancelled\`, \`draft\`, \`voided\`, \`archived\`: match that status.
@@ -45855,7 +45877,7 @@ Subscription status filter.
45855
45877
  - \`any\`: every status, no exclusion.
45856
45878
 
45857
45879
  Use \`status__in\` with comma-separated values to combine statuses. When the filter is omitted, \`draft\`, \`voided\`, \`cancelled\` and \`archived\` subscriptions are excluded.
45858
- `).option("--status.in <value>", `Comma-separated list of subscription statuses to include. Same values as \`status\`.`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--plan-id <value>", `plan_id`).option("--plan-id.not <value>", `plan_id__not`).option("--plan-id.is-null <value>", `plan_id__isNull`).option("--plan-id.is-not-null <value>", `plan_id__isNotNull`).option("--plan-id.equals <value>", `plan_id__equals`).option("--plan-id.contains <value>", `plan_id__contains`).option("--plan-id.starts-with <value>", `plan_id__startsWith`).option("--plan-id.end-with <value>", `plan_id__endWith`).option("--original-quote-id <value>", `original_quote_id`).option("--original-quote-id.not <value>", `original_quote_id__not`).option("--original-quote-id.is-null <value>", `original_quote_id__isNull`).option("--original-quote-id.is-not-null <value>", `original_quote_id__isNotNull`).option("--original-quote-id.equals <value>", `original_quote_id__equals`).option("--original-quote-id.contains <value>", `original_quote_id__contains`).option("--original-quote-id.starts-with <value>", `original_quote_id__startsWith`).option("--original-quote-id.end-with <value>", `original_quote_id__endWith`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--purchase-order <value>", `purchase_order`).option("--purchase-order.not <value>", `purchase_order__not`).option("--purchase-order.is-null <value>", `purchase_order__isNull`).option("--purchase-order.is-not-null <value>", `purchase_order__isNotNull`).option("--purchase-order.equals <value>", `purchase_order__equals`).option("--purchase-order.contains <value>", `purchase_order__contains`).option("--purchase-order.starts-with <value>", `purchase_order__startsWith`).option("--purchase-order.end-with <value>", `purchase_order__endWith`).option("--custom-properties <value>", `custom_properties`).option("--invoice-drafts <value>", `invoice_drafts`).option("--integration-entity-id <value>", `integration_entity_id`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
45880
+ `).option("--status.in <value>", `Comma-separated list of subscription statuses to include. Same values as \`status\`.`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--plan-id <value>", `plan_id`).option("--plan-id.not <value>", `plan_id__not`).option("--plan-id.is-null <value>", `plan_id__isNull`).option("--plan-id.is-not-null <value>", `plan_id__isNotNull`).option("--plan-id.equals <value>", `plan_id__equals`).option("--plan-id.contains <value>", `plan_id__contains`).option("--plan-id.starts-with <value>", `plan_id__startsWith`).option("--plan-id.end-with <value>", `plan_id__endWith`).option("--original-quote-id <value>", `original_quote_id`).option("--original-quote-id.not <value>", `original_quote_id__not`).option("--original-quote-id.is-null <value>", `original_quote_id__isNull`).option("--original-quote-id.is-not-null <value>", `original_quote_id__isNotNull`).option("--original-quote-id.equals <value>", `original_quote_id__equals`).option("--original-quote-id.contains <value>", `original_quote_id__contains`).option("--original-quote-id.starts-with <value>", `original_quote_id__startsWith`).option("--original-quote-id.end-with <value>", `original_quote_id__endWith`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--purchase-order <value>", `purchase_order`).option("--purchase-order.not <value>", `purchase_order__not`).option("--purchase-order.is-null <value>", `purchase_order__isNull`).option("--purchase-order.is-not-null <value>", `purchase_order__isNotNull`).option("--purchase-order.equals <value>", `purchase_order__equals`).option("--purchase-order.contains <value>", `purchase_order__contains`).option("--purchase-order.starts-with <value>", `purchase_order__startsWith`).option("--purchase-order.end-with <value>", `purchase_order__endWith`).option("--custom-properties <value>", `custom_properties`).option("--invoice-drafts <value>", `invoice_drafts`).option("--integration-entity-id <value>", `integration_entity_id`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.is-null <value>", `updated_at__isNull`).option("--updated-at.is-not-null <value>", `updated_at__isNotNull`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).option("--cancel-at <value>", `cancel_at`).option("--cancel-at.not <value>", `cancel_at__not`).option("--cancel-at.is-null <value>", `cancel_at__isNull`).option("--cancel-at.is-not-null <value>", `cancel_at__isNotNull`).option("--cancel-at.equals <value>", `cancel_at__equals`).option("--cancel-at.lt <value>", `cancel_at__lt`).option("--cancel-at.lte <value>", `cancel_at__lte`).option("--cancel-at.gt <value>", `cancel_at__gt`).option("--cancel-at.gte <value>", `cancel_at__gte`).option("--contract-start.gte <value>", `Return only subscriptions whose active contract starts on or after this date.`).option("--contract-start.lte <value>", `Return only subscriptions whose active contract starts on or before this date.`).option("--contract-end.gte <value>", `Return only subscriptions whose active contract ends on or after this date.`).option("--contract-end.lte <value>", `Return only subscriptions whose active contract ends on or before this date.`).option("--renew-automatically <value>", `Return only subscriptions whose active contract renews automatically (\`true\`) or not (\`false\`).`).addHelpText("after", `
45859
45881
  Examples:
45860
45882
  hyperline subscriptions list
45861
45883
  hyperline subscriptions list --take <take> --activation-strategy <activation_strategy>`).action(async (opts) => {
@@ -45979,6 +46001,34 @@ Examples:
45979
46001
  args.updated_at__gt = opts["updatedAt.gt"];
45980
46002
  if (opts["updatedAt.gte"] !== void 0)
45981
46003
  args.updated_at__gte = opts["updatedAt.gte"];
46004
+ if (opts.cancelAt !== void 0)
46005
+ args.cancel_at = opts.cancelAt;
46006
+ if (opts["cancelAt.not"] !== void 0)
46007
+ args.cancel_at__not = opts["cancelAt.not"];
46008
+ if (opts["cancelAt.isNull"] !== void 0)
46009
+ args.cancel_at__isNull = opts["cancelAt.isNull"];
46010
+ if (opts["cancelAt.isNotNull"] !== void 0)
46011
+ args.cancel_at__isNotNull = opts["cancelAt.isNotNull"];
46012
+ if (opts["cancelAt.equals"] !== void 0)
46013
+ args.cancel_at__equals = opts["cancelAt.equals"];
46014
+ if (opts["cancelAt.lt"] !== void 0)
46015
+ args.cancel_at__lt = opts["cancelAt.lt"];
46016
+ if (opts["cancelAt.lte"] !== void 0)
46017
+ args.cancel_at__lte = opts["cancelAt.lte"];
46018
+ if (opts["cancelAt.gt"] !== void 0)
46019
+ args.cancel_at__gt = opts["cancelAt.gt"];
46020
+ if (opts["cancelAt.gte"] !== void 0)
46021
+ args.cancel_at__gte = opts["cancelAt.gte"];
46022
+ if (opts["contractStart.gte"] !== void 0)
46023
+ args.contract_start__gte = opts["contractStart.gte"];
46024
+ if (opts["contractStart.lte"] !== void 0)
46025
+ args.contract_start__lte = opts["contractStart.lte"];
46026
+ if (opts["contractEnd.gte"] !== void 0)
46027
+ args.contract_end__gte = opts["contractEnd.gte"];
46028
+ if (opts["contractEnd.lte"] !== void 0)
46029
+ args.contract_end__lte = opts["contractEnd.lte"];
46030
+ if (opts.renewAutomatically !== void 0)
46031
+ args.renew_automatically = opts.renewAutomatically;
45982
46032
  if (opts.take !== void 0)
45983
46033
  args.take = Number(opts.take);
45984
46034
  if (opts.skip !== void 0)
@@ -46046,7 +46096,21 @@ Examples:
46046
46096
  "updated_at__lt",
46047
46097
  "updated_at__lte",
46048
46098
  "updated_at__gt",
46049
- "updated_at__gte"
46099
+ "updated_at__gte",
46100
+ "cancel_at",
46101
+ "cancel_at__not",
46102
+ "cancel_at__isNull",
46103
+ "cancel_at__isNotNull",
46104
+ "cancel_at__equals",
46105
+ "cancel_at__lt",
46106
+ "cancel_at__lte",
46107
+ "cancel_at__gt",
46108
+ "cancel_at__gte",
46109
+ "contract_start__gte",
46110
+ "contract_start__lte",
46111
+ "contract_end__gte",
46112
+ "contract_end__lte",
46113
+ "renew_automatically"
46050
46114
  ]
46051
46115
  });
46052
46116
  });
@@ -63891,6 +63955,223 @@ import * as winston from "winston";
63891
63955
 
63892
63956
  // ../hyperline-monitoring/build/logger/formatting/format.js
63893
63957
  import prune from "json-prune";
63958
+
63959
+ // ../hyperline-monitoring/build/logger/formatting/logRedaction.js
63960
+ var REDACTED_KEY_NAMES = /* @__PURE__ */ new Set([
63961
+ "accesstoken",
63962
+ "apitoken",
63963
+ "assertion",
63964
+ "authorization",
63965
+ "authtoken",
63966
+ "cardnumber",
63967
+ "clientassertion",
63968
+ "codeverifier",
63969
+ "connectionurl",
63970
+ "consumerkey",
63971
+ "cookie",
63972
+ "credential",
63973
+ "credentials",
63974
+ "iban",
63975
+ "idtoken",
63976
+ "privatekey",
63977
+ "publictoken",
63978
+ "refreshtoken",
63979
+ "sessiontoken",
63980
+ "token",
63981
+ "tokenid",
63982
+ "verificationcode"
63983
+ ]);
63984
+ var REDACTED_KEY_SUFFIX_PATTERN = /(secret|password|passphrase|apikey)$/;
63985
+ var REDACTED_KEY_CANDIDATE_PATTERN = /token|key|secret|pass|assertion|verifier|credential|authorization|cookie|iban|cardnumber|code|connectionurl/i;
63986
+ var URL_ONLY_REDACTED_KEYS = /* @__PURE__ */ new Set(["key"]);
63987
+ var OAUTH_CODE_KEY = "code";
63988
+ var OAUTH_CODE_CONTEXT_KEYS = ["state", "grant_type"];
63989
+ var REDACTED_VALUE = "<redacted>";
63990
+ var TRUNCATED_VALUE = "[TRUNCATED: not redacted]";
63991
+ var TRUNCATED_KEY = "[TRUNCATED]";
63992
+ var MAX_REDACTION_DEPTH = 6;
63993
+ var MAX_ARRAY_ENTRIES = 50;
63994
+ var MAX_PARSED_STRING_LENGTH = 16384;
63995
+ var MAX_VISITED_NODES = 5e3;
63996
+ var MAX_CONTAINER_ENTRIES = 1e3;
63997
+ var MAX_STRING_CHARACTERS = 256e3;
63998
+ function redactLogBody({ body }) {
63999
+ return redactValue({
64000
+ value: body,
64001
+ depth: MAX_REDACTION_DEPTH,
64002
+ budget: {
64003
+ remainingNodes: MAX_VISITED_NODES,
64004
+ remainingChars: MAX_STRING_CHARACTERS
64005
+ }
64006
+ });
64007
+ }
64008
+ function redactLogUrl({ url: url2 }) {
64009
+ const queryIndex = url2.indexOf("?");
64010
+ if (queryIndex === -1) {
64011
+ return url2;
64012
+ }
64013
+ if (url2.length > MAX_PARSED_STRING_LENGTH) {
64014
+ return `${url2.slice(0, queryIndex)}?${TRUNCATED_VALUE}`;
64015
+ }
64016
+ const redactedQuery = redactFormEncoded({
64017
+ text: url2.slice(queryIndex + 1),
64018
+ extraRedactedKeys: URL_ONLY_REDACTED_KEYS
64019
+ });
64020
+ return redactedQuery === void 0 ? url2 : `${url2.slice(0, queryIndex)}?${redactedQuery}`;
64021
+ }
64022
+ function redactValue({ value, depth, budget }) {
64023
+ if (isOpaqueObject({ value })) {
64024
+ return replaceOpaqueObject({ value });
64025
+ }
64026
+ if (typeof value === "string") {
64027
+ if (value.length > budget.remainingChars) {
64028
+ return TRUNCATED_VALUE;
64029
+ }
64030
+ budget.remainingChars -= value.length;
64031
+ }
64032
+ if (depth <= 0 || budget.remainingNodes <= 0) {
64033
+ return isInspectable({ value }) ? TRUNCATED_VALUE : value;
64034
+ }
64035
+ budget.remainingNodes -= 1;
64036
+ if (typeof value === "string") {
64037
+ return redactString({ text: value, budget });
64038
+ }
64039
+ if (value instanceof URLSearchParams) {
64040
+ return redactValue({ value: value.toString(), depth, budget });
64041
+ }
64042
+ if (Array.isArray(value)) {
64043
+ return redactArray({ items: value, depth, budget });
64044
+ }
64045
+ if (isPlainObject2(value)) {
64046
+ return redactObject({ record: value, depth, budget });
64047
+ }
64048
+ return value;
64049
+ }
64050
+ function isOpaqueObject({ value }) {
64051
+ return typeof value === "object" && value !== null && !Array.isArray(value) && !isPlainObject2(value) && !(value instanceof URLSearchParams);
64052
+ }
64053
+ function replaceOpaqueObject({ value }) {
64054
+ if (typeof value !== "object" || value === null || value instanceof Date) {
64055
+ return value;
64056
+ }
64057
+ if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {
64058
+ return `[BINARY ${value.byteLength} bytes]`;
64059
+ }
64060
+ if (value instanceof Blob) {
64061
+ return `[BINARY ${value.size} bytes]`;
64062
+ }
64063
+ if (value instanceof FormData || typeof Reflect.get(value, "pipe") === "function") {
64064
+ return "[BINARY stream]";
64065
+ }
64066
+ return TRUNCATED_VALUE;
64067
+ }
64068
+ function redactArray({ items, depth, budget }) {
64069
+ const isTruncated = items.length > MAX_ARRAY_ENTRIES;
64070
+ const keptItems = isTruncated ? items.slice(0, MAX_ARRAY_ENTRIES) : items;
64071
+ let redactedItems;
64072
+ for (const [index, item] of keptItems.entries()) {
64073
+ const redactedItem = redactValue({ value: item, depth: depth - 1, budget });
64074
+ if (redactedItem !== item) {
64075
+ redactedItems ??= [...keptItems];
64076
+ redactedItems[index] = redactedItem;
64077
+ }
64078
+ }
64079
+ const result = redactedItems ?? keptItems;
64080
+ return isTruncated ? [...result, TRUNCATED_VALUE] : result;
64081
+ }
64082
+ function redactObject({ record: record2, depth, budget }) {
64083
+ const redactedEntries = /* @__PURE__ */ new Map();
64084
+ const carriesOAuthCode = OAUTH_CODE_CONTEXT_KEYS.some((contextKey) => Object.hasOwn(record2, contextKey));
64085
+ const keptKeys = [];
64086
+ let isTruncated = false;
64087
+ for (const key in record2) {
64088
+ if (!Object.hasOwn(record2, key)) {
64089
+ continue;
64090
+ }
64091
+ if (keptKeys.length >= MAX_CONTAINER_ENTRIES || key.length > budget.remainingChars) {
64092
+ isTruncated = true;
64093
+ break;
64094
+ }
64095
+ budget.remainingChars -= key.length;
64096
+ keptKeys.push(key);
64097
+ const nestedValue = record2[key];
64098
+ const isSensitiveKey = isRedactedKey({ key }) || carriesOAuthCode && key === OAUTH_CODE_KEY;
64099
+ const shouldRedact = isSensitiveKey && nestedValue != null && typeof nestedValue !== "boolean";
64100
+ if (shouldRedact) {
64101
+ budget.remainingNodes -= 1;
64102
+ }
64103
+ const redactedNestedValue = shouldRedact ? REDACTED_VALUE : redactValue({ value: nestedValue, depth: depth - 1, budget });
64104
+ if (redactedNestedValue !== nestedValue) {
64105
+ redactedEntries.set(key, redactedNestedValue);
64106
+ }
64107
+ }
64108
+ if (isTruncated) {
64109
+ const keptRecord = {};
64110
+ for (const key of keptKeys) {
64111
+ keptRecord[key] = redactedEntries.has(key) ? redactedEntries.get(key) : record2[key];
64112
+ }
64113
+ keptRecord[TRUNCATED_KEY] = TRUNCATED_VALUE;
64114
+ return keptRecord;
64115
+ }
64116
+ return redactedEntries.size === 0 ? record2 : { ...record2, ...Object.fromEntries(redactedEntries) };
64117
+ }
64118
+ function redactString({ text, budget }) {
64119
+ if (text.length > MAX_PARSED_STRING_LENGTH) {
64120
+ return TRUNCATED_VALUE;
64121
+ }
64122
+ if (!isInspectable({ value: text })) {
64123
+ return text;
64124
+ }
64125
+ const trimmedText = text.trim();
64126
+ if (trimmedText.startsWith("{") || trimmedText.startsWith("[")) {
64127
+ try {
64128
+ const parsedValue = JSON.parse(trimmedText);
64129
+ const redactedValue = redactValue({
64130
+ value: parsedValue,
64131
+ depth: MAX_REDACTION_DEPTH,
64132
+ budget
64133
+ });
64134
+ return redactedValue === parsedValue ? text : JSON.stringify(redactedValue);
64135
+ } catch {
64136
+ return REDACTED_KEY_CANDIDATE_PATTERN.test(text) ? TRUNCATED_VALUE : redactFormEncoded({ text }) ?? text;
64137
+ }
64138
+ }
64139
+ return redactFormEncoded({ text }) ?? text;
64140
+ }
64141
+ function redactFormEncoded({ text, extraRedactedKeys }) {
64142
+ if (!text.includes("=") || !REDACTED_KEY_CANDIDATE_PATTERN.test(text)) {
64143
+ return void 0;
64144
+ }
64145
+ const params = new URLSearchParams(text);
64146
+ const carriesOAuthCode = OAUTH_CODE_CONTEXT_KEYS.some((contextKey) => params.has(contextKey));
64147
+ let hasRedactedParam = false;
64148
+ for (const key of new Set(params.keys())) {
64149
+ if (isRedactedKey({ key }) || extraRedactedKeys?.has(key.toLowerCase()) || carriesOAuthCode && key === OAUTH_CODE_KEY) {
64150
+ params.set(key, REDACTED_VALUE);
64151
+ hasRedactedParam = true;
64152
+ }
64153
+ }
64154
+ return hasRedactedParam ? params.toString() : void 0;
64155
+ }
64156
+ function isRedactedKey({ key }) {
64157
+ const normalizedKey = key.toLowerCase().replace(/[_-]/g, "");
64158
+ return REDACTED_KEY_NAMES.has(normalizedKey) || REDACTED_KEY_SUFFIX_PATTERN.test(normalizedKey);
64159
+ }
64160
+ function isInspectable({ value }) {
64161
+ if (typeof value === "string") {
64162
+ return value.length > MAX_PARSED_STRING_LENGTH || /^\s*[{[]/.test(value) || value.includes("=") && REDACTED_KEY_CANDIDATE_PATTERN.test(value);
64163
+ }
64164
+ return value instanceof URLSearchParams || Array.isArray(value) || isPlainObject2(value);
64165
+ }
64166
+ function isPlainObject2(value) {
64167
+ if (typeof value !== "object" || value === null) {
64168
+ return false;
64169
+ }
64170
+ const prototype = Object.getPrototypeOf(value);
64171
+ return prototype === Object.prototype || prototype === null;
64172
+ }
64173
+
64174
+ // ../hyperline-monitoring/build/logger/formatting/format.js
63894
64175
  var REDACTED_HEADER_KEY_PATTERN = /authorization|authenticate|cookie|secret|token|credential|signature|jwt|api[_-]?key|access[_-]?token|refresh[_-]?token|private[_-]?key/i;
63895
64176
  function jsonFormat(info) {
63896
64177
  const prunedInfo = JSON.parse(prune(info));
@@ -63951,14 +64232,106 @@ function transformPrune(info) {
63951
64232
  });
63952
64233
  return info;
63953
64234
  }
64235
+ var MAX_AXIOS_ERROR_DEPTH = 5;
64236
+ var MAX_AXIOS_ERROR_CONTAINER_ENTRIES = 1e3;
64237
+ var MAX_AXIOS_ERROR_VISITED_NODES = 5e3;
64238
+ var REDACTED_BODY_KEYS = /* @__PURE__ */ new Set(["requestBody", "responseBody"]);
63954
64239
  function transformAxiosError(info) {
63955
- Object.entries(info).forEach(([key, value]) => {
63956
- if (typeof value === "object" && value?.name === "AxiosError") {
63957
- info[key] = formatAxiosError(value);
64240
+ let walk;
64241
+ for (const [key, value] of Object.entries(info)) {
64242
+ if (typeof value !== "object" || value === null || REDACTED_BODY_KEYS.has(key)) {
64243
+ continue;
63958
64244
  }
63959
- });
64245
+ walk ??= {
64246
+ formatted: /* @__PURE__ */ new Map(),
64247
+ remainingNodes: MAX_AXIOS_ERROR_VISITED_NODES
64248
+ };
64249
+ const formattedValue = formatNestedAxiosErrors({
64250
+ value,
64251
+ depth: MAX_AXIOS_ERROR_DEPTH,
64252
+ walk
64253
+ });
64254
+ if (formattedValue !== value) {
64255
+ info[key] = formattedValue;
64256
+ }
64257
+ }
63960
64258
  return info;
63961
64259
  }
64260
+ function formatNestedAxiosErrors({ value, depth, walk }) {
64261
+ if (typeof value !== "object" || value === null) {
64262
+ return value;
64263
+ }
64264
+ if (walk.formatted.has(value)) {
64265
+ return walk.formatted.get(value);
64266
+ }
64267
+ if (Reflect.get(value, "name") === "AxiosError") {
64268
+ const formattedError = walk.remainingNodes > 0 ? formatAxiosError(value) : summarizeAxiosError({ error: value });
64269
+ walk.remainingNodes -= 1;
64270
+ walk.formatted.set(value, formattedError);
64271
+ return formattedError;
64272
+ }
64273
+ const isWalkable = Array.isArray(value) || value instanceof Error || isPlainRecord(value);
64274
+ if (!isWalkable || depth <= 0 || walk.remainingNodes <= 0) {
64275
+ return value;
64276
+ }
64277
+ walk.formatted.set(value, "[Circular]");
64278
+ walk.remainingNodes -= 1;
64279
+ const formattedValue = formatWalkableValue({ value, depth, walk });
64280
+ walk.formatted.set(value, formattedValue);
64281
+ return formattedValue;
64282
+ }
64283
+ function summarizeAxiosError({ error: error48 }) {
64284
+ return {
64285
+ name: Reflect.get(error48, "name"),
64286
+ message: Reflect.get(error48, "message"),
64287
+ code: Reflect.get(error48, "code")
64288
+ };
64289
+ }
64290
+ function formatWalkableValue({ value, depth, walk }) {
64291
+ if (Array.isArray(value)) {
64292
+ if (value.length > MAX_AXIOS_ERROR_CONTAINER_ENTRIES) {
64293
+ return value;
64294
+ }
64295
+ let formattedItems;
64296
+ for (const [index, item] of value.entries()) {
64297
+ const formattedItem = formatNestedAxiosErrors({
64298
+ value: item,
64299
+ depth: depth - 1,
64300
+ walk
64301
+ });
64302
+ if (formattedItem !== item) {
64303
+ formattedItems ??= [...value];
64304
+ formattedItems[index] = formattedItem;
64305
+ }
64306
+ }
64307
+ return formattedItems ?? value;
64308
+ }
64309
+ const keys = Object.keys(value);
64310
+ if (keys.length > MAX_AXIOS_ERROR_CONTAINER_ENTRIES) {
64311
+ return value;
64312
+ }
64313
+ const formattedEntries = /* @__PURE__ */ new Map();
64314
+ for (const key of keys) {
64315
+ const nestedValue = Reflect.get(value, key);
64316
+ const formattedNestedValue = formatNestedAxiosErrors({
64317
+ value: nestedValue,
64318
+ depth: depth - 1,
64319
+ walk
64320
+ });
64321
+ if (formattedNestedValue !== nestedValue) {
64322
+ formattedEntries.set(key, formattedNestedValue);
64323
+ }
64324
+ }
64325
+ if (formattedEntries.size === 0) {
64326
+ return value;
64327
+ }
64328
+ return {
64329
+ ...value,
64330
+ // Error properties are not enumerable, so the spread would drop them.
64331
+ ...value instanceof Error ? { name: value.name, message: value.message, stack: value.stack } : {},
64332
+ ...Object.fromEntries(formattedEntries)
64333
+ };
64334
+ }
63962
64335
  function formatAxiosError(error48) {
63963
64336
  if (!isRecord(error48) || error48.name !== "AxiosError") {
63964
64337
  return error48;
@@ -63971,9 +64344,9 @@ function formatAxiosError(error48) {
63971
64344
  code: error48.code,
63972
64345
  request: {
63973
64346
  method: request?.method,
63974
- url: request?.url,
64347
+ url: typeof request?.url === "string" ? redactLogUrl({ url: request.url }) : request?.url,
63975
64348
  baseURL: request?.baseURL,
63976
- params: request?.params,
64349
+ params: redactLogBody({ body: request?.params }),
63977
64350
  headers: redactHeaders({ headers: request?.headers }),
63978
64351
  "axios-retry": request?.["axios-retry"]
63979
64352
  },
@@ -63981,7 +64354,7 @@ function formatAxiosError(error48) {
63981
64354
  status: response?.status,
63982
64355
  statusText: response?.statusText,
63983
64356
  headers: redactHeaders({ headers: response?.headers }),
63984
- data: response?.data
64357
+ data: redactLogBody({ body: response?.data })
63985
64358
  }
63986
64359
  };
63987
64360
  }
@@ -63994,6 +64367,10 @@ function redactHeaders({ headers }) {
63994
64367
  REDACTED_HEADER_KEY_PATTERN.test(headerKey) ? "<redacted>" : headerValue
63995
64368
  ]));
63996
64369
  }
64370
+ function isPlainRecord(value) {
64371
+ const prototype = Object.getPrototypeOf(value);
64372
+ return prototype === Object.prototype || prototype === null;
64373
+ }
63997
64374
  function isRecord(value) {
63998
64375
  return typeof value === "object" && value !== null && !Array.isArray(value);
63999
64376
  }
@@ -64023,7 +64400,7 @@ function logHttpResponse(logger2, response, responseTime, extra) {
64023
64400
  const responseMetadata = {
64024
64401
  statusCode,
64025
64402
  responseTime,
64026
- responseBody,
64403
+ responseBody: redactLogBody({ body: responseBody }),
64027
64404
  // Redacted so secrets (authorization/cookie/token/…) never reach the logs
64028
64405
  // while diagnostic headers (e.g. rate-limit headers on a 429) stay visible.
64029
64406
  responseHeaders: responseHeaders === void 0 ? void 0 : redactHeaders({ headers: responseHeaders })
@@ -64036,14 +64413,15 @@ function logHttpResponse(logger2, response, responseTime, extra) {
64036
64413
  }
64037
64414
  function transform2(request) {
64038
64415
  const method = request.method.toUpperCase();
64039
- const message = `${method} ${request.originalUrl}`;
64416
+ const originalUrl = redactLogUrl({ url: request.originalUrl });
64417
+ const message = `${method} ${originalUrl}`;
64040
64418
  const metadata = {};
64041
64419
  metadata.method = method;
64042
- metadata.url = request.url;
64043
- metadata.path = request.path;
64420
+ metadata.url = redactLogUrl({ url: request.url });
64421
+ metadata.path = redactLogUrl({ url: request.path });
64044
64422
  metadata.hostname = request.hostname;
64045
- metadata.originalUrl = request.originalUrl;
64046
- metadata.requestBody = request.body && typeof request.body === "object" && "apiKey" in request.body ? { ...request.body, apiKey: "<redacted>" } : request.body;
64423
+ metadata.originalUrl = originalUrl;
64424
+ metadata.requestBody = redactLogBody({ body: request.body });
64047
64425
  metadata.routePath = transformUrlIntoRoutePath(request);
64048
64426
  metadata.apiKeyEnd = request.headers["authorization"]?.slice(-6);
64049
64427
  return { message, metadata };
@@ -64090,7 +64468,16 @@ function buildLoggerFactory({ config: config4, context }) {
64090
64468
  const internalLogger = winston.createLogger({
64091
64469
  transports: transports2,
64092
64470
  defaultMeta,
64093
- format: winston.format.combine(winston.format.splat(), winston.format(addMetadata({ getCorrelationId, getExecutionContext }))(), winston.format(transformErrorEnrich)({ depth: 5 }), winston.format(transformPrune)(), winston.format(transformAxiosError)(), winston.format.timestamp()),
64471
+ format: winston.format.combine(
64472
+ winston.format.splat(),
64473
+ winston.format(addMetadata({ getCorrelationId, getExecutionContext }))(),
64474
+ // Before pruning: json-prune would otherwise serialize a binary
64475
+ // `response.data` byte by byte before it is summarised (#6006).
64476
+ winston.format(transformAxiosError)(),
64477
+ winston.format(transformErrorEnrich)({ depth: 5 }),
64478
+ winston.format(transformPrune)(),
64479
+ winston.format.timestamp()
64480
+ ),
64094
64481
  exitOnError: false
64095
64482
  });
64096
64483
  function createLogger3({ serviceName }) {
@@ -66440,7 +66827,12 @@ var import_shared4 = __toESM(require_shared(), 1);
66440
66827
  var MILLISECONDS_PER_HOUR = 60 * 60 * 1e3;
66441
66828
  var MILLISECONDS_PER_DAY = 24 * MILLISECONDS_PER_HOUR;
66442
66829
  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");
66830
+ var dateRealignmentModeSchema = external_exports.enum([
66831
+ "utc_midnight_import",
66832
+ "dst_hour_drift",
66833
+ "month_start_drift",
66834
+ "manual_phase_end_midnight"
66835
+ ]).default("utc_midnight_import");
66444
66836
  var DST_HOUR_SHIFT_BY_LOCAL_MILLISECOND_OF_DAY = /* @__PURE__ */ new Map([
66445
66837
  [23 * MILLISECONDS_PER_HOUR, MILLISECONDS_PER_HOUR],
66446
66838
  [LAST_MILLISECOND_OF_DAY - MILLISECONDS_PER_HOUR, MILLISECONDS_PER_HOUR],
@@ -66515,150 +66907,6 @@ var isAxiosError = axios.isAxiosError;
66515
66907
  // ../hyperline-lib/build/httpClient/httpClient.js
66516
66908
  import axios2 from "axios";
66517
66909
  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
66662
66910
  import { AxiosError } from "axios";
66663
66911
  var recommendedRetryConfig = {
66664
66912
  retries: 3,
@@ -66726,14 +66974,14 @@ function isTooManyRequestsError(error48) {
66726
66974
  return error48.response?.status === 429;
66727
66975
  }
66728
66976
  var toLogRequest = (config4) => {
66729
- const url2 = redactLogUrl({ url: config4.url ?? "" });
66977
+ const url2 = config4.url ?? "";
66730
66978
  return {
66731
66979
  method: config4.method ?? "",
66732
66980
  url: url2,
66733
66981
  path: url2,
66734
66982
  hostname: config4.baseURL ?? "",
66735
66983
  originalUrl: `${config4.baseURL ?? ""}${url2}`,
66736
- body: redactLogBody({ body: config4.data }),
66984
+ body: config4.data,
66737
66985
  headers: {}
66738
66986
  };
66739
66987
  };
@@ -66753,9 +67001,13 @@ import multer2 from "multer";
66753
67001
  // ../hyperline-lib/build/httpRouter/file.js
66754
67002
  import helmet from "helmet";
66755
67003
 
66756
- // ../hyperline-lib/build/publicApi/auth/index.js
67004
+ // ../hyperline-lib/build/publicApi/auth/apiKey.js
66757
67005
  import { randomBytes as randomBytes2, scryptSync } from "node:crypto";
66758
67006
 
67007
+ // ../hyperline-lib/build/publicApi/auth/apiKeyHashCache.js
67008
+ import { createHash as createHash4 } from "node:crypto";
67009
+ var TTL_MS = 5 * 6e4;
67010
+
66759
67011
  // ../hyperline-mcp/build/requestBuilder.js
66760
67012
  function buildRequestConfig(path2, args, method, queryParamKeys = []) {
66761
67013
  const { url: url2, usedKeys } = replacePathParams(path2, args);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperline/cli",
3
- "version": "0.1.0-build.1.7eb82b4",
3
+ "version": "0.1.0-build.1.8040445",
4
4
  "description": "Agent-first CLI for Hyperline API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",