@robinmordasiewicz/xcsh 6.19.0 → 6.21.0
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 +41 -41
- package/completions/xcsh.fish +41 -41
- package/dist/index.js +868 -262
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -7936,7 +7936,7 @@ var require_react_reconciler_development = __commonJS({
|
|
|
7936
7936
|
var HostPortal = 4;
|
|
7937
7937
|
var HostComponent = 5;
|
|
7938
7938
|
var HostText = 6;
|
|
7939
|
-
var
|
|
7939
|
+
var Fragment2 = 7;
|
|
7940
7940
|
var Mode = 8;
|
|
7941
7941
|
var ContextConsumer = 9;
|
|
7942
7942
|
var ContextProvider = 10;
|
|
@@ -8076,7 +8076,7 @@ var require_react_reconciler_development = __commonJS({
|
|
|
8076
8076
|
return "DehydratedFragment";
|
|
8077
8077
|
case ForwardRef:
|
|
8078
8078
|
return getWrappedName$1(type, type.render, "ForwardRef");
|
|
8079
|
-
case
|
|
8079
|
+
case Fragment2:
|
|
8080
8080
|
return "Fragment";
|
|
8081
8081
|
case HostComponent:
|
|
8082
8082
|
return type;
|
|
@@ -11210,7 +11210,7 @@ var require_react_reconciler_development = __commonJS({
|
|
|
11210
11210
|
}
|
|
11211
11211
|
}
|
|
11212
11212
|
function updateFragment2(returnFiber, current2, fragment, lanes, key) {
|
|
11213
|
-
if (current2 === null || current2.tag !==
|
|
11213
|
+
if (current2 === null || current2.tag !== Fragment2) {
|
|
11214
11214
|
var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key);
|
|
11215
11215
|
created.return = returnFiber;
|
|
11216
11216
|
return created;
|
|
@@ -11613,7 +11613,7 @@ var require_react_reconciler_development = __commonJS({
|
|
|
11613
11613
|
if (child.key === key) {
|
|
11614
11614
|
var elementType = element.type;
|
|
11615
11615
|
if (elementType === REACT_FRAGMENT_TYPE) {
|
|
11616
|
-
if (child.tag ===
|
|
11616
|
+
if (child.tag === Fragment2) {
|
|
11617
11617
|
deleteRemainingChildren(returnFiber, child.sibling);
|
|
11618
11618
|
var existing = useFiber(child, element.props.children);
|
|
11619
11619
|
existing.return = returnFiber;
|
|
@@ -17104,7 +17104,7 @@ var require_react_reconciler_development = __commonJS({
|
|
|
17104
17104
|
var _resolvedProps2 = workInProgress2.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
|
|
17105
17105
|
return updateForwardRef(current2, workInProgress2, type, _resolvedProps2, renderLanes2);
|
|
17106
17106
|
}
|
|
17107
|
-
case
|
|
17107
|
+
case Fragment2:
|
|
17108
17108
|
return updateFragment(current2, workInProgress2, renderLanes2);
|
|
17109
17109
|
case Mode:
|
|
17110
17110
|
return updateMode(current2, workInProgress2, renderLanes2);
|
|
@@ -17541,7 +17541,7 @@ var require_react_reconciler_development = __commonJS({
|
|
|
17541
17541
|
case SimpleMemoComponent:
|
|
17542
17542
|
case FunctionComponent:
|
|
17543
17543
|
case ForwardRef:
|
|
17544
|
-
case
|
|
17544
|
+
case Fragment2:
|
|
17545
17545
|
case Mode:
|
|
17546
17546
|
case Profiler:
|
|
17547
17547
|
case ContextConsumer:
|
|
@@ -22309,7 +22309,7 @@ var require_react_reconciler_development = __commonJS({
|
|
|
22309
22309
|
return fiber;
|
|
22310
22310
|
}
|
|
22311
22311
|
function createFiberFromFragment(elements, mode, lanes, key) {
|
|
22312
|
-
var fiber = createFiber(
|
|
22312
|
+
var fiber = createFiber(Fragment2, elements, key, mode);
|
|
22313
22313
|
fiber.lanes = lanes;
|
|
22314
22314
|
return fiber;
|
|
22315
22315
|
}
|
|
@@ -38537,6 +38537,46 @@ function throttle(func, throttleMs = 0, options = {}) {
|
|
|
38537
38537
|
});
|
|
38538
38538
|
}
|
|
38539
38539
|
|
|
38540
|
+
// node_modules/ansi-escapes/index.js
|
|
38541
|
+
var ansi_escapes_exports = {};
|
|
38542
|
+
__export(ansi_escapes_exports, {
|
|
38543
|
+
ConEmu: () => ConEmu,
|
|
38544
|
+
beep: () => beep,
|
|
38545
|
+
clearScreen: () => clearScreen,
|
|
38546
|
+
clearTerminal: () => clearTerminal,
|
|
38547
|
+
clearViewport: () => clearViewport,
|
|
38548
|
+
cursorBackward: () => cursorBackward,
|
|
38549
|
+
cursorDown: () => cursorDown,
|
|
38550
|
+
cursorForward: () => cursorForward,
|
|
38551
|
+
cursorGetPosition: () => cursorGetPosition,
|
|
38552
|
+
cursorHide: () => cursorHide,
|
|
38553
|
+
cursorLeft: () => cursorLeft,
|
|
38554
|
+
cursorMove: () => cursorMove,
|
|
38555
|
+
cursorNextLine: () => cursorNextLine,
|
|
38556
|
+
cursorPrevLine: () => cursorPrevLine,
|
|
38557
|
+
cursorRestorePosition: () => cursorRestorePosition,
|
|
38558
|
+
cursorSavePosition: () => cursorSavePosition,
|
|
38559
|
+
cursorShow: () => cursorShow,
|
|
38560
|
+
cursorTo: () => cursorTo,
|
|
38561
|
+
cursorUp: () => cursorUp,
|
|
38562
|
+
default: () => base_exports,
|
|
38563
|
+
enterAlternativeScreen: () => enterAlternativeScreen,
|
|
38564
|
+
eraseDown: () => eraseDown,
|
|
38565
|
+
eraseEndLine: () => eraseEndLine,
|
|
38566
|
+
eraseLine: () => eraseLine,
|
|
38567
|
+
eraseLines: () => eraseLines,
|
|
38568
|
+
eraseScreen: () => eraseScreen,
|
|
38569
|
+
eraseStartLine: () => eraseStartLine,
|
|
38570
|
+
eraseUp: () => eraseUp,
|
|
38571
|
+
exitAlternativeScreen: () => exitAlternativeScreen,
|
|
38572
|
+
iTerm: () => iTerm,
|
|
38573
|
+
image: () => image,
|
|
38574
|
+
link: () => link,
|
|
38575
|
+
scrollDown: () => scrollDown,
|
|
38576
|
+
scrollUp: () => scrollUp,
|
|
38577
|
+
setCwd: () => setCwd
|
|
38578
|
+
});
|
|
38579
|
+
|
|
38540
38580
|
// node_modules/ansi-escapes/base.js
|
|
38541
38581
|
var base_exports = {};
|
|
38542
38582
|
__export(base_exports, {
|
|
@@ -38733,6 +38773,51 @@ var ConEmu = {
|
|
|
38733
38773
|
};
|
|
38734
38774
|
var setCwd = (cwd2 = cwdFunction()) => iTerm.setCwd(cwd2) + ConEmu.setCwd(cwd2);
|
|
38735
38775
|
|
|
38776
|
+
// src/stubs/ansi-escapes.ts
|
|
38777
|
+
var ESC2 = "\x1B[";
|
|
38778
|
+
var eraseScreen2 = `${ESC2}2J`;
|
|
38779
|
+
var cursorHome = `${ESC2}H`;
|
|
38780
|
+
var patchedClearTerminal = `${eraseScreen2}${cursorHome}`;
|
|
38781
|
+
var {
|
|
38782
|
+
beep: beep2,
|
|
38783
|
+
clearScreen: clearScreen2,
|
|
38784
|
+
clearViewport: clearViewport2,
|
|
38785
|
+
cursorBackward: cursorBackward2,
|
|
38786
|
+
cursorDown: cursorDown2,
|
|
38787
|
+
cursorForward: cursorForward2,
|
|
38788
|
+
cursorGetPosition: cursorGetPosition2,
|
|
38789
|
+
cursorHide: cursorHide2,
|
|
38790
|
+
cursorLeft: cursorLeft2,
|
|
38791
|
+
cursorMove: cursorMove2,
|
|
38792
|
+
cursorNextLine: cursorNextLine2,
|
|
38793
|
+
cursorPrevLine: cursorPrevLine2,
|
|
38794
|
+
cursorRestorePosition: cursorRestorePosition2,
|
|
38795
|
+
cursorSavePosition: cursorSavePosition2,
|
|
38796
|
+
cursorShow: cursorShow2,
|
|
38797
|
+
cursorTo: cursorTo2,
|
|
38798
|
+
cursorUp: cursorUp2,
|
|
38799
|
+
enterAlternativeScreen: enterAlternativeScreen2,
|
|
38800
|
+
eraseDown: eraseDown2,
|
|
38801
|
+
eraseEndLine: eraseEndLine2,
|
|
38802
|
+
eraseLine: eraseLine2,
|
|
38803
|
+
eraseLines: eraseLines2,
|
|
38804
|
+
eraseScreen: eraseScreenOriginal,
|
|
38805
|
+
eraseStartLine: eraseStartLine2,
|
|
38806
|
+
eraseUp: eraseUp2,
|
|
38807
|
+
exitAlternativeScreen: exitAlternativeScreen2,
|
|
38808
|
+
image: image2,
|
|
38809
|
+
link: link2,
|
|
38810
|
+
scrollDown: scrollDown2,
|
|
38811
|
+
scrollUp: scrollUp2,
|
|
38812
|
+
setCwd: setCwd2,
|
|
38813
|
+
iTerm: iTerm2,
|
|
38814
|
+
ConEmu: ConEmu2
|
|
38815
|
+
} = ansi_escapes_exports;
|
|
38816
|
+
var ansi_escapes_default = {
|
|
38817
|
+
...base_exports,
|
|
38818
|
+
clearTerminal: patchedClearTerminal
|
|
38819
|
+
};
|
|
38820
|
+
|
|
38736
38821
|
// node_modules/is-in-ci/index.js
|
|
38737
38822
|
import { env } from "process";
|
|
38738
38823
|
var isInCi = env.CI !== "0" && env.CI !== "false" && ("CI" in env || "CONTINUOUS_INTEGRATION" in env || Object.keys(env).some((key) => key.startsWith("CI_")));
|
|
@@ -42856,11 +42941,11 @@ var create = (stream, { showCursor = false } = {}) => {
|
|
|
42856
42941
|
return;
|
|
42857
42942
|
}
|
|
42858
42943
|
previousOutput = output;
|
|
42859
|
-
stream.write(
|
|
42944
|
+
stream.write(ansi_escapes_default.eraseLines(previousLineCount) + output);
|
|
42860
42945
|
previousLineCount = output.split("\n").length;
|
|
42861
42946
|
};
|
|
42862
42947
|
render2.clear = () => {
|
|
42863
|
-
stream.write(
|
|
42948
|
+
stream.write(ansi_escapes_default.eraseLines(previousLineCount));
|
|
42864
42949
|
previousOutput = "";
|
|
42865
42950
|
previousLineCount = 0;
|
|
42866
42951
|
};
|
|
@@ -43535,7 +43620,7 @@ var Ink = class {
|
|
|
43535
43620
|
this.fullStaticOutput += staticOutput;
|
|
43536
43621
|
}
|
|
43537
43622
|
if (outputHeight >= this.options.stdout.rows) {
|
|
43538
|
-
this.options.stdout.write(
|
|
43623
|
+
this.options.stdout.write(ansi_escapes_default.clearTerminal + this.fullStaticOutput + output);
|
|
43539
43624
|
this.lastOutput = output;
|
|
43540
43625
|
return;
|
|
43541
43626
|
}
|
|
@@ -43688,6 +43773,25 @@ var getInstance = (stdout, createInstance) => {
|
|
|
43688
43773
|
|
|
43689
43774
|
// node_modules/ink/build/components/Static.js
|
|
43690
43775
|
var import_react11 = __toESM(require_react(), 1);
|
|
43776
|
+
function Static(props) {
|
|
43777
|
+
const { items, children: render2, style: customStyle } = props;
|
|
43778
|
+
const [index, setIndex] = (0, import_react11.useState)(0);
|
|
43779
|
+
const itemsToRender = (0, import_react11.useMemo)(() => {
|
|
43780
|
+
return items.slice(index);
|
|
43781
|
+
}, [items, index]);
|
|
43782
|
+
(0, import_react11.useLayoutEffect)(() => {
|
|
43783
|
+
setIndex(items.length);
|
|
43784
|
+
}, [items.length]);
|
|
43785
|
+
const children = itemsToRender.map((item, itemIndex) => {
|
|
43786
|
+
return render2(item, index + itemIndex);
|
|
43787
|
+
});
|
|
43788
|
+
const style = (0, import_react11.useMemo)(() => ({
|
|
43789
|
+
position: "absolute",
|
|
43790
|
+
flexDirection: "column",
|
|
43791
|
+
...customStyle
|
|
43792
|
+
}), [customStyle]);
|
|
43793
|
+
return import_react11.default.createElement("ink-box", { internal_static: true, style }, children);
|
|
43794
|
+
}
|
|
43691
43795
|
|
|
43692
43796
|
// node_modules/ink/build/components/Transform.js
|
|
43693
43797
|
var import_react12 = __toESM(require_react(), 1);
|
|
@@ -44005,6 +44109,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44005
44109
|
name: "admin_console_and_ui",
|
|
44006
44110
|
displayName: "Admin Console And Ui",
|
|
44007
44111
|
description: "Provides management capabilities for static components used in the F5 XC admin console and user interface. Enables operations to deploy, retrieve, update, and list static UI assets within namespace boundaries. Supports configuration of console interface elements, component metadata management, and asset lifecycle operations. Use this domain to manage custom UI components, static resources, and interface configurations that extend or customize the admin console experience.",
|
|
44112
|
+
descriptionShort: "Static UI component and console asset management",
|
|
44113
|
+
descriptionMedium: "Manage static components for the admin console interface. Deploy, retrieve, and list UI assets and configuration elements within namespaces.",
|
|
44008
44114
|
aliases: [],
|
|
44009
44115
|
complexity: "simple",
|
|
44010
44116
|
isPreview: false,
|
|
@@ -44017,6 +44123,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44017
44123
|
name: "api",
|
|
44018
44124
|
displayName: "Api",
|
|
44019
44125
|
description: "Comprehensive API lifecycle management including automatic discovery and cataloging of APIs across your infrastructure, security testing to identify vulnerabilities and validate behavior, credential management for secure API access, and policy-driven API grouping. Define testing policies to continuously validate API security posture, organize APIs into logical groups for governance, and integrate with WAF and network security controls. Supports marking endpoints as non-API traffic and...",
|
|
44126
|
+
descriptionShort: "API discovery, security testing, and credential management",
|
|
44127
|
+
descriptionMedium: "Discover and catalog APIs, test security behavior, manage credentials, and define API groups with testing policies for comprehensive API lifecycle...",
|
|
44020
44128
|
aliases: ["apisec", "api-discovery"],
|
|
44021
44129
|
complexity: "advanced",
|
|
44022
44130
|
isPreview: false,
|
|
@@ -44079,6 +44187,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44079
44187
|
name: "authentication",
|
|
44080
44188
|
displayName: "Authentication",
|
|
44081
44189
|
description: "F5 Distributed Cloud Authentication API specifications",
|
|
44190
|
+
descriptionShort: "Authentication API",
|
|
44191
|
+
descriptionMedium: "F5 Distributed Cloud Authentication API specifications",
|
|
44082
44192
|
aliases: ["authn", "oidc", "sso"],
|
|
44083
44193
|
complexity: "simple",
|
|
44084
44194
|
isPreview: false,
|
|
@@ -44091,6 +44201,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44091
44201
|
name: "bigip",
|
|
44092
44202
|
displayName: "Bigip",
|
|
44093
44203
|
description: "Configure and manage BigIP F5 appliance integration with Distributed Cloud infrastructure. Create and deploy iRule scripts for advanced traffic manipulation, manage data groups for dynamic configuration, configure Access Policy Manager (APM) settings for authentication and access control, and define BigIP virtual servers. Provides metrics collection for APM performance monitoring and enables seamless hybrid deployments combining traditional BigIP infrastructure with cloud-native services...",
|
|
44204
|
+
descriptionShort: "BigIP appliance management, iRules, and data groups",
|
|
44205
|
+
descriptionMedium: "Manage BigIP F5 appliances including iRule script configuration, data groups, APM policies, and virtual server integration with Distributed Cloud.",
|
|
44094
44206
|
aliases: ["f5-bigip", "irule", "ltm"],
|
|
44095
44207
|
complexity: "moderate",
|
|
44096
44208
|
isPreview: false,
|
|
@@ -44103,6 +44215,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44103
44215
|
name: "billing_and_usage",
|
|
44104
44216
|
displayName: "Billing And Usage",
|
|
44105
44217
|
description: "Comprehensive billing and usage management for F5 XC tenants. Handle subscription plan transitions between tiers, configure primary and secondary payment methods, and download invoice PDFs. Monitor resource quota limits and current usage across namespaces. Supports custom invoice listing, quota configuration per namespace, and contact management for billing communications. Essential for financial operations, capacity planning, and subscription lifecycle management.",
|
|
44218
|
+
descriptionShort: "Subscription billing, payment methods, and usage tracking",
|
|
44219
|
+
descriptionMedium: "Manage subscription plans, payment methods, invoices, and resource quotas. Track usage limits and billing transitions across namespaces.",
|
|
44106
44220
|
aliases: [],
|
|
44107
44221
|
complexity: "moderate",
|
|
44108
44222
|
isPreview: false,
|
|
@@ -44115,6 +44229,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44115
44229
|
name: "blindfold",
|
|
44116
44230
|
displayName: "Blindfold",
|
|
44117
44231
|
description: "Configure and manage cryptographic secret protection with policy-based access controls. Create secret policies and policy rules that govern how sensitive data is encrypted, shared, and accessed across namespaces. Retrieve public keys for encryption operations, process policy information for secret sharing workflows, and decrypt secrets with proper authorization. Monitor secret access through comprehensive audit logs with aggregation and scrolling capabilities. Enforce data protection...",
|
|
44232
|
+
descriptionShort: "Secret encryption and policy-based data protection",
|
|
44233
|
+
descriptionMedium: "Manage encryption keys, secret policies, and sensitive data protection. Configure policy rules for secure secret sharing with audit logging.",
|
|
44118
44234
|
aliases: ["bf", "encrypt", "secrets"],
|
|
44119
44235
|
complexity: "moderate",
|
|
44120
44236
|
isPreview: false,
|
|
@@ -44127,6 +44243,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44127
44243
|
name: "bot_and_threat_defense",
|
|
44128
44244
|
displayName: "Bot And Threat Defense",
|
|
44129
44245
|
description: "Manage comprehensive bot and threat defense capabilities including Shape bot defense instance configuration, threat protection manager (TPM) categories for threat classification, and API key provisioning for automated defense systems. Create and manage TPM categories to organize threats by type, configure bot defense instances per namespace, and handle TPM manager lifecycle operations. Supports preauthorization and provisioning workflows for integrating threat intelligence services with...",
|
|
44246
|
+
descriptionShort: "Bot detection, threat categorization, and defense management",
|
|
44247
|
+
descriptionMedium: "Configure bot defense instances, manage threat categories, and provision TPM API keys for automated threat detection and mitigation.",
|
|
44130
44248
|
aliases: [],
|
|
44131
44249
|
complexity: "moderate",
|
|
44132
44250
|
isPreview: false,
|
|
@@ -44139,6 +44257,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44139
44257
|
name: "cdn",
|
|
44140
44258
|
displayName: "Cdn",
|
|
44141
44259
|
description: "Content Delivery Network services for global content distribution and edge caching. Configure CDN load balancers with custom caching rules based on paths, headers, cookies, and query parameters. Define cache TTL policies, eligibility options, and cache-control behaviors. Monitor CDN performance through access logs and metrics aggregation. Perform cache purge operations for content invalidation. Manage addon subscriptions and track service operation status for CDN deployments.",
|
|
44260
|
+
descriptionShort: "CDN load balancing, caching rules, and content delivery",
|
|
44261
|
+
descriptionMedium: "Configure CDN load balancers and caching rules for content delivery. Manage cache policies, purge operations, and access logs for optimized...",
|
|
44142
44262
|
aliases: ["cache", "content"],
|
|
44143
44263
|
complexity: "advanced",
|
|
44144
44264
|
isPreview: false,
|
|
@@ -44151,6 +44271,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44151
44271
|
name: "ce_management",
|
|
44152
44272
|
displayName: "Ce Management",
|
|
44153
44273
|
description: "Configure and manage Customer Edge (CE) site infrastructure across distributed deployments. Define network interfaces with DHCP, IPv6, and dedicated management settings. Organize sites into fleets for coordinated management. Handle site registration workflows including token-based registration, image downloads, and suggested configuration values. Monitor and execute site upgrades with pre-upgrade checks and status tracking. Supports both dedicated and Ethernet interface types with...",
|
|
44274
|
+
descriptionShort: "Customer Edge site lifecycle and network configuration",
|
|
44275
|
+
descriptionMedium: "Manage Customer Edge sites including network interfaces, fleet configurations, site upgrades, and registration workflows for distributed deployments.",
|
|
44154
44276
|
aliases: [],
|
|
44155
44277
|
complexity: "advanced",
|
|
44156
44278
|
isPreview: false,
|
|
@@ -44163,6 +44285,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44163
44285
|
name: "certificates",
|
|
44164
44286
|
displayName: "Certificates",
|
|
44165
44287
|
description: "Comprehensive certificate lifecycle management for securing application communications. Configure SSL/TLS certificates and certificate chains for endpoints, manage trusted Certificate Authority (CA) lists for client verification, and maintain Certificate Revocation Lists (CRLs) to invalidate compromised certificates. Supports certificate manifests for organized deployment across namespaces, enabling mTLS authentication, HTTPS termination, and secure service-to-service communication patterns.",
|
|
44288
|
+
descriptionShort: "SSL/TLS certificate and trusted CA management",
|
|
44289
|
+
descriptionMedium: "Manage SSL/TLS certificates, certificate chains, trusted CA lists, and certificate revocation lists for secure communications.",
|
|
44166
44290
|
aliases: ["cert", "certs", "ssl", "tls"],
|
|
44167
44291
|
complexity: "moderate",
|
|
44168
44292
|
isPreview: false,
|
|
@@ -44175,6 +44299,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44175
44299
|
name: "cloud_infrastructure",
|
|
44176
44300
|
displayName: "Cloud Infrastructure",
|
|
44177
44301
|
description: "Establish and manage connectivity to major cloud providers including AWS, Azure, and GCP. Configure cloud credentials and authentication for secure provider access. Create and manage VPC attachments, transit gateways, and route tables for cross-cloud networking. Support elastic provisioning with automatic resource discovery and reapplication workflows. Monitor cloud connection metrics and segment performance. Integrate with Customer Edge sites for hybrid cloud deployments across multiple...",
|
|
44302
|
+
descriptionShort: "Multi-cloud provider connectivity and credential management",
|
|
44303
|
+
descriptionMedium: "Connect to AWS, Azure, and GCP cloud providers. Manage cloud credentials, VPC attachments, transit gateways, and cross-cloud networking with...",
|
|
44178
44304
|
aliases: ["cloud", "infra", "provider"],
|
|
44179
44305
|
complexity: "moderate",
|
|
44180
44306
|
isPreview: false,
|
|
@@ -44187,6 +44313,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44187
44313
|
name: "container_services",
|
|
44188
44314
|
displayName: "Container Services",
|
|
44189
44315
|
description: "Container Services (XCCS) enables deployment and management of containerized applications across distributed edge sites without requiring full Kubernetes complexity. Create virtual Kubernetes clusters for isolated multi-tenant environments, define workload flavors for resource allocation, and deploy container workloads with simplified orchestration. Monitor workload usage and PVC metrics, manage namespace isolation, and integrate with site infrastructure for edge-native container...",
|
|
44316
|
+
descriptionShort: "Edge container workloads and virtual Kubernetes management",
|
|
44317
|
+
descriptionMedium: "Deploy and manage containerized workloads at the edge with simplified orchestration. Configure virtual Kubernetes clusters, workload flavors, and...",
|
|
44190
44318
|
aliases: ["vk8s", "containers", "workloads"],
|
|
44191
44319
|
complexity: "moderate",
|
|
44192
44320
|
isPreview: false,
|
|
@@ -44199,6 +44327,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44199
44327
|
name: "data_and_privacy_security",
|
|
44200
44328
|
displayName: "Data And Privacy Security",
|
|
44201
44329
|
description: "Manage comprehensive data privacy and security controls including sensitive data detection policies, custom data type definitions, and log management analytics (LMA) region configurations. Define patterns for identifying PII, financial data, and other sensitive information with configurable actions for masking, alerting, or blocking. Configure LMA regions with Elasticsearch, Kafka, or ClickHouse backends for centralized security logging and compliance auditing. Integrate geo-configurations...",
|
|
44330
|
+
descriptionShort: "Sensitive data detection, classification, and privacy...",
|
|
44331
|
+
descriptionMedium: "Configure data types, sensitive data policies, and LMA regions for detecting, classifying, and protecting personally identifiable information and...",
|
|
44202
44332
|
aliases: [],
|
|
44203
44333
|
complexity: "simple",
|
|
44204
44334
|
isPreview: false,
|
|
@@ -44211,6 +44341,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44211
44341
|
name: "data_intelligence",
|
|
44212
44342
|
displayName: "Data Intelligence",
|
|
44213
44343
|
description: "F5 Distributed Cloud Data Intelligence API specifications",
|
|
44344
|
+
descriptionShort: "Data Intelligence API",
|
|
44345
|
+
descriptionMedium: "F5 Distributed Cloud Data Intelligence API specifications",
|
|
44214
44346
|
aliases: ["di", "intelligence", "insights"],
|
|
44215
44347
|
complexity: "moderate",
|
|
44216
44348
|
isPreview: false,
|
|
@@ -44223,6 +44355,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44223
44355
|
name: "ddos",
|
|
44224
44356
|
displayName: "Ddos",
|
|
44225
44357
|
description: "Comprehensive DDoS protection and infrastructure security management. Configure deny list rules to block malicious traffic sources, create firewall rule groups for granular traffic filtering, and manage protection tunnels for secure infrastructure connectivity. The infraprotect APIs enable proactive threat mitigation through customizable security policies, real-time tunnel status monitoring, and namespace-scoped rule management. Integrates with network security and virtual load balancing for...",
|
|
44358
|
+
descriptionShort: "DDoS protection and infrastructure security policies",
|
|
44359
|
+
descriptionMedium: "Configure DDoS protection policies, deny lists, and firewall rules. Monitor infrastructure threats and manage protection tunnels for network security.",
|
|
44226
44360
|
aliases: ["dos", "ddos-protect"],
|
|
44227
44361
|
complexity: "advanced",
|
|
44228
44362
|
isPreview: false,
|
|
@@ -44235,6 +44369,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44235
44369
|
name: "dns",
|
|
44236
44370
|
displayName: "Dns",
|
|
44237
44371
|
description: "Comprehensive DNS management for zones, domains, and resource records. Configure DNS load balancing with health checks for high availability. Import and export zone files via BIND format or AXFR transfers. Manage resource record sets including A, AAAA, CNAME, CAA, CERT, AFSDB, and DLV records. Monitor DNS performance through metrics and request logs. Clone zones from existing domains and enforce DNS compliance policies across namespaces.",
|
|
44372
|
+
descriptionShort: "DNS zone management, load balancing, and record...",
|
|
44373
|
+
descriptionMedium: "Manage DNS zones, configure DNS load balancing with health checks, and control resource record sets. Supports zone imports, BIND file handling,...",
|
|
44238
44374
|
aliases: ["dns-zone", "zones"],
|
|
44239
44375
|
complexity: "advanced",
|
|
44240
44376
|
isPreview: false,
|
|
@@ -44297,6 +44433,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44297
44433
|
name: "generative_ai",
|
|
44298
44434
|
displayName: "Generative Ai",
|
|
44299
44435
|
description: "Generative AI services providing intelligent automation and analysis capabilities. Configure AI assistant policies and submit queries with feedback tracking for continuous improvement. Enable flow anomaly detection powered by machine learning. Manage AI data collection through the BFDP subsystem including feature enablement, token management, and subscription controls. Supports IP allocation for GIA services. Integrates dashboard visualization with customizable displays, filters, and link...",
|
|
44436
|
+
descriptionShort: "AI-powered features, assistants, and data collection",
|
|
44437
|
+
descriptionMedium: "Access generative AI capabilities including AI assistant queries, flow anomaly detection, and AI data collection with feedback mechanisms.",
|
|
44300
44438
|
aliases: ["ai", "genai", "assistant"],
|
|
44301
44439
|
complexity: "simple",
|
|
44302
44440
|
isPreview: true,
|
|
@@ -44309,6 +44447,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44309
44447
|
name: "managed_kubernetes",
|
|
44310
44448
|
displayName: "Managed Kubernetes",
|
|
44311
44449
|
description: "Configure and manage Managed Kubernetes (XCKS) security and access controls. Define cluster roles with fine-grained permissions for API resources and non-resource URLs. Create role bindings to associate users and groups with cluster-wide permissions. Enforce pod security standards through admission controllers with configurable enforcement levels. Manage private container registries for secure image distribution. Integrates with external Kubernetes clusters including EKS, AKS, and GKE for...",
|
|
44450
|
+
descriptionShort: "Kubernetes RBAC, pod security, and container registries",
|
|
44451
|
+
descriptionMedium: "Manage Kubernetes cluster roles, RBAC bindings, pod security admission policies, and container registries for enterprise deployments.",
|
|
44312
44452
|
aliases: ["mk8s", "appstack", "k8s-mgmt"],
|
|
44313
44453
|
complexity: "moderate",
|
|
44314
44454
|
isPreview: false,
|
|
@@ -44321,6 +44461,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44321
44461
|
name: "marketplace",
|
|
44322
44462
|
displayName: "Marketplace",
|
|
44323
44463
|
description: "Access and manage the marketplace ecosystem including third-party integrations, add-on services, and external connectors. Configure connection types for direct, GRE tunnel, and IPSec connectivity with customizable IKE parameters and DPD keepalive settings. Manage navigation tiles for custom UI extensions, activate and monitor add-on service status across namespaces, and integrate with external platforms like Terraform. Supports TPM policy management and configuration management instances for...",
|
|
44464
|
+
descriptionShort: "Third-party integrations, add-ons, and extensions",
|
|
44465
|
+
descriptionMedium: "Manage marketplace extensions, external connectors, and third-party add-on services. Configure Terraform integrations and TPM policies.",
|
|
44324
44466
|
aliases: ["market", "addons", "extensions"],
|
|
44325
44467
|
complexity: "moderate",
|
|
44326
44468
|
isPreview: false,
|
|
@@ -44333,6 +44475,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44333
44475
|
name: "network",
|
|
44334
44476
|
displayName: "Network",
|
|
44335
44477
|
description: "Comprehensive network infrastructure management including BGP routing with ASN configuration and peering policies, IPsec tunnel establishment with full IKE phase 1 and phase 2 parameter control, and network connector configuration for hybrid cloud connectivity. Supports SRv6 segment routing, subnet management, DC cluster groups for data center integration, static and dynamic route definitions, and IP prefix set policies. Enables secure site-to-site VPN connections, multi-cloud network...",
|
|
44478
|
+
descriptionShort: "BGP routing, IPsec tunnels, and network connectivity",
|
|
44479
|
+
descriptionMedium: "Configure BGP routing policies, IPsec tunnels with IKE phases, network connectors, SRv6, and IP prefix sets for secure site-to-site connectivity.",
|
|
44336
44480
|
aliases: ["net", "routing", "bgp"],
|
|
44337
44481
|
complexity: "advanced",
|
|
44338
44482
|
isPreview: false,
|
|
@@ -44345,6 +44489,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44345
44489
|
name: "network_security",
|
|
44346
44490
|
displayName: "Network Security",
|
|
44347
44491
|
description: "Network security controls for protecting traffic at the network layer. Configure network firewalls with stateful inspection and ACL rules. Define NAT policies for address translation, port forwarding, and dynamic pool management. Create network policy sets for segmentation and micro-segmentation between workloads. Implement policy-based routing to direct traffic based on source, destination, or application criteria. Manage segment connections for multi-site network isolation. Configure...",
|
|
44492
|
+
descriptionShort: "Network firewall, NAT, ACL, and policy-based routing",
|
|
44493
|
+
descriptionMedium: "Configure network firewalls, NAT policies, ACLs, and policy-based routing. Manage network segmentation, port forwarding, and forward proxy policies.",
|
|
44348
44494
|
aliases: ["netsec", "nfw"],
|
|
44349
44495
|
complexity: "advanced",
|
|
44350
44496
|
isPreview: false,
|
|
@@ -44357,6 +44503,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44357
44503
|
name: "nginx_one",
|
|
44358
44504
|
displayName: "Nginx One",
|
|
44359
44505
|
description: "Integrate and manage NGINX One platform capabilities including subscription lifecycle management, NGINX Plus instance provisioning, and server configuration. Configure dataplane servers, manage nginx instances with WAF and API discovery specifications, and enable service discovery integrations. Supports NGINX Configuration Sync Gateway (CSG) configurations for centralized management workflows. Typical operations include subscribing to NGINX One services, retrieving server status and...",
|
|
44506
|
+
descriptionShort: "NGINX One platform integration and instance management",
|
|
44507
|
+
descriptionMedium: "Manage NGINX One platform subscriptions, configure NGINX Plus instances and servers, and integrate service discovery with centralized...",
|
|
44360
44508
|
aliases: ["nginx", "nms", "nginx-plus"],
|
|
44361
44509
|
complexity: "simple",
|
|
44362
44510
|
isPreview: false,
|
|
@@ -44369,6 +44517,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44369
44517
|
name: "object_storage",
|
|
44370
44518
|
displayName: "Object Storage",
|
|
44371
44519
|
description: "Manage versioned object storage for mobile application components and platform integrations. Upload and retrieve mobile app shield configurations, SDK integrations, and custom artifacts organized by namespace and object type. Support for multiple versions of each object enables rollback and version-specific deployments. Presigned URLs provide secure, time-limited access for direct object downloads. Object types include mobile-app-shield for application protection, mobile-integrator for...",
|
|
44520
|
+
descriptionShort: "Object storage for mobile SDK artifacts and integrations",
|
|
44521
|
+
descriptionMedium: "Store and retrieve versioned objects including mobile app shields, SDK integrations, and custom artifacts with presigned URL access.",
|
|
44372
44522
|
aliases: ["storage", "s3", "buckets"],
|
|
44373
44523
|
complexity: "simple",
|
|
44374
44524
|
isPreview: false,
|
|
@@ -44381,6 +44531,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44381
44531
|
name: "observability",
|
|
44382
44532
|
displayName: "Observability",
|
|
44383
44533
|
description: "Comprehensive synthetic monitoring and observability capabilities for proactive infrastructure health assessment. Configure DNS monitors to validate resolution across AWS regions, set up HTTP monitors for endpoint availability testing, and track SSL/TLS certificate expiration status. Access real-time health summaries at global and namespace levels, review historical monitoring data, and generate detailed reports for DNS and HTTP monitors. Integrate with dashboards to visualize monitoring...",
|
|
44534
|
+
descriptionShort: "Synthetic monitoring, health checks, and observability...",
|
|
44535
|
+
descriptionMedium: "Configure synthetic monitoring with DNS and HTTP health checks. Track certificate status, monitor global health summaries, and analyze monitoring...",
|
|
44384
44536
|
aliases: ["obs", "monitoring", "synth"],
|
|
44385
44537
|
complexity: "advanced",
|
|
44386
44538
|
isPreview: false,
|
|
@@ -44393,6 +44545,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44393
44545
|
name: "rate_limiting",
|
|
44394
44546
|
displayName: "Rate Limiting",
|
|
44395
44547
|
description: "Manage rate limiting policies to protect applications from traffic surges and abuse. Configure rate limiters with customizable thresholds, time periods, and enforcement actions including blocking or throttling. Implement policers using leaky bucket algorithms for smooth traffic shaping. Define protocol-specific policers for granular control over different traffic types. Integrate with virtual hosts and load balancers to enforce rate limits at the edge, preventing resource exhaustion and...",
|
|
44548
|
+
descriptionShort: "Traffic rate limiting, policers, and throttling controls",
|
|
44549
|
+
descriptionMedium: "Configure rate limiters and policers to control traffic flow. Define request thresholds, leaky bucket algorithms, and enforcement actions for API...",
|
|
44396
44550
|
aliases: ["ratelimit", "throttle", "policer"],
|
|
44397
44551
|
complexity: "simple",
|
|
44398
44552
|
isPreview: false,
|
|
@@ -44405,6 +44559,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44405
44559
|
name: "secops_and_incident_response",
|
|
44406
44560
|
displayName: "Secops And Incident Response",
|
|
44407
44561
|
description: "Security operations and incident response capabilities for detecting and mitigating malicious user activity. Create mitigation policies that define automated responses based on user threat levels, including blocking, challenging, or rate limiting suspicious users. Configure rules that match specific malicious user types and threat severity levels to appropriate mitigation actions. Supports namespace-scoped configurations for managing security policies across different application...",
|
|
44562
|
+
descriptionShort: "Malicious user detection and automated threat mitigation",
|
|
44563
|
+
descriptionMedium: "Configure automated responses to malicious user behavior. Define mitigation rules based on threat levels and apply actions like blocking or rate...",
|
|
44408
44564
|
aliases: [],
|
|
44409
44565
|
complexity: "simple",
|
|
44410
44566
|
isPreview: false,
|
|
@@ -44417,6 +44573,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44417
44573
|
name: "service_mesh",
|
|
44418
44574
|
displayName: "Service Mesh",
|
|
44419
44575
|
description: "Manage service mesh infrastructure including endpoint discovery and intelligent routing between distributed services. Define application types with learned API schemas, security risk classifications, and authentication configurations. Configure NFV (Network Function Virtualization) services with lifecycle management including force-delete operations. Leverage machine learning capabilities for automatic API endpoint detection, schema learning, and traffic pattern analysis. Integrate with...",
|
|
44576
|
+
descriptionShort: "Service mesh connectivity, discovery, and NFV management",
|
|
44577
|
+
descriptionMedium: "Configure service mesh networking with endpoint discovery, application type definitions, API endpoint learning, and NFV service lifecycle management.",
|
|
44420
44578
|
aliases: ["mesh", "svc-mesh"],
|
|
44421
44579
|
complexity: "advanced",
|
|
44422
44580
|
isPreview: false,
|
|
@@ -44429,6 +44587,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44429
44587
|
name: "shape",
|
|
44430
44588
|
displayName: "Shape",
|
|
44431
44589
|
description: "Shape Security integration for advanced bot defense and threat prevention capabilities. Configure bot infrastructure deployments with policy management, deployment history tracking, and status monitoring. Manage mobile SDK attributes for application shielding and integrator configurations. Subscribe to bot defense add-ons and client-side defense services. Includes SafeAP policy configuration, threat recognition rules, and automated bot mitigation across namespaces with comprehensive...",
|
|
44590
|
+
descriptionShort: "Bot defense and threat prevention with Shape Security",
|
|
44591
|
+
descriptionMedium: "Configure Shape Security policies for bot defense, threat recognition, and mobile SDK protection. Manage bot infrastructure deployments and SafeAP...",
|
|
44432
44592
|
aliases: ["shape-sec", "safeap"],
|
|
44433
44593
|
complexity: "advanced",
|
|
44434
44594
|
isPreview: false,
|
|
@@ -44441,6 +44601,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44441
44601
|
name: "sites",
|
|
44442
44602
|
displayName: "Sites",
|
|
44443
44603
|
description: "Comprehensive site infrastructure management for deploying F5 XC across multiple cloud providers and edge locations. Configure AWS Transit Gateway sites with VPN tunnels, VPC IP prefixes, and security settings. Manage virtual sites for logical grouping and policy application. Deploy Secure Mesh sites for networking-focused edge deployments, integrate external Kubernetes clusters as Customer Edge nodes, and configure cloud-specific resources including AWS VPC, Azure VNet, and GCP VPC sites....",
|
|
44604
|
+
descriptionShort: "Multi-cloud site deployment and edge infrastructure",
|
|
44605
|
+
descriptionMedium: "Deploy and manage F5 XC sites across AWS, Azure, and GCP. Configure AWS TGW sites, virtual sites, managed Kubernetes, and Customer Edge integrations.",
|
|
44444
44606
|
aliases: ["site", "deployment"],
|
|
44445
44607
|
complexity: "advanced",
|
|
44446
44608
|
isPreview: false,
|
|
@@ -44505,6 +44667,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44505
44667
|
name: "statistics",
|
|
44506
44668
|
displayName: "Statistics",
|
|
44507
44669
|
description: "Comprehensive operational analytics and monitoring capabilities for distributed cloud infrastructure. Configure alert policies with custom matchers and grouping rules to detect anomalies across namespaces. Manage alert receivers with confirmation, testing, and verification workflows for reliable notification delivery. Access flow statistics, view historical alerts, generate reports and graphs for capacity planning, track service topology and discovery patterns, and monitor real-time status...",
|
|
44670
|
+
descriptionShort: "Flow statistics, alerts, logs, and operational analytics",
|
|
44671
|
+
descriptionMedium: "Access flow statistics and analytics, configure alert policies and receivers, view logs, generate reports and graphs, and monitor site status.",
|
|
44508
44672
|
aliases: ["stats", "metrics", "logs"],
|
|
44509
44673
|
complexity: "advanced",
|
|
44510
44674
|
isPreview: false,
|
|
@@ -44517,6 +44681,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44517
44681
|
name: "support",
|
|
44518
44682
|
displayName: "Support",
|
|
44519
44683
|
description: "Manage the complete customer support ticket lifecycle including creation, commenting, priority adjustment, escalation, and closure. Submit specialized requests such as tax exemption verification. Access site-level diagnostic capabilities including TCP dump capture, listing, and management for network troubleshooting. Integrates with operational workflows to enable support teams to gather diagnostic data directly from distributed sites while maintaining ticket-based tracking of all customer...",
|
|
44684
|
+
descriptionShort: "Customer support ticket lifecycle and site diagnostics",
|
|
44685
|
+
descriptionMedium: "Create, track, and manage support tickets with escalation workflows. Includes site diagnostic tools for packet capture and troubleshooting.",
|
|
44520
44686
|
aliases: ["tickets", "help-desk"],
|
|
44521
44687
|
complexity: "moderate",
|
|
44522
44688
|
isPreview: false,
|
|
@@ -44529,6 +44695,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44529
44695
|
name: "telemetry_and_insights",
|
|
44530
44696
|
displayName: "Telemetry And Insights",
|
|
44531
44697
|
description: "F5 Distributed Cloud Telemetry And Insights API specifications",
|
|
44698
|
+
descriptionShort: "Telemetry And Insights API",
|
|
44699
|
+
descriptionMedium: "F5 Distributed Cloud Telemetry And Insights API specifications",
|
|
44532
44700
|
aliases: ["telemetry", "ti"],
|
|
44533
44701
|
complexity: "moderate",
|
|
44534
44702
|
isPreview: false,
|
|
@@ -44541,6 +44709,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44541
44709
|
name: "tenant_and_identity",
|
|
44542
44710
|
displayName: "Tenant And Identity",
|
|
44543
44711
|
description: "Comprehensive user and tenant identity management for F5 Distributed Cloud. Configure user settings including profile images, notification preferences (admin and combined), and view preferences. Manage user sessions with listing and control capabilities. Handle OTP (one-time password) administration including admin resets. Support identity management (IDM) enable/disable operations. Process initial access requests for new users. Manage customer support ticket attachments and interactions for...",
|
|
44712
|
+
descriptionShort: "User settings, notifications, sessions, and identity...",
|
|
44713
|
+
descriptionMedium: "Manage user profiles, notification preferences, session controls, OTP settings, and customer support interactions. Configure identity management...",
|
|
44544
44714
|
aliases: [],
|
|
44545
44715
|
complexity: "advanced",
|
|
44546
44716
|
isPreview: false,
|
|
@@ -44553,6 +44723,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44553
44723
|
name: "threat_campaign",
|
|
44554
44724
|
displayName: "Threat Campaign",
|
|
44555
44725
|
description: "F5 Distributed Cloud Threat Campaign API specifications",
|
|
44726
|
+
descriptionShort: "Threat Campaign API",
|
|
44727
|
+
descriptionMedium: "F5 Distributed Cloud Threat Campaign API specifications",
|
|
44556
44728
|
aliases: ["threats", "campaigns", "threat-intel"],
|
|
44557
44729
|
complexity: "moderate",
|
|
44558
44730
|
isPreview: false,
|
|
@@ -44565,6 +44737,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44565
44737
|
name: "users",
|
|
44566
44738
|
displayName: "Users",
|
|
44567
44739
|
description: "Comprehensive user and identity management for the F5 XC platform. Create and manage registration tokens for site and node onboarding, including cloud-init configuration retrieval. Define known label keys and values to establish consistent resource tagging taxonomies across namespaces. Configure implicit labels for automatic resource classification. Supports full lifecycle management of user-related configuration objects with metadata tracking, state management, and condition monitoring for...",
|
|
44740
|
+
descriptionShort: "User accounts, tokens, and label management",
|
|
44741
|
+
descriptionMedium: "Manage user accounts, registration tokens, and label systems. Configure known and implicit labels for resource organization and user identification.",
|
|
44568
44742
|
aliases: ["user", "accounts", "iam"],
|
|
44569
44743
|
complexity: "simple",
|
|
44570
44744
|
isPreview: false,
|
|
@@ -44577,6 +44751,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44577
44751
|
name: "virtual",
|
|
44578
44752
|
displayName: "Virtual",
|
|
44579
44753
|
description: "Comprehensive application delivery and traffic management capabilities including HTTP/HTTPS/TCP/UDP load balancers, origin pool configuration, virtual host management, and advanced routing rules. Supports rate limiting policies, service policy enforcement, geo-location-based routing, and proxy forwarding configurations. Integrates with security features including malware protection, threat campaign detection, and WAF policy attachment. Provides health check configuration, endpoint...",
|
|
44754
|
+
descriptionShort: "HTTP/HTTPS load balancing and traffic management",
|
|
44755
|
+
descriptionMedium: "Configure HTTP, TCP, and UDP load balancers with origin pools, virtual hosts, routing rules, rate limiting, and service policies for application...",
|
|
44580
44756
|
aliases: ["lb", "loadbalancer", "vhost"],
|
|
44581
44757
|
complexity: "advanced",
|
|
44582
44758
|
isPreview: false,
|
|
@@ -44641,6 +44817,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44641
44817
|
name: "vpm_and_node_management",
|
|
44642
44818
|
displayName: "Vpm And Node Management",
|
|
44643
44819
|
description: "F5 Distributed Cloud Vpm And Node Management API specifications",
|
|
44820
|
+
descriptionShort: "Vpm And Node Management API",
|
|
44821
|
+
descriptionMedium: "F5 Distributed Cloud Vpm And Node Management API specifications",
|
|
44644
44822
|
aliases: ["vpm", "nodes", "node-mgmt"],
|
|
44645
44823
|
complexity: "simple",
|
|
44646
44824
|
isPreview: false,
|
|
@@ -44653,6 +44831,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44653
44831
|
name: "waf",
|
|
44654
44832
|
displayName: "Waf",
|
|
44655
44833
|
description: "Web Application Firewall (WAF) configuration and management for protecting applications against common attacks and vulnerabilities. Define application firewall policies with attack type detection, bot protection settings, and custom blocking pages. Manage WAF exclusion policies for legitimate traffic patterns, configure signature staging and release workflows, and monitor security events with detailed rule hit metrics. Supports AI-powered risk-based blocking, anonymization settings for...",
|
|
44834
|
+
descriptionShort: "Web application firewall rules and security policies",
|
|
44835
|
+
descriptionMedium: "Configure web application firewall rules, manage security policies, and enable attack detection with customizable blocking actions and signature...",
|
|
44656
44836
|
aliases: ["firewall", "appfw"],
|
|
44657
44837
|
complexity: "advanced",
|
|
44658
44838
|
isPreview: false,
|
|
@@ -44678,6 +44858,13 @@ function initializeAliasRegistry() {
|
|
|
44678
44858
|
function resolveDomain(nameOrAlias) {
|
|
44679
44859
|
return aliasRegistry.get(nameOrAlias);
|
|
44680
44860
|
}
|
|
44861
|
+
function getDomainInfo(nameOrAlias) {
|
|
44862
|
+
const canonical = resolveDomain(nameOrAlias);
|
|
44863
|
+
if (!canonical) {
|
|
44864
|
+
return void 0;
|
|
44865
|
+
}
|
|
44866
|
+
return domainRegistry.get(canonical);
|
|
44867
|
+
}
|
|
44681
44868
|
function allDomains() {
|
|
44682
44869
|
return Array.from(domainRegistry.keys()).sort();
|
|
44683
44870
|
}
|
|
@@ -44983,8 +45170,8 @@ var HistoryManager = class _HistoryManager {
|
|
|
44983
45170
|
var CLI_NAME = "xcsh";
|
|
44984
45171
|
var CLI_FULL_NAME = "F5 Distributed Cloud Shell";
|
|
44985
45172
|
function getVersion() {
|
|
44986
|
-
if ("6.
|
|
44987
|
-
return "6.
|
|
45173
|
+
if ("6.21.0") {
|
|
45174
|
+
return "6.21.0";
|
|
44988
45175
|
}
|
|
44989
45176
|
if (process.env.XCSH_VERSION) {
|
|
44990
45177
|
return process.env.XCSH_VERSION;
|
|
@@ -44992,6 +45179,7 @@ function getVersion() {
|
|
|
44992
45179
|
return "dev";
|
|
44993
45180
|
}
|
|
44994
45181
|
var CLI_VERSION = getVersion();
|
|
45182
|
+
var CONFIG_FILE_NAME = ".xcshconfig";
|
|
44995
45183
|
var ENV_PREFIX = "F5XC";
|
|
44996
45184
|
var F5_LOGO = ` ________
|
|
44997
45185
|
(\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592)
|
|
@@ -45034,6 +45222,15 @@ var REPO_OWNER = "robinmordasiewicz";
|
|
|
45034
45222
|
var REPO_NAME = CLI_NAME;
|
|
45035
45223
|
var REPO_URL = `https://github.com/${REPO_OWNER}/${REPO_NAME}`;
|
|
45036
45224
|
var DOCS_URL = `https://${REPO_OWNER}.github.io/${REPO_NAME}/`;
|
|
45225
|
+
function colorRed(text) {
|
|
45226
|
+
return `${colors.red}${text}${colors.reset}`;
|
|
45227
|
+
}
|
|
45228
|
+
function colorBoldWhite(text) {
|
|
45229
|
+
return `${colors.boldWhite}${text}${colors.reset}`;
|
|
45230
|
+
}
|
|
45231
|
+
function colorDim(text) {
|
|
45232
|
+
return `${colors.dim}${text}${colors.reset}`;
|
|
45233
|
+
}
|
|
45037
45234
|
|
|
45038
45235
|
// src/profile/manager.ts
|
|
45039
45236
|
var import_yaml = __toESM(require_dist(), 1);
|
|
@@ -46482,22 +46679,8 @@ var REPLSession = class {
|
|
|
46482
46679
|
};
|
|
46483
46680
|
|
|
46484
46681
|
// src/repl/prompt.ts
|
|
46485
|
-
function buildPlainPrompt(
|
|
46486
|
-
|
|
46487
|
-
const profileName = session.getActiveProfileName();
|
|
46488
|
-
if (profileName) {
|
|
46489
|
-
parts.push(`${profileName}@xc`);
|
|
46490
|
-
} else {
|
|
46491
|
-
parts.push("xc");
|
|
46492
|
-
}
|
|
46493
|
-
const ctx = session.getContextPath();
|
|
46494
|
-
if (ctx.domain !== "") {
|
|
46495
|
-
parts.push(ctx.domain);
|
|
46496
|
-
if (ctx.action !== "") {
|
|
46497
|
-
parts.push(ctx.action);
|
|
46498
|
-
}
|
|
46499
|
-
}
|
|
46500
|
-
return `<${parts.join(".")}> `;
|
|
46682
|
+
function buildPlainPrompt(_session) {
|
|
46683
|
+
return "> ";
|
|
46501
46684
|
}
|
|
46502
46685
|
|
|
46503
46686
|
// src/repl/App.tsx
|
|
@@ -46778,151 +46961,10 @@ function toDisplayTier(tier) {
|
|
|
46778
46961
|
|
|
46779
46962
|
// src/repl/components/Banner.tsx
|
|
46780
46963
|
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
|
|
46781
|
-
var BOX = {
|
|
46782
|
-
topLeft: "\u256D",
|
|
46783
|
-
topRight: "\u256E",
|
|
46784
|
-
bottomLeft: "\u2570",
|
|
46785
|
-
bottomRight: "\u256F",
|
|
46786
|
-
horizontal: "\u2500",
|
|
46787
|
-
vertical: "\u2502",
|
|
46788
|
-
leftT: "\u251C",
|
|
46789
|
-
rightT: "\u2524"
|
|
46790
|
-
};
|
|
46791
46964
|
var TOTAL_WIDTH = 80;
|
|
46792
46965
|
var INNER_WIDTH = TOTAL_WIDTH - 2;
|
|
46793
46966
|
var logoLines = F5_LOGO.split("\n");
|
|
46794
46967
|
var LOGO_WIDTH = Math.max(...logoLines.map((l) => stringWidth(l)));
|
|
46795
|
-
var HELP_LINES = [
|
|
46796
|
-
"Type 'help' for commands",
|
|
46797
|
-
"Run 'namespace <ns>' to set",
|
|
46798
|
-
"Press Ctrl+C twice to exit"
|
|
46799
|
-
];
|
|
46800
|
-
var HELP_START_ROW = 8;
|
|
46801
|
-
function padToWidth(str, targetWidth) {
|
|
46802
|
-
const currentWidth = stringWidth(str);
|
|
46803
|
-
if (currentWidth >= targetWidth) return str;
|
|
46804
|
-
return str + " ".repeat(targetWidth - currentWidth);
|
|
46805
|
-
}
|
|
46806
|
-
function colorizeLogoLine(line) {
|
|
46807
|
-
const elements = [];
|
|
46808
|
-
let currentColor = null;
|
|
46809
|
-
let buffer = "";
|
|
46810
|
-
let keyIndex = 0;
|
|
46811
|
-
const flush = () => {
|
|
46812
|
-
if (buffer) {
|
|
46813
|
-
if (currentColor) {
|
|
46814
|
-
elements.push(
|
|
46815
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: currentColor, children: buffer }, keyIndex++)
|
|
46816
|
-
);
|
|
46817
|
-
} else {
|
|
46818
|
-
elements.push(/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { children: buffer }, keyIndex++));
|
|
46819
|
-
}
|
|
46820
|
-
buffer = "";
|
|
46821
|
-
}
|
|
46822
|
-
};
|
|
46823
|
-
for (const char of line) {
|
|
46824
|
-
let newColor;
|
|
46825
|
-
switch (char) {
|
|
46826
|
-
case "\u2593":
|
|
46827
|
-
// Dark shade - red
|
|
46828
|
-
case "\u2592":
|
|
46829
|
-
// Medium shade - red
|
|
46830
|
-
case "(":
|
|
46831
|
-
case ")":
|
|
46832
|
-
case "|":
|
|
46833
|
-
case "_":
|
|
46834
|
-
newColor = "#E4002B";
|
|
46835
|
-
break;
|
|
46836
|
-
case "\u2588":
|
|
46837
|
-
newColor = "#ffffff";
|
|
46838
|
-
break;
|
|
46839
|
-
default:
|
|
46840
|
-
newColor = null;
|
|
46841
|
-
}
|
|
46842
|
-
if (newColor !== currentColor) {
|
|
46843
|
-
flush();
|
|
46844
|
-
currentColor = newColor;
|
|
46845
|
-
}
|
|
46846
|
-
buffer += char === "\u2593" ? "\u2588" : char;
|
|
46847
|
-
}
|
|
46848
|
-
flush();
|
|
46849
|
-
return elements;
|
|
46850
|
-
}
|
|
46851
|
-
function buildContentRow(logoLine, helpText, innerWidth) {
|
|
46852
|
-
const paddedLogo = padToWidth(logoLine, LOGO_WIDTH);
|
|
46853
|
-
const helpColumnWidth = innerWidth - LOGO_WIDTH - 1;
|
|
46854
|
-
const paddedHelp = padToWidth(helpText, helpColumnWidth);
|
|
46855
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { children: [
|
|
46856
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#E4002B", children: BOX.vertical }),
|
|
46857
|
-
colorizeLogoLine(paddedLogo),
|
|
46858
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { children: " " }),
|
|
46859
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { bold: true, color: "#ffffff", children: paddedHelp }),
|
|
46860
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#E4002B", children: BOX.vertical })
|
|
46861
|
-
] });
|
|
46862
|
-
}
|
|
46863
|
-
function Banner({
|
|
46864
|
-
version,
|
|
46865
|
-
connectionInfo
|
|
46866
|
-
}) {
|
|
46867
|
-
const title = ` ${CLI_FULL_NAME} v${version} `;
|
|
46868
|
-
const titleWidth = stringWidth(title);
|
|
46869
|
-
const leftDashes = 3;
|
|
46870
|
-
const rightDashes = TOTAL_WIDTH - 1 - leftDashes - titleWidth - 1;
|
|
46871
|
-
const connectionLines = [];
|
|
46872
|
-
if (!connectionInfo.isConnected) {
|
|
46873
|
-
connectionLines.push("Not connected - run: export F5XC_API_URL=...");
|
|
46874
|
-
} else {
|
|
46875
|
-
if (connectionInfo.tenant) {
|
|
46876
|
-
connectionLines.push(`Tenant: ${connectionInfo.tenant}`);
|
|
46877
|
-
}
|
|
46878
|
-
if (connectionInfo.username) {
|
|
46879
|
-
connectionLines.push(`User: ${connectionInfo.username}`);
|
|
46880
|
-
}
|
|
46881
|
-
if (connectionInfo.tier) {
|
|
46882
|
-
const displayTier = toDisplayTier(connectionInfo.tier);
|
|
46883
|
-
if (displayTier) {
|
|
46884
|
-
connectionLines.push(`Tier: ${displayTier}`);
|
|
46885
|
-
}
|
|
46886
|
-
}
|
|
46887
|
-
}
|
|
46888
|
-
connectionLines.push(`Namespace: ${connectionInfo.namespace}`);
|
|
46889
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Box_default, { flexDirection: "column", marginY: 1, children: [
|
|
46890
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { children: [
|
|
46891
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#E4002B", children: [
|
|
46892
|
-
BOX.topLeft,
|
|
46893
|
-
BOX.horizontal.repeat(leftDashes)
|
|
46894
|
-
] }),
|
|
46895
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { bold: true, color: "#ffffff", children: title }),
|
|
46896
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#E4002B", children: [
|
|
46897
|
-
BOX.horizontal.repeat(Math.max(0, rightDashes)),
|
|
46898
|
-
BOX.topRight
|
|
46899
|
-
] })
|
|
46900
|
-
] }),
|
|
46901
|
-
logoLines.map((logoLine, index) => {
|
|
46902
|
-
const helpIndex = index - HELP_START_ROW;
|
|
46903
|
-
const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] : "";
|
|
46904
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Box_default, { children: buildContentRow(logoLine, helpText ?? "", INNER_WIDTH) }, index);
|
|
46905
|
-
}),
|
|
46906
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#E4002B", children: [
|
|
46907
|
-
BOX.leftT,
|
|
46908
|
-
BOX.horizontal.repeat(INNER_WIDTH),
|
|
46909
|
-
BOX.rightT
|
|
46910
|
-
] }),
|
|
46911
|
-
connectionLines.map((line, index) => {
|
|
46912
|
-
const paddedLine = padToWidth(` ${line}`, INNER_WIDTH);
|
|
46913
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { children: [
|
|
46914
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#E4002B", children: BOX.vertical }),
|
|
46915
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { bold: true, color: "#ffffff", children: paddedLine }),
|
|
46916
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#E4002B", children: BOX.vertical })
|
|
46917
|
-
] }, index);
|
|
46918
|
-
}),
|
|
46919
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#E4002B", children: [
|
|
46920
|
-
BOX.bottomLeft,
|
|
46921
|
-
BOX.horizontal.repeat(INNER_WIDTH),
|
|
46922
|
-
BOX.bottomRight
|
|
46923
|
-
] })
|
|
46924
|
-
] });
|
|
46925
|
-
}
|
|
46926
46968
|
|
|
46927
46969
|
// src/repl/components/Suggestions.tsx
|
|
46928
46970
|
var import_react24 = __toESM(require_react(), 1);
|
|
@@ -47199,6 +47241,9 @@ var DomainRegistry = class {
|
|
|
47199
47241
|
}
|
|
47200
47242
|
const firstArg = args[0]?.toLowerCase() ?? "";
|
|
47201
47243
|
const restArgs = args.slice(1);
|
|
47244
|
+
if (firstArg === "--help" || firstArg === "-h" || firstArg === "help") {
|
|
47245
|
+
return this.showDomainHelp(domain);
|
|
47246
|
+
}
|
|
47202
47247
|
const subgroup = domain.subcommands.get(firstArg);
|
|
47203
47248
|
if (subgroup) {
|
|
47204
47249
|
if (restArgs.length === 0) {
|
|
@@ -47856,7 +47901,7 @@ function formatWhoamiBox(info, options) {
|
|
|
47856
47901
|
const lines = [];
|
|
47857
47902
|
const red = colors.red;
|
|
47858
47903
|
const reset = colors.reset;
|
|
47859
|
-
const
|
|
47904
|
+
const BOX = {
|
|
47860
47905
|
topLeft: "\u256D",
|
|
47861
47906
|
topRight: "\u256E",
|
|
47862
47907
|
bottomLeft: "\u2570",
|
|
@@ -47922,12 +47967,12 @@ function formatWhoamiBox(info, options) {
|
|
|
47922
47967
|
const leftDashes = 1;
|
|
47923
47968
|
const rightDashes = Math.max(0, remainingWidth - leftDashes);
|
|
47924
47969
|
lines.push(
|
|
47925
|
-
`${red}${
|
|
47970
|
+
`${red}${BOX.topLeft}${BOX.horizontal.repeat(leftDashes)}${reset}${title}${red}${BOX.horizontal.repeat(rightDashes)}${BOX.topRight}${reset}`
|
|
47926
47971
|
);
|
|
47927
47972
|
for (const text of formattedContent) {
|
|
47928
47973
|
const padding = innerWidth - text.length;
|
|
47929
47974
|
lines.push(
|
|
47930
|
-
`${red}${
|
|
47975
|
+
`${red}${BOX.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX.vertical}${reset}`
|
|
47931
47976
|
);
|
|
47932
47977
|
}
|
|
47933
47978
|
if (quotaLines.length > 0) {
|
|
@@ -47936,12 +47981,12 @@ function formatWhoamiBox(info, options) {
|
|
|
47936
47981
|
const quotaLeft = 1;
|
|
47937
47982
|
const quotaRight = Math.max(0, quotaRemaining - quotaLeft);
|
|
47938
47983
|
lines.push(
|
|
47939
|
-
`${red}${
|
|
47984
|
+
`${red}${BOX.leftT}${BOX.horizontal.repeat(quotaLeft)}${reset}${quotaTitle}${red}${BOX.horizontal.repeat(quotaRight)}${BOX.rightT}${reset}`
|
|
47940
47985
|
);
|
|
47941
47986
|
for (const text of quotaLines) {
|
|
47942
47987
|
const padding = innerWidth - text.length;
|
|
47943
47988
|
lines.push(
|
|
47944
|
-
`${red}${
|
|
47989
|
+
`${red}${BOX.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX.vertical}${reset}`
|
|
47945
47990
|
);
|
|
47946
47991
|
}
|
|
47947
47992
|
}
|
|
@@ -47951,17 +47996,17 @@ function formatWhoamiBox(info, options) {
|
|
|
47951
47996
|
const addonLeft = 1;
|
|
47952
47997
|
const addonRight = Math.max(0, addonRemaining - addonLeft);
|
|
47953
47998
|
lines.push(
|
|
47954
|
-
`${red}${
|
|
47999
|
+
`${red}${BOX.leftT}${BOX.horizontal.repeat(addonLeft)}${reset}${addonTitle}${red}${BOX.horizontal.repeat(addonRight)}${BOX.rightT}${reset}`
|
|
47955
48000
|
);
|
|
47956
48001
|
for (const text of addonLines) {
|
|
47957
48002
|
const padding = innerWidth - text.length;
|
|
47958
48003
|
lines.push(
|
|
47959
|
-
`${red}${
|
|
48004
|
+
`${red}${BOX.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX.vertical}${reset}`
|
|
47960
48005
|
);
|
|
47961
48006
|
}
|
|
47962
48007
|
}
|
|
47963
48008
|
lines.push(
|
|
47964
|
-
`${red}${
|
|
48009
|
+
`${red}${BOX.bottomLeft}${BOX.horizontal.repeat(innerWidth)}${BOX.bottomRight}${reset}`
|
|
47965
48010
|
);
|
|
47966
48011
|
return lines;
|
|
47967
48012
|
}
|
|
@@ -47997,7 +48042,9 @@ var profileSubcommands = {
|
|
|
47997
48042
|
};
|
|
47998
48043
|
var loginDomain = {
|
|
47999
48044
|
name: "login",
|
|
48000
|
-
description: "Authentication, identity, and session management",
|
|
48045
|
+
description: "Authentication, identity, and session management for F5 XC. Manage connection profiles to save and switch between tenants, handle context for namespace targeting, and verify current authentication status with whoami.",
|
|
48046
|
+
descriptionShort: "Authentication and session management",
|
|
48047
|
+
descriptionMedium: "Manage connection profiles, authentication contexts, and session identity for F5 Distributed Cloud.",
|
|
48001
48048
|
commands: /* @__PURE__ */ new Map([["show", whoamiCommand]]),
|
|
48002
48049
|
subcommands: /* @__PURE__ */ new Map([
|
|
48003
48050
|
["profile", profileSubcommands],
|
|
@@ -48665,7 +48712,9 @@ function formatSummaryYaml(summary) {
|
|
|
48665
48712
|
}
|
|
48666
48713
|
var cloudstatusDomain = {
|
|
48667
48714
|
name: "cloudstatus",
|
|
48668
|
-
description: "Monitor F5 Distributed Cloud service status and incidents",
|
|
48715
|
+
description: "Monitor F5 Distributed Cloud service status and incidents. Check overall status indicators, view component health, track active incidents and their updates, and monitor scheduled maintenance windows.",
|
|
48716
|
+
descriptionShort: "F5 XC service status and incidents",
|
|
48717
|
+
descriptionMedium: "Monitor F5 Distributed Cloud service health, active incidents, component status, and scheduled maintenance windows.",
|
|
48669
48718
|
commands: /* @__PURE__ */ new Map([
|
|
48670
48719
|
["status", statusCommand],
|
|
48671
48720
|
["summary", summaryCommand],
|
|
@@ -49320,7 +49369,7 @@ function getAllDomains() {
|
|
|
49320
49369
|
for (const domain of customDomains.all()) {
|
|
49321
49370
|
domains.push({
|
|
49322
49371
|
name: domain.name,
|
|
49323
|
-
description: domain.
|
|
49372
|
+
description: domain.descriptionShort,
|
|
49324
49373
|
aliases: []
|
|
49325
49374
|
});
|
|
49326
49375
|
seen.add(domain.name);
|
|
@@ -49342,7 +49391,7 @@ function getAllDomains() {
|
|
|
49342
49391
|
if (seen.has(name)) continue;
|
|
49343
49392
|
domains.push({
|
|
49344
49393
|
name,
|
|
49345
|
-
description: info.
|
|
49394
|
+
description: info.descriptionShort,
|
|
49346
49395
|
aliases: info.aliases
|
|
49347
49396
|
});
|
|
49348
49397
|
seen.add(name);
|
|
@@ -49685,7 +49734,9 @@ var fishCommand = {
|
|
|
49685
49734
|
};
|
|
49686
49735
|
var completionDomain = {
|
|
49687
49736
|
name: "completion",
|
|
49688
|
-
description: "Generate shell completion scripts for bash, zsh, and fish",
|
|
49737
|
+
description: "Generate shell completion scripts for bash, zsh, and fish shells. Enables tab-completion for xcsh commands, domains, actions, and flags in your preferred shell environment.",
|
|
49738
|
+
descriptionShort: "Shell completion script generation",
|
|
49739
|
+
descriptionMedium: "Generate tab-completion scripts for bash, zsh, and fish shells to enhance the xcsh command-line experience.",
|
|
49689
49740
|
commands: /* @__PURE__ */ new Map([
|
|
49690
49741
|
["bash", bashCommand],
|
|
49691
49742
|
["zsh", zshCommand],
|
|
@@ -50209,7 +50260,7 @@ var Completer = class {
|
|
|
50209
50260
|
if (addedDomains.has(domain)) continue;
|
|
50210
50261
|
suggestions.push({
|
|
50211
50262
|
text: domain,
|
|
50212
|
-
description: meta.
|
|
50263
|
+
description: meta.descriptionShort,
|
|
50213
50264
|
category: "domain"
|
|
50214
50265
|
});
|
|
50215
50266
|
addedDomains.add(domain);
|
|
@@ -50807,9 +50858,383 @@ function formatAPIError(statusCode, body, operation) {
|
|
|
50807
50858
|
return lines.join("\n");
|
|
50808
50859
|
}
|
|
50809
50860
|
|
|
50861
|
+
// src/config/envvars.ts
|
|
50862
|
+
var EnvVarRegistry = [
|
|
50863
|
+
{
|
|
50864
|
+
name: `${ENV_PREFIX}_API_URL`,
|
|
50865
|
+
description: "API endpoint URL",
|
|
50866
|
+
relatedFlag: "",
|
|
50867
|
+
required: true
|
|
50868
|
+
},
|
|
50869
|
+
{
|
|
50870
|
+
name: `${ENV_PREFIX}_API_TOKEN`,
|
|
50871
|
+
description: "API authentication token",
|
|
50872
|
+
relatedFlag: "",
|
|
50873
|
+
required: true
|
|
50874
|
+
},
|
|
50875
|
+
{
|
|
50876
|
+
name: `${ENV_PREFIX}_NAMESPACE`,
|
|
50877
|
+
description: "Default namespace",
|
|
50878
|
+
relatedFlag: "-ns"
|
|
50879
|
+
},
|
|
50880
|
+
{
|
|
50881
|
+
name: `${ENV_PREFIX}_OUTPUT_FORMAT`,
|
|
50882
|
+
description: "Output format (json, yaml, table)",
|
|
50883
|
+
relatedFlag: "-o"
|
|
50884
|
+
},
|
|
50885
|
+
{
|
|
50886
|
+
name: `${ENV_PREFIX}_SUBSCRIPTION_TIER`,
|
|
50887
|
+
description: "Subscription tier for feature validation",
|
|
50888
|
+
relatedFlag: ""
|
|
50889
|
+
},
|
|
50890
|
+
{
|
|
50891
|
+
name: "NO_COLOR",
|
|
50892
|
+
description: "Disable color output",
|
|
50893
|
+
relatedFlag: "--no-color"
|
|
50894
|
+
}
|
|
50895
|
+
];
|
|
50896
|
+
function formatEnvVarsSection() {
|
|
50897
|
+
const maxLen = Math.max(...EnvVarRegistry.map((e) => e.name.length));
|
|
50898
|
+
const lines = ["ENVIRONMENT VARIABLES"];
|
|
50899
|
+
for (const env3 of EnvVarRegistry) {
|
|
50900
|
+
const padding = " ".repeat(maxLen - env3.name.length + 3);
|
|
50901
|
+
const flagNote = env3.relatedFlag ? ` [${env3.relatedFlag}]` : "";
|
|
50902
|
+
lines.push(` ${env3.name}${padding}${env3.description}${flagNote}`);
|
|
50903
|
+
}
|
|
50904
|
+
return lines;
|
|
50905
|
+
}
|
|
50906
|
+
function formatConfigSection() {
|
|
50907
|
+
return [
|
|
50908
|
+
"CONFIGURATION",
|
|
50909
|
+
` Config file: ~/${CONFIG_FILE_NAME}`,
|
|
50910
|
+
" Priority: CLI flags > environment variables > config file > defaults",
|
|
50911
|
+
"",
|
|
50912
|
+
"DOCUMENTATION",
|
|
50913
|
+
` ${DOCS_URL}`
|
|
50914
|
+
];
|
|
50915
|
+
}
|
|
50916
|
+
|
|
50917
|
+
// src/repl/help.ts
|
|
50918
|
+
function formatRootHelp() {
|
|
50919
|
+
return [
|
|
50920
|
+
"",
|
|
50921
|
+
colorBoldWhite(`${CLI_NAME} - ${CLI_FULL_NAME} v${CLI_VERSION}`),
|
|
50922
|
+
"",
|
|
50923
|
+
"DESCRIPTION",
|
|
50924
|
+
` Interactive CLI for F5 Distributed Cloud services.`,
|
|
50925
|
+
"",
|
|
50926
|
+
"USAGE",
|
|
50927
|
+
` ${CLI_NAME} Enter interactive REPL mode`,
|
|
50928
|
+
` ${CLI_NAME} <domain> <action> Execute command non-interactively`,
|
|
50929
|
+
` ${CLI_NAME} help [topic] Show help for a topic`,
|
|
50930
|
+
"",
|
|
50931
|
+
"EXAMPLES",
|
|
50932
|
+
` ${CLI_NAME} tenant_and_identity list namespace List all namespaces`,
|
|
50933
|
+
` ${CLI_NAME} virtual get http_loadbalancer Get a specific load balancer`,
|
|
50934
|
+
` ${CLI_NAME} dns list List DNS zones`,
|
|
50935
|
+
` ${CLI_NAME} waf list -ns prod List WAF policies in prod`,
|
|
50936
|
+
` ${CLI_NAME} --interactive Force interactive REPL mode`,
|
|
50937
|
+
"",
|
|
50938
|
+
...formatDomainsSection(),
|
|
50939
|
+
"",
|
|
50940
|
+
...formatGlobalFlags(),
|
|
50941
|
+
"",
|
|
50942
|
+
...formatEnvVarsSection(),
|
|
50943
|
+
"",
|
|
50944
|
+
...formatConfigSection(),
|
|
50945
|
+
"",
|
|
50946
|
+
"NAVIGATION (Interactive Mode)",
|
|
50947
|
+
" <domain> Navigate into a domain (e.g., 'dns', 'lb')",
|
|
50948
|
+
" /domain Navigate directly to domain from anywhere",
|
|
50949
|
+
" .. Go up one level",
|
|
50950
|
+
" / Return to root",
|
|
50951
|
+
" context Show current navigation context",
|
|
50952
|
+
"",
|
|
50953
|
+
"BUILTINS",
|
|
50954
|
+
" help Show this help",
|
|
50955
|
+
" domains List all available domains",
|
|
50956
|
+
" clear Clear the screen",
|
|
50957
|
+
" history Show command history",
|
|
50958
|
+
" quit, exit Exit the shell",
|
|
50959
|
+
""
|
|
50960
|
+
];
|
|
50961
|
+
}
|
|
50962
|
+
function formatGlobalFlags() {
|
|
50963
|
+
return [
|
|
50964
|
+
"GLOBAL FLAGS",
|
|
50965
|
+
" -v, --version Show version number",
|
|
50966
|
+
" -h, --help Show this help",
|
|
50967
|
+
" -i, --interactive Force interactive mode",
|
|
50968
|
+
" --no-color Disable color output",
|
|
50969
|
+
" -o, --output <fmt> Output format (json, yaml, table)",
|
|
50970
|
+
" -ns, --namespace <ns> Target namespace"
|
|
50971
|
+
];
|
|
50972
|
+
}
|
|
50973
|
+
function formatEnvironmentVariables() {
|
|
50974
|
+
return formatEnvVarsSection();
|
|
50975
|
+
}
|
|
50976
|
+
function formatDomainHelp(domain) {
|
|
50977
|
+
const output = ["", colorBoldWhite(`${domain.displayName}`), ""];
|
|
50978
|
+
output.push(` ${domain.description}`);
|
|
50979
|
+
output.push("");
|
|
50980
|
+
if (domain.category || domain.complexity) {
|
|
50981
|
+
const meta = [];
|
|
50982
|
+
if (domain.category) meta.push(`Category: ${domain.category}`);
|
|
50983
|
+
if (domain.complexity) meta.push(`Complexity: ${domain.complexity}`);
|
|
50984
|
+
output.push(colorDim(` ${meta.join(" | ")}`));
|
|
50985
|
+
output.push("");
|
|
50986
|
+
}
|
|
50987
|
+
output.push("USAGE");
|
|
50988
|
+
output.push(` ${CLI_NAME} ${domain.name} <action> [options]`);
|
|
50989
|
+
output.push("");
|
|
50990
|
+
output.push("ACTIONS");
|
|
50991
|
+
const actionDescriptions = {
|
|
50992
|
+
list: "List resources",
|
|
50993
|
+
get: "Get a specific resource by name",
|
|
50994
|
+
create: "Create a new resource",
|
|
50995
|
+
delete: "Delete a resource",
|
|
50996
|
+
replace: "Replace a resource configuration",
|
|
50997
|
+
apply: "Apply configuration from file",
|
|
50998
|
+
status: "Get resource status",
|
|
50999
|
+
patch: "Patch a resource",
|
|
51000
|
+
"add-labels": "Add labels to a resource",
|
|
51001
|
+
"remove-labels": "Remove labels from a resource"
|
|
51002
|
+
};
|
|
51003
|
+
for (const action of validActions) {
|
|
51004
|
+
const desc = actionDescriptions[action] ?? action;
|
|
51005
|
+
output.push(` ${action.padEnd(16)} ${desc}`);
|
|
51006
|
+
}
|
|
51007
|
+
output.push("");
|
|
51008
|
+
output.push("EXAMPLES");
|
|
51009
|
+
output.push(` ${CLI_NAME} ${domain.name} list`);
|
|
51010
|
+
output.push(` ${CLI_NAME} ${domain.name} get my-resource`);
|
|
51011
|
+
output.push(
|
|
51012
|
+
` ${CLI_NAME} ${domain.name} create my-resource -f config.yaml`
|
|
51013
|
+
);
|
|
51014
|
+
output.push(` ${CLI_NAME} ${domain.name} delete my-resource`);
|
|
51015
|
+
output.push("");
|
|
51016
|
+
if (domain.useCases && domain.useCases.length > 0) {
|
|
51017
|
+
output.push("USE CASES");
|
|
51018
|
+
for (const useCase of domain.useCases.slice(0, 5)) {
|
|
51019
|
+
output.push(` - ${useCase}`);
|
|
51020
|
+
}
|
|
51021
|
+
output.push("");
|
|
51022
|
+
}
|
|
51023
|
+
if (domain.relatedDomains && domain.relatedDomains.length > 0) {
|
|
51024
|
+
output.push("RELATED DOMAINS");
|
|
51025
|
+
output.push(` ${domain.relatedDomains.join(", ")}`);
|
|
51026
|
+
output.push("");
|
|
51027
|
+
}
|
|
51028
|
+
if (domain.aliases && domain.aliases.length > 0) {
|
|
51029
|
+
output.push("ALIASES");
|
|
51030
|
+
output.push(` ${domain.aliases.join(", ")}`);
|
|
51031
|
+
output.push("");
|
|
51032
|
+
}
|
|
51033
|
+
output.push(colorDim(`For global options, run: ${CLI_NAME} --help`));
|
|
51034
|
+
output.push("");
|
|
51035
|
+
return output;
|
|
51036
|
+
}
|
|
51037
|
+
function formatActionHelp(domainName, action) {
|
|
51038
|
+
const domain = getDomainInfo(domainName);
|
|
51039
|
+
const displayDomain = domain?.displayName ?? domainName;
|
|
51040
|
+
const actionDescriptions = {
|
|
51041
|
+
list: {
|
|
51042
|
+
desc: "List all resources in the namespace",
|
|
51043
|
+
usage: `${CLI_NAME} ${domainName} list [--limit N] [--label key=value]`
|
|
51044
|
+
},
|
|
51045
|
+
get: {
|
|
51046
|
+
desc: "Get a specific resource by name",
|
|
51047
|
+
usage: `${CLI_NAME} ${domainName} get <name> [-o json|yaml|table]`
|
|
51048
|
+
},
|
|
51049
|
+
create: {
|
|
51050
|
+
desc: "Create a new resource",
|
|
51051
|
+
usage: `${CLI_NAME} ${domainName} create <name> -f <file.yaml>`
|
|
51052
|
+
},
|
|
51053
|
+
delete: {
|
|
51054
|
+
desc: "Delete a resource by name",
|
|
51055
|
+
usage: `${CLI_NAME} ${domainName} delete <name>`
|
|
51056
|
+
},
|
|
51057
|
+
replace: {
|
|
51058
|
+
desc: "Replace an existing resource configuration",
|
|
51059
|
+
usage: `${CLI_NAME} ${domainName} replace <name> -f <file.yaml>`
|
|
51060
|
+
},
|
|
51061
|
+
apply: {
|
|
51062
|
+
desc: "Apply configuration from a file (create or update)",
|
|
51063
|
+
usage: `${CLI_NAME} ${domainName} apply -f <file.yaml>`
|
|
51064
|
+
},
|
|
51065
|
+
status: {
|
|
51066
|
+
desc: "Get the current status of a resource",
|
|
51067
|
+
usage: `${CLI_NAME} ${domainName} status <name>`
|
|
51068
|
+
},
|
|
51069
|
+
patch: {
|
|
51070
|
+
desc: "Patch specific fields of a resource",
|
|
51071
|
+
usage: `${CLI_NAME} ${domainName} patch <name> -f <patch.yaml>`
|
|
51072
|
+
},
|
|
51073
|
+
"add-labels": {
|
|
51074
|
+
desc: "Add labels to a resource",
|
|
51075
|
+
usage: `${CLI_NAME} ${domainName} add-labels <name> key=value`
|
|
51076
|
+
},
|
|
51077
|
+
"remove-labels": {
|
|
51078
|
+
desc: "Remove labels from a resource",
|
|
51079
|
+
usage: `${CLI_NAME} ${domainName} remove-labels <name> key`
|
|
51080
|
+
}
|
|
51081
|
+
};
|
|
51082
|
+
const actionInfo = actionDescriptions[action] ?? {
|
|
51083
|
+
desc: `Execute ${action} operation`,
|
|
51084
|
+
usage: `${CLI_NAME} ${domainName} ${action} [options]`
|
|
51085
|
+
};
|
|
51086
|
+
return [
|
|
51087
|
+
"",
|
|
51088
|
+
colorBoldWhite(`${displayDomain} - ${action}`),
|
|
51089
|
+
"",
|
|
51090
|
+
` ${actionInfo.desc}`,
|
|
51091
|
+
"",
|
|
51092
|
+
"USAGE",
|
|
51093
|
+
` ${actionInfo.usage}`,
|
|
51094
|
+
"",
|
|
51095
|
+
"OPTIONS",
|
|
51096
|
+
" -n, --name <name> Resource name",
|
|
51097
|
+
" -ns, --namespace <ns> Target namespace",
|
|
51098
|
+
" -o, --output <fmt> Output format (json, yaml, table)",
|
|
51099
|
+
" -f, --file <path> Configuration file",
|
|
51100
|
+
"",
|
|
51101
|
+
colorDim(`For domain help, run: ${CLI_NAME} ${domainName} --help`),
|
|
51102
|
+
""
|
|
51103
|
+
];
|
|
51104
|
+
}
|
|
51105
|
+
function formatTopicHelp(topic) {
|
|
51106
|
+
const lowerTopic = topic.toLowerCase();
|
|
51107
|
+
const domainInfo = getDomainInfo(lowerTopic);
|
|
51108
|
+
if (domainInfo) {
|
|
51109
|
+
return formatDomainHelp(domainInfo);
|
|
51110
|
+
}
|
|
51111
|
+
switch (lowerTopic) {
|
|
51112
|
+
case "domains":
|
|
51113
|
+
return formatDomainsHelp();
|
|
51114
|
+
case "actions":
|
|
51115
|
+
return formatActionsHelp();
|
|
51116
|
+
case "navigation":
|
|
51117
|
+
case "nav":
|
|
51118
|
+
return formatNavigationHelp();
|
|
51119
|
+
case "env":
|
|
51120
|
+
case "environment":
|
|
51121
|
+
return ["", ...formatEnvironmentVariables(), ""];
|
|
51122
|
+
case "flags":
|
|
51123
|
+
return ["", ...formatGlobalFlags(), ""];
|
|
51124
|
+
default:
|
|
51125
|
+
return [
|
|
51126
|
+
"",
|
|
51127
|
+
`Unknown help topic: ${topic}`,
|
|
51128
|
+
"",
|
|
51129
|
+
"Available topics:",
|
|
51130
|
+
" domains List all available domains",
|
|
51131
|
+
" actions List available actions",
|
|
51132
|
+
" navigation Navigation commands",
|
|
51133
|
+
" env Environment variables",
|
|
51134
|
+
" flags Global flags",
|
|
51135
|
+
" <domain> Help for a specific domain (e.g., 'help dns')",
|
|
51136
|
+
""
|
|
51137
|
+
];
|
|
51138
|
+
}
|
|
51139
|
+
}
|
|
51140
|
+
function formatDomainsHelp() {
|
|
51141
|
+
const output = ["", colorBoldWhite("Available Domains"), ""];
|
|
51142
|
+
const categories = /* @__PURE__ */ new Map();
|
|
51143
|
+
for (const domain of domainRegistry.values()) {
|
|
51144
|
+
const category = domain.category ?? "Other";
|
|
51145
|
+
if (!categories.has(category)) {
|
|
51146
|
+
categories.set(category, []);
|
|
51147
|
+
}
|
|
51148
|
+
categories.get(category)?.push(domain);
|
|
51149
|
+
}
|
|
51150
|
+
const sortedCategories = Array.from(categories.keys()).sort();
|
|
51151
|
+
for (const category of sortedCategories) {
|
|
51152
|
+
const domains = categories.get(category) ?? [];
|
|
51153
|
+
output.push(colorBoldWhite(` ${category}`));
|
|
51154
|
+
for (const domain of domains.sort(
|
|
51155
|
+
(a, b) => a.name.localeCompare(b.name)
|
|
51156
|
+
)) {
|
|
51157
|
+
const aliases = domain.aliases.length > 0 ? colorDim(` (${domain.aliases.join(", ")})`) : "";
|
|
51158
|
+
output.push(
|
|
51159
|
+
` ${domain.name.padEnd(24)} ${domain.descriptionShort}`
|
|
51160
|
+
);
|
|
51161
|
+
if (aliases) {
|
|
51162
|
+
output.push(` ${"".padEnd(24)} Aliases:${aliases}`);
|
|
51163
|
+
}
|
|
51164
|
+
}
|
|
51165
|
+
output.push("");
|
|
51166
|
+
}
|
|
51167
|
+
return output;
|
|
51168
|
+
}
|
|
51169
|
+
function formatActionsHelp() {
|
|
51170
|
+
return [
|
|
51171
|
+
"",
|
|
51172
|
+
colorBoldWhite("Available Actions"),
|
|
51173
|
+
"",
|
|
51174
|
+
" list List all resources in the namespace",
|
|
51175
|
+
" get Get a specific resource by name",
|
|
51176
|
+
" create Create a new resource from a file",
|
|
51177
|
+
" delete Delete a resource by name",
|
|
51178
|
+
" replace Replace a resource configuration",
|
|
51179
|
+
" apply Apply configuration (create or update)",
|
|
51180
|
+
" status Get resource status",
|
|
51181
|
+
" patch Patch specific fields of a resource",
|
|
51182
|
+
" add-labels Add labels to a resource",
|
|
51183
|
+
" remove-labels Remove labels from a resource",
|
|
51184
|
+
"",
|
|
51185
|
+
"USAGE",
|
|
51186
|
+
` ${CLI_NAME} <domain> <action> [options]`,
|
|
51187
|
+
"",
|
|
51188
|
+
"EXAMPLES",
|
|
51189
|
+
` ${CLI_NAME} dns list`,
|
|
51190
|
+
` ${CLI_NAME} lb get my-loadbalancer`,
|
|
51191
|
+
` ${CLI_NAME} waf create my-policy -f policy.yaml`,
|
|
51192
|
+
""
|
|
51193
|
+
];
|
|
51194
|
+
}
|
|
51195
|
+
function formatNavigationHelp() {
|
|
51196
|
+
return [
|
|
51197
|
+
"",
|
|
51198
|
+
colorBoldWhite("Navigation Commands"),
|
|
51199
|
+
"",
|
|
51200
|
+
" <domain> Navigate into a domain context",
|
|
51201
|
+
" /<domain> Navigate directly to domain from anywhere",
|
|
51202
|
+
" .. Go up one level in context",
|
|
51203
|
+
" / Return to root context",
|
|
51204
|
+
" back Go up one level (same as ..)",
|
|
51205
|
+
" root Return to root (same as /)",
|
|
51206
|
+
"",
|
|
51207
|
+
"CONTEXT DISPLAY",
|
|
51208
|
+
" context Show current navigation context",
|
|
51209
|
+
" ctx Alias for context",
|
|
51210
|
+
"",
|
|
51211
|
+
"EXAMPLES",
|
|
51212
|
+
" xcsh> dns # Enter dns domain",
|
|
51213
|
+
" dns> list # Execute list in dns context",
|
|
51214
|
+
" dns> .. # Return to root",
|
|
51215
|
+
" xcsh> /waf # Jump directly to waf",
|
|
51216
|
+
" waf> /dns # Jump from waf to dns",
|
|
51217
|
+
""
|
|
51218
|
+
];
|
|
51219
|
+
}
|
|
51220
|
+
function formatDomainsSection() {
|
|
51221
|
+
const output = ["DOMAINS"];
|
|
51222
|
+
const domains = Array.from(domainRegistry.values()).sort(
|
|
51223
|
+
(a, b) => a.name.localeCompare(b.name)
|
|
51224
|
+
);
|
|
51225
|
+
const maxNameLen = Math.max(...domains.map((d) => d.name.length));
|
|
51226
|
+
for (const domain of domains) {
|
|
51227
|
+
const padding = " ".repeat(maxNameLen - domain.name.length + 2);
|
|
51228
|
+
output.push(` ${domain.name}${padding}${domain.descriptionShort}`);
|
|
51229
|
+
}
|
|
51230
|
+
return output;
|
|
51231
|
+
}
|
|
51232
|
+
|
|
50810
51233
|
// src/repl/executor.ts
|
|
50811
51234
|
var BUILTIN_COMMANDS = /* @__PURE__ */ new Set([
|
|
50812
51235
|
"help",
|
|
51236
|
+
"--help",
|
|
51237
|
+
"-h",
|
|
50813
51238
|
"clear",
|
|
50814
51239
|
"quit",
|
|
50815
51240
|
"exit",
|
|
@@ -50858,9 +51283,11 @@ function parseCommand(input) {
|
|
|
50858
51283
|
};
|
|
50859
51284
|
}
|
|
50860
51285
|
const firstWord = trimmed.split(/\s+/)[0]?.toLowerCase() ?? "";
|
|
50861
|
-
|
|
51286
|
+
const normalizedFirst = firstWord.startsWith("/") ? firstWord.slice(1) : firstWord;
|
|
51287
|
+
if (BUILTIN_COMMANDS.has(firstWord) || BUILTIN_COMMANDS.has(normalizedFirst)) {
|
|
51288
|
+
const effectiveCommand = normalizedFirst === "--help" || normalizedFirst === "-h" ? "help" : normalizedFirst;
|
|
50862
51289
|
return {
|
|
50863
|
-
raw:
|
|
51290
|
+
raw: effectiveCommand,
|
|
50864
51291
|
isDirectNavigation: false,
|
|
50865
51292
|
isBuiltin: true,
|
|
50866
51293
|
args: trimmed.split(/\s+/).slice(1)
|
|
@@ -51027,32 +51454,57 @@ function executeBuiltin(cmd, session, ctx) {
|
|
|
51027
51454
|
}));
|
|
51028
51455
|
}
|
|
51029
51456
|
if (command === "help" || command.startsWith("help ")) {
|
|
51457
|
+
const topic = cmd.args[0]?.trim() ?? "";
|
|
51458
|
+
if (topic) {
|
|
51459
|
+
return {
|
|
51460
|
+
output: formatTopicHelp(topic),
|
|
51461
|
+
shouldExit: false,
|
|
51462
|
+
shouldClear: false,
|
|
51463
|
+
contextChanged: false
|
|
51464
|
+
};
|
|
51465
|
+
}
|
|
51466
|
+
if (ctx.isRoot()) {
|
|
51467
|
+
return {
|
|
51468
|
+
output: formatRootHelp(),
|
|
51469
|
+
shouldExit: false,
|
|
51470
|
+
shouldClear: false,
|
|
51471
|
+
contextChanged: false
|
|
51472
|
+
};
|
|
51473
|
+
}
|
|
51474
|
+
if (ctx.isDomain()) {
|
|
51475
|
+
const domain = ctx.domain ?? "";
|
|
51476
|
+
const domainInfo = getDomainInfo(domain);
|
|
51477
|
+
if (domainInfo) {
|
|
51478
|
+
return {
|
|
51479
|
+
output: formatDomainHelp(domainInfo),
|
|
51480
|
+
shouldExit: false,
|
|
51481
|
+
shouldClear: false,
|
|
51482
|
+
contextChanged: false
|
|
51483
|
+
};
|
|
51484
|
+
}
|
|
51485
|
+
return {
|
|
51486
|
+
output: [
|
|
51487
|
+
`Help for domain: ${domain}`,
|
|
51488
|
+
"",
|
|
51489
|
+
"Use 'help' at root for full help."
|
|
51490
|
+
],
|
|
51491
|
+
shouldExit: false,
|
|
51492
|
+
shouldClear: false,
|
|
51493
|
+
contextChanged: false
|
|
51494
|
+
};
|
|
51495
|
+
}
|
|
51496
|
+
if (ctx.isAction()) {
|
|
51497
|
+
const domain = ctx.domain ?? "";
|
|
51498
|
+
const action = ctx.action ?? "";
|
|
51499
|
+
return {
|
|
51500
|
+
output: formatActionHelp(domain, action),
|
|
51501
|
+
shouldExit: false,
|
|
51502
|
+
shouldClear: false,
|
|
51503
|
+
contextChanged: false
|
|
51504
|
+
};
|
|
51505
|
+
}
|
|
51030
51506
|
return {
|
|
51031
|
-
output:
|
|
51032
|
-
"xcsh - F5 Distributed Cloud Shell",
|
|
51033
|
-
"",
|
|
51034
|
-
"Navigation:",
|
|
51035
|
-
" /domain Navigate directly to domain",
|
|
51036
|
-
" exit, back, .. Navigate up one level (exits at root)",
|
|
51037
|
-
" /, root Navigate to root context",
|
|
51038
|
-
" context, ctx Show current context",
|
|
51039
|
-
"",
|
|
51040
|
-
"Built-in commands:",
|
|
51041
|
-
" help Show this help",
|
|
51042
|
-
" clear Clear the screen",
|
|
51043
|
-
" quit Exit the shell",
|
|
51044
|
-
" history Show command history",
|
|
51045
|
-
" domains List available domains",
|
|
51046
|
-
" whoami Show current user and connection (-q/--quota, -a/--addons, -v/--verbose, --json)",
|
|
51047
|
-
" version Show version info",
|
|
51048
|
-
"",
|
|
51049
|
-
"Keyboard shortcuts:",
|
|
51050
|
-
" Tab Trigger/cycle completions",
|
|
51051
|
-
" Up/Down Navigate history or suggestions",
|
|
51052
|
-
" Ctrl+C twice Exit (within 500ms)",
|
|
51053
|
-
" Ctrl+D Exit immediately",
|
|
51054
|
-
" Escape Cancel suggestions"
|
|
51055
|
-
],
|
|
51507
|
+
output: formatRootHelp(),
|
|
51056
51508
|
shouldExit: false,
|
|
51057
51509
|
shouldClear: false,
|
|
51058
51510
|
contextChanged: false
|
|
@@ -51083,6 +51535,27 @@ async function handleDirectNavigation(cmd, ctx, session) {
|
|
|
51083
51535
|
);
|
|
51084
51536
|
return customDomains.execute(canonicalDomain, allArgs, session);
|
|
51085
51537
|
}
|
|
51538
|
+
if (cmd.targetAction === "--help" || cmd.targetAction === "-h" || cmd.targetAction === "help") {
|
|
51539
|
+
const domainInfo = getDomainInfo(cmd.targetDomain);
|
|
51540
|
+
if (domainInfo) {
|
|
51541
|
+
return {
|
|
51542
|
+
output: formatDomainHelp(domainInfo),
|
|
51543
|
+
shouldExit: false,
|
|
51544
|
+
shouldClear: false,
|
|
51545
|
+
contextChanged: false
|
|
51546
|
+
};
|
|
51547
|
+
}
|
|
51548
|
+
return {
|
|
51549
|
+
output: [
|
|
51550
|
+
`${cmd.targetDomain} - Run '${cmd.targetDomain}' for available commands.`,
|
|
51551
|
+
"",
|
|
51552
|
+
`For global options, run: help`
|
|
51553
|
+
],
|
|
51554
|
+
shouldExit: false,
|
|
51555
|
+
shouldClear: false,
|
|
51556
|
+
contextChanged: false
|
|
51557
|
+
};
|
|
51558
|
+
}
|
|
51086
51559
|
const extensionDomain = aliasRegistry.get(cmd.targetDomain) ?? cmd.targetDomain;
|
|
51087
51560
|
const merged = extensionRegistry.getMergedDomain(extensionDomain);
|
|
51088
51561
|
if (merged?.hasExtension && cmd.targetAction) {
|
|
@@ -51166,6 +51639,28 @@ async function handleDomainNavigation(domain, args, ctx, session) {
|
|
|
51166
51639
|
const canonicalDomain = resolveDomainAlias(domain);
|
|
51167
51640
|
return customDomains.execute(canonicalDomain, args, session);
|
|
51168
51641
|
}
|
|
51642
|
+
const firstArg = args[0]?.toLowerCase() ?? "";
|
|
51643
|
+
if (firstArg === "--help" || firstArg === "-h" || firstArg === "help") {
|
|
51644
|
+
const domainInfo = getDomainInfo(domain);
|
|
51645
|
+
if (domainInfo) {
|
|
51646
|
+
return {
|
|
51647
|
+
output: formatDomainHelp(domainInfo),
|
|
51648
|
+
shouldExit: false,
|
|
51649
|
+
shouldClear: false,
|
|
51650
|
+
contextChanged: false
|
|
51651
|
+
};
|
|
51652
|
+
}
|
|
51653
|
+
return {
|
|
51654
|
+
output: [
|
|
51655
|
+
`${domain} - Run '${domain}' for available commands.`,
|
|
51656
|
+
"",
|
|
51657
|
+
`For global options, run: help`
|
|
51658
|
+
],
|
|
51659
|
+
shouldExit: false,
|
|
51660
|
+
shouldClear: false,
|
|
51661
|
+
contextChanged: false
|
|
51662
|
+
};
|
|
51663
|
+
}
|
|
51169
51664
|
const merged = extensionRegistry.getMergedDomain(domain);
|
|
51170
51665
|
if (merged?.hasExtension) {
|
|
51171
51666
|
if (args.length > 0) {
|
|
@@ -51508,9 +52003,9 @@ function App2() {
|
|
|
51508
52003
|
},
|
|
51509
52004
|
[]
|
|
51510
52005
|
);
|
|
51511
|
-
const [
|
|
51512
|
-
const
|
|
51513
|
-
const [prompt, setPrompt] = (0, import_react28.useState)("
|
|
52006
|
+
const [outputItems, setOutputItems] = (0, import_react28.useState)([]);
|
|
52007
|
+
const outputIdRef = (0, import_react28.useRef)(0);
|
|
52008
|
+
const [prompt, setPrompt] = (0, import_react28.useState)("> ");
|
|
51514
52009
|
const [width, setWidth] = (0, import_react28.useState)(stdout?.columns ?? 80);
|
|
51515
52010
|
const [gitInfo, setGitInfo] = (0, import_react28.useState)(void 0);
|
|
51516
52011
|
const [statusHint, setStatusHint] = (0, import_react28.useState)("Ctrl+C twice to exit");
|
|
@@ -51558,12 +52053,17 @@ function App2() {
|
|
|
51558
52053
|
};
|
|
51559
52054
|
}, [stdout]);
|
|
51560
52055
|
const addOutput = (0, import_react28.useCallback)((line) => {
|
|
51561
|
-
|
|
51562
|
-
|
|
51563
|
-
|
|
51564
|
-
|
|
52056
|
+
const lines = line.split("\n");
|
|
52057
|
+
const newItems = lines.map((content) => ({
|
|
52058
|
+
id: outputIdRef.current++,
|
|
52059
|
+
content
|
|
52060
|
+
}));
|
|
52061
|
+
setOutputItems((prev) => {
|
|
52062
|
+
const combined = [...prev, ...newItems];
|
|
52063
|
+
if (combined.length > 1e3) {
|
|
52064
|
+
return combined.slice(combined.length - 1e3);
|
|
51565
52065
|
}
|
|
51566
|
-
return
|
|
52066
|
+
return combined;
|
|
51567
52067
|
});
|
|
51568
52068
|
}, []);
|
|
51569
52069
|
const applyCompletion = (0, import_react28.useCallback)(
|
|
@@ -51605,10 +52105,9 @@ function App2() {
|
|
|
51605
52105
|
const trimmed = cmd.trim();
|
|
51606
52106
|
if (!trimmed) return;
|
|
51607
52107
|
addOutput(prompt + trimmed);
|
|
51608
|
-
setShowBanner(false);
|
|
51609
52108
|
const result = await executeCommand(trimmed, session);
|
|
51610
52109
|
if (result.shouldClear) {
|
|
51611
|
-
|
|
52110
|
+
setOutputItems([]);
|
|
51612
52111
|
} else {
|
|
51613
52112
|
result.output.forEach((line) => addOutput(line));
|
|
51614
52113
|
}
|
|
@@ -51672,10 +52171,17 @@ function App2() {
|
|
|
51672
52171
|
if (key.tab) {
|
|
51673
52172
|
const currentInput = inputRef.current;
|
|
51674
52173
|
if (completion.isShowing) {
|
|
51675
|
-
|
|
51676
|
-
completion.
|
|
51677
|
-
|
|
51678
|
-
|
|
52174
|
+
const selected = completion.suggestions.at(
|
|
52175
|
+
completion.selectedIndex
|
|
52176
|
+
);
|
|
52177
|
+
if (selected) {
|
|
52178
|
+
applyCompletion({
|
|
52179
|
+
label: selected.text,
|
|
52180
|
+
value: selected.text,
|
|
52181
|
+
description: selected.description,
|
|
52182
|
+
category: selected.category ?? "builtin"
|
|
52183
|
+
});
|
|
52184
|
+
completion.hide();
|
|
51679
52185
|
}
|
|
51680
52186
|
} else {
|
|
51681
52187
|
completion.triggerCompletion(currentInput).then((suggestion) => {
|
|
@@ -51742,52 +52248,151 @@ function App2() {
|
|
|
51742
52248
|
},
|
|
51743
52249
|
[applyCompletion, completion]
|
|
51744
52250
|
);
|
|
51745
|
-
if (!isInitialized) {
|
|
51746
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Box_default, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text, { children: "Initializing..." }) });
|
|
51747
|
-
}
|
|
51748
|
-
const maxOutputLines = Math.max(5, 20);
|
|
51749
|
-
const connectionInfo = {
|
|
51750
|
-
tenant: session.getTenant() || void 0,
|
|
51751
|
-
username: session.getUsername() || void 0,
|
|
51752
|
-
tier: session.getTier() || void 0,
|
|
51753
|
-
namespace: session.getNamespace(),
|
|
51754
|
-
isConnected: session.isConnected()
|
|
51755
|
-
};
|
|
51756
52251
|
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Box_default, { flexDirection: "column", width, children: [
|
|
51757
|
-
|
|
51758
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.
|
|
51759
|
-
|
|
51760
|
-
|
|
51761
|
-
|
|
51762
|
-
|
|
51763
|
-
|
|
51764
|
-
|
|
51765
|
-
|
|
51766
|
-
|
|
51767
|
-
|
|
51768
|
-
|
|
51769
|
-
|
|
51770
|
-
|
|
51771
|
-
|
|
51772
|
-
|
|
51773
|
-
|
|
51774
|
-
|
|
51775
|
-
|
|
51776
|
-
|
|
51777
|
-
|
|
51778
|
-
|
|
51779
|
-
|
|
51780
|
-
|
|
51781
|
-
|
|
51782
|
-
|
|
52252
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Static, { items: outputItems, children: (item) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text, { children: item.content }, item.id) }),
|
|
52253
|
+
isInitialized ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
|
|
52254
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
52255
|
+
InputBox,
|
|
52256
|
+
{
|
|
52257
|
+
prompt,
|
|
52258
|
+
value: input,
|
|
52259
|
+
onChange: handleInputChange,
|
|
52260
|
+
onSubmit: handleSubmit,
|
|
52261
|
+
width,
|
|
52262
|
+
isActive: true,
|
|
52263
|
+
inputKey
|
|
52264
|
+
}
|
|
52265
|
+
),
|
|
52266
|
+
completion.isShowing && completion.suggestions.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
52267
|
+
Suggestions,
|
|
52268
|
+
{
|
|
52269
|
+
suggestions: toUISuggestions(
|
|
52270
|
+
completion.suggestions
|
|
52271
|
+
),
|
|
52272
|
+
selectedIndex: completion.selectedIndex,
|
|
52273
|
+
onSelect: handleSuggestionSelect,
|
|
52274
|
+
onNavigate: handleSuggestionNavigate,
|
|
52275
|
+
onCancel: completion.hide,
|
|
52276
|
+
maxVisible: 10,
|
|
52277
|
+
isActive: false
|
|
52278
|
+
}
|
|
52279
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
52280
|
+
StatusBar,
|
|
52281
|
+
{
|
|
52282
|
+
gitInfo,
|
|
52283
|
+
width,
|
|
52284
|
+
hint: statusHint
|
|
52285
|
+
}
|
|
52286
|
+
)
|
|
52287
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text, { children: "Initializing..." })
|
|
51783
52288
|
] });
|
|
51784
52289
|
}
|
|
51785
52290
|
|
|
51786
52291
|
// src/index.tsx
|
|
51787
52292
|
var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
|
|
52293
|
+
function colorizeLogoLine(line) {
|
|
52294
|
+
let result = "";
|
|
52295
|
+
let currentColor = "none";
|
|
52296
|
+
for (const char of line) {
|
|
52297
|
+
let newColor;
|
|
52298
|
+
switch (char) {
|
|
52299
|
+
case "\u2593":
|
|
52300
|
+
// Dark shade - red (rendered as solid block)
|
|
52301
|
+
case "\u2592":
|
|
52302
|
+
// Medium shade - red
|
|
52303
|
+
case "(":
|
|
52304
|
+
case ")":
|
|
52305
|
+
case "|":
|
|
52306
|
+
case "_":
|
|
52307
|
+
newColor = "red";
|
|
52308
|
+
break;
|
|
52309
|
+
case "\u2588":
|
|
52310
|
+
newColor = "white";
|
|
52311
|
+
break;
|
|
52312
|
+
default:
|
|
52313
|
+
newColor = "none";
|
|
52314
|
+
}
|
|
52315
|
+
if (newColor !== currentColor) {
|
|
52316
|
+
if (currentColor !== "none") {
|
|
52317
|
+
result += colors.reset;
|
|
52318
|
+
}
|
|
52319
|
+
if (newColor === "red") {
|
|
52320
|
+
result += colors.red;
|
|
52321
|
+
} else if (newColor === "white") {
|
|
52322
|
+
result += colors.boldWhite;
|
|
52323
|
+
}
|
|
52324
|
+
currentColor = newColor;
|
|
52325
|
+
}
|
|
52326
|
+
result += char === "\u2593" ? "\u2588" : char;
|
|
52327
|
+
}
|
|
52328
|
+
if (currentColor !== "none") {
|
|
52329
|
+
result += colors.reset;
|
|
52330
|
+
}
|
|
52331
|
+
return result;
|
|
52332
|
+
}
|
|
52333
|
+
function printBannerToScrollback() {
|
|
52334
|
+
const BOX = {
|
|
52335
|
+
topLeft: "\u256D",
|
|
52336
|
+
topRight: "\u256E",
|
|
52337
|
+
bottomLeft: "\u2570",
|
|
52338
|
+
bottomRight: "\u256F",
|
|
52339
|
+
horizontal: "\u2500",
|
|
52340
|
+
vertical: "\u2502",
|
|
52341
|
+
leftT: "\u251C",
|
|
52342
|
+
rightT: "\u2524"
|
|
52343
|
+
};
|
|
52344
|
+
const logoLines2 = F5_LOGO.split("\n");
|
|
52345
|
+
const logoWidth = Math.max(...logoLines2.map((l) => [...l].length));
|
|
52346
|
+
const TOTAL_WIDTH2 = Math.max(80, logoWidth + 4);
|
|
52347
|
+
const INNER_WIDTH2 = TOTAL_WIDTH2 - 2;
|
|
52348
|
+
const HELP_LINES = [
|
|
52349
|
+
"Type 'help' for commands",
|
|
52350
|
+
"Run 'namespace <ns>' to set",
|
|
52351
|
+
"Press Ctrl+C twice to exit"
|
|
52352
|
+
];
|
|
52353
|
+
const HELP_START_ROW = 8;
|
|
52354
|
+
const title = ` ${CLI_FULL_NAME} v${CLI_VERSION} `;
|
|
52355
|
+
const leftDashes = 3;
|
|
52356
|
+
const rightDashes = TOTAL_WIDTH2 - 1 - leftDashes - title.length - 1;
|
|
52357
|
+
const output = [];
|
|
52358
|
+
output.push(
|
|
52359
|
+
colorRed(BOX.topLeft + BOX.horizontal.repeat(leftDashes)) + colorBoldWhite(title) + colorRed(
|
|
52360
|
+
BOX.horizontal.repeat(Math.max(0, rightDashes)) + BOX.topRight
|
|
52361
|
+
)
|
|
52362
|
+
);
|
|
52363
|
+
for (let i = 0; i < logoLines2.length; i++) {
|
|
52364
|
+
const logoLine = logoLines2[i] ?? "";
|
|
52365
|
+
const helpIndex = i - HELP_START_ROW;
|
|
52366
|
+
const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] ?? "" : "";
|
|
52367
|
+
const paddedLogo = logoLine.padEnd(logoWidth);
|
|
52368
|
+
const coloredLogo = colorizeLogoLine(paddedLogo);
|
|
52369
|
+
const helpColumnWidth = INNER_WIDTH2 - logoWidth - 1;
|
|
52370
|
+
const paddedHelp = helpText.padEnd(helpColumnWidth);
|
|
52371
|
+
output.push(
|
|
52372
|
+
colorRed(BOX.vertical) + coloredLogo + " " + colorBoldWhite(paddedHelp) + colorRed(BOX.vertical)
|
|
52373
|
+
);
|
|
52374
|
+
}
|
|
52375
|
+
output.push(
|
|
52376
|
+
colorRed(
|
|
52377
|
+
BOX.bottomLeft + BOX.horizontal.repeat(INNER_WIDTH2) + BOX.bottomRight
|
|
52378
|
+
)
|
|
52379
|
+
);
|
|
52380
|
+
output.push("");
|
|
52381
|
+
process.stdout.write(output.join("\n") + "\n");
|
|
52382
|
+
}
|
|
51788
52383
|
var program2 = new Command();
|
|
51789
|
-
program2.
|
|
52384
|
+
program2.configureHelp({
|
|
52385
|
+
formatHelp: () => formatRootHelp().join("\n")
|
|
52386
|
+
});
|
|
52387
|
+
program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CLI for F5 XC").version(CLI_VERSION, "-v, --version", "Show version number").option("-i, --interactive", "Force interactive mode").option("--no-color", "Disable color output").option("-h, --help", "Show help").argument("[command...]", "Command to execute non-interactively").allowUnknownOption(true).helpOption(false).action(
|
|
51790
52388
|
async (commandArgs, options) => {
|
|
52389
|
+
if (options.help && commandArgs.length === 0) {
|
|
52390
|
+
formatRootHelp().forEach((line) => console.log(line));
|
|
52391
|
+
process.exit(0);
|
|
52392
|
+
}
|
|
52393
|
+
if (options.help && commandArgs.length > 0) {
|
|
52394
|
+
commandArgs.push("--help");
|
|
52395
|
+
}
|
|
51791
52396
|
if (commandArgs.length === 0 || options.interactive) {
|
|
51792
52397
|
if (!process.stdin.isTTY && !options.interactive) {
|
|
51793
52398
|
console.error(
|
|
@@ -51798,6 +52403,7 @@ program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CL
|
|
|
51798
52403
|
);
|
|
51799
52404
|
process.exit(1);
|
|
51800
52405
|
}
|
|
52406
|
+
printBannerToScrollback();
|
|
51801
52407
|
process.stdin.resume();
|
|
51802
52408
|
render_default(/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(App2, {}));
|
|
51803
52409
|
return;
|