@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.2",
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.2",
65
- "@f5-sales-demo/pi-ai": "20.22.2",
66
- "@f5-sales-demo/pi-natives": "20.22.2",
67
- "@f5-sales-demo/pi-resource-management": "20.22.2",
68
- "@f5-sales-demo/pi-tui": "20.22.2",
69
- "@f5-sales-demo/pi-utils": "20.22.2",
70
- "@f5-sales-demo/xcsh-stats": "20.22.2",
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
- if (type === "object" && fieldProp.properties && depth < SCHEMA_RENDER_MAX_DEPTH) {
823
- const nestedOneOf = renderOneOfGroups(fieldProp, schemaRecommended);
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(fieldProp, spec, depth + 1, fieldName, schemaRecommended);
826
- const nestedLines = nested.split("\n").filter(l => l.startsWith("|") && !l.startsWith("| Field"));
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.2",
21
- "commit": "ed93a01366838afc5ccd503a0bc678af72c92fe4",
22
- "shortCommit": "ed93a01",
20
+ "version": "20.22.3",
21
+ "commit": "57fa717872ecf0c762c91f0e4ebf6aeb8a6fd8b1",
22
+ "shortCommit": "57fa717",
23
23
  "branch": "main",
24
- "tag": "v20.22.2",
25
- "commitDate": "2026-08-25T17:12:23+00:00",
26
- "buildDate": "2026-08-26T01:20:47.235Z",
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/ed93a01366838afc5ccd503a0bc678af72c92fe4",
32
- "releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v20.22.2"
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", "alert_status"],
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", "environment_type", "traffic_type"],
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", "is_pii", "is_sensitive_data"],
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", "namespace"],
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", "queue_id_to_use", "interface_group"],
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", "connection_timeout"],
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", "namespace"],
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", "tunnel_type"],
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", "legacy_type"],
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", "address", "protocol", "skip_xff_append"],
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", "health_check_port", "port", "protocol"],
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", "dns_volterra_managed", "idle_timeout"],
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", "address", "aws_region", "disk_size", "instance_type", "ssh_key"],
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", "namespace", "machine_type", "resource_group", "ssh_key"],
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", "address", "disk_size", "gcp_region", "instance_type", "ssh_key"],
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", "address", "volterra_certified_hw"],
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", "namespace"],
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", "address", "volterra_certified_hw"],
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", "email", "registry", "user_name"],
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", "namespace"],
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", "namespace", "ephemeral_storage", "memory", "vcpus"],
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", "traffic_type"],
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", "region"],
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", "load_balancing_mode"],
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", "transport_type"],
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", "custom_header_value"],
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", "trusted_ca_url"],
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", "severity"],
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", "description", "description_spec", "irule"],
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", "mode"],
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
- // Match Anthropic stream-envelope failures that indicate a broken stream before any content starts.
5892
- return /anthropic stream envelope error:/i.test(errorMessage) && /before message_start/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 {