@robinmordasiewicz/f5xc-xcsh 1.0.84-2601020527 → 1.0.85-2601020738
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/completions/_xcsh +33 -33
- package/completions/xcsh.fish +33 -33
- package/dist/index.js +474 -185
- package/package.json +1 -1
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: "
|
|
44112
|
-
descriptionShort: "
|
|
44113
|
-
descriptionMedium: "
|
|
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: "
|
|
44151
|
-
descriptionShort: "
|
|
44152
|
-
descriptionMedium: "
|
|
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: "
|
|
44303
|
-
descriptionShort: "
|
|
44304
|
-
descriptionMedium: "
|
|
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: "
|
|
44342
|
-
descriptionShort: "
|
|
44343
|
-
descriptionMedium: "
|
|
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: "
|
|
44391
|
-
descriptionShort: "
|
|
44392
|
-
descriptionMedium: "
|
|
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: "
|
|
44440
|
-
descriptionShort: "
|
|
44441
|
-
descriptionMedium: "
|
|
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: "
|
|
44479
|
-
descriptionShort: "
|
|
44480
|
-
descriptionMedium: "
|
|
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: "
|
|
44520
|
-
descriptionShort: "
|
|
44521
|
-
descriptionMedium: "
|
|
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: "
|
|
44569
|
-
descriptionShort: "
|
|
44570
|
-
descriptionMedium: "
|
|
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: "
|
|
44618
|
-
descriptionShort: "
|
|
44619
|
-
descriptionMedium: "
|
|
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: "
|
|
44683
|
-
descriptionShort: "
|
|
44684
|
-
descriptionMedium: "
|
|
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: "
|
|
44736
|
-
descriptionShort: "
|
|
44737
|
-
descriptionMedium: "
|
|
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: "
|
|
44814
|
-
descriptionShort: "
|
|
44815
|
-
descriptionMedium: "
|
|
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: "
|
|
44855
|
-
descriptionShort: "
|
|
44856
|
-
descriptionMedium: "
|
|
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: "
|
|
44958
|
-
descriptionShort: "
|
|
44959
|
-
descriptionMedium: "
|
|
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: "
|
|
44999
|
-
descriptionShort: "
|
|
45000
|
-
descriptionMedium: "
|
|
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: "
|
|
45050
|
-
descriptionShort: "
|
|
45051
|
-
descriptionMedium: "
|
|
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: "
|
|
45089
|
-
descriptionShort: "
|
|
45090
|
-
descriptionMedium: "
|
|
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: "
|
|
45144
|
-
descriptionShort: "
|
|
45145
|
-
descriptionMedium: "
|
|
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: "
|
|
45193
|
-
descriptionShort: "
|
|
45194
|
-
descriptionMedium: "
|
|
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: "
|
|
45234
|
-
descriptionShort: "
|
|
45235
|
-
descriptionMedium: "
|
|
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: "
|
|
45277
|
-
descriptionShort: "
|
|
45278
|
-
descriptionMedium: "
|
|
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: "
|
|
45326
|
-
descriptionShort: "
|
|
45327
|
-
descriptionMedium: "
|
|
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: "
|
|
45377
|
-
descriptionShort: "
|
|
45378
|
-
descriptionMedium: "
|
|
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: "
|
|
45416
|
-
descriptionShort: "
|
|
45417
|
-
descriptionMedium: "
|
|
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: "
|
|
45467
|
-
descriptionShort: "
|
|
45468
|
-
descriptionMedium: "
|
|
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: "
|
|
45506
|
-
descriptionShort: "
|
|
45507
|
-
descriptionMedium: "
|
|
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: "
|
|
45611
|
-
descriptionShort: "
|
|
45612
|
-
descriptionMedium: "
|
|
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: "
|
|
45652
|
-
descriptionShort: "
|
|
45653
|
-
descriptionMedium: "
|
|
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: "
|
|
45740
|
-
descriptionShort: "
|
|
45741
|
-
descriptionMedium: "
|
|
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: "
|
|
45818
|
-
descriptionShort: "
|
|
45819
|
-
descriptionMedium: "
|
|
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: "
|
|
45869
|
-
descriptionShort: "
|
|
45870
|
-
descriptionMedium: "
|
|
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: "
|
|
46025
|
-
descriptionShort: "
|
|
46026
|
-
descriptionMedium: "
|
|
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,
|
|
@@ -46237,7 +46237,8 @@ var ContextValidator = class {
|
|
|
46237
46237
|
|
|
46238
46238
|
// src/repl/history.ts
|
|
46239
46239
|
import { readFileSync as readFileSync2, writeFileSync, mkdirSync, existsSync as existsSync2 } from "fs";
|
|
46240
|
-
import { dirname } from "path";
|
|
46240
|
+
import { dirname, join as join2 } from "path";
|
|
46241
|
+
import { homedir as homedir2 } from "os";
|
|
46241
46242
|
|
|
46242
46243
|
// src/config/paths.ts
|
|
46243
46244
|
import { homedir } from "os";
|
|
@@ -46281,6 +46282,7 @@ var paths = {
|
|
|
46281
46282
|
};
|
|
46282
46283
|
|
|
46283
46284
|
// src/repl/history.ts
|
|
46285
|
+
var LEGACY_HISTORY_PATH = join2(homedir2(), ".xcsh_history");
|
|
46284
46286
|
var SENSITIVE_PATTERNS = [
|
|
46285
46287
|
// Flag-based patterns: --flag value or --flag=value (capture flag and separator separately)
|
|
46286
46288
|
{
|
|
@@ -46339,9 +46341,21 @@ var HistoryManager = class _HistoryManager {
|
|
|
46339
46341
|
}
|
|
46340
46342
|
/**
|
|
46341
46343
|
* Load reads history from the history file
|
|
46344
|
+
* Includes one-time migration from legacy ~/.xcsh_history location
|
|
46342
46345
|
*/
|
|
46343
46346
|
async load() {
|
|
46344
46347
|
try {
|
|
46348
|
+
const newPathExists = existsSync2(this.path);
|
|
46349
|
+
const legacyExists = existsSync2(LEGACY_HISTORY_PATH);
|
|
46350
|
+
if (!newPathExists && legacyExists) {
|
|
46351
|
+
const dir = dirname(this.path);
|
|
46352
|
+
mkdirSync(dir, { recursive: true });
|
|
46353
|
+
const legacyContent = readFileSync2(
|
|
46354
|
+
LEGACY_HISTORY_PATH,
|
|
46355
|
+
"utf-8"
|
|
46356
|
+
);
|
|
46357
|
+
writeFileSync(this.path, legacyContent, "utf-8");
|
|
46358
|
+
}
|
|
46345
46359
|
if (!existsSync2(this.path)) {
|
|
46346
46360
|
return;
|
|
46347
46361
|
}
|
|
@@ -46620,8 +46634,8 @@ function getLogoModeFromEnv(envPrefix) {
|
|
|
46620
46634
|
var CLI_NAME = "xcsh";
|
|
46621
46635
|
var CLI_FULL_NAME = "F5 Distributed Cloud Shell";
|
|
46622
46636
|
function getVersion() {
|
|
46623
|
-
if ("v1.0.
|
|
46624
|
-
return "v1.0.
|
|
46637
|
+
if ("v1.0.85-2601020738") {
|
|
46638
|
+
return "v1.0.85-2601020738";
|
|
46625
46639
|
}
|
|
46626
46640
|
if (process.env.XCSH_VERSION) {
|
|
46627
46641
|
return process.env.XCSH_VERSION;
|
|
@@ -46695,7 +46709,7 @@ function colorDim(text) {
|
|
|
46695
46709
|
// src/profile/manager.ts
|
|
46696
46710
|
var import_yaml = __toESM(require_dist(), 1);
|
|
46697
46711
|
import { promises as fs2 } from "fs";
|
|
46698
|
-
import { join as
|
|
46712
|
+
import { join as join3 } from "path";
|
|
46699
46713
|
function snakeToCamel(str) {
|
|
46700
46714
|
return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
46701
46715
|
}
|
|
@@ -46728,7 +46742,7 @@ var ProfileManager = class {
|
|
|
46728
46742
|
* Get path to profile JSON file
|
|
46729
46743
|
*/
|
|
46730
46744
|
getProfilePath(name) {
|
|
46731
|
-
return
|
|
46745
|
+
return join3(this.config.profilesDir, `${name}.json`);
|
|
46732
46746
|
}
|
|
46733
46747
|
/**
|
|
46734
46748
|
* Validate profile name (alphanumeric, dash, underscore only)
|
|
@@ -46787,7 +46801,7 @@ var ProfileManager = class {
|
|
|
46787
46801
|
await this.ensureDirectories();
|
|
46788
46802
|
const extensions = [".json", ".yaml", ".yml"];
|
|
46789
46803
|
for (const ext of extensions) {
|
|
46790
|
-
const path =
|
|
46804
|
+
const path = join3(this.config.profilesDir, `${name}${ext}`);
|
|
46791
46805
|
try {
|
|
46792
46806
|
const data = await fs2.readFile(path, "utf-8");
|
|
46793
46807
|
let parsed;
|
|
@@ -144106,7 +144120,11 @@ var REPLSession = class {
|
|
|
144106
144120
|
};
|
|
144107
144121
|
|
|
144108
144122
|
// src/repl/prompt.ts
|
|
144109
|
-
function buildPlainPrompt(
|
|
144123
|
+
function buildPlainPrompt(session) {
|
|
144124
|
+
const ctx = session.getContextPath();
|
|
144125
|
+
if (ctx.isDomain()) {
|
|
144126
|
+
return `${CLI_NAME}:${ctx.domain}> `;
|
|
144127
|
+
}
|
|
144110
144128
|
return `${CLI_NAME}> `;
|
|
144111
144129
|
}
|
|
144112
144130
|
|
|
@@ -147493,7 +147511,146 @@ var CompletionCache = class {
|
|
|
147493
147511
|
}
|
|
147494
147512
|
};
|
|
147495
147513
|
|
|
147514
|
+
// src/repl/completion/resource-fetcher.ts
|
|
147515
|
+
var CACHE_TTL = 30 * 1e3;
|
|
147516
|
+
var ResourceFetcher = class {
|
|
147517
|
+
cache = /* @__PURE__ */ new Map();
|
|
147518
|
+
pendingRequests = /* @__PURE__ */ new Map();
|
|
147519
|
+
/**
|
|
147520
|
+
* Convert resource type (snake_case) to API path (kebab-case with plural)
|
|
147521
|
+
* Examples:
|
|
147522
|
+
* http_loadbalancer -> http-loadbalancers
|
|
147523
|
+
* origin_pool -> origin-pools
|
|
147524
|
+
* app_firewall -> app-firewalls
|
|
147525
|
+
*/
|
|
147526
|
+
resourceTypeToApiPath(resourceType) {
|
|
147527
|
+
const kebabCase = resourceType.replace(/_/g, "-");
|
|
147528
|
+
return kebabCase.endsWith("s") ? kebabCase : `${kebabCase}s`;
|
|
147529
|
+
}
|
|
147530
|
+
/**
|
|
147531
|
+
* Generate cache key from namespace and resource type
|
|
147532
|
+
*/
|
|
147533
|
+
getCacheKey(namespace, resourceType) {
|
|
147534
|
+
return `${namespace}:${resourceType}`;
|
|
147535
|
+
}
|
|
147536
|
+
/**
|
|
147537
|
+
* Check if cache entry is still valid
|
|
147538
|
+
*/
|
|
147539
|
+
isCacheValid(entry) {
|
|
147540
|
+
if (!entry) return false;
|
|
147541
|
+
return Date.now() - entry.timestamp < CACHE_TTL;
|
|
147542
|
+
}
|
|
147543
|
+
/**
|
|
147544
|
+
* Check if a resource type is currently being loaded
|
|
147545
|
+
*/
|
|
147546
|
+
isLoading(namespace, resourceType) {
|
|
147547
|
+
const key = this.getCacheKey(namespace, resourceType);
|
|
147548
|
+
const entry = this.cache.get(key);
|
|
147549
|
+
return entry?.loading ?? false;
|
|
147550
|
+
}
|
|
147551
|
+
/**
|
|
147552
|
+
* Fetch resource names from API with caching and deduplication
|
|
147553
|
+
*/
|
|
147554
|
+
async fetchResourceNames(client, namespace, resourceType, partial = "") {
|
|
147555
|
+
const cacheKey = this.getCacheKey(namespace, resourceType);
|
|
147556
|
+
const cached = this.cache.get(cacheKey);
|
|
147557
|
+
if (cached && this.isCacheValid(cached)) {
|
|
147558
|
+
return this.filterByPrefix(cached.names, partial);
|
|
147559
|
+
}
|
|
147560
|
+
const pending = this.pendingRequests.get(cacheKey);
|
|
147561
|
+
if (pending) {
|
|
147562
|
+
const names = await pending;
|
|
147563
|
+
return this.filterByPrefix(names, partial);
|
|
147564
|
+
}
|
|
147565
|
+
if (!client?.isAuthenticated()) {
|
|
147566
|
+
return [];
|
|
147567
|
+
}
|
|
147568
|
+
const existingNames = cached?.names ?? [];
|
|
147569
|
+
const existingTimestamp = cached?.timestamp ?? 0;
|
|
147570
|
+
this.cache.set(cacheKey, {
|
|
147571
|
+
names: existingNames,
|
|
147572
|
+
timestamp: existingTimestamp,
|
|
147573
|
+
loading: true
|
|
147574
|
+
});
|
|
147575
|
+
const fetchPromise = this.doFetch(client, namespace, resourceType);
|
|
147576
|
+
this.pendingRequests.set(cacheKey, fetchPromise);
|
|
147577
|
+
try {
|
|
147578
|
+
const names = await fetchPromise;
|
|
147579
|
+
this.cache.set(cacheKey, {
|
|
147580
|
+
names,
|
|
147581
|
+
timestamp: Date.now(),
|
|
147582
|
+
loading: false
|
|
147583
|
+
});
|
|
147584
|
+
return this.filterByPrefix(names, partial);
|
|
147585
|
+
} catch {
|
|
147586
|
+
const existing = this.cache.get(cacheKey);
|
|
147587
|
+
if (existing) {
|
|
147588
|
+
existing.loading = false;
|
|
147589
|
+
}
|
|
147590
|
+
return [];
|
|
147591
|
+
} finally {
|
|
147592
|
+
this.pendingRequests.delete(cacheKey);
|
|
147593
|
+
}
|
|
147594
|
+
}
|
|
147595
|
+
/**
|
|
147596
|
+
* Internal fetch implementation
|
|
147597
|
+
*/
|
|
147598
|
+
async doFetch(client, namespace, resourceType) {
|
|
147599
|
+
const apiPath = this.resourceTypeToApiPath(resourceType);
|
|
147600
|
+
const endpoint = `/api/config/namespaces/${namespace}/${apiPath}`;
|
|
147601
|
+
try {
|
|
147602
|
+
const response = await client.get(endpoint);
|
|
147603
|
+
if (response.ok && response.data?.items) {
|
|
147604
|
+
return response.data.items.map((item) => item.name ?? item.metadata?.name).filter((name) => !!name).sort();
|
|
147605
|
+
}
|
|
147606
|
+
} catch {
|
|
147607
|
+
}
|
|
147608
|
+
return [];
|
|
147609
|
+
}
|
|
147610
|
+
/**
|
|
147611
|
+
* Filter names by prefix (case-insensitive)
|
|
147612
|
+
*/
|
|
147613
|
+
filterByPrefix(names, prefix) {
|
|
147614
|
+
if (!prefix) return names;
|
|
147615
|
+
const lowerPrefix = prefix.toLowerCase();
|
|
147616
|
+
return names.filter(
|
|
147617
|
+
(name) => name.toLowerCase().startsWith(lowerPrefix)
|
|
147618
|
+
);
|
|
147619
|
+
}
|
|
147620
|
+
/**
|
|
147621
|
+
* Prefetch resource names for a domain's primary resources
|
|
147622
|
+
* Call this when entering a domain context to warm the cache
|
|
147623
|
+
*/
|
|
147624
|
+
async prefetch(client, namespace, resourceTypes) {
|
|
147625
|
+
if (!client?.isAuthenticated()) return;
|
|
147626
|
+
await Promise.allSettled(
|
|
147627
|
+
resourceTypes.map(
|
|
147628
|
+
(rt) => this.fetchResourceNames(client, namespace, rt)
|
|
147629
|
+
)
|
|
147630
|
+
);
|
|
147631
|
+
}
|
|
147632
|
+
/**
|
|
147633
|
+
* Clear cache for a specific namespace (e.g., when switching namespaces)
|
|
147634
|
+
*/
|
|
147635
|
+
clearNamespaceCache(namespace) {
|
|
147636
|
+
for (const key of this.cache.keys()) {
|
|
147637
|
+
if (key.startsWith(`${namespace}:`)) {
|
|
147638
|
+
this.cache.delete(key);
|
|
147639
|
+
}
|
|
147640
|
+
}
|
|
147641
|
+
}
|
|
147642
|
+
/**
|
|
147643
|
+
* Clear all cached data
|
|
147644
|
+
*/
|
|
147645
|
+
clearAll() {
|
|
147646
|
+
this.cache.clear();
|
|
147647
|
+
this.pendingRequests.clear();
|
|
147648
|
+
}
|
|
147649
|
+
};
|
|
147650
|
+
var resourceFetcher = new ResourceFetcher();
|
|
147651
|
+
|
|
147496
147652
|
// src/repl/completion/completer.ts
|
|
147653
|
+
var RESOURCE_ACTIONS = /* @__PURE__ */ new Set(["list", "get", "delete", "status"]);
|
|
147497
147654
|
function parseInputArgs(text) {
|
|
147498
147655
|
const args = [];
|
|
147499
147656
|
let current = "";
|
|
@@ -147539,21 +147696,22 @@ function parseInput(text) {
|
|
|
147539
147696
|
const isCompletingFlag = currentWord.startsWith("-");
|
|
147540
147697
|
let isCompletingFlagValue = false;
|
|
147541
147698
|
let currentFlag = null;
|
|
147542
|
-
|
|
147543
|
-
|
|
147699
|
+
const valueFlagPatterns = [
|
|
147700
|
+
"--namespace",
|
|
147701
|
+
"-ns",
|
|
147702
|
+
"--output",
|
|
147703
|
+
"-o",
|
|
147704
|
+
"--name",
|
|
147705
|
+
"-n",
|
|
147706
|
+
"--file",
|
|
147707
|
+
"-f",
|
|
147708
|
+
"--limit",
|
|
147709
|
+
"--label"
|
|
147710
|
+
];
|
|
147711
|
+
if (args.length >= 1 && !currentWord.startsWith("-")) {
|
|
147712
|
+
const flagIndex = endsWithSpace ? args.length - 1 : args.length - 2;
|
|
147713
|
+
const prevArg = args[flagIndex];
|
|
147544
147714
|
if (prevArg && prevArg.startsWith("-") && !prevArg.includes("=")) {
|
|
147545
|
-
const valueFlagPatterns = [
|
|
147546
|
-
"--namespace",
|
|
147547
|
-
"-ns",
|
|
147548
|
-
"--output",
|
|
147549
|
-
"-o",
|
|
147550
|
-
"--name",
|
|
147551
|
-
"-n",
|
|
147552
|
-
"--file",
|
|
147553
|
-
"-f",
|
|
147554
|
-
"--limit",
|
|
147555
|
-
"--label"
|
|
147556
|
-
];
|
|
147557
147715
|
if (valueFlagPatterns.some((f) => prevArg === f)) {
|
|
147558
147716
|
isCompletingFlagValue = true;
|
|
147559
147717
|
currentFlag = prevArg;
|
|
@@ -147609,6 +147767,7 @@ var Completer = class {
|
|
|
147609
147767
|
parsed.currentWord
|
|
147610
147768
|
);
|
|
147611
147769
|
}
|
|
147770
|
+
const resourceCtx = this.parseResourceContext(parsed);
|
|
147612
147771
|
if (parsed.isCompletingFlagValue && parsed.currentFlag) {
|
|
147613
147772
|
return await this.getFlagValueCompletions(
|
|
147614
147773
|
parsed.currentFlag,
|
|
@@ -147616,7 +147775,43 @@ var Completer = class {
|
|
|
147616
147775
|
);
|
|
147617
147776
|
}
|
|
147618
147777
|
if (parsed.isCompletingFlag) {
|
|
147619
|
-
return this.getFlagCompletions(
|
|
147778
|
+
return this.getFlagCompletions(
|
|
147779
|
+
parsed.currentWord,
|
|
147780
|
+
resourceCtx.action ?? void 0
|
|
147781
|
+
);
|
|
147782
|
+
}
|
|
147783
|
+
if (resourceCtx.resourceType) {
|
|
147784
|
+
const resourceNames = await this.getResourceNameSuggestions(
|
|
147785
|
+
resourceCtx.resourceType,
|
|
147786
|
+
resourceCtx.resourceNamePartial
|
|
147787
|
+
);
|
|
147788
|
+
if (resourceNames.length > 0) {
|
|
147789
|
+
return resourceNames;
|
|
147790
|
+
}
|
|
147791
|
+
return this.getActionFlagSuggestions(
|
|
147792
|
+
resourceCtx.action ?? void 0
|
|
147793
|
+
);
|
|
147794
|
+
}
|
|
147795
|
+
if (resourceCtx.domain && resourceCtx.action && RESOURCE_ACTIONS.has(resourceCtx.action) && !resourceCtx.resourceType) {
|
|
147796
|
+
const resourceTypes = this.getResourceTypeSuggestions(
|
|
147797
|
+
resourceCtx.domain
|
|
147798
|
+
);
|
|
147799
|
+
if (resourceTypes.length > 0) {
|
|
147800
|
+
if (parsed.currentWord && !parsed.currentWord.startsWith("-")) {
|
|
147801
|
+
const filtered = this.filterSuggestions(
|
|
147802
|
+
resourceTypes,
|
|
147803
|
+
parsed.currentWord
|
|
147804
|
+
);
|
|
147805
|
+
if (filtered.length > 0) {
|
|
147806
|
+
return filtered;
|
|
147807
|
+
}
|
|
147808
|
+
} else if (!parsed.currentWord) {
|
|
147809
|
+
return [
|
|
147810
|
+
...resourceTypes,
|
|
147811
|
+
...this.getActionFlagSuggestions(resourceCtx.action)
|
|
147812
|
+
];
|
|
147813
|
+
}
|
|
147814
|
+
}
|
|
147620
147815
|
}
|
|
147621
147816
|
let suggestions;
|
|
147622
147817
|
if (parsed.isEscapedToRoot) {
|
|
@@ -147718,21 +147913,16 @@ var Completer = class {
|
|
|
147718
147913
|
}
|
|
147719
147914
|
/**
|
|
147720
147915
|
* Get suggestions based on current navigation context
|
|
147916
|
+
* Note: Actions don't create sub-contexts - only domain-level navigation exists
|
|
147721
147917
|
*/
|
|
147722
147918
|
async getContextualSuggestions() {
|
|
147723
147919
|
if (!this.session) {
|
|
147724
147920
|
return this.getRootContextSuggestions();
|
|
147725
147921
|
}
|
|
147726
147922
|
const ctx = this.session.getContextPath();
|
|
147727
|
-
if (ctx.isRoot()) {
|
|
147728
|
-
return this.getRootContextSuggestions();
|
|
147729
|
-
}
|
|
147730
147923
|
if (ctx.isDomain()) {
|
|
147731
147924
|
return this.getDomainContextSuggestions();
|
|
147732
147925
|
}
|
|
147733
|
-
if (ctx.isAction()) {
|
|
147734
|
-
return await this.getActionContextSuggestions();
|
|
147735
|
-
}
|
|
147736
147926
|
return this.getRootContextSuggestions();
|
|
147737
147927
|
}
|
|
147738
147928
|
/**
|
|
@@ -147850,44 +148040,35 @@ var Completer = class {
|
|
|
147850
148040
|
return suggestions;
|
|
147851
148041
|
}
|
|
147852
148042
|
/**
|
|
147853
|
-
* Get suggestions
|
|
148043
|
+
* Get resource-related suggestions for a domain with an action
|
|
148044
|
+
* Called when user types an action (list, get, delete) followed by space
|
|
147854
148045
|
*/
|
|
147855
|
-
|
|
148046
|
+
getResourceSuggestionsForAction(domain, action) {
|
|
147856
148047
|
const suggestions = [];
|
|
147857
|
-
|
|
147858
|
-
|
|
147859
|
-
|
|
147860
|
-
|
|
147861
|
-
|
|
147862
|
-
|
|
147863
|
-
|
|
147864
|
-
|
|
147865
|
-
|
|
147866
|
-
|
|
147867
|
-
|
|
147868
|
-
|
|
147869
|
-
{
|
|
147870
|
-
text: "..",
|
|
147871
|
-
description: "Go up to domain context",
|
|
147872
|
-
category: "navigation"
|
|
147873
|
-
},
|
|
147874
|
-
{
|
|
147875
|
-
text: "root",
|
|
147876
|
-
description: "Go to root context",
|
|
147877
|
-
category: "navigation"
|
|
147878
|
-
},
|
|
148048
|
+
if (RESOURCE_ACTIONS.has(action)) {
|
|
148049
|
+
const resourceTypes = this.getResourceTypeSuggestions(domain);
|
|
148050
|
+
suggestions.push(...resourceTypes);
|
|
148051
|
+
}
|
|
148052
|
+
suggestions.push(...this.getCommonFlagSuggestions());
|
|
148053
|
+
return suggestions;
|
|
148054
|
+
}
|
|
148055
|
+
/**
|
|
148056
|
+
* Get common flag suggestions (for use within domain context)
|
|
148057
|
+
*/
|
|
148058
|
+
getCommonFlagSuggestions() {
|
|
148059
|
+
return [
|
|
148060
|
+
{ text: "--namespace", description: "Namespace", category: "flag" },
|
|
147879
148061
|
{
|
|
147880
|
-
text: "
|
|
147881
|
-
description:
|
|
147882
|
-
category: "
|
|
148062
|
+
text: "--output",
|
|
148063
|
+
description: `Output format (${OUTPUT_FORMAT_HELP})`,
|
|
148064
|
+
category: "flag"
|
|
147883
148065
|
},
|
|
147884
148066
|
{
|
|
147885
|
-
text: "
|
|
147886
|
-
description: "
|
|
147887
|
-
category: "
|
|
148067
|
+
text: "-o",
|
|
148068
|
+
description: "Output format (short)",
|
|
148069
|
+
category: "flag"
|
|
147888
148070
|
}
|
|
147889
|
-
|
|
147890
|
-
return suggestions;
|
|
148071
|
+
];
|
|
147891
148072
|
}
|
|
147892
148073
|
/**
|
|
147893
148074
|
* Get domain suggestions from unified registry
|
|
@@ -147909,9 +148090,100 @@ var Completer = class {
|
|
|
147909
148090
|
);
|
|
147910
148091
|
}
|
|
147911
148092
|
/**
|
|
147912
|
-
* Get
|
|
148093
|
+
* Get resource type suggestions for a domain
|
|
148094
|
+
* Returns the primaryResources from domain metadata
|
|
148095
|
+
*/
|
|
148096
|
+
getResourceTypeSuggestions(domain) {
|
|
148097
|
+
const domainInfo = getDomainInfo(domain);
|
|
148098
|
+
if (!domainInfo?.primaryResources) {
|
|
148099
|
+
return [];
|
|
148100
|
+
}
|
|
148101
|
+
return domainInfo.primaryResources.map((resource) => ({
|
|
148102
|
+
text: resource.name,
|
|
148103
|
+
description: resource.descriptionShort || resource.description,
|
|
148104
|
+
category: "resource"
|
|
148105
|
+
}));
|
|
148106
|
+
}
|
|
148107
|
+
/**
|
|
148108
|
+
* Get resource name suggestions from live API
|
|
148109
|
+
* Fetches actual resource names for a given resource type
|
|
147913
148110
|
*/
|
|
147914
|
-
|
|
148111
|
+
async getResourceNameSuggestions(resourceType, partial = "") {
|
|
148112
|
+
if (!this.session) return [];
|
|
148113
|
+
const namespace = this.session.getNamespace();
|
|
148114
|
+
const client = this.session.getAPIClient();
|
|
148115
|
+
const names = await resourceFetcher.fetchResourceNames(
|
|
148116
|
+
client,
|
|
148117
|
+
namespace,
|
|
148118
|
+
resourceType,
|
|
148119
|
+
partial
|
|
148120
|
+
);
|
|
148121
|
+
return names.map((name) => ({
|
|
148122
|
+
text: name,
|
|
148123
|
+
description: `${resourceType} resource`,
|
|
148124
|
+
category: "resource-name"
|
|
148125
|
+
}));
|
|
148126
|
+
}
|
|
148127
|
+
/**
|
|
148128
|
+
* Parse resource context from input
|
|
148129
|
+
* Detects: domain → action → resourceType → resourceName
|
|
148130
|
+
* Note: Actions are detected from input args, not navigation context
|
|
148131
|
+
*
|
|
148132
|
+
* Key distinction:
|
|
148133
|
+
* - "list http_loadbalancer" (no space) → still typing resource type
|
|
148134
|
+
* - "list http_loadbalancer " (with space) → resource type complete, ready for resource name
|
|
148135
|
+
*/
|
|
148136
|
+
parseResourceContext(parsed) {
|
|
148137
|
+
const ctx = {
|
|
148138
|
+
domain: null,
|
|
148139
|
+
action: null,
|
|
148140
|
+
resourceType: null,
|
|
148141
|
+
resourceNamePartial: ""
|
|
148142
|
+
};
|
|
148143
|
+
if (!this.session) {
|
|
148144
|
+
return ctx;
|
|
148145
|
+
}
|
|
148146
|
+
const navCtx = this.session.getContextPath();
|
|
148147
|
+
ctx.domain = navCtx.domain || null;
|
|
148148
|
+
if (parsed.args.length > 0) {
|
|
148149
|
+
const firstArg = parsed.args[0]?.toLowerCase() ?? "";
|
|
148150
|
+
if (RESOURCE_ACTIONS.has(firstArg)) {
|
|
148151
|
+
ctx.action = firstArg;
|
|
148152
|
+
}
|
|
148153
|
+
}
|
|
148154
|
+
if (ctx.domain && ctx.action && RESOURCE_ACTIONS.has(ctx.action)) {
|
|
148155
|
+
const domainInfo = getDomainInfo(ctx.domain);
|
|
148156
|
+
const resourceNames = new Set(
|
|
148157
|
+
domainInfo?.primaryResources?.map((r) => r.name) ?? []
|
|
148158
|
+
);
|
|
148159
|
+
for (let i = 1; i < parsed.args.length; i++) {
|
|
148160
|
+
const arg = parsed.args[i]?.toLowerCase() ?? "";
|
|
148161
|
+
if (resourceNames.has(arg)) {
|
|
148162
|
+
const isLastArg = i === parsed.args.length - 1;
|
|
148163
|
+
const isStillTyping = isLastArg && parsed.currentWord.toLowerCase() === arg;
|
|
148164
|
+
if (isStillTyping) {
|
|
148165
|
+
break;
|
|
148166
|
+
}
|
|
148167
|
+
ctx.resourceType = arg;
|
|
148168
|
+
if (i < parsed.args.length - 1) {
|
|
148169
|
+
const nextArg = parsed.args[i + 1]?.toLowerCase() ?? "";
|
|
148170
|
+
if (!nextArg.startsWith("-")) {
|
|
148171
|
+
ctx.resourceNamePartial = nextArg;
|
|
148172
|
+
}
|
|
148173
|
+
} else if (!parsed.currentWord) {
|
|
148174
|
+
ctx.resourceNamePartial = "";
|
|
148175
|
+
}
|
|
148176
|
+
break;
|
|
148177
|
+
}
|
|
148178
|
+
}
|
|
148179
|
+
}
|
|
148180
|
+
return ctx;
|
|
148181
|
+
}
|
|
148182
|
+
/**
|
|
148183
|
+
* Get flag suggestions for a given action
|
|
148184
|
+
* @param action - The action to get flags for (optional, uses common flags if not provided)
|
|
148185
|
+
*/
|
|
148186
|
+
getActionFlagSuggestions(action) {
|
|
147915
148187
|
const commonFlags = [
|
|
147916
148188
|
{ text: "--name", description: "Resource name", category: "flag" },
|
|
147917
148189
|
{
|
|
@@ -147931,11 +148203,9 @@ var Completer = class {
|
|
|
147931
148203
|
category: "flag"
|
|
147932
148204
|
}
|
|
147933
148205
|
];
|
|
147934
|
-
if (!
|
|
148206
|
+
if (!action) {
|
|
147935
148207
|
return commonFlags;
|
|
147936
148208
|
}
|
|
147937
|
-
const ctx = this.session.getContextPath();
|
|
147938
|
-
const action = ctx.action;
|
|
147939
148209
|
const actionFlags = [...commonFlags];
|
|
147940
148210
|
switch (action) {
|
|
147941
148211
|
case "list":
|
|
@@ -147993,9 +148263,11 @@ var Completer = class {
|
|
|
147993
148263
|
}
|
|
147994
148264
|
/**
|
|
147995
148265
|
* Get flag completions filtered by prefix
|
|
148266
|
+
* @param prefix - The prefix to filter by
|
|
148267
|
+
* @param action - Optional action for action-specific flags
|
|
147996
148268
|
*/
|
|
147997
|
-
getFlagCompletions(prefix) {
|
|
147998
|
-
const allFlags = this.getActionFlagSuggestions();
|
|
148269
|
+
getFlagCompletions(prefix, action) {
|
|
148270
|
+
const allFlags = this.getActionFlagSuggestions(action);
|
|
147999
148271
|
return this.filterSuggestions(allFlags, prefix);
|
|
148000
148272
|
}
|
|
148001
148273
|
/**
|
|
@@ -148824,6 +149096,19 @@ async function handleDomainNavigation(domain, args, ctx, session) {
|
|
|
148824
149096
|
};
|
|
148825
149097
|
}
|
|
148826
149098
|
ctx.setDomain(domain);
|
|
149099
|
+
if (args.length > 0) {
|
|
149100
|
+
const firstArg2 = args[0]?.toLowerCase() ?? "";
|
|
149101
|
+
const resourceActions = /* @__PURE__ */ new Set(["list", "get", "delete", "status"]);
|
|
149102
|
+
if (resourceActions.has(firstArg2)) {
|
|
149103
|
+
const cmd = {
|
|
149104
|
+
raw: args.join(" "),
|
|
149105
|
+
args,
|
|
149106
|
+
isBuiltin: false,
|
|
149107
|
+
isDirectNavigation: false
|
|
149108
|
+
};
|
|
149109
|
+
return await executeAPICommand(session, ctx, cmd);
|
|
149110
|
+
}
|
|
149111
|
+
}
|
|
148827
149112
|
return {
|
|
148828
149113
|
output: [`Entered ${domain} context`],
|
|
148829
149114
|
shouldExit: false,
|
|
@@ -148857,31 +149142,21 @@ async function executeCommand(input, session) {
|
|
|
148857
149142
|
return handleDomainNavigation(firstWord, domainArgs, ctx, session);
|
|
148858
149143
|
}
|
|
148859
149144
|
}
|
|
148860
|
-
if (ctx.isDomain() && !ctx.isAction()) {
|
|
148861
|
-
const firstWord = cmd.args[0] ?? "";
|
|
148862
|
-
if (firstWord && !firstWord.startsWith("-")) {
|
|
148863
|
-
ctx.setAction(firstWord);
|
|
148864
|
-
return {
|
|
148865
|
-
output: [`Entered ${ctx.domain} > ${firstWord} context`],
|
|
148866
|
-
shouldExit: false,
|
|
148867
|
-
shouldClear: false,
|
|
148868
|
-
contextChanged: true
|
|
148869
|
-
};
|
|
148870
|
-
}
|
|
148871
|
-
}
|
|
148872
149145
|
return await executeAPICommand(session, ctx, cmd);
|
|
148873
149146
|
}
|
|
148874
149147
|
function domainToResourcePath(domain) {
|
|
148875
149148
|
const canonical = resolveDomain(domain) ?? domain;
|
|
148876
|
-
const resourceName = canonical
|
|
149149
|
+
const resourceName = canonical;
|
|
148877
149150
|
return resourceName.endsWith("s") ? resourceName : `${resourceName}s`;
|
|
148878
149151
|
}
|
|
148879
|
-
function parseCommandArgs(args) {
|
|
149152
|
+
function parseCommandArgs(args, domainResourceTypes) {
|
|
149153
|
+
let resourceType;
|
|
148880
149154
|
let name;
|
|
148881
149155
|
let namespace;
|
|
148882
149156
|
let outputFormat;
|
|
148883
149157
|
let spec = false;
|
|
148884
149158
|
let noColor = false;
|
|
149159
|
+
let positionalIndex = 0;
|
|
148885
149160
|
for (let i = 0; i < args.length; i++) {
|
|
148886
149161
|
const arg = args[i] ?? "";
|
|
148887
149162
|
if (arg.startsWith("--")) {
|
|
@@ -148934,11 +149209,20 @@ function parseCommandArgs(args) {
|
|
|
148934
149209
|
i++;
|
|
148935
149210
|
}
|
|
148936
149211
|
}
|
|
148937
|
-
} else
|
|
148938
|
-
|
|
149212
|
+
} else {
|
|
149213
|
+
if (positionalIndex === 0) {
|
|
149214
|
+
if (domainResourceTypes?.has(arg.toLowerCase())) {
|
|
149215
|
+
resourceType = arg.toLowerCase();
|
|
149216
|
+
} else {
|
|
149217
|
+
name = arg;
|
|
149218
|
+
}
|
|
149219
|
+
} else if (positionalIndex === 1 && resourceType && !name) {
|
|
149220
|
+
name = arg;
|
|
149221
|
+
}
|
|
149222
|
+
positionalIndex++;
|
|
148939
149223
|
}
|
|
148940
149224
|
}
|
|
148941
|
-
return { name, namespace, outputFormat, spec, noColor };
|
|
149225
|
+
return { resourceType, name, namespace, outputFormat, spec, noColor };
|
|
148942
149226
|
}
|
|
148943
149227
|
async function executeAPICommand(session, ctx, cmd) {
|
|
148944
149228
|
const client = session.getAPIClient();
|
|
@@ -148987,8 +149271,13 @@ async function executeAPICommand(session, ctx, cmd) {
|
|
|
148987
149271
|
}
|
|
148988
149272
|
}
|
|
148989
149273
|
const canonicalDomain = resolveDomain(domain) ?? domain;
|
|
148990
|
-
const
|
|
149274
|
+
const domainInfo = getDomainInfo(canonicalDomain);
|
|
149275
|
+
const domainResourceTypes = new Set(
|
|
149276
|
+
domainInfo?.primaryResources?.map((r) => r.name) ?? []
|
|
149277
|
+
);
|
|
149278
|
+
const { resourceType, name, namespace, outputFormat, spec, noColor } = parseCommandArgs(args, domainResourceTypes);
|
|
148991
149279
|
const effectiveNamespace = namespace ?? session.getNamespace();
|
|
149280
|
+
const effectiveResource = resourceType ?? canonicalDomain;
|
|
148992
149281
|
const nsValidation = validateNamespaceScope(
|
|
148993
149282
|
canonicalDomain,
|
|
148994
149283
|
action,
|
|
@@ -149055,7 +149344,7 @@ Suggestion: Use --namespace ${nsValidation.suggestion}` : "";
|
|
|
149055
149344
|
contextChanged: false
|
|
149056
149345
|
};
|
|
149057
149346
|
}
|
|
149058
|
-
const resourcePath = domainToResourcePath(
|
|
149347
|
+
const resourcePath = domainToResourcePath(effectiveResource);
|
|
149059
149348
|
let apiPath = `/api/config/namespaces/${effectiveNamespace}/${resourcePath}`;
|
|
149060
149349
|
try {
|
|
149061
149350
|
let result;
|