@f5-sales-demo/xcsh 20.22.2 → 20.22.3
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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@f5-sales-demo/xcsh",
|
|
4
|
-
"version": "20.22.
|
|
4
|
+
"version": "20.22.3",
|
|
5
5
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
6
6
|
"homepage": "https://github.com/f5-sales-demo/xcsh",
|
|
7
7
|
"author": "Can Boluk",
|
|
@@ -61,13 +61,13 @@
|
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@agentclientprotocol/sdk": "1.3.0",
|
|
64
|
-
"@f5-sales-demo/pi-agent-core": "20.22.
|
|
65
|
-
"@f5-sales-demo/pi-ai": "20.22.
|
|
66
|
-
"@f5-sales-demo/pi-natives": "20.22.
|
|
67
|
-
"@f5-sales-demo/pi-resource-management": "20.22.
|
|
68
|
-
"@f5-sales-demo/pi-tui": "20.22.
|
|
69
|
-
"@f5-sales-demo/pi-utils": "20.22.
|
|
70
|
-
"@f5-sales-demo/xcsh-stats": "20.22.
|
|
64
|
+
"@f5-sales-demo/pi-agent-core": "20.22.3",
|
|
65
|
+
"@f5-sales-demo/pi-ai": "20.22.3",
|
|
66
|
+
"@f5-sales-demo/pi-natives": "20.22.3",
|
|
67
|
+
"@f5-sales-demo/pi-resource-management": "20.22.3",
|
|
68
|
+
"@f5-sales-demo/pi-tui": "20.22.3",
|
|
69
|
+
"@f5-sales-demo/pi-utils": "20.22.3",
|
|
70
|
+
"@f5-sales-demo/xcsh-stats": "20.22.3",
|
|
71
71
|
"@mozilla/readability": "^0.6",
|
|
72
72
|
"@sinclair/typebox": "^0.34",
|
|
73
73
|
"@xterm/headless": "^6.0",
|
|
@@ -757,13 +757,48 @@ function renderSchemaAsTable(
|
|
|
757
757
|
depth = 0,
|
|
758
758
|
prefix = "",
|
|
759
759
|
schemaRecommended?: Readonly<Record<string, string>>,
|
|
760
|
+
visited = new Set<string>(),
|
|
760
761
|
): string {
|
|
761
762
|
if (depth > SCHEMA_RENDER_MAX_DEPTH) return "";
|
|
762
763
|
|
|
764
|
+
const schemaName = extractSchemaName(schema);
|
|
765
|
+
if (schemaName && visited.has(schemaName)) return "";
|
|
766
|
+
const nextVisited = new Set(visited);
|
|
767
|
+
if (schemaName) nextVisited.add(schemaName);
|
|
763
768
|
const resolved = resolveSchemaRef(schema, spec);
|
|
764
769
|
const properties = resolved.properties as Record<string, Record<string, unknown>> | undefined;
|
|
765
770
|
if (!properties) {
|
|
766
771
|
const type = (resolved.type as string) ?? "object";
|
|
772
|
+
const items = resolved.items;
|
|
773
|
+
if (type === "array" && items && typeof items === "object" && depth < SCHEMA_RENDER_MAX_DEPTH) {
|
|
774
|
+
return renderSchemaAsTable(
|
|
775
|
+
items as Record<string, unknown>,
|
|
776
|
+
spec,
|
|
777
|
+
depth + 1,
|
|
778
|
+
`${prefix}[]`,
|
|
779
|
+
schemaRecommended,
|
|
780
|
+
nextVisited,
|
|
781
|
+
);
|
|
782
|
+
}
|
|
783
|
+
const variants = Array.isArray(resolved.oneOf)
|
|
784
|
+
? (resolved.oneOf as unknown[]).filter(
|
|
785
|
+
(variant): variant is Record<string, unknown> => typeof variant === "object" && variant !== null,
|
|
786
|
+
)
|
|
787
|
+
: [];
|
|
788
|
+
if (variants.length > 0 && depth < SCHEMA_RENDER_MAX_DEPTH) {
|
|
789
|
+
return variants
|
|
790
|
+
.map((variant, index) =>
|
|
791
|
+
renderSchemaAsTable(
|
|
792
|
+
variant,
|
|
793
|
+
spec,
|
|
794
|
+
depth + 1,
|
|
795
|
+
`${prefix}.oneOf[${index}]`,
|
|
796
|
+
schemaRecommended,
|
|
797
|
+
nextVisited,
|
|
798
|
+
),
|
|
799
|
+
)
|
|
800
|
+
.join("");
|
|
801
|
+
}
|
|
767
802
|
return `Type: ${type}\n`;
|
|
768
803
|
}
|
|
769
804
|
|
|
@@ -780,7 +815,7 @@ function renderSchemaAsTable(
|
|
|
780
815
|
for (const [name, prop] of Object.entries(properties)) {
|
|
781
816
|
const fieldProp = resolveSchemaRef(prop, spec);
|
|
782
817
|
const fieldName = prefix ? `${prefix}.${name}` : name;
|
|
783
|
-
const type = (fieldProp.type as string) ?? "object";
|
|
818
|
+
const type = (fieldProp.type as string) ?? (Array.isArray(fieldProp.oneOf) ? "oneOf" : "object");
|
|
784
819
|
const desc = (fieldProp.description as string) ?? "";
|
|
785
820
|
const isRequired = required.includes(name) ? "yes" : "no";
|
|
786
821
|
const constraints = formatFieldConstraints(fieldProp);
|
|
@@ -819,11 +854,34 @@ function renderSchemaAsTable(
|
|
|
819
854
|
}
|
|
820
855
|
}
|
|
821
856
|
|
|
822
|
-
|
|
823
|
-
|
|
857
|
+
const nestedSources: Array<{ source: Record<string, unknown>; prefix: string }> = [];
|
|
858
|
+
if (type === "array" && fieldProp.items && typeof fieldProp.items === "object") {
|
|
859
|
+
nestedSources.push({ source: fieldProp.items as Record<string, unknown>, prefix: `${fieldName}[]` });
|
|
860
|
+
} else if (Array.isArray(fieldProp.oneOf)) {
|
|
861
|
+
for (const [index, variant] of fieldProp.oneOf.entries()) {
|
|
862
|
+
if (typeof variant === "object" && variant !== null) {
|
|
863
|
+
nestedSources.push({
|
|
864
|
+
source: variant as Record<string, unknown>,
|
|
865
|
+
prefix: `${fieldName}.oneOf[${index}]`,
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
} else if (type === "object") {
|
|
870
|
+
nestedSources.push({ source: prop, prefix: fieldName });
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
for (const { source, prefix: nestedPrefix } of nestedSources) {
|
|
874
|
+
const nestedResolved = resolveSchemaRef(source, spec);
|
|
875
|
+
if (
|
|
876
|
+
depth >= SCHEMA_RENDER_MAX_DEPTH ||
|
|
877
|
+
(!nestedResolved.properties && nestedResolved.type !== "array" && !Array.isArray(nestedResolved.oneOf))
|
|
878
|
+
) {
|
|
879
|
+
continue;
|
|
880
|
+
}
|
|
881
|
+
const nestedOneOf = renderOneOfGroups(nestedResolved, schemaRecommended);
|
|
824
882
|
if (nestedOneOf) rows.push("", nestedOneOf);
|
|
825
|
-
const nested = renderSchemaAsTable(
|
|
826
|
-
const nestedLines = nested.split("\n").filter(
|
|
883
|
+
const nested = renderSchemaAsTable(source, spec, depth + 1, nestedPrefix, schemaRecommended, nextVisited);
|
|
884
|
+
const nestedLines = nested.split("\n").filter(line => line.startsWith("|") && !line.startsWith("| Field"));
|
|
827
885
|
rows.push(...nestedLines);
|
|
828
886
|
}
|
|
829
887
|
}
|
|
@@ -17,17 +17,17 @@ export interface BuildInfo {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export const BUILD_INFO: BuildInfo = {
|
|
20
|
-
"version": "20.22.
|
|
21
|
-
"commit": "
|
|
22
|
-
"shortCommit": "
|
|
20
|
+
"version": "20.22.3",
|
|
21
|
+
"commit": "57fa717872ecf0c762c91f0e4ebf6aeb8a6fd8b1",
|
|
22
|
+
"shortCommit": "57fa717",
|
|
23
23
|
"branch": "main",
|
|
24
|
-
"tag": "v20.22.
|
|
25
|
-
"commitDate": "2026-08-
|
|
26
|
-
"buildDate": "2026-08-
|
|
24
|
+
"tag": "v20.22.3",
|
|
25
|
+
"commitDate": "2026-08-27T12:54:10+00:00",
|
|
26
|
+
"buildDate": "2026-08-27T13:26:07.116Z",
|
|
27
27
|
"dirty": true,
|
|
28
28
|
"prNumber": "",
|
|
29
29
|
"repoUrl": "https://github.com/f5-sales-demo/xcsh",
|
|
30
30
|
"repoSlug": "f5-sales-demo/xcsh",
|
|
31
|
-
"commitUrl": "https://github.com/f5-sales-demo/xcsh/commit/
|
|
32
|
-
"releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v20.22.
|
|
31
|
+
"commitUrl": "https://github.com/f5-sales-demo/xcsh/commit/57fa717872ecf0c762c91f0e4ebf6aeb8a6fd8b1",
|
|
32
|
+
"releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v20.22.3"
|
|
33
33
|
};
|
|
@@ -289,7 +289,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
289
289
|
name: "alert_gen_policy",
|
|
290
290
|
category: "security",
|
|
291
291
|
description: "Alert Generation Policy",
|
|
292
|
-
required: ["name", "namespace"
|
|
292
|
+
required: ["name", "namespace"],
|
|
293
293
|
minimal_config: {
|
|
294
294
|
format: "terraform",
|
|
295
295
|
source: "_llms-txt/resources/alert_gen_policy.txt#minimal-valid-config",
|
|
@@ -332,7 +332,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
332
332
|
name: "bot_defense_app_infrastructure",
|
|
333
333
|
category: "security",
|
|
334
334
|
description: "Bot Defense App Infrastructure in a given namespace",
|
|
335
|
-
required: ["name", "namespace"
|
|
335
|
+
required: ["name", "namespace"],
|
|
336
336
|
minimal_config: {
|
|
337
337
|
format: "terraform",
|
|
338
338
|
source: "_llms-txt/resources/bot_defense_app_infrastructure.txt#minimal-valid-config",
|
|
@@ -346,7 +346,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
346
346
|
name: "data_type",
|
|
347
347
|
category: "security",
|
|
348
348
|
description: "Data_type creates a new object in the storage backend for metadata.namespace",
|
|
349
|
-
required: ["name", "namespace"
|
|
349
|
+
required: ["name", "namespace"],
|
|
350
350
|
minimal_config: {
|
|
351
351
|
format: "terraform",
|
|
352
352
|
source: "_llms-txt/resources/data_type.txt#minimal-valid-config",
|
|
@@ -390,7 +390,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
390
390
|
name: "fast_acl_rule",
|
|
391
391
|
category: "security",
|
|
392
392
|
description: "New Fast ACL rule, has specification to match source IP, source port and action to apply",
|
|
393
|
-
required: ["name"],
|
|
393
|
+
required: ["name", "namespace"],
|
|
394
394
|
minimal_config: {
|
|
395
395
|
format: "terraform",
|
|
396
396
|
source: "_llms-txt/resources/fast_acl_rule.txt#minimal-valid-config",
|
|
@@ -505,7 +505,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
505
505
|
name: "network_policy_view",
|
|
506
506
|
category: "security",
|
|
507
507
|
description: "Network policy view specification. configuration",
|
|
508
|
-
required: ["name"
|
|
508
|
+
required: ["name"],
|
|
509
509
|
minimal_config: {
|
|
510
510
|
format: "terraform",
|
|
511
511
|
source: "_llms-txt/resources/network_policy_view.txt#minimal-valid-config",
|
|
@@ -751,7 +751,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
751
751
|
name: "forwarding_class",
|
|
752
752
|
category: "networking",
|
|
753
753
|
description: "Forwarding class is created by users in system namespace. configuration",
|
|
754
|
-
required: ["name", "namespace"
|
|
754
|
+
required: ["name", "namespace"],
|
|
755
755
|
minimal_config: {
|
|
756
756
|
format: "terraform",
|
|
757
757
|
source: "_llms-txt/resources/forwarding_class.txt#minimal-valid-config",
|
|
@@ -851,7 +851,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
851
851
|
name: "proxy",
|
|
852
852
|
category: "networking",
|
|
853
853
|
description: "Tcp loadbalancer create specification. configuration",
|
|
854
|
-
required: ["name", "namespace"
|
|
854
|
+
required: ["name", "namespace"],
|
|
855
855
|
minimal_config: {
|
|
856
856
|
format: "terraform",
|
|
857
857
|
source: "_llms-txt/resources/proxy.txt#minimal-valid-config",
|
|
@@ -865,7 +865,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
865
865
|
name: "segment",
|
|
866
866
|
category: "networking",
|
|
867
867
|
description: "Segment. configuration",
|
|
868
|
-
required: ["name"
|
|
868
|
+
required: ["name"],
|
|
869
869
|
minimal_config: {
|
|
870
870
|
format: "terraform",
|
|
871
871
|
source: "_llms-txt/resources/segment.txt#minimal-valid-config",
|
|
@@ -879,13 +879,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
879
879
|
name: "srv6_network_slice",
|
|
880
880
|
category: "networking",
|
|
881
881
|
description: "Srv6_network_slice creates a new object in the storage backend for metadata.namespace",
|
|
882
|
-
required: [
|
|
883
|
-
"name",
|
|
884
|
-
"namespace",
|
|
885
|
-
"connect_to_access_networks",
|
|
886
|
-
"connect_to_enterprise_networks",
|
|
887
|
-
"connect_to_internet",
|
|
888
|
-
],
|
|
882
|
+
required: ["name"],
|
|
889
883
|
minimal_config: {
|
|
890
884
|
format: "terraform",
|
|
891
885
|
source: "_llms-txt/resources/srv6_network_slice.txt#minimal-valid-config",
|
|
@@ -914,7 +908,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
914
908
|
name: "tunnel",
|
|
915
909
|
category: "networking",
|
|
916
910
|
description: "Tunnel in a given namespace. If one already exist it will give a error",
|
|
917
|
-
required: ["name", "namespace"
|
|
911
|
+
required: ["name", "namespace"],
|
|
918
912
|
minimal_config: {
|
|
919
913
|
format: "terraform",
|
|
920
914
|
source: "_llms-txt/resources/tunnel.txt#minimal-valid-config",
|
|
@@ -928,7 +922,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
928
922
|
name: "virtual_network",
|
|
929
923
|
category: "networking",
|
|
930
924
|
description: "Virtual network in given namespace",
|
|
931
|
-
required: ["name"
|
|
925
|
+
required: ["name"],
|
|
932
926
|
minimal_config: {
|
|
933
927
|
format: "terraform",
|
|
934
928
|
source: "_llms-txt/resources/virtual_network.txt#minimal-valid-config",
|
|
@@ -1062,7 +1056,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1062
1056
|
category: "load-balancing",
|
|
1063
1057
|
description:
|
|
1064
1058
|
"Advertise_policy object controls how and where a service represented by a given virtual_host object is advertised to consumers. configuration",
|
|
1065
|
-
required: ["name", "namespace"
|
|
1059
|
+
required: ["name", "namespace"],
|
|
1066
1060
|
minimal_config: {
|
|
1067
1061
|
format: "terraform",
|
|
1068
1062
|
source: "_llms-txt/resources/advertise_policy.txt#minimal-valid-config",
|
|
@@ -1118,15 +1112,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1118
1112
|
name: "cluster",
|
|
1119
1113
|
category: "load-balancing",
|
|
1120
1114
|
description: "Cluster will create the object in the storage backend for namespace metadata.namespace",
|
|
1121
|
-
required: [
|
|
1122
|
-
"name",
|
|
1123
|
-
"namespace",
|
|
1124
|
-
"connection_timeout",
|
|
1125
|
-
"endpoint_selection",
|
|
1126
|
-
"fallback_policy",
|
|
1127
|
-
"http_idle_timeout",
|
|
1128
|
-
"loadbalancer_algorithm",
|
|
1129
|
-
],
|
|
1115
|
+
required: ["name", "namespace"],
|
|
1130
1116
|
minimal_config: {
|
|
1131
1117
|
format: "terraform",
|
|
1132
1118
|
source: "_llms-txt/resources/cluster.txt#minimal-valid-config",
|
|
@@ -1140,7 +1126,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1140
1126
|
name: "endpoint",
|
|
1141
1127
|
category: "load-balancing",
|
|
1142
1128
|
description: "Endpoint will create the object in the storage backend for namespace metadata.namespace",
|
|
1143
|
-
required: ["name", "namespace"
|
|
1129
|
+
required: ["name", "namespace"],
|
|
1144
1130
|
minimal_config: {
|
|
1145
1131
|
format: "terraform",
|
|
1146
1132
|
source: "_llms-txt/resources/endpoint.txt#minimal-valid-config",
|
|
@@ -1192,7 +1178,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1192
1178
|
name: "udp_loadbalancer",
|
|
1193
1179
|
category: "load-balancing",
|
|
1194
1180
|
description: "Load balancing UDP traffic across origin pools",
|
|
1195
|
-
required: ["name", "namespace"
|
|
1181
|
+
required: ["name", "namespace"],
|
|
1196
1182
|
minimal_config: {
|
|
1197
1183
|
format: "terraform",
|
|
1198
1184
|
source: "_llms-txt/resources/udp_loadbalancer.txt#minimal-valid-config",
|
|
@@ -1206,17 +1192,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1206
1192
|
name: "virtual_host",
|
|
1207
1193
|
category: "load-balancing",
|
|
1208
1194
|
description: "Virtual host in a given namespace",
|
|
1209
|
-
required: [
|
|
1210
|
-
"name",
|
|
1211
|
-
"namespace",
|
|
1212
|
-
"add_location",
|
|
1213
|
-
"connection_idle_timeout",
|
|
1214
|
-
"disable_default_error_pages",
|
|
1215
|
-
"disable_dns_resolve",
|
|
1216
|
-
"idle_timeout",
|
|
1217
|
-
"max_request_header_size",
|
|
1218
|
-
"proxy",
|
|
1219
|
-
],
|
|
1195
|
+
required: ["name", "namespace"],
|
|
1220
1196
|
minimal_config: {
|
|
1221
1197
|
format: "terraform",
|
|
1222
1198
|
source: "_llms-txt/resources/virtual_host.txt#minimal-valid-config",
|
|
@@ -1244,7 +1220,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1244
1220
|
name: "aws_vpc_site",
|
|
1245
1221
|
category: "sites",
|
|
1246
1222
|
description: "Deploying F5 sites within AWS VPC environments",
|
|
1247
|
-
required: ["name", "namespace", "
|
|
1223
|
+
required: ["name", "namespace", "aws_region", "instance_type", "ssh_key"],
|
|
1248
1224
|
minimal_config: {
|
|
1249
1225
|
format: "terraform",
|
|
1250
1226
|
source: "_llms-txt/resources/aws_vpc_site.txt#minimal-valid-config",
|
|
@@ -1258,7 +1234,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1258
1234
|
name: "azure_vnet_site",
|
|
1259
1235
|
category: "sites",
|
|
1260
1236
|
description: "Deploying F5 sites within Azure Virtual Network environments",
|
|
1261
|
-
required: ["name", "
|
|
1237
|
+
required: ["name", "machine_type", "resource_group", "ssh_key"],
|
|
1262
1238
|
server_defaults: [
|
|
1263
1239
|
"block_all_services",
|
|
1264
1240
|
"disk_size",
|
|
@@ -1282,14 +1258,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1282
1258
|
name: "fleet",
|
|
1283
1259
|
category: "sites",
|
|
1284
1260
|
description: "Fleet will create a fleet object in 'system' namespace of the user",
|
|
1285
|
-
required: [
|
|
1286
|
-
"name",
|
|
1287
|
-
"namespace",
|
|
1288
|
-
"enable_default_fleet_config_download",
|
|
1289
|
-
"fleet_label",
|
|
1290
|
-
"operating_system_version",
|
|
1291
|
-
"volterra_software_version",
|
|
1292
|
-
],
|
|
1261
|
+
required: ["name", "namespace", "fleet_label"],
|
|
1293
1262
|
minimal_config: {
|
|
1294
1263
|
format: "terraform",
|
|
1295
1264
|
source: "_llms-txt/resources/fleet.txt#minimal-valid-config",
|
|
@@ -1303,7 +1272,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1303
1272
|
name: "gcp_vpc_site",
|
|
1304
1273
|
category: "sites",
|
|
1305
1274
|
description: "Deploying F5 sites within Google Cloud VPC environments",
|
|
1306
|
-
required: ["name", "namespace", "
|
|
1275
|
+
required: ["name", "namespace", "gcp_region", "instance_type", "ssh_key"],
|
|
1307
1276
|
minimal_config: {
|
|
1308
1277
|
format: "terraform",
|
|
1309
1278
|
source: "_llms-txt/resources/gcp_vpc_site.txt#minimal-valid-config",
|
|
@@ -1331,7 +1300,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1331
1300
|
name: "securemesh_site",
|
|
1332
1301
|
category: "sites",
|
|
1333
1302
|
description: "Deploying secure mesh edge sites with distributed security",
|
|
1334
|
-
required: ["name", "namespace", "
|
|
1303
|
+
required: ["name", "namespace", "volterra_certified_hw"],
|
|
1335
1304
|
minimal_config: {
|
|
1336
1305
|
format: "terraform",
|
|
1337
1306
|
source: "_llms-txt/resources/securemesh_site.txt#minimal-valid-config",
|
|
@@ -1345,7 +1314,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1345
1314
|
name: "securemesh_site_v2",
|
|
1346
1315
|
category: "sites",
|
|
1347
1316
|
description: "Deploying secure mesh edge sites with security and networking controls",
|
|
1348
|
-
required: ["name"
|
|
1317
|
+
required: ["name"],
|
|
1349
1318
|
minimal_config: {
|
|
1350
1319
|
format: "terraform",
|
|
1351
1320
|
source: "_llms-txt/resources/securemesh_site_v2.txt#minimal-valid-config",
|
|
@@ -1387,7 +1356,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1387
1356
|
name: "voltstack_site",
|
|
1388
1357
|
category: "sites",
|
|
1389
1358
|
description: "Deploying App Stack edge computing sites",
|
|
1390
|
-
required: ["name", "namespace", "
|
|
1359
|
+
required: ["name", "namespace", "volterra_certified_hw"],
|
|
1391
1360
|
minimal_config: {
|
|
1392
1361
|
format: "terraform",
|
|
1393
1362
|
source: "_llms-txt/resources/voltstack_site.txt#minimal-valid-config",
|
|
@@ -1401,7 +1370,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1401
1370
|
name: "container_registry",
|
|
1402
1371
|
category: "kubernetes",
|
|
1403
1372
|
description: "Container image registry configuration",
|
|
1404
|
-
required: ["name", "namespace", "
|
|
1373
|
+
required: ["name", "namespace", "registry", "user_name"],
|
|
1405
1374
|
minimal_config: {
|
|
1406
1375
|
format: "terraform",
|
|
1407
1376
|
source: "_llms-txt/resources/container_registry.txt#minimal-valid-config",
|
|
@@ -1455,7 +1424,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1455
1424
|
category: "kubernetes",
|
|
1456
1425
|
description:
|
|
1457
1426
|
"K8s_cluster_role_binding will create the object in the storage backend for namespace metadata.namespace",
|
|
1458
|
-
required: ["name"],
|
|
1427
|
+
required: ["name", "namespace"],
|
|
1459
1428
|
minimal_config: {
|
|
1460
1429
|
format: "terraform",
|
|
1461
1430
|
source: "_llms-txt/resources/k8s_cluster_role_binding.txt#minimal-valid-config",
|
|
@@ -1469,7 +1438,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1469
1438
|
name: "k8s_pod_security_admission",
|
|
1470
1439
|
category: "kubernetes",
|
|
1471
1440
|
description: "K8s_pod_security_admission will create the object in the storage backend",
|
|
1472
|
-
required: ["name"
|
|
1441
|
+
required: ["name"],
|
|
1473
1442
|
minimal_config: {
|
|
1474
1443
|
format: "terraform",
|
|
1475
1444
|
source: "_llms-txt/resources/k8s_pod_security_admission.txt#minimal-valid-config",
|
|
@@ -1511,7 +1480,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1511
1480
|
name: "workload_flavor",
|
|
1512
1481
|
category: "kubernetes",
|
|
1513
1482
|
description: "Workload_flavor",
|
|
1514
|
-
required: ["name"
|
|
1483
|
+
required: ["name"],
|
|
1515
1484
|
minimal_config: {
|
|
1516
1485
|
format: "terraform",
|
|
1517
1486
|
source: "_llms-txt/resources/workload_flavor.txt#minimal-valid-config",
|
|
@@ -1553,7 +1522,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1553
1522
|
name: "bot_infrastructure",
|
|
1554
1523
|
category: "uncategorized",
|
|
1555
1524
|
description: "Bot Infrastructure",
|
|
1556
|
-
required: ["name", "namespace"
|
|
1525
|
+
required: ["name", "namespace"],
|
|
1557
1526
|
minimal_config: {
|
|
1558
1527
|
format: "terraform",
|
|
1559
1528
|
source: "_llms-txt/resources/bot_infrastructure.txt#minimal-valid-config",
|
|
@@ -1581,7 +1550,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1581
1550
|
name: "protected_application",
|
|
1582
1551
|
category: "uncategorized",
|
|
1583
1552
|
description: "Applications protected by Bot Defense",
|
|
1584
|
-
required: ["name", "namespace"
|
|
1553
|
+
required: ["name", "namespace"],
|
|
1585
1554
|
minimal_config: {
|
|
1586
1555
|
format: "terraform",
|
|
1587
1556
|
source: "_llms-txt/resources/protected_application.txt#minimal-valid-config",
|
|
@@ -1652,7 +1621,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1652
1621
|
name: "dns_lb_pool",
|
|
1653
1622
|
category: "dns",
|
|
1654
1623
|
description: "DNS Load Balancer Pool in a given namespace. If one already exist it will give a error",
|
|
1655
|
-
required: ["name"
|
|
1624
|
+
required: ["name"],
|
|
1656
1625
|
minimal_config: {
|
|
1657
1626
|
format: "terraform",
|
|
1658
1627
|
source: "_llms-txt/resources/dns_lb_pool.txt#minimal-valid-config",
|
|
@@ -1680,7 +1649,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1680
1649
|
name: "dns_proxy",
|
|
1681
1650
|
category: "dns",
|
|
1682
1651
|
description: "DNS Proxy in a given namespace. If one already exists it will give an error",
|
|
1683
|
-
required: ["name"
|
|
1652
|
+
required: ["name"],
|
|
1684
1653
|
minimal_config: {
|
|
1685
1654
|
format: "terraform",
|
|
1686
1655
|
source: "_llms-txt/resources/dns_proxy.txt#minimal-valid-config",
|
|
@@ -1762,7 +1731,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1762
1731
|
name: "api_testing",
|
|
1763
1732
|
category: "api-security",
|
|
1764
1733
|
description: "API Testing resource",
|
|
1765
|
-
required: ["name", "namespace"
|
|
1734
|
+
required: ["name", "namespace"],
|
|
1766
1735
|
minimal_config: {
|
|
1767
1736
|
format: "terraform",
|
|
1768
1737
|
source: "_llms-txt/resources/api_testing.txt#minimal-valid-config",
|
|
@@ -1945,7 +1914,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1945
1914
|
name: "trusted_ca_list",
|
|
1946
1915
|
category: "certificates",
|
|
1947
1916
|
description: "Trusted certificate authority list management",
|
|
1948
|
-
required: ["name", "namespace"
|
|
1917
|
+
required: ["name", "namespace"],
|
|
1949
1918
|
minimal_config: {
|
|
1950
1919
|
format: "terraform",
|
|
1951
1920
|
source: "_llms-txt/resources/trusted_ca_list.txt#minimal-valid-config",
|
|
@@ -1973,7 +1942,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
1973
1942
|
name: "alert_template",
|
|
1974
1943
|
category: "monitoring",
|
|
1975
1944
|
description: "Domain to protect",
|
|
1976
|
-
required: ["name", "namespace", "alert_message", "alert_message_details", "alert_name"
|
|
1945
|
+
required: ["name", "namespace", "alert_message", "alert_message_details", "alert_name"],
|
|
1977
1946
|
minimal_config: {
|
|
1978
1947
|
format: "terraform",
|
|
1979
1948
|
source: "_llms-txt/resources/alert_template.txt#minimal-valid-config",
|
|
@@ -2100,7 +2069,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
2100
2069
|
name: "irule",
|
|
2101
2070
|
category: "big-ip-integration",
|
|
2102
2071
|
description: "IRule in a given namespace. If one already exists it will give an error",
|
|
2103
|
-
required: ["name", "namespace", "
|
|
2072
|
+
required: ["name", "namespace", "description_spec", "irule"],
|
|
2104
2073
|
minimal_config: {
|
|
2105
2074
|
format: "terraform",
|
|
2106
2075
|
source: "_llms-txt/resources/irule.txt#minimal-valid-config",
|
|
@@ -2114,7 +2083,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
|
|
|
2114
2083
|
name: "address_allocator",
|
|
2115
2084
|
category: "cloud-resources",
|
|
2116
2085
|
description: "Address Allocator will create an address allocator object in 'system' namespace of the user",
|
|
2117
|
-
required: ["name", "namespace"
|
|
2086
|
+
required: ["name", "namespace"],
|
|
2118
2087
|
minimal_config: {
|
|
2119
2088
|
format: "terraform",
|
|
2120
2089
|
source: "_llms-txt/resources/address_allocator.txt#minimal-valid-config",
|
|
@@ -380,6 +380,8 @@ Set a session-wide default with `set_presentation_profile`.
|
|
|
380
380
|
The `xcsh_api` tool handles authentication, URL construction, and HTTP execution.
|
|
381
381
|
Never construct cURL commands for F5 XC API calls — use `xcsh_api` instead.
|
|
382
382
|
|
|
383
|
+
**CLI portability:** Prefer broadly supported flags and output fields. Before using version-specific diagnostics, inspect the installed tool version or help. If an optional diagnostic field is unsupported (for example cURL 8.7.1 does not provide ssl_cipher), retry without that field while preserving and reporting the underlying command result. Do not add command interception layers or tool-specific compatibility shims.
|
|
384
|
+
|
|
383
385
|
After `xcsh_api` returns a 200 or 201 response, report the result immediately.
|
|
384
386
|
Do not issue a follow-up GET to verify — the response body is the verification.
|
|
385
387
|
Only issue a GET if the user explicitly asks to read current state, or if the
|
|
@@ -799,6 +799,23 @@ export class AgentSession {
|
|
|
799
799
|
}
|
|
800
800
|
|
|
801
801
|
// Deobfuscate assistant message content for display emission — the LLM echoes back
|
|
802
|
+
// A terminal-envelope error means the provider never completed the response.
|
|
803
|
+
// Persist its diagnostics, but never retain text, tool arguments, or other partial content.
|
|
804
|
+
if (
|
|
805
|
+
event.type === "message_end" &&
|
|
806
|
+
event.message.role === "assistant" &&
|
|
807
|
+
event.message.stopReason === "error" &&
|
|
808
|
+
this.#isTransientEnvelopeErrorMessage(event.message.errorMessage ?? "")
|
|
809
|
+
) {
|
|
810
|
+
const discardedMessage: AssistantMessage = { ...event.message, content: [] };
|
|
811
|
+
event = { ...event, message: discardedMessage };
|
|
812
|
+
const messages = this.agent.state.messages;
|
|
813
|
+
const lastMessage = messages.at(-1);
|
|
814
|
+
if (lastMessage?.role === "assistant" && lastMessage.timestamp === discardedMessage.timestamp) {
|
|
815
|
+
this.agent.replaceMessages([...messages.slice(0, -1), discardedMessage]);
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
|
|
802
819
|
// obfuscated placeholders, but listeners (TUI, extensions, exporters) must see real
|
|
803
820
|
// values. The original event.message stays obfuscated so the persistence path below
|
|
804
821
|
// writes `#HASH#` tokens to the session file; convertToLlm re-obfuscates outbound
|
|
@@ -5888,8 +5905,8 @@ export class AgentSession {
|
|
|
5888
5905
|
}
|
|
5889
5906
|
|
|
5890
5907
|
#isTransientEnvelopeErrorMessage(errorMessage: string): boolean {
|
|
5891
|
-
//
|
|
5892
|
-
return /anthropic stream envelope error:/i.test(errorMessage)
|
|
5908
|
+
// A terminal-envelope failure is a discarded attempt; the provider never returns its partial content as a completed message.
|
|
5909
|
+
return /anthropic stream envelope error:/i.test(errorMessage);
|
|
5893
5910
|
}
|
|
5894
5911
|
|
|
5895
5912
|
#isTransientTransportErrorMessage(errorMessage: string): boolean {
|