@robinmordasiewicz/f5xc-xcsh 1.0.84-2601020342 → 1.0.85-2601020718

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -44108,9 +44108,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44108
44108
  ["admin_console_and_ui", {
44109
44109
  name: "admin_console_and_ui",
44110
44110
  displayName: "Admin Console And Ui",
44111
- description: "Create administrative dashboard building blocks with tailored setup data and view bindings. Organize presentational materials by namespace and fetch them by name or list all available items. Define display parameters, track system object relationships, and maintain consistent portal appearance through centralized resource management workflows.",
44112
- descriptionShort: "Manage static UI components for admin console.",
44113
- descriptionMedium: "Deploy and retrieve graphical elements within namespaces. Configure custom startup parameters and view references for display composition.",
44111
+ description: "Dashboard customization through namespace-bounded asset libraries. Storage systems for branding resources, layout templates, and interactive widgets. Catalog organization with system object references tracking modification history and deployment status. Schema enforcement ensuring configuration validity across tenant hierarchies and environment boundaries.",
44112
+ descriptionShort: "Static UI components and console assets.",
44113
+ descriptionMedium: "Namespace-scoped visual elements with versioning. Custom widget deployment and catalog management for portal surfaces.",
44114
44114
  aliases: ["console-ui", "ui-assets", "static-components"],
44115
44115
  complexity: "simple",
44116
44116
  isPreview: false,
@@ -44147,9 +44147,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44147
44147
  ["api", {
44148
44148
  name: "api",
44149
44149
  displayName: "Api",
44150
- description: "Catalog services automatically to maintain an inventory of operations and their characteristics. Organize related resources by function or ownership through logical groupings. Establish verification procedures that confirm authentication requirements and expected response structures. Link definitions with load balancers for traffic routing decisions. Flag non-standard paths for exclusion from automated scanning. Monitor resource status and metadata throughout deployment zones.",
44151
- descriptionShort: "Discover, catalog, and test service interfaces.",
44152
- descriptionMedium: "Define interface groups and discovery policies. Set up verification rules to check security posture and expected patterns across environments.",
44150
+ description: "Structured classification systems with versioning support for contract evolution. Hierarchical groupings segment resources by operational role or security boundaries. Behavioral verification confirms authentication flows and permission constraints. Token and key safeguards protect sensitive credentials. Traffic inspection through connected load balancers and firewalls enables threat detection at network perimeters.",
44151
+ descriptionShort: "Interface definitions, schema validation, and grouping.",
44152
+ descriptionMedium: "Resource cataloging with automatic classification and security profiling. Organizational hierarchies segment access by function or protection policy.",
44153
44153
  aliases: ["apisec", "api-discovery"],
44154
44154
  complexity: "advanced",
44155
44155
  isPreview: false,
@@ -44299,9 +44299,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44299
44299
  ["bigip", {
44300
44300
  name: "bigip",
44301
44301
  displayName: "Bigip",
44302
- description: "Define custom rule-based policies governing routing decisions and request handling. Build organized collections for network ranges, string patterns, and key-value entries. Map cloud services to physical appliances through connector setups. Link identity workflows using access modules. Track performance metrics and coordinate synchronization between components.",
44303
- descriptionShort: "Manage iRules, data groups, and virtual servers.",
44304
- descriptionMedium: "Configure traffic logic scripts and structured list entries. Establish appliance bindings and access module integrations.",
44302
+ description: "On-premises appliance connector enabling iRule lifecycle operations and data group replication. APM policy coordination, virtual server configuration binding, and CNE linkage. Telemetry aggregation and health status monitoring across hybrid infrastructure deployments.",
44303
+ descriptionShort: "iRules, data groups, and APM integration.",
44304
+ descriptionMedium: "Legacy device orchestration with iRule scripts and data group synchronization. Virtual server bindings and metrics collection.",
44305
44305
  aliases: ["f5-bigip", "irule", "ltm"],
44306
44306
  complexity: "moderate",
44307
44307
  isPreview: false,
@@ -44338,9 +44338,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44338
44338
  ["billing_and_usage", {
44339
44339
  name: "billing_and_usage",
44340
44340
  displayName: "Billing And Usage",
44341
- description: "Set up payment methods with primary and secondary designations for redundancy. Initiate plan transitions between subscription tiers with state tracking. Download invoice PDFs and query custom invoice lists by date range or status. Define quota limits per namespace and monitor current usage against allocated capacity. Swap payment method roles without service interruption.",
44342
- descriptionShort: "Manage subscription plans and payment methods.",
44343
- descriptionMedium: "Configure billing transitions and payment processing. Track invoices and monitor resource quota consumption across namespaces.",
44341
+ description: "Subscription lifecycle with plan transitions and billing states. Payment method hierarchies supporting primary and secondary configurations. Invoice generation with PDF downloads and custom listing. Resource quotas per namespace with limit definitions and consumption metrics. Contact types for billing notifications and tenant deletion workflows.",
44342
+ descriptionShort: "Subscription plans, payment methods, and quotas.",
44343
+ descriptionMedium: "Plan transitions, invoicing, and resource consumption. Namespace-level quota limits and usage tracking.",
44344
44344
  aliases: ["billing-usage", "quotas", "usage-tracking"],
44345
44345
  complexity: "moderate",
44346
44346
  isPreview: false,
@@ -44387,9 +44387,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44387
44387
  ["blindfold", {
44388
44388
  name: "blindfold",
44389
44389
  displayName: "Blindfold",
44390
- description: "Define policy rules with label matching and combining algorithms. Set up transformers and matchers to control data safeguarding. Track access patterns through timestamped records with scroll queries and date groupings. Retrieve public keys for cryptographic operations and process policy information for decryption workflows.",
44391
- descriptionShort: "Manage secret encryption and policy rules.",
44392
- descriptionMedium: "Configure protection policies and access controls for sensitive data. Monitor usage through detailed logs and date-based rollups.",
44390
+ description: "Public key retrieval and secret policy enforcement for encrypted data handling. Policy rules govern access with configurable matching and transformation actions. VoltShare integration provides decryption services, access counting, and audit log aggregation. Namespace-scoped policies enable fine-grained control over sensitive information with administrative overrides.",
44391
+ descriptionShort: "Secret encryption, key policies, and audit trails.",
44392
+ descriptionMedium: "Encryption key management with policy-based access controls. Audit logging and secure data protection.",
44393
44393
  aliases: ["bf", "encrypt", "secrets"],
44394
44394
  complexity: "moderate",
44395
44395
  isPreview: false,
@@ -44436,9 +44436,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44436
44436
  ["bot_and_threat_defense", {
44437
44437
  name: "bot_and_threat_defense",
44438
44438
  displayName: "Bot And Threat Defense",
44439
- description: "Deploy namespace-scoped protection using behavioral analysis and machine learning. Provision dedicated keys for system automation and real-time intelligence feeds. Coordinate detection across protected applications through centralized managers. Configure pre-authentication checks to identify suspicious patterns before they reach backends. Enable adaptive blocking decisions based on risk scoring and historical activity profiles.",
44440
- descriptionShort: "Detect and block automated attacks.",
44441
- descriptionMedium: "Create bot defense instances with Shape integration. Set up traffic classification rules and automated response policies for malicious actors.",
44439
+ description: "Behavioral fingerprinting identifies automated clients through request patterns, mouse movements, and JavaScript execution. Threat categories classify attacks by type including credential stuffing, scraping, and denial-of-service. Defense instances apply per-namespace policies with configurable sensitivity thresholds and challenge actions. Provisioning handles integration credentials for third-party threat intelligence feeds.",
44440
+ descriptionShort: "Bot detection, threat categories, and defense instances.",
44441
+ descriptionMedium: "Threat classification with behavioral analysis and signature matching. Automated blocking for malicious traffic patterns.",
44442
44442
  aliases: ["threat-defense", "tpm", "shape-bot"],
44443
44443
  complexity: "moderate",
44444
44444
  isPreview: false,
@@ -44475,9 +44475,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44475
44475
  ["cdn", {
44476
44476
  name: "cdn",
44477
44477
  displayName: "Cdn",
44478
- description: "Set up cache eligibility based on headers, cookies, and query parameters. Create expression-based rules with custom TTL settings and path matchers. Deploy load balancers that handle content distribution across origin pools. Monitor access logs and metrics, aggregate performance data, and execute cache purge operations when content updates require immediate invalidation.",
44479
- descriptionShort: "Configure caching rules and load balancing.",
44480
- descriptionMedium: "Define cache rules, TTLs, and path matching. Manage load balancers with origin pools and purge operations.",
44478
+ description: "Content distribution through global edge networks with rule-based eligibility. Path matchers, cookie patterns, and query parameter filters control caching behavior. Expression-based rules enable fine-grained targeting by request attributes. Load balancer integration provides throughput aggregation, request log queries, and on-demand cache clearing across worldwide distribution points.",
44479
+ descriptionShort: "Edge caching, content delivery, and distribution rules.",
44480
+ descriptionMedium: "Path-based policies with TTL controls and header conditions. Purge operations, access logs, and cache eligibility for multi-region deployments.",
44481
44481
  aliases: ["cache", "content"],
44482
44482
  complexity: "advanced",
44483
44483
  isPreview: false,
@@ -44516,9 +44516,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44516
44516
  ["ce_management", {
44517
44517
  name: "ce_management",
44518
44518
  displayName: "Ce Management",
44519
- description: "Define network connectivity parameters including address allocation ranges, dual-stack protocol support, and isolated administrative ports for out-of-band access. Group physical locations under common policy templates for streamlined oversight. Onboard new deployments through secure credential workflows with expiration policies. Execute controlled software transitions featuring pre-flight validation, rollback capabilities, and progress tracking to maintain service continuity.",
44520
- descriptionShort: "Manage Customer Edge sites and network interfaces.",
44521
- descriptionMedium: "Configure DHCP pools, IPv6 addressing, and dedicated management ports. Handle site tokens with lifecycle controls and software version transitions.",
44519
+ description: "Customer edge node lifecycle through secure enrollment tokens and downloadable deployment images. Network connectivity options span exclusive, common, and administrative pathways with DHCP address pools supporting both IPv4 and IPv6. Bulk grouping consolidates configuration across distributed locations. Compatibility verification runs before software updates, with rollout tracking for version progression across the infrastructure.",
44520
+ descriptionShort: "Network interfaces, fleets, and site registration.",
44521
+ descriptionMedium: "Token-based provisioning with image downloads and pre-upgrade validation. Fleet grouping enables bulk operations across distributed locations.",
44522
44522
  aliases: ["ce-mgmt", "edge-management", "ce-lifecycle"],
44523
44523
  complexity: "advanced",
44524
44524
  isPreview: false,
@@ -44565,9 +44565,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44565
44565
  ["certificates", {
44566
44566
  name: "certificates",
44567
44567
  displayName: "Certificates",
44568
- description: "Create PKI artifacts organizing cryptographic identity materials by namespace for multi-tenant isolation. Deploy keypair bundles with issuer hierarchies for TLS termination. Establish verification anchor collections governing which external parties can authenticate. Maintain deny-lists blocking compromised identities from initiating sessions. Organize resources within independent security boundaries supporting granular access control.",
44569
- descriptionShort: "Manage SSL/TLS certificate chains and trusted CAs.",
44570
- descriptionMedium: "Configure certificate manifests linking keys to credential bundles. Define trust anchors for validating client authenticity during mutual TLS.",
44568
+ description: "X.509 certificate chains with intermediate and root CA support. Trusted CA list bundles for client authentication and mTLS validation. CRL distribution points and OCSP stapling configuration. Certificate manifests link credentials to load balancers and gateways. Automatic expiration tracking and renewal notifications.",
44569
+ descriptionShort: "SSL/TLS chains, trusted CAs, and revocation lists.",
44570
+ descriptionMedium: "Certificate chains and trusted CA bundles. Revocation list management and manifest configuration for PKI operations.",
44571
44571
  aliases: ["cert", "certs", "ssl", "tls"],
44572
44572
  complexity: "moderate",
44573
44573
  isPreview: false,
@@ -44614,9 +44614,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44614
44614
  ["cloud_infrastructure", {
44615
44615
  name: "cloud_infrastructure",
44616
44616
  displayName: "Cloud Infrastructure",
44617
- description: "Establish connections to AWS, Azure, and GCP environments with secure authentication and network discovery. Define gateway links, edge site peering, and elastic provisioning workflows. Monitor segment performance and connection health across geographic regions. Create automated VPC attachment policies with intelligent path selection between customer locations and cloud workloads.",
44618
- descriptionShort: "Connect and manage multi-cloud providers.",
44619
- descriptionMedium: "Configure cloud provider credentials and VPC attachments. Manage AWS transit gateways, Azure route tables, and cross-cloud connectivity.",
44617
+ description: "Hyperscaler integration supporting Amazon Web Services, Microsoft Azure, and Google Cloud Platform environments. Virtual network attachment workflows enable elastic compute provisioning with automatic reattachment capabilities. Edge authentication secrets for provider access. Segment telemetry and cross-region link reapplication for distributed deployments. Autonomous path synchronization across peered networks with real-time topology updates.",
44618
+ descriptionShort: "AWS, Azure, GCP connectors and VPC attachments.",
44619
+ descriptionMedium: "Multi-cloud provider connections with gateway peering and network path configuration. Credential vault integration and subnet enumeration.",
44620
44620
  aliases: ["cloud", "infra", "provider"],
44621
44621
  complexity: "moderate",
44622
44622
  isPreview: false,
@@ -44679,9 +44679,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44679
44679
  ["container_services", {
44680
44680
  name: "container_services",
44681
44681
  displayName: "Container Services",
44682
- description: "Create definitions for applications running on distributed infrastructure. Establish standardized templates controlling resource consumption and disk limits. Set up partitioned execution contexts supporting namespace separation and multi-tenant isolation. Track persistent volume claims and usage metrics. Connect with mesh networking for traffic routing.",
44683
- descriptionShort: "Deploy containerized workloads across sites.",
44684
- descriptionMedium: "Run services with simplified orchestration. Define blueprints governing processor and storage allocation.",
44682
+ description: "Namespaced isolation with configurable limits and autoscaling policies. vK8s abstracts operational overhead while providing scheduling, persistent storage, and service mesh integration. Compute profiles specify CPU, memory, and GPU allocations for reproducible environments. Telemetry tracks consumption patterns across geographically distributed infrastructure nodes.",
44683
+ descriptionShort: "Containerized workloads and virtual Kubernetes clusters.",
44684
+ descriptionMedium: "Pod orchestration without full cluster complexity. Edge site execution, quota enforcement, and standardized compute profiles for distributed apps.",
44685
44685
  aliases: ["vk8s", "containers", "workloads"],
44686
44686
  complexity: "moderate",
44687
44687
  isPreview: false,
@@ -44732,9 +44732,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44732
44732
  ["data_and_privacy_security", {
44733
44733
  name: "data_and_privacy_security",
44734
44734
  displayName: "Data And Privacy Security",
44735
- description: "Set up sensitive data policies that identify and protect personally identifiable information across traffic flows. Create custom data type definitions matching organizational privacy standards and industry regulations. Configure LMA region parameters including Clickhouse, Elastic, and Kafka integrations. Deploy geo-configurations enforcing data residency rules and regional compliance mandates. Monitor detection status through condition tracking and secret management with blindfold encryption.",
44736
- descriptionShort: "Configure sensitive data detection and privacy policies.",
44737
- descriptionMedium: "Define custom data types for PII classification. Manage LMA regions and geo-configurations to meet regulatory compliance requirements.",
44735
+ description: "Pattern-based detection for personally identifiable information across request and response payloads. Custom data type definitions enable organization-specific classification beyond built-in PII categories. Regional log and metrics aggregation with Clickhouse, Elasticsearch, and Kafka export options. Geo-configuration policies enforce data residency requirements and jurisdiction-specific privacy regulations.",
44736
+ descriptionShort: "PII detection, data types, and regional compliance.",
44737
+ descriptionMedium: "Sensitive data policies with custom classification rules. LMA region configuration and geo-based compliance controls.",
44738
44738
  aliases: ["data-privacy", "pii", "sensitive-data", "lma"],
44739
44739
  complexity: "simple",
44740
44740
  isPreview: false,
@@ -44810,9 +44810,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44810
44810
  ["ddos", {
44811
44811
  name: "ddos",
44812
44812
  displayName: "Ddos",
44813
- description: "Deploy definitions that block IP addresses and network segments from accessing protected resources. Organize by threat type or source classification. Manage secure channels routing suspicious packets for analysis before reaching origin servers. Update status for real-time visibility into active defenses. Add items during attacks and monitor health metrics.",
44814
- descriptionShort: "Configure blocking policies and tunnel protection.",
44815
- descriptionMedium: "Set up firewall configurations with deny list rules. Filter malicious traffic through inspection points.",
44813
+ description: "Network perimeter hardening through deny list configurations, rule group hierarchies, and encrypted tunnel endpoints. Attack signature detection identifies flood patterns while throttling mechanisms block anomalous traffic bursts. Tunnel health checks verify coverage across distributed segments. Priority ordering governs policy application for multi-layered screening approaches.",
44814
+ descriptionShort: "Volumetric attack mitigation and traffic scrubbing.",
44815
+ descriptionMedium: "Deny lists, firewall rule groups, and tunnel-based safeguards. Rate limiting and pattern analysis for network perimeter security.",
44816
44816
  aliases: ["dos", "ddos-protect"],
44817
44817
  complexity: "advanced",
44818
44818
  isPreview: false,
@@ -44851,9 +44851,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44851
44851
  ["dns", {
44852
44852
  name: "dns",
44853
44853
  displayName: "Dns",
44854
- description: "Set up primary and secondary zones with support for A, AAAA, CNAME, CAA, CERT, and AFSDB record types. Define health checks to monitor target availability and enable automatic failover between record destinations. Clone existing domains, import zone configurations from external servers, or export zone files for backup. Track query metrics and request logs to analyze resolution patterns across namespaces.",
44855
- descriptionShort: "Manage zones, records, and load balancing.",
44856
- descriptionMedium: "Configure authoritative name services with record sets and health checks. Import zones from BIND files or transfer via AXFR protocol.",
44854
+ description: "Primary and secondary zone configuration with support for A, AAAA, CNAME, CAA, CERT, and AFSDB record types. Zone cloning, BIND file imports, and AXFR transfers for migration. Load balancer health checks with metrics collection and request log analysis. Compliance policies and RRSet management for enterprise name resolution.",
44855
+ descriptionShort: "Zones, record types, and load balancing.",
44856
+ descriptionMedium: "Authoritative zone hosting with BIND and AXFR imports. Health checks, failover policies, and request logging.",
44857
44857
  aliases: ["dns-zone", "zones"],
44858
44858
  complexity: "advanced",
44859
44859
  isPreview: false,
@@ -44954,9 +44954,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44954
44954
  ["generative_ai", {
44955
44955
  name: "generative_ai",
44956
44956
  displayName: "Generative Ai",
44957
- description: "Set up query evaluation and response handling for intelligent assistant workflows. Manage rating collection with positive and negative outcome tracking. Subscribe to data streams for traffic pattern detection and behavioral analysis. Allocate and deallocate IP resources for ML infrastructure. Control feature enablement and token management for telemetry collection paths.",
44958
- descriptionShort: "Access AI assistant queries and feedback.",
44959
- descriptionMedium: "Configure machine learning interactions and collect response ratings. Enable flow pattern monitoring through data subscription channels.",
44957
+ description: "Query handling through inference routing with production and test modes. Positive and negative quality markers with detailed categorization capture assistant performance. Streaming connections support authenticated access, subscription lifecycles, and feature flags. IP provisioning services allocate infrastructure resources for model workloads across distributed systems.",
44958
+ descriptionShort: "AI assistant queries and feedback collection.",
44959
+ descriptionMedium: "Natural language processing with quality signals and anomaly monitoring. Token authentication for data stream subscriptions.",
44960
44960
  aliases: ["ai", "genai", "assistant"],
44961
44961
  complexity: "simple",
44962
44962
  isPreview: true,
@@ -44995,9 +44995,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
44995
44995
  ["managed_kubernetes", {
44996
44996
  name: "managed_kubernetes",
44997
44997
  displayName: "Managed Kubernetes",
44998
- description: "Create granular access controls for namespace resources and non-resource URLs. Map permissions to users, groups, or service accounts through binding configurations. Deploy security admission enforcement using baseline, restricted, or privileged profiles. Register private image sources with credential management for secure pulls. Integrate with external managed solutions including EKS, AKS, and GKE infrastructure.",
44999
- descriptionShort: "Configure Kubernetes RBAC and pod security policies.",
45000
- descriptionMedium: "Define permission boundaries for workload access. Set up private image repositories with authentication for enterprise deployments.",
44998
+ description: "Role-based access controls with cluster-scoped permissions and namespace bindings. Pod security admission levels enforce baseline, restricted, or privileged profiles. Container registry credentials support private image pulls across hybrid deployments. Policy rules define resource verbs, groups, and non-resource URL access patterns.",
44999
+ descriptionShort: "Cluster RBAC, pod security, and container registries.",
45000
+ descriptionMedium: "Kubernetes role bindings and admission policies. Registry integration for EKS, AKS, and GKE workloads.",
45001
45001
  aliases: ["mk8s", "appstack", "k8s-mgmt"],
45002
45002
  complexity: "moderate",
45003
45003
  isPreview: false,
@@ -45046,9 +45046,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45046
45046
  ["marketplace", {
45047
45047
  name: "marketplace",
45048
45048
  displayName: "Marketplace",
45049
- description: "Set up secure tunnel connections using IKEv1/IKEv2 parameters, GRE encapsulation with source and destination addressing, or dedicated link types. Manage DPD keep-alive timers and tunnel termination points for reliable connectivity. Activate purchasable services with namespace-scoped status tracking. Create custom portal widgets for interface integration and configure Cloud Manager instances for Terraform and infrastructure automation workflows.",
45050
- descriptionShort: "Manage third-party integrations and add-ons.",
45051
- descriptionMedium: "Configure connector tunnels with IPSec, GRE, or direct links. Deploy purchasable services and portal customizations across namespaces.",
45049
+ description: "External connector infrastructure supporting direct, GRE, and encrypted tunnel modes with IKE parameter configuration and dead peer detection intervals. Cloud provider instances for Terraform automation and vendor partnerships. Service catalog entries with per-namespace activation flags, resource quotas, and administrative dashboard tile arrangement for operational workflows.",
45050
+ descriptionShort: "Add-on services, connectors, and TPM policies.",
45051
+ descriptionMedium: "Third-party GRE and IPSec tunnel provisioning with DPD timers. Shared resource allocation across namespaces with tile placement controls.",
45052
45052
  aliases: ["market", "addons", "extensions"],
45053
45053
  complexity: "moderate",
45054
45054
  isPreview: false,
@@ -45085,9 +45085,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45085
45085
  ["network", {
45086
45086
  name: "network",
45087
45087
  displayName: "Network",
45088
- description: "Deploy secure site connectivity using IPsec tunnels with customizable IKE phase settings, encryption algorithms, and DH groups. Configure BGP routing with peer state monitoring, ASN management, and traffic policies. Set up SRv6 segments, IP prefix sets, and subnet definitions. Manage DC cluster groups for data center integration and define routes for traffic steering across distributed infrastructure.",
45089
- descriptionShort: "Configure BGP routing, tunnels, and connectivity.",
45090
- descriptionMedium: "Manage IPsec tunnels and IKE configurations. Define BGP peers, ASN assignments, and routing policies for site-to-site connections.",
45088
+ description: "Routing table manipulation via peer state machines and path selection algorithms. Secure conduits between locations using IKE handshakes, cipher suites, and key exchanges. Segment attachments bridge hybrid topologies spanning cloud providers and on-premises infrastructure. SRv6 addressing, CIDR block matching, and advertisement controls direct traffic flows across distributed deployments with granular policy enforcement.",
45089
+ descriptionShort: "BGP peering, IPsec tunnels, and segment policies.",
45090
+ descriptionMedium: "Border gateway protocol with ASN management and autonomous system relationships. Site-to-site VPN linking datacenters through encrypted channels.",
45091
45091
  aliases: ["net", "routing", "bgp"],
45092
45092
  complexity: "advanced",
45093
45093
  isPreview: false,
@@ -45140,9 +45140,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45140
45140
  ["network_security", {
45141
45141
  name: "network_security",
45142
45142
  displayName: "Network Security",
45143
- description: "Manage firewall configurations with match criteria and action rules. Create NAT policies using dynamic pools and port configurations for address translation. Define segment connections to isolate traffic between network zones. Configure policy-based routing to direct packets based on source, destination, or protocol attributes. Set up forward proxy policies and access control lists to govern outbound connections.",
45144
- descriptionShort: "Configure firewalls, NAT, and routing policies.",
45145
- descriptionMedium: "Define network firewall rules and NAT policies. Set up policy-based routing with segment connections for traffic control.",
45143
+ description: "Perimeter defense through firewall configurations, address translation, and ingress/egress policies. Traffic steering directs packets according to defined criteria including origin, target, and service type. Segment boundaries create workload isolation zones while HTTP intermediaries manage client requests to external destinations. Port mappings employ static and dynamic address pools for flexible translation scenarios across multi-tenant environments.",
45144
+ descriptionShort: "NAT policies, firewalls, and segment connections.",
45145
+ descriptionMedium: "Firewall rules with routing decisions based on source, destination, or protocol. Segmentation isolates workloads while outbound proxies govern access.",
45146
45146
  aliases: ["netsec", "nfw"],
45147
45147
  complexity: "advanced",
45148
45148
  isPreview: false,
@@ -45189,9 +45189,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45189
45189
  ["nginx_one", {
45190
45190
  name: "nginx_one",
45191
45191
  displayName: "Nginx One",
45192
- description: "Set up load balancing configurations with backend server definitions and routing logic. Create monitoring schedules for availability tracking across distributed nodes. Build request handling pipelines with rate controls and authentication layers. Track instance performance metrics and traffic patterns. Coordinate failover mechanisms using weighted distribution and priority-based selection.",
45193
- descriptionShort: "Configure NGINX proxy instances and deployments.",
45194
- descriptionMedium: "Manage upstream server pools and health monitors. Define SSL termination rules and connection parameters for gateway endpoints.",
45192
+ description: "Dataplane server registration with health status tracking and location awareness. Service discovery bindings for dynamic upstream resolution. Cloud service gateway integration for hybrid deployments. WAF policy attachment and instance-level security controls.",
45193
+ descriptionShort: "NGINX Plus instances and dataplane servers.",
45194
+ descriptionMedium: "Instance discovery, WAF integration, and service mesh connectivity. Subscription lifecycle and configuration synchronization.",
45195
45195
  aliases: ["nginx", "nms", "nginx-plus"],
45196
45196
  complexity: "simple",
45197
45197
  isPreview: false,
@@ -45230,9 +45230,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45230
45230
  ["object_storage", {
45231
45231
  name: "object_storage",
45232
45232
  displayName: "Object Storage",
45233
- description: "Deploy binary artifacts and configuration bundles with automatic version tracking and lifecycle policies. Organize content by category including protection signatures, SDK packages, and third-party connector files. Enable time-limited download links for secure distribution without credential exposure. Track revision history for audit trails and support rollback to previous artifact versions when needed.",
45234
- descriptionShort: "Manage stored objects and bucket versioning.",
45235
- descriptionMedium: "Create versioned content within tenant buckets. Generate secure access URLs for SDK distributions and application protection resources.",
45233
+ description: "Blob management for application component delivery across namespaces. Time-limited download links with cryptographic signing protect asset retrieval. Version-controlled packages organized by operating system type support artifact discovery. Query filtering by name, type, and release number enables programmatic access to integrator libraries and protection modules for mobile deployments.",
45234
+ descriptionShort: "Mobile SDK assets, versioned binaries, and app shield files.",
45235
+ descriptionMedium: "Versioned library distribution for mobile app integrators. Presigned URLs enable secure downloads with OS-specific builds for iOS and Android.",
45236
45236
  aliases: ["storage", "s3", "buckets"],
45237
45237
  complexity: "simple",
45238
45238
  isPreview: false,
@@ -45273,9 +45273,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45273
45273
  ["observability", {
45274
45274
  name: "observability",
45275
45275
  displayName: "Observability",
45276
- description: "Set up synthetic monitoring for DNS resolution and HTTP services across AWS regions. Generate health reports with historical trends and summary dashboards. Monitor certificate validity, track response times, and aggregate results by namespace for capacity planning.",
45277
- descriptionShort: "Configure synthetic monitors and health checks.",
45278
- descriptionMedium: "Define DNS and HTTP monitors with regional testing. Track certificate expiration and service availability across zones.",
45276
+ description: "Telemetry systems execute scheduled availability checks from distributed AWS locations worldwide. Response code validation and timing metrics feed into historical trend analysis. DNS resolution accuracy verification ensures name service reliability. Certificate lifecycle tracking generates expiration warnings before outages occur. Regional probe distribution provides geographic coverage insights. Health summaries aggregate results into actionable dashboards with configurable alerting thresholds.",
45277
+ descriptionShort: "Synthetic health checks and DNS resolution validation.",
45278
+ descriptionMedium: "HTTP availability probes with latency measurement. Certificate expiration alerts and global status dashboards for infrastructure health.",
45279
45279
  aliases: ["obs", "monitoring", "synth"],
45280
45280
  complexity: "advanced",
45281
45281
  isPreview: false,
@@ -45322,9 +45322,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45322
45322
  ["rate_limiting", {
45323
45323
  name: "rate_limiting",
45324
45324
  displayName: "Rate Limiting",
45325
- description: "Create rate limiter policies with configurable time periods using seconds, minutes, or hours granularity. Deploy policers and protocol policers to enforce bandwidth constraints across namespaces. Define limit values, burst allowances, and blocking behaviors when thresholds trigger. Integrate with load balancers and security policies for layered traffic management and abuse prevention.",
45326
- descriptionShort: "Configure traffic throttling and policer rules.",
45327
- descriptionMedium: "Define request limits and burst thresholds for traffic control. Set up leaky bucket algorithms and block actions for exceeded quotas.",
45325
+ description: "Threshold-based request blocking using sliding window calculations. Burst smoothing algorithms maintain sustained throughput without exceeding defined maximums. Per-connection controls apply granular restrictions by protocol type. Automatic block actions trigger when request counts surpass configured limits within specified intervals.",
45326
+ descriptionShort: "Request throttling, quotas, and policer rules.",
45327
+ descriptionMedium: "Time-based quota enforcement with configurable windows in hours, minutes, or seconds. Protocol-specific controls for traffic shaping.",
45328
45328
  aliases: ["ratelimit", "throttle", "policer"],
45329
45329
  complexity: "simple",
45330
45330
  isPreview: false,
@@ -45373,9 +45373,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45373
45373
  ["secops_and_incident_response", {
45374
45374
  name: "secops_and_incident_response",
45375
45375
  displayName: "Secops And Incident Response",
45376
- description: "Manage incident response workflows that detect and mitigate malicious users automatically. Create rules matching threat levels to actions like blocking, rate limiting, or alerting. Set up mitigation policies per namespace to isolate security responses. Define thresholds for user behavior analysis and configure graduated responses based on severity. Integrate with bot defense and WAF systems for coordinated protection across application layers.",
45377
- descriptionShort: "Configure automated threat mitigation rules.",
45378
- descriptionMedium: "Define malicious user detection policies and response actions. Apply blocking or rate limiting based on threat levels.",
45376
+ description: "User threat assessment with configurable risk thresholds and mitigation rules. Detection covers high, medium, and low threat levels with corresponding actions like blocking, rate limiting, or alerting. Mitigation policies link to load balancers for real-time enforcement against identified bad actors.",
45377
+ descriptionShort: "Threat detection, user risk scoring, and automated blocking.",
45378
+ descriptionMedium: "Malicious user mitigation with threat level classification. Automated response actions for suspicious behavior patterns.",
45379
45379
  aliases: ["secops", "incident-response", "mitigation"],
45380
45380
  complexity: "simple",
45381
45381
  isPreview: false,
@@ -45412,9 +45412,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45412
45412
  ["service_mesh", {
45413
45413
  name: "service_mesh",
45414
45414
  displayName: "Service Mesh",
45415
- description: "Create classifications to organize services and support automatic identification of interconnected components. Set up analysis pipelines to understand patterns and build intelligent routing rules. Define network function virtualization for regional architectures. Configure authentication settings including location, state, and type recognition.",
45416
- descriptionShort: "Configure application types and discovery.",
45417
- descriptionMedium: "Manage NFV integrations and workload categories. Enable traffic learning across distributed deployments.",
45415
+ description: "NFV service lifecycle and software version tracking. Machine learning-driven classification with security risk assessment and PII detection. Override management for application behavior customization. Sidecar proxy orchestration with automatic mTLS certificate rotation and policy enforcement across distributed workloads.",
45416
+ descriptionShort: "Microservice routing and sidecar configuration.",
45417
+ descriptionMedium: "Application type definitions with discovery and learned schema analysis. Traffic pattern inference for intelligent request handling.",
45418
45418
  aliases: ["mesh", "svc-mesh"],
45419
45419
  complexity: "advanced",
45420
45420
  isPreview: false,
@@ -45463,9 +45463,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45463
45463
  ["shape", {
45464
45464
  name: "shape",
45465
45465
  displayName: "Shape",
45466
- description: "Set up bot defense infrastructure across namespaces with deployment tracking and status monitoring. Integrate mobile SDK attributes for app shielding and device recognition. Subscribe to threat intelligence services for real-time protection updates. Define cluster states and location-based policies for distributed bot mitigation. Track deployment history and manage policy configurations through centralized infrastructure objects.",
45467
- descriptionShort: "Configure bot defense and threat prevention.",
45468
- descriptionMedium: "Deploy bot infrastructure with mobile SDK integration. Manage subscription services and policy enforcement for automated threat protection.",
45466
+ description: "Bot infrastructure policies with deployment tracking and subscription management. SafeAP protection against credential stuffing and account takeover. Mobile application shielding through SDK integration with OS-specific configurations. Real-time threat intelligence updates and automated response actions based on risk scoring and traffic patterns.",
45467
+ descriptionShort: "Bot defense, fraud prevention, and client integrity.",
45468
+ descriptionMedium: "Threat recognition with behavioral analysis and device fingerprinting. Mobile SDK integration for application shielding.",
45469
45469
  aliases: ["shape-sec", "safeap"],
45470
45470
  complexity: "advanced",
45471
45471
  isPreview: false,
@@ -45502,9 +45502,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45502
45502
  ["sites", {
45503
45503
  name: "sites",
45504
45504
  displayName: "Sites",
45505
- description: "Deploy edge nodes across AWS, Azure, and GCP with automated provisioning. Configure VPC peering, transit gateway attachments, and VPN tunnel settings. Define virtual groupings with label selectors for policy targeting. Manage Kubernetes cluster integrations and secure mesh deployments. Monitor node health, validate configurations, and set IP prefix allocations.",
45506
- descriptionShort: "Deploy edge nodes across cloud providers.",
45507
- descriptionMedium: "Configure AWS, Azure, GCP deployments with VPC integration. Manage transit gateways and VPN tunnels.",
45505
+ description: "Multi-cloud node provisioning spanning major public cloud environments including TGW, VNet, and VPC architectures. VPN tunnel configuration handles secure connectivity while IP prefix management controls address allocation. Customer edge deployments support external container orchestration platforms. Geographic distribution with resource sharing enables consistent policy enforcement across deployment points.",
45506
+ descriptionShort: "Cloud and edge node deployments.",
45507
+ descriptionMedium: "AWS, Azure, GCP VPC integration with transit gateways. Label-based selection for policy application across regions.",
45508
45508
  aliases: ["site", "deployment"],
45509
45509
  complexity: "advanced",
45510
45510
  isPreview: false,
@@ -45607,9 +45607,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45607
45607
  ["statistics", {
45608
45608
  name: "statistics",
45609
45609
  displayName: "Statistics",
45610
- description: "Set up alert policies with custom matchers, label filters, and group-by rules for targeted notifications. Define routing channels via email, webhook, or integration receivers with confirmation and verification workflows. Access flow analytics, historical alert data, and namespace-scoped metrics. Build capacity planning graphs and operational summaries. Observe deployment health and service discovery mapping across distributed environments.",
45611
- descriptionShort: "Monitor alerts, logs, and flow analytics.",
45612
- descriptionMedium: "Configure alerting policies and notification receivers. Track service topology, build dashboards, and view site health summaries.",
45610
+ description: "Alert policies with custom matchers, label groupings, and notification parameters. Log receivers for centralized collection with confirmation and verification workflows. Flow analytics, historical trend data, and namespace-scoped dashboards. Topology discovery and site-level health indicators for operational visibility.",
45611
+ descriptionShort: "Alerts, logs, flow analytics, and reporting.",
45612
+ descriptionMedium: "Alerting policies with receiver integrations. Log aggregation, topology views, and site health tracking.",
45613
45613
  aliases: ["stats", "metrics", "logs"],
45614
45614
  complexity: "advanced",
45615
45615
  isPreview: false,
@@ -45648,9 +45648,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45648
45648
  ["support", {
45649
45649
  name: "support",
45650
45650
  displayName: "Support",
45651
- description: "Open new cases and assign severity ratings based on business impact. Append notes throughout resolution workflows. Mark items as closed or reinstate them if symptoms recur. Execute diagnostic packet captures on deployed sites for network troubleshooting. Handle tax exemption verification through certificate submission.",
45652
- descriptionShort: "Create and track customer tickets.",
45653
- descriptionMedium: "Submit requests with file uploads and priority levels. Add comments and escalate critical incidents to engineering teams.",
45651
+ description: "Case management workflows including submission, commentary, and closure paths. Urgency adjustments and routing for time-sensitive incidents. Tax exemption verification requests. Site-level tcpdump operations\u2014initiation, enumeration, and termination\u2014for low-level network troubleshooting and protocol analysis.",
45652
+ descriptionShort: "Tickets, escalations, and network diagnostics.",
45653
+ descriptionMedium: "Issue lifecycle with comments, severity changes, and resolution tracking. Packet capture for connection analysis.",
45654
45654
  aliases: ["tickets", "help-desk"],
45655
45655
  complexity: "moderate",
45656
45656
  isPreview: false,
@@ -45736,9 +45736,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45736
45736
  ["tenant_and_identity", {
45737
45737
  name: "tenant_and_identity",
45738
45738
  displayName: "Tenant And Identity",
45739
- description: "Set up granular alert routing for administrative and combined channels with personalized delivery options. Control active login sessions and enforce one-time password resets for security compliance. Define display layouts and avatar images for customized user experiences. Process onboarding access submissions and toggle account management features. Coordinate support ticket attachments and client relationship interactions across managed tenant hierarchies.",
45740
- descriptionShort: "Manage user profiles and session controls.",
45741
- descriptionMedium: "Configure OTP resets and admin alert channels. Handle view settings and profile customization for platform participants.",
45739
+ description: "Profile images and display customizations for personalized dashboard experiences. Federated authentication toggles controlling SSO behavior across organizational boundaries. Session lifecycle tracking with real-time visibility into active connections and timeout policies. Support ticket workflows including attachment handling and closure procedures for managed client escalations. Initial access provisioning sequences for new user onboarding.",
45740
+ descriptionShort: "User profiles, sessions, and OTP settings.",
45741
+ descriptionMedium: "Account view configurations and admin alert channels. One-time password resets, provisioning flows, and active connection monitoring.",
45742
45742
  aliases: ["tenant-identity", "idm", "user-settings"],
45743
45743
  complexity: "advanced",
45744
45744
  isPreview: false,
@@ -45814,9 +45814,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45814
45814
  ["users", {
45815
45815
  name: "users",
45816
45816
  displayName: "Users",
45817
- description: "Deploy namespace-scoped access credentials with lifecycle state tracking for secure machine enrollment. Build hierarchical tagging frameworks that enable systematic organization of infrastructure elements. Retrieve automated provisioning payloads for streamlined node initialization. Enable system-level automatic tagging that applies predefined metadata to newly created objects without operator action.",
45818
- descriptionShort: "Manage account tokens and label settings.",
45819
- descriptionMedium: "Configure credential issuance and cloud-init provisioning. Establish key-value taxonomies for consistent resource categorization across deployments.",
45817
+ description: "Token lifecycle governs automated site onboarding through cloud-init integration with configurable validity periods. Explicit category keys establish permitted classification hierarchies enforced across deployments. Inferred attributes attach automatically based on object characteristics and placement context. Namespace-scoped operations handle credential generation, revocation, and state transitions for streamlined provisioning workflows.",
45818
+ descriptionShort: "Account tokens, labels, and cloud-init config.",
45819
+ descriptionMedium: "Site enrollment credentials with automatic expiration. Taxonomy keys define allowed categorization while auto-derived tags apply dynamically.",
45820
45820
  aliases: ["user", "accounts", "iam"],
45821
45821
  complexity: "simple",
45822
45822
  isPreview: false,
@@ -45865,9 +45865,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
45865
45865
  ["virtual", {
45866
45866
  name: "virtual",
45867
45867
  displayName: "Virtual",
45868
- description: "Deploy load balancers across protocols with origin pool management and service discovery. Set up geo-location routing to direct traffic based on client location. Define rate limiter policies to control request volume and protect services from abuse. Configure health checks for origin monitoring and automatic failover. Manage service policies for access control and traffic filtering. Enable malware protection and threat campaign blocking for security enforcement.",
45869
- descriptionShort: "Configure load balancers and origin pools.",
45870
- descriptionMedium: "Create HTTP, TCP, and UDP load balancers with origin pools. Define routing rules, health checks, and rate limiting policies.",
45868
+ description: "Traffic distribution across origin pools with weighted routing and session persistence. Malware protection integration, threat campaign blocking, and request inspection. Proxy forwarding policies, server monitoring, and latency-based routing decisions. Service policy sets for fine-grained access control and rate limiter policies for traffic shaping.",
45869
+ descriptionShort: "HTTP, TCP, UDP load balancers and origin pools.",
45870
+ descriptionMedium: "Layer 7 routing rules with health checks and failover. Rate limiting, geo-routing, and service policy enforcement.",
45871
45871
  aliases: ["lb", "loadbalancer", "vhost"],
45872
45872
  complexity: "advanced",
45873
45873
  isPreview: false,
@@ -46021,9 +46021,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
46021
46021
  ["waf", {
46022
46022
  name: "waf",
46023
46023
  displayName: "Waf",
46024
- description: "Set up firewall configurations with attack type settings and violation detection. Create exclusion policies to tune false positives and customize blocking responses. Deploy staged signatures before production release and monitor rule hits through security event metrics. Integrate with virtual hosts for layered protection using AI-based risk blocking and anonymization settings for sensitive data handling.",
46025
- descriptionShort: "Configure application firewall rules and bot protection.",
46026
- descriptionMedium: "Define security policies for web applications. Manage attack signatures, exclusion rules, and threat detection settings.",
46024
+ description: "Signature-based attack detection with customizable blocking responses. Attack type classification, protocol inspection, and AI-driven risk assessment. Exclusion policies override default blocking for trusted traffic. Staged signature testing validates rules before enforcement. Security event metrics track rule hits and blocked requests across namespaces.",
46025
+ descriptionShort: "Request inspection, attack signatures, and bot mitigation.",
46026
+ descriptionMedium: "Application firewall rules with signature-based detection. Exclusion policies, blocking pages, and anomaly prevention.",
46027
46027
  aliases: ["firewall", "appfw"],
46028
46028
  complexity: "advanced",
46029
46029
  isPreview: false,
@@ -46620,8 +46620,8 @@ function getLogoModeFromEnv(envPrefix) {
46620
46620
  var CLI_NAME = "xcsh";
46621
46621
  var CLI_FULL_NAME = "F5 Distributed Cloud Shell";
46622
46622
  function getVersion() {
46623
- if ("v1.0.84-2601020342") {
46624
- return "v1.0.84-2601020342";
46623
+ if ("v1.0.85-2601020718") {
46624
+ return "v1.0.85-2601020718";
46625
46625
  }
46626
46626
  if (process.env.XCSH_VERSION) {
46627
46627
  return process.env.XCSH_VERSION;
@@ -47363,6 +47363,16 @@ var APIClient = class {
47363
47363
  var import_yaml2 = __toESM(require_dist(), 1);
47364
47364
 
47365
47365
  // src/output/types.ts
47366
+ var ALL_OUTPUT_FORMATS = [
47367
+ "json",
47368
+ "yaml",
47369
+ "table",
47370
+ "text",
47371
+ "tsv",
47372
+ "none",
47373
+ "spec"
47374
+ ];
47375
+ var OUTPUT_FORMAT_HELP = ALL_OUTPUT_FORMATS.join(", ");
47366
47376
  var DEFAULT_TABLE_STYLE = {
47367
47377
  unicode: true,
47368
47378
  coloredBorders: true,
@@ -47374,7 +47384,7 @@ var PLAIN_TABLE_STYLE = {
47374
47384
  headerStyle: "normal"
47375
47385
  };
47376
47386
  function isValidOutputFormat(format) {
47377
- return ["json", "yaml", "table", "text", "tsv", "none", "spec"].includes(
47387
+ return ALL_OUTPUT_FORMATS.includes(
47378
47388
  format.toLowerCase()
47379
47389
  );
47380
47390
  }
@@ -48000,6 +48010,140 @@ function formatLabel(key) {
48000
48010
  return withSpaces.charAt(0).toUpperCase() + withSpaces.slice(1);
48001
48011
  }
48002
48012
 
48013
+ // src/cloudstatus/types.ts
48014
+ var BASE_URL = "https://www.f5cloudstatus.com/api/v2";
48015
+ var StatusIndicator = {
48016
+ None: "none",
48017
+ Minor: "minor",
48018
+ Major: "major",
48019
+ Critical: "critical",
48020
+ Maintenance: "maintenance"
48021
+ };
48022
+ var ComponentStatus = {
48023
+ Operational: "operational",
48024
+ DegradedPerformance: "degraded_performance",
48025
+ PartialOutage: "partial_outage",
48026
+ MajorOutage: "major_outage",
48027
+ UnderMaintenance: "under_maintenance"
48028
+ };
48029
+ var IncidentStatus = {
48030
+ Investigating: "investigating",
48031
+ Identified: "identified",
48032
+ Monitoring: "monitoring",
48033
+ Resolved: "resolved",
48034
+ Postmortem: "postmortem"
48035
+ };
48036
+ var MaintenanceStatus = {
48037
+ Scheduled: "scheduled",
48038
+ InProgress: "in_progress",
48039
+ Verifying: "verifying",
48040
+ Completed: "completed"
48041
+ };
48042
+ var ExitCode = {
48043
+ Healthy: 0,
48044
+ Minor: 1,
48045
+ Major: 2,
48046
+ Critical: 3,
48047
+ Maintenance: 4,
48048
+ APIError: 10,
48049
+ ParseError: 11
48050
+ };
48051
+ var EXIT_CODE_HELP = Object.entries(ExitCode).filter(([, v]) => typeof v === "number" && v < 10).map(([k, v]) => `${v}=${k.toLowerCase()}`).join(", ");
48052
+ var PredefinedRegions = [
48053
+ {
48054
+ id: "north-america",
48055
+ name: "north-america",
48056
+ displayName: "North America"
48057
+ },
48058
+ {
48059
+ id: "south-america",
48060
+ name: "south-america",
48061
+ displayName: "South America"
48062
+ },
48063
+ { id: "europe", name: "europe", displayName: "Europe" },
48064
+ { id: "asia", name: "asia", displayName: "Asia" },
48065
+ { id: "oceania", name: "oceania", displayName: "Oceania" },
48066
+ { id: "middle-east", name: "middle-east", displayName: "Middle East" }
48067
+ ];
48068
+ function isComponentOperational(component) {
48069
+ return component.status === ComponentStatus.Operational;
48070
+ }
48071
+ function isComponentDegraded(component) {
48072
+ return component.status !== ComponentStatus.Operational;
48073
+ }
48074
+ function isIncidentResolved(incident) {
48075
+ return incident.status === IncidentStatus.Resolved || incident.status === IncidentStatus.Postmortem;
48076
+ }
48077
+ function isIncidentActive(incident) {
48078
+ return !isIncidentResolved(incident);
48079
+ }
48080
+ function isMaintenanceUpcoming(maint) {
48081
+ return maint.status === MaintenanceStatus.Scheduled;
48082
+ }
48083
+ function isMaintenanceActive(maint) {
48084
+ return maint.status === MaintenanceStatus.InProgress || maint.status === MaintenanceStatus.Verifying;
48085
+ }
48086
+ function isMaintenanceCompleted(maint) {
48087
+ return maint.status === MaintenanceStatus.Completed;
48088
+ }
48089
+ function statusIndicatorToExitCode(indicator) {
48090
+ switch (indicator) {
48091
+ case StatusIndicator.None:
48092
+ return ExitCode.Healthy;
48093
+ case StatusIndicator.Minor:
48094
+ return ExitCode.Minor;
48095
+ case StatusIndicator.Major:
48096
+ return ExitCode.Major;
48097
+ case StatusIndicator.Critical:
48098
+ return ExitCode.Critical;
48099
+ case StatusIndicator.Maintenance:
48100
+ return ExitCode.Maintenance;
48101
+ default:
48102
+ return ExitCode.Healthy;
48103
+ }
48104
+ }
48105
+
48106
+ // src/config/settings.ts
48107
+ var import_yaml3 = __toESM(require_dist(), 1);
48108
+ var LOGO_MODES = [
48109
+ {
48110
+ mode: "image",
48111
+ description: "Image if terminal supports, else ASCII (default)"
48112
+ },
48113
+ { mode: "ascii", description: "ASCII art only" },
48114
+ { mode: "none", description: "No logo" }
48115
+ ];
48116
+ var LOGO_MODE_HELP = LOGO_MODES.map((m) => m.mode).join(", ");
48117
+ var DEFAULT_SETTINGS = {
48118
+ logo: "image"
48119
+ };
48120
+ function isValidLogoMode(mode) {
48121
+ return LOGO_MODES.some((m) => m.mode === mode);
48122
+ }
48123
+ function validateSettings(settings) {
48124
+ const validated = {};
48125
+ if (settings.logo && isValidLogoMode(settings.logo)) {
48126
+ validated.logo = settings.logo;
48127
+ }
48128
+ return validated;
48129
+ }
48130
+ function loadSettingsSync() {
48131
+ const configPath = paths.settings;
48132
+ try {
48133
+ const content = __require("fs").readFileSync(
48134
+ configPath,
48135
+ "utf-8"
48136
+ );
48137
+ const parsed = import_yaml3.default.parse(content);
48138
+ return {
48139
+ ...DEFAULT_SETTINGS,
48140
+ ...validateSettings(parsed)
48141
+ };
48142
+ } catch {
48143
+ return DEFAULT_SETTINGS;
48144
+ }
48145
+ }
48146
+
48003
48147
  // src/config/envvars.ts
48004
48148
  var EnvVarRegistry = [
48005
48149
  {
@@ -48021,12 +48165,12 @@ var EnvVarRegistry = [
48021
48165
  },
48022
48166
  {
48023
48167
  name: `${ENV_PREFIX}_OUTPUT_FORMAT`,
48024
- description: "Output format (json, yaml, table)",
48168
+ description: `Output format (${OUTPUT_FORMAT_HELP})`,
48025
48169
  relatedFlag: "-o"
48026
48170
  },
48027
48171
  {
48028
48172
  name: `${ENV_PREFIX}_LOGO`,
48029
- description: "Logo display mode (auto, image, ascii, both, none)",
48173
+ description: `Logo display mode (${LOGO_MODE_HELP})`,
48030
48174
  relatedFlag: "--logo"
48031
48175
  },
48032
48176
  {
@@ -142254,7 +142398,7 @@ function formatGlobalFlags() {
142254
142398
  " -v, --version Show version number",
142255
142399
  " -h, --help Show this help",
142256
142400
  " --no-color Disable color output",
142257
- " -o, --output <fmt> Output format (json, yaml, table)",
142401
+ ` -o, --output <fmt> Output format (${OUTPUT_FORMAT_HELP})`,
142258
142402
  " -ns, --namespace <ns> Target namespace",
142259
142403
  " --spec Output command specification as JSON (for AI)"
142260
142404
  ];
@@ -142462,7 +142606,9 @@ function formatActionHelp(domainName, action) {
142462
142606
  output.push("OPTIONS");
142463
142607
  output.push(" -n, --name <name> Resource name");
142464
142608
  output.push(" -ns, --namespace <ns> Target namespace");
142465
- output.push(" -o, --output <fmt> Output format (json, yaml, table)");
142609
+ output.push(
142610
+ ` -o, --output <fmt> Output format (${OUTPUT_FORMAT_HELP})`
142611
+ );
142466
142612
  output.push(" -f, --file <path> Configuration file");
142467
142613
  output.push("");
142468
142614
  if (opInfo?.externalDocs) {
@@ -142904,7 +143050,7 @@ function buildCommandSpec(options) {
142904
143050
  usage: options.usage ?? `xcsh ${options.command} [options]`,
142905
143051
  flags: options.flags ?? [],
142906
143052
  examples: options.examples ?? [],
142907
- outputFormats: options.outputFormats ?? ["table", "json", "yaml"]
143053
+ outputFormats: options.outputFormats ?? [...ALL_OUTPUT_FORMATS]
142908
143054
  };
142909
143055
  if (options.related !== void 0) {
142910
143056
  spec.related = options.related;
@@ -142924,7 +143070,7 @@ var GLOBAL_FLAGS = [
142924
143070
  description: "Output format",
142925
143071
  type: "string",
142926
143072
  default: "table",
142927
- choices: ["table", "json", "yaml", "tsv"]
143073
+ choices: [...ALL_OUTPUT_FORMATS]
142928
143074
  },
142929
143075
  {
142930
143076
  name: "--namespace",
@@ -142966,7 +143112,7 @@ function buildCloudstatusSpecs() {
142966
143112
  {
142967
143113
  name: "--quiet",
142968
143114
  alias: "-q",
142969
- description: "Return exit code only (0=operational, 1=degraded, 2=outage)",
143115
+ description: `Return exit code only (${EXIT_CODE_HELP})`,
142970
143116
  type: "boolean"
142971
143117
  }
142972
143118
  ],
@@ -143960,7 +144106,11 @@ var REPLSession = class {
143960
144106
  };
143961
144107
 
143962
144108
  // src/repl/prompt.ts
143963
- function buildPlainPrompt(_session) {
144109
+ function buildPlainPrompt(session) {
144110
+ const ctx = session.getContextPath();
144111
+ if (ctx.isDomain()) {
144112
+ return `${CLI_NAME}:${ctx.domain}> `;
144113
+ }
143964
144114
  return `${CLI_NAME}> `;
143965
144115
  }
143966
144116
 
@@ -145154,46 +145304,6 @@ var contextSubcommands = {
145154
145304
  ])
145155
145305
  };
145156
145306
 
145157
- // src/config/settings.ts
145158
- var import_yaml3 = __toESM(require_dist(), 1);
145159
- var LOGO_MODES = [
145160
- {
145161
- mode: "image",
145162
- description: "Image if terminal supports, else ASCII (default)"
145163
- },
145164
- { mode: "ascii", description: "ASCII art only" },
145165
- { mode: "none", description: "No logo" }
145166
- ];
145167
- var DEFAULT_SETTINGS = {
145168
- logo: "image"
145169
- };
145170
- function isValidLogoMode(mode) {
145171
- return LOGO_MODES.some((m) => m.mode === mode);
145172
- }
145173
- function validateSettings(settings) {
145174
- const validated = {};
145175
- if (settings.logo && isValidLogoMode(settings.logo)) {
145176
- validated.logo = settings.logo;
145177
- }
145178
- return validated;
145179
- }
145180
- function loadSettingsSync() {
145181
- const configPath = paths.settings;
145182
- try {
145183
- const content = __require("fs").readFileSync(
145184
- configPath,
145185
- "utf-8"
145186
- );
145187
- const parsed = import_yaml3.default.parse(content);
145188
- return {
145189
- ...DEFAULT_SETTINGS,
145190
- ...validateSettings(parsed)
145191
- };
145192
- } catch {
145193
- return DEFAULT_SETTINGS;
145194
- }
145195
- }
145196
-
145197
145307
  // src/domains/login/banner/display.ts
145198
145308
  function colorizeLogoLine(line) {
145199
145309
  let result = "";
@@ -145771,98 +145881,6 @@ var loginDomain = {
145771
145881
  ])
145772
145882
  };
145773
145883
 
145774
- // src/cloudstatus/types.ts
145775
- var BASE_URL = "https://www.f5cloudstatus.com/api/v2";
145776
- var StatusIndicator = {
145777
- None: "none",
145778
- Minor: "minor",
145779
- Major: "major",
145780
- Critical: "critical",
145781
- Maintenance: "maintenance"
145782
- };
145783
- var ComponentStatus = {
145784
- Operational: "operational",
145785
- DegradedPerformance: "degraded_performance",
145786
- PartialOutage: "partial_outage",
145787
- MajorOutage: "major_outage",
145788
- UnderMaintenance: "under_maintenance"
145789
- };
145790
- var IncidentStatus = {
145791
- Investigating: "investigating",
145792
- Identified: "identified",
145793
- Monitoring: "monitoring",
145794
- Resolved: "resolved",
145795
- Postmortem: "postmortem"
145796
- };
145797
- var MaintenanceStatus = {
145798
- Scheduled: "scheduled",
145799
- InProgress: "in_progress",
145800
- Verifying: "verifying",
145801
- Completed: "completed"
145802
- };
145803
- var ExitCode = {
145804
- Healthy: 0,
145805
- Minor: 1,
145806
- Major: 2,
145807
- Critical: 3,
145808
- Maintenance: 4,
145809
- APIError: 10,
145810
- ParseError: 11
145811
- };
145812
- var PredefinedRegions = [
145813
- {
145814
- id: "north-america",
145815
- name: "north-america",
145816
- displayName: "North America"
145817
- },
145818
- {
145819
- id: "south-america",
145820
- name: "south-america",
145821
- displayName: "South America"
145822
- },
145823
- { id: "europe", name: "europe", displayName: "Europe" },
145824
- { id: "asia", name: "asia", displayName: "Asia" },
145825
- { id: "oceania", name: "oceania", displayName: "Oceania" },
145826
- { id: "middle-east", name: "middle-east", displayName: "Middle East" }
145827
- ];
145828
- function isComponentOperational(component) {
145829
- return component.status === ComponentStatus.Operational;
145830
- }
145831
- function isComponentDegraded(component) {
145832
- return component.status !== ComponentStatus.Operational;
145833
- }
145834
- function isIncidentResolved(incident) {
145835
- return incident.status === IncidentStatus.Resolved || incident.status === IncidentStatus.Postmortem;
145836
- }
145837
- function isIncidentActive(incident) {
145838
- return !isIncidentResolved(incident);
145839
- }
145840
- function isMaintenanceUpcoming(maint) {
145841
- return maint.status === MaintenanceStatus.Scheduled;
145842
- }
145843
- function isMaintenanceActive(maint) {
145844
- return maint.status === MaintenanceStatus.InProgress || maint.status === MaintenanceStatus.Verifying;
145845
- }
145846
- function isMaintenanceCompleted(maint) {
145847
- return maint.status === MaintenanceStatus.Completed;
145848
- }
145849
- function statusIndicatorToExitCode(indicator) {
145850
- switch (indicator) {
145851
- case StatusIndicator.None:
145852
- return ExitCode.Healthy;
145853
- case StatusIndicator.Minor:
145854
- return ExitCode.Minor;
145855
- case StatusIndicator.Major:
145856
- return ExitCode.Major;
145857
- case StatusIndicator.Critical:
145858
- return ExitCode.Critical;
145859
- case StatusIndicator.Maintenance:
145860
- return ExitCode.Maintenance;
145861
- default:
145862
- return ExitCode.Healthy;
145863
- }
145864
- }
145865
-
145866
145884
  // src/cloudstatus/client.ts
145867
145885
  var Cache = class {
145868
145886
  entries = /* @__PURE__ */ new Map();
@@ -146902,7 +146920,7 @@ _xcsh() {
146902
146920
  '(-h --help)'{-h,--help}'[Show help information]'
146903
146921
  '(-v --version)'{-v,--version}'[Show version number]'
146904
146922
  '--no-color[Disable color output]'
146905
- '(-o --output)'{-o,--output}'[Output format]:format:(json yaml table)'
146923
+ '(-o --output)'{-o,--output}'[Output format]:format:(${ALL_OUTPUT_FORMATS.join(" ")})'
146906
146924
  '(-ns --namespace)'{-ns,--namespace}'[Namespace]:namespace:_xcsh_namespaces'
146907
146925
  '--spec[Output command specification as JSON for AI assistants]'
146908
146926
  )
@@ -146951,7 +146969,7 @@ ${customDomainCompletions.join("\n")}
146951
146969
  action_opts=(
146952
146970
  '(-n --name)'{-n,--name}'[Resource name]:name:'
146953
146971
  '(-ns --namespace)'{-ns,--namespace}'[Namespace]:namespace:_xcsh_namespaces'
146954
- '(-o --output)'{-o,--output}'[Output format]:format:(json yaml table)'
146972
+ '(-o --output)'{-o,--output}'[Output format]:format:(${ALL_OUTPUT_FORMATS.join(" ")})'
146955
146973
  '--limit[Maximum results]:limit:'
146956
146974
  '--label[Filter by label]:label:'
146957
146975
  '(-f --file)'{-f,--file}'[Configuration file]:file:_files'
@@ -147017,7 +147035,7 @@ complete -c xcsh -f
147017
147035
  complete -c xcsh -s h -l help -d 'Show help information'
147018
147036
  complete -c xcsh -s v -l version -d 'Show version number'
147019
147037
  complete -c xcsh -l no-color -d 'Disable color output'
147020
- complete -c xcsh -s o -l output -d 'Output format' -xa 'json yaml table'
147038
+ complete -c xcsh -s o -l output -d 'Output format' -xa '${ALL_OUTPUT_FORMATS.join(" ")}'
147021
147039
  complete -c xcsh -l namespace -s ns -d 'Namespace' -xa 'default system shared'
147022
147040
  complete -c xcsh -l spec -d 'Output command specification as JSON for AI assistants'
147023
147041
 
@@ -147479,7 +147497,146 @@ var CompletionCache = class {
147479
147497
  }
147480
147498
  };
147481
147499
 
147500
+ // src/repl/completion/resource-fetcher.ts
147501
+ var CACHE_TTL = 30 * 1e3;
147502
+ var ResourceFetcher = class {
147503
+ cache = /* @__PURE__ */ new Map();
147504
+ pendingRequests = /* @__PURE__ */ new Map();
147505
+ /**
147506
+ * Convert resource type (snake_case) to API path (kebab-case with plural)
147507
+ * Examples:
147508
+ * http_loadbalancer -> http-loadbalancers
147509
+ * origin_pool -> origin-pools
147510
+ * app_firewall -> app-firewalls
147511
+ */
147512
+ resourceTypeToApiPath(resourceType) {
147513
+ const kebabCase = resourceType.replace(/_/g, "-");
147514
+ return kebabCase.endsWith("s") ? kebabCase : `${kebabCase}s`;
147515
+ }
147516
+ /**
147517
+ * Generate cache key from namespace and resource type
147518
+ */
147519
+ getCacheKey(namespace, resourceType) {
147520
+ return `${namespace}:${resourceType}`;
147521
+ }
147522
+ /**
147523
+ * Check if cache entry is still valid
147524
+ */
147525
+ isCacheValid(entry) {
147526
+ if (!entry) return false;
147527
+ return Date.now() - entry.timestamp < CACHE_TTL;
147528
+ }
147529
+ /**
147530
+ * Check if a resource type is currently being loaded
147531
+ */
147532
+ isLoading(namespace, resourceType) {
147533
+ const key = this.getCacheKey(namespace, resourceType);
147534
+ const entry = this.cache.get(key);
147535
+ return entry?.loading ?? false;
147536
+ }
147537
+ /**
147538
+ * Fetch resource names from API with caching and deduplication
147539
+ */
147540
+ async fetchResourceNames(client, namespace, resourceType, partial = "") {
147541
+ const cacheKey = this.getCacheKey(namespace, resourceType);
147542
+ const cached = this.cache.get(cacheKey);
147543
+ if (cached && this.isCacheValid(cached)) {
147544
+ return this.filterByPrefix(cached.names, partial);
147545
+ }
147546
+ const pending = this.pendingRequests.get(cacheKey);
147547
+ if (pending) {
147548
+ const names = await pending;
147549
+ return this.filterByPrefix(names, partial);
147550
+ }
147551
+ if (!client?.isAuthenticated()) {
147552
+ return [];
147553
+ }
147554
+ const existingNames = cached?.names ?? [];
147555
+ const existingTimestamp = cached?.timestamp ?? 0;
147556
+ this.cache.set(cacheKey, {
147557
+ names: existingNames,
147558
+ timestamp: existingTimestamp,
147559
+ loading: true
147560
+ });
147561
+ const fetchPromise = this.doFetch(client, namespace, resourceType);
147562
+ this.pendingRequests.set(cacheKey, fetchPromise);
147563
+ try {
147564
+ const names = await fetchPromise;
147565
+ this.cache.set(cacheKey, {
147566
+ names,
147567
+ timestamp: Date.now(),
147568
+ loading: false
147569
+ });
147570
+ return this.filterByPrefix(names, partial);
147571
+ } catch {
147572
+ const existing = this.cache.get(cacheKey);
147573
+ if (existing) {
147574
+ existing.loading = false;
147575
+ }
147576
+ return [];
147577
+ } finally {
147578
+ this.pendingRequests.delete(cacheKey);
147579
+ }
147580
+ }
147581
+ /**
147582
+ * Internal fetch implementation
147583
+ */
147584
+ async doFetch(client, namespace, resourceType) {
147585
+ const apiPath = this.resourceTypeToApiPath(resourceType);
147586
+ const endpoint = `/api/config/namespaces/${namespace}/${apiPath}`;
147587
+ try {
147588
+ const response = await client.get(endpoint);
147589
+ if (response.ok && response.data?.items) {
147590
+ return response.data.items.map((item) => item.name ?? item.metadata?.name).filter((name) => !!name).sort();
147591
+ }
147592
+ } catch {
147593
+ }
147594
+ return [];
147595
+ }
147596
+ /**
147597
+ * Filter names by prefix (case-insensitive)
147598
+ */
147599
+ filterByPrefix(names, prefix) {
147600
+ if (!prefix) return names;
147601
+ const lowerPrefix = prefix.toLowerCase();
147602
+ return names.filter(
147603
+ (name) => name.toLowerCase().startsWith(lowerPrefix)
147604
+ );
147605
+ }
147606
+ /**
147607
+ * Prefetch resource names for a domain's primary resources
147608
+ * Call this when entering a domain context to warm the cache
147609
+ */
147610
+ async prefetch(client, namespace, resourceTypes) {
147611
+ if (!client?.isAuthenticated()) return;
147612
+ await Promise.allSettled(
147613
+ resourceTypes.map(
147614
+ (rt) => this.fetchResourceNames(client, namespace, rt)
147615
+ )
147616
+ );
147617
+ }
147618
+ /**
147619
+ * Clear cache for a specific namespace (e.g., when switching namespaces)
147620
+ */
147621
+ clearNamespaceCache(namespace) {
147622
+ for (const key of this.cache.keys()) {
147623
+ if (key.startsWith(`${namespace}:`)) {
147624
+ this.cache.delete(key);
147625
+ }
147626
+ }
147627
+ }
147628
+ /**
147629
+ * Clear all cached data
147630
+ */
147631
+ clearAll() {
147632
+ this.cache.clear();
147633
+ this.pendingRequests.clear();
147634
+ }
147635
+ };
147636
+ var resourceFetcher = new ResourceFetcher();
147637
+
147482
147638
  // src/repl/completion/completer.ts
147639
+ var RESOURCE_ACTIONS = /* @__PURE__ */ new Set(["list", "get", "delete", "status"]);
147483
147640
  function parseInputArgs(text) {
147484
147641
  const args = [];
147485
147642
  let current = "";
@@ -147525,21 +147682,22 @@ function parseInput(text) {
147525
147682
  const isCompletingFlag = currentWord.startsWith("-");
147526
147683
  let isCompletingFlagValue = false;
147527
147684
  let currentFlag = null;
147528
- if (args.length >= 2 && !currentWord.startsWith("-")) {
147529
- const prevArg = args[args.length - 2];
147685
+ const valueFlagPatterns = [
147686
+ "--namespace",
147687
+ "-ns",
147688
+ "--output",
147689
+ "-o",
147690
+ "--name",
147691
+ "-n",
147692
+ "--file",
147693
+ "-f",
147694
+ "--limit",
147695
+ "--label"
147696
+ ];
147697
+ if (args.length >= 1 && !currentWord.startsWith("-")) {
147698
+ const flagIndex = endsWithSpace ? args.length - 1 : args.length - 2;
147699
+ const prevArg = args[flagIndex];
147530
147700
  if (prevArg && prevArg.startsWith("-") && !prevArg.includes("=")) {
147531
- const valueFlagPatterns = [
147532
- "--namespace",
147533
- "-ns",
147534
- "--output",
147535
- "-o",
147536
- "--name",
147537
- "-n",
147538
- "--file",
147539
- "-f",
147540
- "--limit",
147541
- "--label"
147542
- ];
147543
147701
  if (valueFlagPatterns.some((f) => prevArg === f)) {
147544
147702
  isCompletingFlagValue = true;
147545
147703
  currentFlag = prevArg;
@@ -147595,6 +147753,7 @@ var Completer = class {
147595
147753
  parsed.currentWord
147596
147754
  );
147597
147755
  }
147756
+ const resourceCtx = this.parseResourceContext(parsed);
147598
147757
  if (parsed.isCompletingFlagValue && parsed.currentFlag) {
147599
147758
  return await this.getFlagValueCompletions(
147600
147759
  parsed.currentFlag,
@@ -147602,7 +147761,43 @@ var Completer = class {
147602
147761
  );
147603
147762
  }
147604
147763
  if (parsed.isCompletingFlag) {
147605
- return this.getFlagCompletions(parsed.currentWord);
147764
+ return this.getFlagCompletions(
147765
+ parsed.currentWord,
147766
+ resourceCtx.action ?? void 0
147767
+ );
147768
+ }
147769
+ if (resourceCtx.resourceType) {
147770
+ const resourceNames = await this.getResourceNameSuggestions(
147771
+ resourceCtx.resourceType,
147772
+ resourceCtx.resourceNamePartial
147773
+ );
147774
+ if (resourceNames.length > 0) {
147775
+ return resourceNames;
147776
+ }
147777
+ return this.getActionFlagSuggestions(
147778
+ resourceCtx.action ?? void 0
147779
+ );
147780
+ }
147781
+ if (resourceCtx.domain && resourceCtx.action && RESOURCE_ACTIONS.has(resourceCtx.action) && !resourceCtx.resourceType) {
147782
+ const resourceTypes = this.getResourceTypeSuggestions(
147783
+ resourceCtx.domain
147784
+ );
147785
+ if (resourceTypes.length > 0) {
147786
+ if (parsed.currentWord && !parsed.currentWord.startsWith("-")) {
147787
+ const filtered = this.filterSuggestions(
147788
+ resourceTypes,
147789
+ parsed.currentWord
147790
+ );
147791
+ if (filtered.length > 0) {
147792
+ return filtered;
147793
+ }
147794
+ } else if (!parsed.currentWord) {
147795
+ return [
147796
+ ...resourceTypes,
147797
+ ...this.getActionFlagSuggestions(resourceCtx.action)
147798
+ ];
147799
+ }
147800
+ }
147606
147801
  }
147607
147802
  let suggestions;
147608
147803
  if (parsed.isEscapedToRoot) {
@@ -147704,21 +147899,16 @@ var Completer = class {
147704
147899
  }
147705
147900
  /**
147706
147901
  * Get suggestions based on current navigation context
147902
+ * Note: Actions don't create sub-contexts - only domain-level navigation exists
147707
147903
  */
147708
147904
  async getContextualSuggestions() {
147709
147905
  if (!this.session) {
147710
147906
  return this.getRootContextSuggestions();
147711
147907
  }
147712
147908
  const ctx = this.session.getContextPath();
147713
- if (ctx.isRoot()) {
147714
- return this.getRootContextSuggestions();
147715
- }
147716
147909
  if (ctx.isDomain()) {
147717
147910
  return this.getDomainContextSuggestions();
147718
147911
  }
147719
- if (ctx.isAction()) {
147720
- return await this.getActionContextSuggestions();
147721
- }
147722
147912
  return this.getRootContextSuggestions();
147723
147913
  }
147724
147914
  /**
@@ -147836,44 +148026,35 @@ var Completer = class {
147836
148026
  return suggestions;
147837
148027
  }
147838
148028
  /**
147839
- * Get suggestions when in an action context
148029
+ * Get resource-related suggestions for a domain with an action
148030
+ * Called when user types an action (list, get, delete) followed by space
147840
148031
  */
147841
- async getActionContextSuggestions() {
148032
+ getResourceSuggestionsForAction(domain, action) {
147842
148033
  const suggestions = [];
147843
- suggestions.push(...this.getActionFlagSuggestions());
147844
- suggestions.push(
147845
- {
147846
- text: "exit",
147847
- description: "Go up to domain context",
147848
- category: "navigation"
147849
- },
147850
- {
147851
- text: "back",
147852
- description: "Go up to domain context",
147853
- category: "navigation"
147854
- },
147855
- {
147856
- text: "..",
147857
- description: "Go up to domain context",
147858
- category: "navigation"
147859
- },
147860
- {
147861
- text: "root",
147862
- description: "Go to root context",
147863
- category: "navigation"
147864
- },
148034
+ if (RESOURCE_ACTIONS.has(action)) {
148035
+ const resourceTypes = this.getResourceTypeSuggestions(domain);
148036
+ suggestions.push(...resourceTypes);
148037
+ }
148038
+ suggestions.push(...this.getCommonFlagSuggestions());
148039
+ return suggestions;
148040
+ }
148041
+ /**
148042
+ * Get common flag suggestions (for use within domain context)
148043
+ */
148044
+ getCommonFlagSuggestions() {
148045
+ return [
148046
+ { text: "--namespace", description: "Namespace", category: "flag" },
147865
148047
  {
147866
- text: "/",
147867
- description: "Go to root context",
147868
- category: "navigation"
148048
+ text: "--output",
148049
+ description: `Output format (${OUTPUT_FORMAT_HELP})`,
148050
+ category: "flag"
147869
148051
  },
147870
148052
  {
147871
- text: "help",
147872
- description: "Show context help",
147873
- category: "builtin"
148053
+ text: "-o",
148054
+ description: "Output format (short)",
148055
+ category: "flag"
147874
148056
  }
147875
- );
147876
- return suggestions;
148057
+ ];
147877
148058
  }
147878
148059
  /**
147879
148060
  * Get domain suggestions from unified registry
@@ -147895,9 +148076,100 @@ var Completer = class {
147895
148076
  );
147896
148077
  }
147897
148078
  /**
147898
- * Get flag suggestions for current action
148079
+ * Get resource type suggestions for a domain
148080
+ * Returns the primaryResources from domain metadata
148081
+ */
148082
+ getResourceTypeSuggestions(domain) {
148083
+ const domainInfo = getDomainInfo(domain);
148084
+ if (!domainInfo?.primaryResources) {
148085
+ return [];
148086
+ }
148087
+ return domainInfo.primaryResources.map((resource) => ({
148088
+ text: resource.name,
148089
+ description: resource.descriptionShort || resource.description,
148090
+ category: "resource"
148091
+ }));
148092
+ }
148093
+ /**
148094
+ * Get resource name suggestions from live API
148095
+ * Fetches actual resource names for a given resource type
148096
+ */
148097
+ async getResourceNameSuggestions(resourceType, partial = "") {
148098
+ if (!this.session) return [];
148099
+ const namespace = this.session.getNamespace();
148100
+ const client = this.session.getAPIClient();
148101
+ const names = await resourceFetcher.fetchResourceNames(
148102
+ client,
148103
+ namespace,
148104
+ resourceType,
148105
+ partial
148106
+ );
148107
+ return names.map((name) => ({
148108
+ text: name,
148109
+ description: `${resourceType} resource`,
148110
+ category: "resource-name"
148111
+ }));
148112
+ }
148113
+ /**
148114
+ * Parse resource context from input
148115
+ * Detects: domain → action → resourceType → resourceName
148116
+ * Note: Actions are detected from input args, not navigation context
148117
+ *
148118
+ * Key distinction:
148119
+ * - "list http_loadbalancer" (no space) → still typing resource type
148120
+ * - "list http_loadbalancer " (with space) → resource type complete, ready for resource name
148121
+ */
148122
+ parseResourceContext(parsed) {
148123
+ const ctx = {
148124
+ domain: null,
148125
+ action: null,
148126
+ resourceType: null,
148127
+ resourceNamePartial: ""
148128
+ };
148129
+ if (!this.session) {
148130
+ return ctx;
148131
+ }
148132
+ const navCtx = this.session.getContextPath();
148133
+ ctx.domain = navCtx.domain || null;
148134
+ if (parsed.args.length > 0) {
148135
+ const firstArg = parsed.args[0]?.toLowerCase() ?? "";
148136
+ if (RESOURCE_ACTIONS.has(firstArg)) {
148137
+ ctx.action = firstArg;
148138
+ }
148139
+ }
148140
+ if (ctx.domain && ctx.action && RESOURCE_ACTIONS.has(ctx.action)) {
148141
+ const domainInfo = getDomainInfo(ctx.domain);
148142
+ const resourceNames = new Set(
148143
+ domainInfo?.primaryResources?.map((r) => r.name) ?? []
148144
+ );
148145
+ for (let i = 1; i < parsed.args.length; i++) {
148146
+ const arg = parsed.args[i]?.toLowerCase() ?? "";
148147
+ if (resourceNames.has(arg)) {
148148
+ const isLastArg = i === parsed.args.length - 1;
148149
+ const isStillTyping = isLastArg && parsed.currentWord.toLowerCase() === arg;
148150
+ if (isStillTyping) {
148151
+ break;
148152
+ }
148153
+ ctx.resourceType = arg;
148154
+ if (i < parsed.args.length - 1) {
148155
+ const nextArg = parsed.args[i + 1]?.toLowerCase() ?? "";
148156
+ if (!nextArg.startsWith("-")) {
148157
+ ctx.resourceNamePartial = nextArg;
148158
+ }
148159
+ } else if (!parsed.currentWord) {
148160
+ ctx.resourceNamePartial = "";
148161
+ }
148162
+ break;
148163
+ }
148164
+ }
148165
+ }
148166
+ return ctx;
148167
+ }
148168
+ /**
148169
+ * Get flag suggestions for a given action
148170
+ * @param action - The action to get flags for (optional, uses common flags if not provided)
147899
148171
  */
147900
- getActionFlagSuggestions() {
148172
+ getActionFlagSuggestions(action) {
147901
148173
  const commonFlags = [
147902
148174
  { text: "--name", description: "Resource name", category: "flag" },
147903
148175
  {
@@ -147908,7 +148180,7 @@ var Completer = class {
147908
148180
  { text: "--namespace", description: "Namespace", category: "flag" },
147909
148181
  {
147910
148182
  text: "--output",
147911
- description: "Output format (json, yaml, table)",
148183
+ description: `Output format (${OUTPUT_FORMAT_HELP})`,
147912
148184
  category: "flag"
147913
148185
  },
147914
148186
  {
@@ -147917,11 +148189,9 @@ var Completer = class {
147917
148189
  category: "flag"
147918
148190
  }
147919
148191
  ];
147920
- if (!this.session) {
148192
+ if (!action) {
147921
148193
  return commonFlags;
147922
148194
  }
147923
- const ctx = this.session.getContextPath();
147924
- const action = ctx.action;
147925
148195
  const actionFlags = [...commonFlags];
147926
148196
  switch (action) {
147927
148197
  case "list":
@@ -147979,9 +148249,11 @@ var Completer = class {
147979
148249
  }
147980
148250
  /**
147981
148251
  * Get flag completions filtered by prefix
148252
+ * @param prefix - The prefix to filter by
148253
+ * @param action - Optional action for action-specific flags
147982
148254
  */
147983
- getFlagCompletions(prefix) {
147984
- const allFlags = this.getActionFlagSuggestions();
148255
+ getFlagCompletions(prefix, action) {
148256
+ const allFlags = this.getActionFlagSuggestions(action);
147985
148257
  return this.filterSuggestions(allFlags, prefix);
147986
148258
  }
147987
148259
  /**
@@ -147996,23 +148268,13 @@ var Completer = class {
147996
148268
  switch (flag) {
147997
148269
  case "--output":
147998
148270
  case "-o":
147999
- return [
148000
- {
148001
- text: "json",
148002
- description: "JSON format",
148003
- category: "value"
148004
- },
148005
- {
148006
- text: "yaml",
148007
- description: "YAML format",
148008
- category: "value"
148009
- },
148010
- {
148011
- text: "table",
148012
- description: "Table format",
148013
- category: "value"
148014
- }
148015
- ].filter((s) => s.text.toLowerCase().startsWith(lowerPartial));
148271
+ return ALL_OUTPUT_FORMATS.map((fmt) => ({
148272
+ text: fmt,
148273
+ description: `${fmt.toUpperCase()} format`,
148274
+ category: "value"
148275
+ })).filter(
148276
+ (s) => s.text.toLowerCase().startsWith(lowerPartial)
148277
+ );
148016
148278
  case "--namespace":
148017
148279
  case "-ns":
148018
148280
  return this.completeNamespace(valuePartial);
@@ -148820,6 +149082,19 @@ async function handleDomainNavigation(domain, args, ctx, session) {
148820
149082
  };
148821
149083
  }
148822
149084
  ctx.setDomain(domain);
149085
+ if (args.length > 0) {
149086
+ const firstArg2 = args[0]?.toLowerCase() ?? "";
149087
+ const resourceActions = /* @__PURE__ */ new Set(["list", "get", "delete", "status"]);
149088
+ if (resourceActions.has(firstArg2)) {
149089
+ const cmd = {
149090
+ raw: args.join(" "),
149091
+ args,
149092
+ isBuiltin: false,
149093
+ isDirectNavigation: false
149094
+ };
149095
+ return await executeAPICommand(session, ctx, cmd);
149096
+ }
149097
+ }
148823
149098
  return {
148824
149099
  output: [`Entered ${domain} context`],
148825
149100
  shouldExit: false,
@@ -148853,31 +149128,21 @@ async function executeCommand(input, session) {
148853
149128
  return handleDomainNavigation(firstWord, domainArgs, ctx, session);
148854
149129
  }
148855
149130
  }
148856
- if (ctx.isDomain() && !ctx.isAction()) {
148857
- const firstWord = cmd.args[0] ?? "";
148858
- if (firstWord && !firstWord.startsWith("-")) {
148859
- ctx.setAction(firstWord);
148860
- return {
148861
- output: [`Entered ${ctx.domain} > ${firstWord} context`],
148862
- shouldExit: false,
148863
- shouldClear: false,
148864
- contextChanged: true
148865
- };
148866
- }
148867
- }
148868
149131
  return await executeAPICommand(session, ctx, cmd);
148869
149132
  }
148870
149133
  function domainToResourcePath(domain) {
148871
149134
  const canonical = resolveDomain(domain) ?? domain;
148872
- const resourceName = canonical.replace(/_/g, "-");
149135
+ const resourceName = canonical;
148873
149136
  return resourceName.endsWith("s") ? resourceName : `${resourceName}s`;
148874
149137
  }
148875
- function parseCommandArgs(args) {
149138
+ function parseCommandArgs(args, domainResourceTypes) {
149139
+ let resourceType;
148876
149140
  let name;
148877
149141
  let namespace;
148878
149142
  let outputFormat;
148879
149143
  let spec = false;
148880
149144
  let noColor = false;
149145
+ let positionalIndex = 0;
148881
149146
  for (let i = 0; i < args.length; i++) {
148882
149147
  const arg = args[i] ?? "";
148883
149148
  if (arg.startsWith("--")) {
@@ -148930,11 +149195,20 @@ function parseCommandArgs(args) {
148930
149195
  i++;
148931
149196
  }
148932
149197
  }
148933
- } else if (!name) {
148934
- name = arg;
149198
+ } else {
149199
+ if (positionalIndex === 0) {
149200
+ if (domainResourceTypes?.has(arg.toLowerCase())) {
149201
+ resourceType = arg.toLowerCase();
149202
+ } else {
149203
+ name = arg;
149204
+ }
149205
+ } else if (positionalIndex === 1 && resourceType && !name) {
149206
+ name = arg;
149207
+ }
149208
+ positionalIndex++;
148935
149209
  }
148936
149210
  }
148937
- return { name, namespace, outputFormat, spec, noColor };
149211
+ return { resourceType, name, namespace, outputFormat, spec, noColor };
148938
149212
  }
148939
149213
  async function executeAPICommand(session, ctx, cmd) {
148940
149214
  const client = session.getAPIClient();
@@ -148983,8 +149257,13 @@ async function executeAPICommand(session, ctx, cmd) {
148983
149257
  }
148984
149258
  }
148985
149259
  const canonicalDomain = resolveDomain(domain) ?? domain;
148986
- const { name, namespace, outputFormat, spec, noColor } = parseCommandArgs(args);
149260
+ const domainInfo = getDomainInfo(canonicalDomain);
149261
+ const domainResourceTypes = new Set(
149262
+ domainInfo?.primaryResources?.map((r) => r.name) ?? []
149263
+ );
149264
+ const { resourceType, name, namespace, outputFormat, spec, noColor } = parseCommandArgs(args, domainResourceTypes);
148987
149265
  const effectiveNamespace = namespace ?? session.getNamespace();
149266
+ const effectiveResource = resourceType ?? canonicalDomain;
148988
149267
  const nsValidation = validateNamespaceScope(
148989
149268
  canonicalDomain,
148990
149269
  action,
@@ -149034,7 +149313,7 @@ Suggestion: Use --namespace ${nsValidation.suggestion}` : "";
149034
149313
  name: "--output",
149035
149314
  alias: "-o",
149036
149315
  type: "string",
149037
- description: "Output format (json, yaml, table)"
149316
+ description: `Output format (${OUTPUT_FORMAT_HELP})`
149038
149317
  },
149039
149318
  {
149040
149319
  name: "--name",
@@ -149042,7 +149321,7 @@ Suggestion: Use --namespace ${nsValidation.suggestion}` : "";
149042
149321
  description: "Resource name"
149043
149322
  }
149044
149323
  ],
149045
- outputFormats: ["table", "json", "yaml"]
149324
+ outputFormats: [...ALL_OUTPUT_FORMATS]
149046
149325
  };
149047
149326
  return {
149048
149327
  output: [JSON.stringify(basicSpec, null, 2)],
@@ -149051,7 +149330,7 @@ Suggestion: Use --namespace ${nsValidation.suggestion}` : "";
149051
149330
  contextChanged: false
149052
149331
  };
149053
149332
  }
149054
- const resourcePath = domainToResourcePath(canonicalDomain);
149333
+ const resourcePath = domainToResourcePath(effectiveResource);
149055
149334
  let apiPath = `/api/config/namespaces/${effectiveNamespace}/${resourcePath}`;
149056
149335
  try {
149057
149336
  let result;
@@ -149951,7 +150230,7 @@ var program2 = new Command();
149951
150230
  program2.configureHelp({
149952
150231
  formatHelp: () => formatRootHelp().join("\n")
149953
150232
  });
149954
- program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CLI for F5 XC").version(CLI_VERSION, "-v, --version", "Show version number").option("--no-color", "Disable color output").option("--logo <mode>", "Logo display mode: image, ascii, none").option("-o, --output <format>", "Output format (json, yaml, table)").option("--spec", "Output command specification as JSON (for AI)").option("--headless", "Run in headless JSON protocol mode (for AI agents)").option("-h, --help", "Show help").argument("[command...]", "Command to execute non-interactively").allowUnknownOption(true).helpOption(false).action(
150233
+ program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CLI for F5 XC").version(CLI_VERSION, "-v, --version", "Show version number").option("--no-color", "Disable color output").option("--logo <mode>", `Logo display mode: ${LOGO_MODE_HELP}`).option("-o, --output <format>", `Output format (${OUTPUT_FORMAT_HELP})`).option("--spec", "Output command specification as JSON (for AI)").option("--headless", "Run in headless JSON protocol mode (for AI agents)").option("-h, --help", "Show help").argument("[command...]", "Command to execute non-interactively").allowUnknownOption(true).helpOption(false).action(
149955
150234
  async (commandArgs, options) => {
149956
150235
  if (options.help && commandArgs.length === 0) {
149957
150236
  formatRootHelp().forEach((line) => console.log(line));