@f5-sales-demo/xcsh 19.61.1 → 19.61.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": "19.61.1",
4
+ "version": "19.61.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",
@@ -36,7 +36,7 @@
36
36
  "check:types": "bun run generate-build-info && bun run generate-extension-capabilities && bun run generate-api-spec-index && bun run generate-branding-index && bun run generate-terraform-index && tsgo -p tsconfig.json --noEmit",
37
37
  "lint": "biome lint .",
38
38
  "check:bundle": "bun scripts/check-bundle.ts",
39
- "test": "bun run generate-build-info && bun run generate-extension-capabilities && bun run generate-api-spec-index && bun run generate-console-catalog && bun run generate-console-field-metadata && bun test --max-concurrency 4",
39
+ "test": "bun run generate-build-info && bun run generate-extension-capabilities && bun run generate-api-spec-index && bun run generate-console-catalog && bun run generate-console-field-metadata && bun scripts/bun-test-guarded.ts --max-concurrency 4",
40
40
  "fix": "biome check --write --unsafe . && bun run format-prompts && bun run generate-docs-index && bun run generate-api-spec-index && bun run generate-build-info",
41
41
  "fmt": "biome format --write . && bun run format-prompts",
42
42
  "format-prompts": "bun scripts/format-prompts.ts",
@@ -56,13 +56,13 @@
56
56
  "dependencies": {
57
57
  "@agentclientprotocol/sdk": "0.16.1",
58
58
  "@mozilla/readability": "^0.6",
59
- "@f5-sales-demo/xcsh-stats": "19.61.1",
60
- "@f5-sales-demo/pi-agent-core": "19.61.1",
61
- "@f5-sales-demo/pi-ai": "19.61.1",
62
- "@f5-sales-demo/pi-natives": "19.61.1",
63
- "@f5-sales-demo/pi-resource-management": "19.61.1",
64
- "@f5-sales-demo/pi-tui": "19.61.1",
65
- "@f5-sales-demo/pi-utils": "19.61.1",
59
+ "@f5-sales-demo/xcsh-stats": "19.61.3",
60
+ "@f5-sales-demo/pi-agent-core": "19.61.3",
61
+ "@f5-sales-demo/pi-ai": "19.61.3",
62
+ "@f5-sales-demo/pi-natives": "19.61.3",
63
+ "@f5-sales-demo/pi-resource-management": "19.61.3",
64
+ "@f5-sales-demo/pi-tui": "19.61.3",
65
+ "@f5-sales-demo/pi-utils": "19.61.3",
66
66
  "@sinclair/typebox": "^0.34",
67
67
  "@xterm/headless": "^6.0",
68
68
  "ajv": "^8.20",
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Guarded `bun test` runner.
4
+ *
5
+ * Runs `bun test <args…>` and enforces one extra invariant: if the run exits 0
6
+ * it MUST have printed a "Ran N tests" summary. A test module that calls
7
+ * `process.exit(0)` terminates the whole runner with a success code BEFORE the
8
+ * summary prints, silently masking every failure that already ran (this made the
9
+ * required CI `test` job a no-op gate — issue #1903). Exit code alone can't catch
10
+ * that regression; the missing summary can.
11
+ *
12
+ * Behaviour:
13
+ * - child exits non-zero → propagate it (real failures already fail the job).
14
+ * - child exits 0 WITH a summary ("Ran N tests" / "No tests found") → pass.
15
+ * - child exits 0 WITHOUT a summary → fail (exit 1): a test aborted the runner.
16
+ *
17
+ * stderr (where bun writes results) is streamed through unchanged so CI logs are
18
+ * identical; we only tee it to scan for the summary line.
19
+ */
20
+ const args = process.argv.slice(2);
21
+
22
+ // Use the running bun (process.execPath), not a PATH lookup of "bun", so the
23
+ // guard works in any environment the parent runs in.
24
+ const proc = Bun.spawn([process.execPath, "test", ...args], {
25
+ stdout: "inherit",
26
+ stderr: "pipe",
27
+ env: process.env,
28
+ });
29
+
30
+ const SUMMARY = /Ran \d+ tests?\b|No tests found/;
31
+ const decoder = new TextDecoder();
32
+ // Keep a small rolling tail so a summary line split across two chunks is still
33
+ // matched, without buffering the entire (potentially large) stderr stream.
34
+ let tail = "";
35
+
36
+ for await (const chunk of proc.stderr as ReadableStream<Uint8Array>) {
37
+ process.stderr.write(chunk); // stream through unchanged
38
+ tail = (tail + decoder.decode(chunk, { stream: true })).slice(-4096);
39
+ }
40
+
41
+ const sawSummary = SUMMARY.test(tail);
42
+ const code = await proc.exited;
43
+
44
+ if (code !== 0) process.exit(code);
45
+
46
+ if (!sawSummary) {
47
+ process.stderr.write(
48
+ '\n\x1b[31mtest-guard: `bun test` exited 0 but printed no "Ran N tests" summary.\x1b[0m\n' +
49
+ "A test module likely called process.exit() and aborted the runner, masking failures (see #1903).\n",
50
+ );
51
+ process.exit(1);
52
+ }
53
+
54
+ process.exit(0);
@@ -228,8 +228,28 @@ export default class Worker extends Command {
228
228
  enableMCP: false,
229
229
  enableLsp: false,
230
230
  disableExtensionDiscovery: true,
231
+ // TTFT Phase 3: load the hermetic bench stand-in provider when the benchmark
232
+ // sets XCSH_BENCH_EXTENSION (absolute path). Inert for normal workers.
233
+ ...(process.env.XCSH_BENCH_EXTENSION ? { additionalExtensionPaths: [process.env.XCSH_BENCH_EXTENSION] } : {}),
231
234
  });
232
235
 
236
+ // TTFT Phase 3 hermeticity: the bench-instant stand-in provider is registered while
237
+ // createAgentSession loads the bench extension (additionalExtensionPaths), which is
238
+ // AFTER the default-model role is resolved — so the worker would otherwise fall back
239
+ // to a real provider and the benchmark would measure live network TTFT, not xcsh
240
+ // overhead. In bench mode, explicitly select bench-instant now that it is registered.
241
+ // Gated on XCSH_BENCH_EXTENSION → completely inert for a normal `xcsh worker`.
242
+ if (process.env.XCSH_BENCH_EXTENSION) {
243
+ const benchModel = session.modelRegistry.find("bench-instant", "bench-instant");
244
+ if (benchModel) {
245
+ await session.setModel(benchModel);
246
+ } else {
247
+ console.error(
248
+ "[xcsh worker] BENCH ERROR: bench-instant model not registered — benchmark would measure a real provider",
249
+ );
250
+ }
251
+ }
252
+
233
253
  const chatHandler = new ChatHandler(bridge, session);
234
254
  chatHandler.attach();
235
255
 
@@ -17,17 +17,17 @@ export interface BuildInfo {
17
17
  }
18
18
 
19
19
  export const BUILD_INFO: BuildInfo = {
20
- "version": "19.61.1",
21
- "commit": "2060729b09fb7a4ede87e49a0ac0fb76725160ae",
22
- "shortCommit": "2060729",
20
+ "version": "19.61.3",
21
+ "commit": "1546a875f07608812967e1169ea86c2bd3f837ac",
22
+ "shortCommit": "1546a87",
23
23
  "branch": "main",
24
- "tag": "v19.61.1",
25
- "commitDate": "2026-07-07T00:26:41Z",
26
- "buildDate": "2026-07-07T01:18:58.960Z",
24
+ "tag": "v19.61.3",
25
+ "commitDate": "2026-07-07T11:57:08Z",
26
+ "buildDate": "2026-07-07T12:21:42.145Z",
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/2060729b09fb7a4ede87e49a0ac0fb76725160ae",
32
- "releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v19.61.1"
31
+ "commitUrl": "https://github.com/f5-sales-demo/xcsh/commit/1546a875f07608812967e1169ea86c2bd3f837ac",
32
+ "releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v19.61.3"
33
33
  };
@@ -146,6 +146,21 @@ export const TERRAFORM_INDEX: TerraformIndex = {
146
146
  "workload_flavor",
147
147
  ],
148
148
  },
149
+ {
150
+ name: "DNS",
151
+ slug: "dns",
152
+ description: "DNS domains, zones, compliance checks, and DNS proxy configuration",
153
+ resource_count: 7,
154
+ resources: [
155
+ "dns_compliance_checks",
156
+ "dns_domain",
157
+ "dns_lb_health_check",
158
+ "dns_lb_pool",
159
+ "dns_load_balancer",
160
+ "dns_proxy",
161
+ "dns_zone",
162
+ ],
163
+ },
149
164
  {
150
165
  name: "API Security",
151
166
  slug: "api-security",
@@ -195,19 +210,12 @@ export const TERRAFORM_INDEX: TerraformIndex = {
195
210
  resource_count: 3,
196
211
  resources: ["bigip_http_proxy", "data_group", "irule"],
197
212
  },
198
- {
199
- name: "DNS",
200
- slug: "dns",
201
- description: "DNS domains, zones, compliance checks, and DNS proxy configuration",
202
- resource_count: 3,
203
- resources: ["dns_compliance_checks", "dns_domain", "dns_proxy"],
204
- },
205
213
  {
206
214
  name: "Cloud Resources",
207
215
  slug: "cloud-resources",
208
216
  description: "Cloud elastic IPs, address allocators, and geo-location resources",
209
- resource_count: 2,
210
- resources: ["address_allocator", "cloud_elastic_ip"],
217
+ resource_count: 3,
218
+ resources: ["address_allocator", "cloud_elastic_ip", "geo_location_set"],
211
219
  },
212
220
  {
213
221
  name: "Organization",
@@ -261,9 +269,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
261
269
  category: "load-balancing",
262
270
  description:
263
271
  "Advertise_policy object controls how and where a service represented by a given virtual_host object is advertised to consumers. configuration",
264
- required: ["name", "namespace", "address", "protocol", "skip_xff_append"],
272
+ required: ["name", "address", "protocol", "skip_xff_append"],
265
273
  minimal_config:
266
- 'resource "xcsh_advertise_policy" "example" {\n name = "example-advertise-policy"\n namespace = "staging"\n\n address = "example-value"\n protocol = "example-value"\n skip_xff_append = true\n}',
274
+ 'resource "xcsh_advertise_policy" "example" {\n name = "example-advertise-policy"\n namespace = "system"\n\n address = "example-value"\n protocol = "example-value"\n skip_xff_append = true\n}',
267
275
  dependencies: {
268
276
  requires: [],
269
277
  },
@@ -283,9 +291,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
283
291
  alert_receiver: {
284
292
  category: "monitoring",
285
293
  description: "New Alert Receiver object",
286
- required: ["name", "namespace"],
294
+ required: ["name", "namespace", "receiver_choice"],
287
295
  minimal_config:
288
- 'resource "xcsh_alert_receiver" "example" {\n name = "example-alert-receiver"\n namespace = "staging"\n}',
296
+ 'resource "xcsh_alert_receiver" "example" {\n name = "example-alert-receiver"\n namespace = "system"\n}',
289
297
  dependencies: {
290
298
  requires: [],
291
299
  },
@@ -294,9 +302,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
294
302
  api_crawler: {
295
303
  category: "api-security",
296
304
  description: "API Crawler resource",
297
- required: ["name", "namespace"],
305
+ required: ["name"],
298
306
  minimal_config:
299
- 'resource "xcsh_api_crawler" "example" {\n name = "example-api-crawler"\n namespace = "staging"\n}',
307
+ 'resource "xcsh_api_crawler" "example" {\n name = "example-api-crawler"\n namespace = "system"\n}',
300
308
  dependencies: {
301
309
  requires: [],
302
310
  },
@@ -307,7 +315,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
307
315
  description: "API Definition",
308
316
  required: ["name", "namespace"],
309
317
  minimal_config:
310
- 'resource "xcsh_api_definition" "example" {\n name = "example-api-definition"\n namespace = "staging"\n}',
318
+ 'resource "xcsh_api_definition" "example" {\n name = "example-api-definition"\n namespace = "system"\n}',
311
319
  dependencies: {
312
320
  requires: ["namespace"],
313
321
  },
@@ -316,9 +324,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
316
324
  api_discovery: {
317
325
  category: "api-security",
318
326
  description: "API discovery creates a new object in the storage backend for metadata.namespace",
319
- required: ["name", "namespace"],
327
+ required: ["name", "namespace", "user_defined_api_discovery_policy"],
320
328
  minimal_config:
321
- 'resource "xcsh_api_discovery" "example" {\n name = "example-api-discovery"\n namespace = "staging"\n}',
329
+ 'resource "xcsh_api_discovery" "example" {\n name = "example-api-discovery"\n namespace = "system"\n}',
322
330
  dependencies: {
323
331
  requires: [],
324
332
  },
@@ -327,9 +335,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
327
335
  api_testing: {
328
336
  category: "api-security",
329
337
  description: "API Testing resource",
330
- required: ["name", "namespace", "custom_header_value"],
338
+ required: ["name", "custom_header_value"],
331
339
  minimal_config:
332
- 'resource "xcsh_api_testing" "example" {\n name = "example-api-testing"\n namespace = "staging"\n\n custom_header_value = "example-value"\n}',
340
+ 'resource "xcsh_api_testing" "example" {\n name = "example-api-testing"\n namespace = "system"\n\n custom_header_value = "example-value"\n}',
333
341
  dependencies: {
334
342
  requires: [],
335
343
  },
@@ -348,9 +356,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
348
356
  app_api_group: {
349
357
  category: "api-security",
350
358
  description: "App_api_group creates a new object in the storage backend for metadata.namespace",
351
- required: ["name", "namespace"],
359
+ required: ["name"],
352
360
  minimal_config:
353
- 'resource "xcsh_app_api_group" "example" {\n name = "example-app-api-group"\n namespace = "staging"\n}',
361
+ 'resource "xcsh_app_api_group" "example" {\n name = "example-app-api-group"\n namespace = "system"\n}',
354
362
  dependencies: {
355
363
  requires: [],
356
364
  },
@@ -370,9 +378,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
370
378
  app_setting: {
371
379
  category: "applications",
372
380
  description: "App setting configuration in namespace metadata.namespace",
373
- required: ["name", "namespace"],
381
+ required: ["name"],
374
382
  minimal_config:
375
- 'resource "xcsh_app_setting" "example" {\n name = "example-app-setting"\n namespace = "staging"\n}',
383
+ 'resource "xcsh_app_setting" "example" {\n name = "example-app-setting"\n namespace = "system"\n}',
376
384
  dependencies: {
377
385
  requires: [],
378
386
  },
@@ -381,9 +389,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
381
389
  app_type: {
382
390
  category: "applications",
383
391
  description: "App type will create the configuration in namespace metadata.namespace",
384
- required: ["name", "namespace"],
392
+ required: ["name"],
385
393
  minimal_config:
386
- 'resource "xcsh_app_type" "example" {\n name = "example-app-type"\n namespace = "staging"\n}',
394
+ 'resource "xcsh_app_type" "example" {\n name = "example-app-type"\n namespace = "system"\n}',
387
395
  dependencies: {
388
396
  requires: [],
389
397
  },
@@ -425,9 +433,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
425
433
  aws_tgw_site: {
426
434
  category: "sites",
427
435
  description: "Deploying F5 sites connected via AWS Transit Gateway",
428
- required: ["name", "namespace"],
436
+ required: ["name"],
429
437
  minimal_config:
430
- 'resource "xcsh_aws_tgw_site" "example" {\n name = "example-aws-tgw-site"\n namespace = "staging"\n}',
438
+ 'resource "xcsh_aws_tgw_site" "example" {\n name = "example-aws-tgw-site"\n namespace = "system"\n}',
431
439
  dependencies: {
432
440
  requires: [],
433
441
  },
@@ -436,9 +444,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
436
444
  aws_vpc_site: {
437
445
  category: "sites",
438
446
  description: "Deploying F5 sites within AWS VPC environments",
439
- required: ["name", "namespace", "address", "aws_region", "disk_size", "instance_type", "ssh_key"],
447
+ required: ["name", "address", "aws_region", "disk_size", "instance_type", "ssh_key"],
440
448
  minimal_config:
441
- 'resource "xcsh_aws_vpc_site" "example" {\n name = "example-aws-vpc-site"\n namespace = "staging"\n\n aws_region = "example-value"\n instance_type = "example-value"\n ssh_key = "example-value"\n address = "example-value"\n disk_size = 1\n}',
449
+ 'resource "xcsh_aws_vpc_site" "example" {\n name = "example-aws-vpc-site"\n namespace = "system"\n\n aws_region = "example-value"\n instance_type = "example-value"\n ssh_key = "example-value"\n address = "example-value"\n disk_size = 1\n}',
442
450
  dependencies: {
443
451
  requires: [],
444
452
  },
@@ -447,9 +455,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
447
455
  azure_vnet_site: {
448
456
  category: "sites",
449
457
  description: "Deploying F5 sites within Azure Virtual Network environments",
450
- required: ["name", "namespace", "machine_type", "resource_group", "ssh_key"],
458
+ required: ["name", "machine_type", "resource_group", "ssh_key"],
451
459
  minimal_config:
452
- 'resource "xcsh_azure_vnet_site" "example" {\n name = "example-Azure-vnet-site"\n namespace = "staging"\n\n machine_type = "example-value"\n resource_group = "example-value"\n ssh_key = "example-value"\n}',
460
+ 'resource "xcsh_azure_vnet_site" "example" {\n name = "example-Azure-vnet-site"\n namespace = "system"\n\n machine_type = "example-value"\n resource_group = "example-value"\n ssh_key = "example-value"\n}',
453
461
  dependencies: {
454
462
  requires: [],
455
463
  },
@@ -459,8 +467,8 @@ export const TERRAFORM_INDEX: TerraformIndex = {
459
467
  category: "networking",
460
468
  description:
461
469
  "Bgp object is the configuration for peering with external bgp servers. it is created by users in system namespace. configuration",
462
- required: ["name", "namespace"],
463
- minimal_config: 'resource "xcsh_bgp" "example" {\n name = "example-bgp"\n namespace = "staging"\n}',
470
+ required: ["name"],
471
+ minimal_config: 'resource "xcsh_bgp" "example" {\n name = "example-bgp"\n namespace = "system"\n}',
464
472
  dependencies: {
465
473
  requires: [],
466
474
  },
@@ -469,9 +477,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
469
477
  bgp_asn_set: {
470
478
  category: "networking",
471
479
  description: "Bgp_asn_set creates a new object in the storage backend for metadata.namespace",
472
- required: ["name", "namespace"],
480
+ required: ["name"],
473
481
  minimal_config:
474
- 'resource "xcsh_bgp_asn_set" "example" {\n name = "example-bgp-asn-set"\n namespace = "staging"\n\n as_numbers = [1]\n}',
482
+ 'resource "xcsh_bgp_asn_set" "example" {\n name = "example-bgp-asn-set"\n namespace = "system"\n\n as_numbers = [1]\n}',
475
483
  dependencies: {
476
484
  requires: [],
477
485
  },
@@ -480,7 +488,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
480
488
  bgp_routing_policy: {
481
489
  category: "security",
482
490
  description:
483
- "Bgp routing policy is a list of rules containing match criteria and action to be applied. these rules help control routes which are imported or exported to bgp peers. configuration",
491
+ "Bgp routing policy is a list of rules containing match criteria and action to be applied. these rules help contol routes which are imported or exported to bgp peers. configuration",
484
492
  required: ["name", "namespace"],
485
493
  minimal_config:
486
494
  'resource "xcsh_bgp_routing_policy" "example" {\n name = "example-bgp-routing-policy"\n namespace = "staging"\n}',
@@ -547,7 +555,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
547
555
  certificate: {
548
556
  category: "certificates",
549
557
  description: "Certificate. configuration",
550
- required: ["name", "namespace", "certificate_url"],
558
+ required: ["name", "namespace", "certificate_url", "private_key"],
551
559
  minimal_config:
552
560
  'resource "xcsh_certificate" "example" {\n name = "example-certificate"\n namespace = "staging"\n\n certificate_url = "example-value"\n}',
553
561
  dependencies: {
@@ -580,9 +588,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
580
588
  cloud_credentials: {
581
589
  category: "authentication",
582
590
  description: "Api to create cloud_credentials object. configuration",
583
- required: ["name", "namespace"],
591
+ required: ["name"],
584
592
  minimal_config:
585
- 'resource "xcsh_cloud_credentials" "example" {\n name = "example-cloud-credentials"\n namespace = "staging"\n}',
593
+ 'resource "xcsh_cloud_credentials" "example" {\n name = "example-cloud-credentials"\n namespace = "system"\n}',
586
594
  dependencies: {
587
595
  requires: [],
588
596
  },
@@ -591,9 +599,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
591
599
  cloud_elastic_ip: {
592
600
  category: "cloud-resources",
593
601
  description: "Cloud Elastic IP creates Cloud Elastic IP object Object is attached to a site",
594
- required: ["name", "namespace", "item_count"],
602
+ required: ["name", "item_count"],
595
603
  minimal_config:
596
- 'resource "xcsh_cloud_elastic_ip" "example" {\n name = "example-cloud-elastic-ip"\n namespace = "staging"\n\n item_count = 1\n}',
604
+ 'resource "xcsh_cloud_elastic_ip" "example" {\n name = "example-cloud-elastic-ip"\n namespace = "system"\n\n item_count = 1\n}',
597
605
  dependencies: {
598
606
  requires: [],
599
607
  },
@@ -643,9 +651,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
643
651
  code_base_integration: {
644
652
  category: "integrations",
645
653
  description: "Integration details",
646
- required: ["name", "namespace"],
654
+ required: ["name"],
647
655
  minimal_config:
648
- 'resource "xcsh_code_base_integration" "example" {\n name = "example-code-base-integration"\n namespace = "staging"\n}',
656
+ 'resource "xcsh_code_base_integration" "example" {\n name = "example-code-base-integration"\n namespace = "system"\n}',
649
657
  dependencies: {
650
658
  requires: [],
651
659
  },
@@ -698,9 +706,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
698
706
  dc_cluster_group: {
699
707
  category: "networking",
700
708
  description: "DC Cluster group in given namespace",
701
- required: ["name", "namespace"],
709
+ required: ["name"],
702
710
  minimal_config:
703
- 'resource "xcsh_dc_cluster_group" "example" {\n name = "example-dc-cluster-group"\n namespace = "staging"\n}',
711
+ 'resource "xcsh_dc_cluster_group" "example" {\n name = "example-dc-cluster-group"\n namespace = "system"\n}',
704
712
  dependencies: {
705
713
  requires: [],
706
714
  },
@@ -709,9 +717,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
709
717
  discovery: {
710
718
  category: "applications",
711
719
  description: "Api to create discovery object for a site or virtual site in system namespace. configuration",
712
- required: ["name", "namespace"],
720
+ required: ["name"],
713
721
  minimal_config:
714
- 'resource "xcsh_discovery" "example" {\n name = "example-discovery"\n namespace = "staging"\n}',
722
+ 'resource "xcsh_discovery" "example" {\n name = "example-discovery"\n namespace = "system"\n}',
715
723
  dependencies: {
716
724
  requires: [],
717
725
  },
@@ -732,14 +740,47 @@ export const TERRAFORM_INDEX: TerraformIndex = {
732
740
  dns_domain: {
733
741
  category: "dns",
734
742
  description: "DNS Domain in a given namespace. If one already exist it will give a error",
735
- required: ["name", "namespace", "dnssec_mode"],
743
+ required: ["name", "dnssec_mode"],
736
744
  minimal_config:
737
- 'resource "xcsh_dns_domain" "example" {\n name = "example-dns-domain"\n namespace = "staging"\n\n dnssec_mode = "DNSSEC_DISABLE"\n}',
745
+ 'resource "xcsh_dns_domain" "example" {\n name = "example-dns-domain"\n namespace = "system"\n\n dnssec_mode = "DNSSEC_DISABLE"\n}',
738
746
  dependencies: {
739
747
  requires: [],
740
748
  },
741
749
  import_syntax: "terraform import xcsh_dns_domain.example namespace/name",
742
750
  },
751
+ dns_lb_health_check: {
752
+ category: "dns",
753
+ description: "DNS Load Balancer Health Check in a given namespace. If one already exist it will give a error",
754
+ required: ["name"],
755
+ minimal_config:
756
+ 'resource "xcsh_dns_lb_health_check" "example" {\n name = "example-dns-lb-health-check"\n namespace = "system"\n}',
757
+ dependencies: {
758
+ requires: [],
759
+ },
760
+ import_syntax: "terraform import xcsh_dns_lb_health_check.example namespace/name",
761
+ },
762
+ dns_lb_pool: {
763
+ category: "dns",
764
+ description: "DNS Load Balancer Pool in a given namespace. If one already exist it will give a error",
765
+ required: ["name", "load_balancing_mode"],
766
+ minimal_config:
767
+ 'resource "xcsh_dns_lb_pool" "example" {\n name = "example-dns-lb-pool"\n namespace = "system"\n\n load_balancing_mode = "ROUND_ROBIN"\n}',
768
+ dependencies: {
769
+ requires: [],
770
+ },
771
+ import_syntax: "terraform import xcsh_dns_lb_pool.example namespace/name",
772
+ },
773
+ dns_load_balancer: {
774
+ category: "dns",
775
+ description: "DNS Load Balancer in a given namespace. If one already exist it will give a error",
776
+ required: ["name", "namespace"],
777
+ minimal_config:
778
+ 'resource "xcsh_dns_load_balancer" "example" {\n name = "example-dns-load-balancer"\n namespace = "staging"\n}',
779
+ dependencies: {
780
+ requires: [],
781
+ },
782
+ import_syntax: "terraform import xcsh_dns_load_balancer.example namespace/name",
783
+ },
743
784
  dns_proxy: {
744
785
  category: "dns",
745
786
  description: "DNS Proxy in a given namespace. If one already exists it will give an error",
@@ -751,12 +792,23 @@ export const TERRAFORM_INDEX: TerraformIndex = {
751
792
  },
752
793
  import_syntax: "terraform import xcsh_dns_proxy.example namespace/name",
753
794
  },
795
+ dns_zone: {
796
+ category: "dns",
797
+ description: "DNS Zone in a given namespace. If one already exist it will give a error",
798
+ required: ["name"],
799
+ minimal_config:
800
+ 'resource "xcsh_dns_zone" "example" {\n name = "example-dns-zone"\n namespace = "system"\n}',
801
+ dependencies: {
802
+ requires: [],
803
+ },
804
+ import_syntax: "terraform import xcsh_dns_zone.example namespace/name",
805
+ },
754
806
  endpoint: {
755
807
  category: "load-balancing",
756
808
  description: "Endpoint will create the object in the storage backend for namespace metadata.namespace",
757
- required: ["name", "namespace", "health_check_port", "port", "protocol"],
809
+ required: ["name", "health_check_port", "port", "protocol"],
758
810
  minimal_config:
759
- 'resource "xcsh_endpoint" "example" {\n name = "example-endpoint"\n namespace = "staging"\n\n health_check_port = 1\n port = 1\n protocol = "example-value"\n}',
811
+ 'resource "xcsh_endpoint" "example" {\n name = "example-endpoint"\n namespace = "system"\n\n health_check_port = 1\n port = 1\n protocol = "example-value"\n}',
760
812
  dependencies: {
761
813
  requires: [],
762
814
  },
@@ -799,9 +851,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
799
851
  fast_acl_rule: {
800
852
  category: "security",
801
853
  description: "New Fast ACL rule, has specification to match source IP, source port and action to apply",
802
- required: ["name", "namespace"],
854
+ required: ["name"],
803
855
  minimal_config:
804
- 'resource "xcsh_fast_acl_rule" "example" {\n name = "example-fast-acl-rule"\n namespace = "staging"\n}',
856
+ 'resource "xcsh_fast_acl_rule" "example" {\n name = "example-fast-acl-rule"\n namespace = "system"\n}',
805
857
  dependencies: {
806
858
  requires: [],
807
859
  },
@@ -823,14 +875,13 @@ export const TERRAFORM_INDEX: TerraformIndex = {
823
875
  description: "Fleet will create a fleet object in 'system' namespace of the user",
824
876
  required: [
825
877
  "name",
826
- "namespace",
827
878
  "enable_default_fleet_config_download",
828
879
  "fleet_label",
829
880
  "operating_system_version",
830
881
  "volterra_software_version",
831
882
  ],
832
883
  minimal_config:
833
- 'resource "xcsh_fleet" "example" {\n name = "example-fleet"\n namespace = "staging"\n\n fleet_label = "example-value"\n enable_default_fleet_config_download = true\n operating_system_version = "example-value"\n volterra_software_version = "example-value"\n}',
884
+ 'resource "xcsh_fleet" "example" {\n name = "example-fleet"\n namespace = "system"\n\n fleet_label = "example-value"\n enable_default_fleet_config_download = true\n operating_system_version = "example-value"\n volterra_software_version = "example-value"\n}',
834
885
  dependencies: {
835
886
  requires: [],
836
887
  },
@@ -861,20 +912,31 @@ export const TERRAFORM_INDEX: TerraformIndex = {
861
912
  gcp_vpc_site: {
862
913
  category: "sites",
863
914
  description: "Deploying F5 sites within Google Cloud VPC environments",
864
- required: ["name", "namespace", "address", "disk_size", "gcp_region", "instance_type", "ssh_key"],
915
+ required: ["name", "address", "disk_size", "gcp_region", "instance_type", "ssh_key"],
865
916
  minimal_config:
866
- 'resource "xcsh_gcp_vpc_site" "example" {\n name = "example-gcp-vpc-site"\n namespace = "staging"\n\n gcp_region = "example-value"\n instance_type = "example-value"\n ssh_key = "example-value"\n address = "example-value"\n disk_size = 1\n}',
917
+ 'resource "xcsh_gcp_vpc_site" "example" {\n name = "example-gcp-vpc-site"\n namespace = "system"\n\n gcp_region = "example-value"\n instance_type = "example-value"\n ssh_key = "example-value"\n address = "example-value"\n disk_size = 1\n}',
867
918
  dependencies: {
868
919
  requires: [],
869
920
  },
870
921
  import_syntax: "terraform import xcsh_gcp_vpc_site.example namespace/name",
871
922
  },
923
+ geo_location_set: {
924
+ category: "cloud-resources",
925
+ description: "Geolocation Set",
926
+ required: ["name", "namespace"],
927
+ minimal_config:
928
+ 'resource "xcsh_geo_location_set" "example" {\n name = "example-geo-location-set"\n namespace = "staging"\n}',
929
+ dependencies: {
930
+ requires: [],
931
+ },
932
+ import_syntax: "terraform import xcsh_geo_location_set.example namespace/name",
933
+ },
872
934
  global_log_receiver: {
873
935
  category: "monitoring",
874
936
  description: "New Global Log Receiver object",
875
- required: ["name", "namespace"],
937
+ required: ["name", "namespace", "log_type", "receiver_choice"],
876
938
  minimal_config:
877
- 'resource "xcsh_global_log_receiver" "example" {\n name = "example-global-log-receiver"\n namespace = "staging"\n}',
939
+ 'resource "xcsh_global_log_receiver" "example" {\n name = "example-global-log-receiver"\n namespace = "system"\n}',
878
940
  dependencies: {
879
941
  requires: [],
880
942
  },
@@ -884,8 +946,8 @@ export const TERRAFORM_INDEX: TerraformIndex = {
884
946
  category: "load-balancing",
885
947
  description:
886
948
  "Healthcheck object defines method to determine if the given endpoint is healthy. single healthcheck object can be referred to by one or many cluster objects. configuration",
887
- required: ["name", "namespace", "healthy_threshold", "interval", "timeout", "unhealthy_threshold"],
888
- server_defaults: ["jitter_percent"],
949
+ required: ["name", "namespace", "interval", "timeout", "healthy_threshold", "unhealthy_threshold"],
950
+ server_defaults: ["jitter_percent", "use_http2"],
889
951
  minimal_config:
890
952
  'resource "xcsh_healthcheck" "example" {\n name = "example-healthcheck"\n namespace = "staging"\n\n healthy_threshold = 1\n interval = 1\n timeout = 1\n unhealthy_threshold = 1\n}',
891
953
  dependencies: {
@@ -897,7 +959,8 @@ export const TERRAFORM_INDEX: TerraformIndex = {
897
959
  http_loadbalancer: {
898
960
  category: "load-balancing",
899
961
  description: "Load balancing HTTP/HTTPS traffic with advanced routing and security",
900
- required: ["name", "namespace"],
962
+ required: ["name", "namespace", "domains"],
963
+ server_defaults: ["connection_timeout", "http_idle_timeout"],
901
964
  minimal_config:
902
965
  'resource "xcsh_http_loadbalancer" "example" {\n name = "example-http-loadbalancer"\n namespace = "staging"\n\n domains = ["example-value"]\n}',
903
966
  dependencies: {
@@ -975,7 +1038,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
975
1038
  description: "K8s_cluster will create the object in the storage backend for namespace metadata.namespace",
976
1039
  required: ["name", "namespace"],
977
1040
  minimal_config:
978
- 'resource "xcsh_k8s_cluster" "example" {\n name = "example-k8s-cluster"\n namespace = "staging"\n}',
1041
+ 'resource "xcsh_k8s_cluster" "example" {\n name = "example-k8s-cluster"\n namespace = "system"\n}',
979
1042
  dependencies: {
980
1043
  requires: [],
981
1044
  },
@@ -984,9 +1047,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
984
1047
  k8s_cluster_role: {
985
1048
  category: "kubernetes",
986
1049
  description: "K8s_cluster_role will create the object in the storage backend for namespace metadata.namespace",
987
- required: ["name", "namespace"],
1050
+ required: ["name"],
988
1051
  minimal_config:
989
- 'resource "xcsh_k8s_cluster_role" "example" {\n name = "example-k8s-cluster-role"\n namespace = "staging"\n}',
1052
+ 'resource "xcsh_k8s_cluster_role" "example" {\n name = "example-k8s-cluster-role"\n namespace = "system"\n}',
990
1053
  dependencies: {
991
1054
  requires: [],
992
1055
  },
@@ -996,9 +1059,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
996
1059
  category: "kubernetes",
997
1060
  description:
998
1061
  "K8s_cluster_role_binding will create the object in the storage backend for namespace metadata.namespace",
999
- required: ["name", "namespace"],
1062
+ required: ["name"],
1000
1063
  minimal_config:
1001
- 'resource "xcsh_k8s_cluster_role_binding" "example" {\n name = "example-k8s-cluster-role-binding"\n namespace = "staging"\n}',
1064
+ 'resource "xcsh_k8s_cluster_role_binding" "example" {\n name = "example-k8s-cluster-role-binding"\n namespace = "system"\n}',
1002
1065
  dependencies: {
1003
1066
  requires: [],
1004
1067
  },
@@ -1030,9 +1093,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1030
1093
  log_receiver: {
1031
1094
  category: "monitoring",
1032
1095
  description: "New Log Receiver object",
1033
- required: ["name", "namespace"],
1096
+ required: ["name"],
1034
1097
  minimal_config:
1035
- 'resource "xcsh_log_receiver" "example" {\n name = "example-log-receiver"\n namespace = "staging"\n}',
1098
+ 'resource "xcsh_log_receiver" "example" {\n name = "example-log-receiver"\n namespace = "system"\n}',
1036
1099
  dependencies: {
1037
1100
  requires: [],
1038
1101
  },
@@ -1076,9 +1139,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1076
1139
  nat_policy: {
1077
1140
  category: "security",
1078
1141
  description: "Nat policy create specification configures nat policy with multiple rules,. configuration",
1079
- required: ["name", "namespace"],
1142
+ required: ["name"],
1080
1143
  minimal_config:
1081
- 'resource "xcsh_nat_policy" "example" {\n name = "example-nat-policy"\n namespace = "staging"\n}',
1144
+ 'resource "xcsh_nat_policy" "example" {\n name = "example-nat-policy"\n namespace = "system"\n}',
1082
1145
  dependencies: {
1083
1146
  requires: [],
1084
1147
  },
@@ -1087,9 +1150,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1087
1150
  network_connector: {
1088
1151
  category: "networking",
1089
1152
  description: "Network connector is created by users in system namespace. configuration",
1090
- required: ["name", "namespace"],
1153
+ required: ["name"],
1091
1154
  minimal_config:
1092
- 'resource "xcsh_network_connector" "example" {\n name = "example-network-connector"\n namespace = "staging"\n}',
1155
+ 'resource "xcsh_network_connector" "example" {\n name = "example-network-connector"\n namespace = "system"\n}',
1093
1156
  dependencies: {
1094
1157
  requires: [],
1095
1158
  },
@@ -1100,7 +1163,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1100
1163
  description: "Network firewall is created by users in system namespace. configuration",
1101
1164
  required: ["name", "namespace"],
1102
1165
  minimal_config:
1103
- 'resource "xcsh_network_firewall" "example" {\n name = "example-network-firewall"\n namespace = "staging"\n}',
1166
+ 'resource "xcsh_network_firewall" "example" {\n name = "example-network-firewall"\n namespace = "system"\n}',
1104
1167
  dependencies: {
1105
1168
  requires: [],
1106
1169
  },
@@ -1110,9 +1173,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1110
1173
  category: "networking",
1111
1174
  description:
1112
1175
  "Network interface represents configuration of a network device. it is created by users in system namespace. configuration",
1113
- required: ["name", "namespace"],
1176
+ required: ["name"],
1114
1177
  minimal_config:
1115
- 'resource "xcsh_network_interface" "example" {\n name = "example-network-interface"\n namespace = "staging"\n}',
1178
+ 'resource "xcsh_network_interface" "example" {\n name = "example-network-interface"\n namespace = "system"\n}',
1116
1179
  dependencies: {
1117
1180
  requires: [],
1118
1181
  },
@@ -1132,9 +1195,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1132
1195
  network_policy_rule: {
1133
1196
  category: "security",
1134
1197
  description: "Network policy rule with configured parameters in specified namespace",
1135
- required: ["name", "namespace"],
1198
+ required: ["name"],
1136
1199
  minimal_config:
1137
- 'resource "xcsh_network_policy_rule" "example" {\n name = "example-network-policy-rule"\n namespace = "staging"\n}',
1200
+ 'resource "xcsh_network_policy_rule" "example" {\n name = "example-network-policy-rule"\n namespace = "system"\n}',
1138
1201
  dependencies: {
1139
1202
  requires: [],
1140
1203
  },
@@ -1154,9 +1217,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1154
1217
  nfv_service: {
1155
1218
  category: "networking",
1156
1219
  description: "New NFV service with configured parameters",
1157
- required: ["name", "namespace"],
1220
+ required: ["name"],
1158
1221
  minimal_config:
1159
- 'resource "xcsh_nfv_service" "example" {\n name = "example-nfv-service"\n namespace = "staging"\n}',
1222
+ 'resource "xcsh_nfv_service" "example" {\n name = "example-nfv-service"\n namespace = "system"\n}',
1160
1223
  dependencies: {
1161
1224
  requires: [],
1162
1225
  },
@@ -1166,9 +1229,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1166
1229
  category: "networking",
1167
1230
  description:
1168
1231
  "Api to create nginx service discovery object for a site or virtual site in system namespace. configuration",
1169
- required: ["name", "namespace"],
1232
+ required: ["name"],
1170
1233
  minimal_config:
1171
- 'resource "xcsh_nginx_service_discovery" "example" {\n name = "example-nginx-service-discovery"\n namespace = "staging"\n}',
1234
+ 'resource "xcsh_nginx_service_discovery" "example" {\n name = "example-nginx-service-discovery"\n namespace = "system"\n}',
1172
1235
  dependencies: {
1173
1236
  requires: [],
1174
1237
  },
@@ -1177,7 +1240,8 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1177
1240
  origin_pool: {
1178
1241
  category: "load-balancing",
1179
1242
  description: "Defining backend server pools for load balancer targets",
1180
- required: ["name", "namespace"],
1243
+ required: ["name", "namespace", "origin_servers", "port"],
1244
+ server_defaults: ["connection_timeout", "http_idle_timeout"],
1181
1245
  minimal_config:
1182
1246
  'resource "xcsh_origin_pool" "example" {\n name = "example-origin-pool"\n namespace = "staging"\n}',
1183
1247
  dependencies: {
@@ -1212,9 +1276,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1212
1276
  category: "security",
1213
1277
  description:
1214
1278
  "Protocol Inspection Specification in a given namespace. If one already exists it will give an error",
1215
- required: ["name", "namespace"],
1279
+ required: ["name", "namespace", "enable_disable_compliance_checks", "enable_disable_signatures"],
1216
1280
  minimal_config:
1217
- 'resource "xcsh_protocol_inspection" "example" {\n name = "example-protocol-inspection"\n namespace = "staging"\n}',
1281
+ 'resource "xcsh_protocol_inspection" "example" {\n name = "example-protocol-inspection"\n namespace = "system"\n}',
1218
1282
  dependencies: {
1219
1283
  requires: [],
1220
1284
  },
@@ -1257,7 +1321,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1257
1321
  rate_limiter_policy: {
1258
1322
  category: "security",
1259
1323
  description: "Rate limiter policy create specification. configuration",
1260
- required: ["name", "namespace"],
1324
+ required: ["name", "namespace", "burst_size", "committed_information_rate"],
1261
1325
  minimal_config:
1262
1326
  'resource "xcsh_rate_limiter_policy" "example" {\n name = "example-rate-limiter-policy"\n namespace = "staging"\n}',
1263
1327
  dependencies: {
@@ -1279,9 +1343,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1279
1343
  secret_management_access: {
1280
1344
  category: "authentication",
1281
1345
  description: "Secret_management_access creates a new object in storage backend for metadata.namespace",
1282
- required: ["name", "namespace", "provider_name"],
1346
+ required: ["name", "provider_name"],
1283
1347
  minimal_config:
1284
- 'resource "xcsh_secret_management_access" "example" {\n name = "example-secret-management-access"\n namespace = "staging"\n\n provider_name = "example-value"\n}',
1348
+ 'resource "xcsh_secret_management_access" "example" {\n name = "example-secret-management-access"\n namespace = "system"\n\n provider_name = "example-value"\n}',
1285
1349
  dependencies: {
1286
1350
  requires: [],
1287
1351
  },
@@ -1290,9 +1354,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1290
1354
  securemesh_site: {
1291
1355
  category: "sites",
1292
1356
  description: "Deploying secure mesh edge sites with distributed security capabilities",
1293
- required: ["name", "namespace", "address", "volterra_certified_hw"],
1357
+ required: ["name", "address", "volterra_certified_hw"],
1294
1358
  minimal_config:
1295
- 'resource "xcsh_securemesh_site" "example" {\n name = "example-securemesh-site"\n namespace = "staging"\n\n volterra_certified_hw = "example-value"\n worker_nodes = ["example-value"]\n address = "example-value"\n}',
1359
+ 'resource "xcsh_securemesh_site" "example" {\n name = "example-securemesh-site"\n namespace = "system"\n\n volterra_certified_hw = "example-value"\n worker_nodes = ["example-value"]\n address = "example-value"\n}',
1296
1360
  dependencies: {
1297
1361
  requires: [],
1298
1362
  },
@@ -1301,9 +1365,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1301
1365
  securemesh_site_v2: {
1302
1366
  category: "sites",
1303
1367
  description: "Deploying secure mesh edge sites with enhanced security and networking features",
1304
- required: ["name", "namespace"],
1368
+ required: ["name"],
1305
1369
  minimal_config:
1306
- 'resource "xcsh_securemesh_site_v2" "example" {\n name = "example-securemesh-site-v2"\n namespace = "staging"\n}',
1370
+ 'resource "xcsh_securemesh_site_v2" "example" {\n name = "example-securemesh-site-v2"\n namespace = "system"\n}',
1307
1371
  dependencies: {
1308
1372
  requires: [],
1309
1373
  },
@@ -1356,9 +1420,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1356
1420
  site: {
1357
1421
  category: "sites",
1358
1422
  description: "Virtual site object in given namespace",
1359
- required: ["name", "namespace", "site_type"],
1423
+ required: ["name", "site_type"],
1360
1424
  minimal_config:
1361
- 'resource "xcsh_site" "example" {\n name = "example-site"\n namespace = "staging"\n\n site_type = "INVALID"\n}',
1425
+ 'resource "xcsh_site" "example" {\n name = "example-site"\n namespace = "system"\n\n site_type = "INVALID"\n}',
1362
1426
  dependencies: {
1363
1427
  requires: [],
1364
1428
  },
@@ -1367,9 +1431,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1367
1431
  site_mesh_group: {
1368
1432
  category: "sites",
1369
1433
  description: "Site Mesh Group in system namespace of user",
1370
- required: ["name", "namespace"],
1434
+ required: ["name"],
1371
1435
  minimal_config:
1372
- 'resource "xcsh_site_mesh_group" "example" {\n name = "example-site-mesh-group"\n namespace = "staging"\n}',
1436
+ 'resource "xcsh_site_mesh_group" "example" {\n name = "example-site-mesh-group"\n namespace = "system"\n}',
1373
1437
  dependencies: {
1374
1438
  requires: [],
1375
1439
  },
@@ -1407,7 +1471,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1407
1471
  tcp_loadbalancer: {
1408
1472
  category: "load-balancing",
1409
1473
  description: "Load balancing TCP traffic across origin pools",
1410
- required: ["name", "namespace"],
1474
+ required: ["name", "namespace", "origin_pools"],
1411
1475
  minimal_config:
1412
1476
  'resource "xcsh_tcp_loadbalancer" "example" {\n name = "example-tcp-loadbalancer"\n namespace = "staging"\n}',
1413
1477
  dependencies: {
@@ -1418,9 +1482,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1418
1482
  tenant_configuration: {
1419
1483
  category: "organization",
1420
1484
  description: "Tenant configuration specification. configuration",
1421
- required: ["name", "namespace"],
1485
+ required: ["name"],
1422
1486
  minimal_config:
1423
- 'resource "xcsh_tenant_configuration" "example" {\n name = "example-tenant-configuration"\n namespace = "staging"\n}',
1487
+ 'resource "xcsh_tenant_configuration" "example" {\n name = "example-tenant-configuration"\n namespace = "system"\n}',
1424
1488
  dependencies: {
1425
1489
  requires: [],
1426
1490
  },
@@ -1462,9 +1526,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1462
1526
  usb_policy: {
1463
1527
  category: "security",
1464
1528
  description: "New USB policy object",
1465
- required: ["name", "namespace"],
1529
+ required: ["name"],
1466
1530
  minimal_config:
1467
- 'resource "xcsh_usb_policy" "example" {\n name = "example-usb-policy"\n namespace = "staging"\n}',
1531
+ 'resource "xcsh_usb_policy" "example" {\n name = "example-usb-policy"\n namespace = "system"\n}',
1468
1532
  dependencies: {
1469
1533
  requires: [],
1470
1534
  },
@@ -1473,7 +1537,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1473
1537
  user_identification: {
1474
1538
  category: "security",
1475
1539
  description: "User_identification creates a new object in the storage backend for metadata.namespace",
1476
- required: ["name", "namespace"],
1540
+ required: ["name", "namespace", "rules"],
1477
1541
  minimal_config:
1478
1542
  'resource "xcsh_user_identification" "example" {\n name = "example-user-identification"\n namespace = "staging"\n}',
1479
1543
  dependencies: {
@@ -1516,9 +1580,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1516
1580
  virtual_network: {
1517
1581
  category: "networking",
1518
1582
  description: "Virtual network in given namespace",
1519
- required: ["name", "namespace", "legacy_type"],
1583
+ required: ["name", "legacy_type"],
1520
1584
  minimal_config:
1521
- 'resource "xcsh_virtual_network" "example" {\n name = "example-virtual-network"\n namespace = "staging"\n\n legacy_type = "VIRTUAL_NETWORK_SITE_LOCAL"\n}',
1585
+ 'resource "xcsh_virtual_network" "example" {\n name = "example-virtual-network"\n namespace = "system"\n\n legacy_type = "VIRTUAL_NETWORK_SITE_LOCAL"\n}',
1522
1586
  dependencies: {
1523
1587
  requires: [],
1524
1588
  },
@@ -1527,9 +1591,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1527
1591
  virtual_site: {
1528
1592
  category: "sites",
1529
1593
  description: "Virtual site object in given namespace",
1530
- required: ["name", "namespace", "site_type"],
1594
+ required: ["name", "namespace", "site_type", "site_selector"],
1531
1595
  minimal_config:
1532
- 'resource "xcsh_virtual_site" "example" {\n name = "example-virtual-site"\n namespace = "staging"\n\n site_type = "INVALID"\n}',
1596
+ 'resource "xcsh_virtual_site" "example" {\n name = "example-virtual-site"\n namespace = "system"\n\n site_type = "INVALID"\n}',
1533
1597
  dependencies: {
1534
1598
  requires: [],
1535
1599
  },
@@ -1538,9 +1602,9 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1538
1602
  voltstack_site: {
1539
1603
  category: "sites",
1540
1604
  description: "Deploying Volterra stack sites for edge computing",
1541
- required: ["name", "namespace", "address", "volterra_certified_hw"],
1605
+ required: ["name", "address", "volterra_certified_hw"],
1542
1606
  minimal_config:
1543
- 'resource "xcsh_voltstack_site" "example" {\n name = "example-voltstack-site"\n namespace = "staging"\n\n volterra_certified_hw = "example-value"\n worker_nodes = ["example-value"]\n address = "example-value"\n}',
1607
+ 'resource "xcsh_voltstack_site" "example" {\n name = "example-voltstack-site"\n namespace = "system"\n\n volterra_certified_hw = "example-value"\n worker_nodes = ["example-value"]\n address = "example-value"\n}',
1544
1608
  dependencies: {
1545
1609
  requires: [],
1546
1610
  },
@@ -1549,7 +1613,7 @@ export const TERRAFORM_INDEX: TerraformIndex = {
1549
1613
  waf_exclusion_policy: {
1550
1614
  category: "security",
1551
1615
  description: "WAF exclusion policy",
1552
- required: ["name", "namespace"],
1616
+ required: ["name", "namespace", "waf_exclusion_rules"],
1553
1617
  minimal_config:
1554
1618
  'resource "xcsh_waf_exclusion_policy" "example" {\n name = "example-waf-exclusion-policy"\n namespace = "staging"\n}',
1555
1619
  dependencies: {
@@ -2658,8 +2658,12 @@ export class AgentSession {
2658
2658
  );
2659
2659
  }
2660
2660
 
2661
- // Validate API key
2662
- const apiKey = await this.#modelRegistry.getApiKey(this.model, this.sessionId);
2661
+ // Validate API key. Capture the guard-narrowed model into a local: TS narrowing
2662
+ // of the `this.model` getter does not persist into the ttftAttr closure below.
2663
+ const model = this.model;
2664
+ const apiKey = await logger.ttftAttr("ttft.getapikey", () =>
2665
+ this.#modelRegistry.getApiKey(model, this.sessionId),
2666
+ );
2663
2667
  if (!apiKey) {
2664
2668
  throw new Error(
2665
2669
  `No API key found for ${this.model.provider}.\n\n` +
@@ -2674,20 +2678,23 @@ export class AgentSession {
2674
2678
  }
2675
2679
 
2676
2680
  // Build messages array (session context, eager todo prelude, then active prompt message)
2677
- const messages: AgentMessage[] = [];
2678
- const planReferenceMessage = await this.#buildPlanReferenceMessage?.();
2679
- if (planReferenceMessage) {
2680
- messages.push(planReferenceMessage);
2681
- }
2682
- const planModeMessage = await this.#buildPlanModeMessage();
2683
- if (planModeMessage) {
2684
- messages.push(planModeMessage);
2685
- }
2686
- if (options?.prependMessages) {
2687
- messages.push(...options.prependMessages);
2688
- }
2681
+ const messages: AgentMessage[] = await logger.ttftAttr("ttft.build-context", async () => {
2682
+ const built: AgentMessage[] = [];
2683
+ const planReferenceMessage = await this.#buildPlanReferenceMessage?.();
2684
+ if (planReferenceMessage) {
2685
+ built.push(planReferenceMessage);
2686
+ }
2687
+ const planModeMessage = await this.#buildPlanModeMessage();
2688
+ if (planModeMessage) {
2689
+ built.push(planModeMessage);
2690
+ }
2691
+ if (options?.prependMessages) {
2692
+ built.push(...options.prependMessages);
2693
+ }
2689
2694
 
2690
- messages.push(message);
2695
+ built.push(message);
2696
+ return built;
2697
+ });
2691
2698
 
2692
2699
  // Early bail-out: if a newer abort/prompt cycle started during setup,
2693
2700
  // return before mutating shared state (nextTurn messages, system prompt).
@@ -2711,12 +2718,12 @@ export class AgentSession {
2711
2718
  messages.push(...fileMentionMessages);
2712
2719
  }
2713
2720
 
2714
- // Emit before_agent_start extension event
2721
+ // Emit before_agent_start extension event. Capture the narrowed runner into a
2722
+ // local: the `this.#extensionRunner` guard does not narrow inside the closure.
2715
2723
  if (this.#extensionRunner) {
2716
- const result = await this.#extensionRunner.emitBeforeAgentStart(
2717
- expandedText,
2718
- options?.images,
2719
- this.#baseSystemPrompt,
2724
+ const runner = this.#extensionRunner;
2725
+ const result = await logger.ttftAttr("ttft.before-agent-start-hook", () =>
2726
+ runner.emitBeforeAgentStart(expandedText, options?.images, this.#baseSystemPrompt),
2720
2727
  );
2721
2728
  if (result?.messages) {
2722
2729
  const promptAttribution: "user" | "agent" | undefined =
@@ -2747,7 +2754,9 @@ export class AgentSession {
2747
2754
  }
2748
2755
 
2749
2756
  const agentPromptOptions = options?.toolChoice ? { toolChoice: options.toolChoice } : undefined;
2750
- await this.#promptAgentWithIdleRetry(messages, agentPromptOptions);
2757
+ await logger.ttftAttr("ttft.agent-loop-total", () =>
2758
+ this.#promptAgentWithIdleRetry(messages, agentPromptOptions),
2759
+ );
2751
2760
  if (!options?.skipPostPromptRecoveryWait) {
2752
2761
  await this.#waitForPostPromptRecovery();
2753
2762
  }
@@ -327,6 +327,11 @@ export async function resolvePromptInput(input: string | undefined, description:
327
327
  export interface LoadContextFilesOptions {
328
328
  /** Working directory to start walking up from. Default: getProjectDir() */
329
329
  cwd?: string;
330
+ /**
331
+ * Explicit disabled extension IDs to apply instead of the global settings default.
332
+ * Pass `[]` to force discovery independent of any process-wide settings state.
333
+ */
334
+ disabledExtensions?: string[];
330
335
  }
331
336
 
332
337
  function dedupeExactContextFiles(
@@ -351,7 +356,10 @@ export async function loadProjectContextFiles(
351
356
  ): Promise<Array<{ path: string; content: string; depth?: number }>> {
352
357
  const resolvedCwd = options.cwd ?? getProjectDir();
353
358
 
354
- const result = await loadCapability(contextFileCapability.id, { cwd: resolvedCwd });
359
+ const result = await loadCapability(contextFileCapability.id, {
360
+ cwd: resolvedCwd,
361
+ disabledExtensions: options.disabledExtensions,
362
+ });
355
363
 
356
364
  // Convert ContextFile items and preserve depth info
357
365
  const files = result.items.map(item => {
@@ -436,6 +444,11 @@ export interface BuildSystemPromptOptions {
436
444
  cwd?: string;
437
445
  /** Pre-loaded context files (skips discovery if provided). */
438
446
  contextFiles?: Array<{ path: string; content: string; depth?: number }>;
447
+ /**
448
+ * Explicit disabled extension IDs applied to context-file discovery instead of the
449
+ * global settings default. Pass `[]` to discover independent of process-wide settings.
450
+ */
451
+ disabledExtensions?: string[];
439
452
  /** Skills provided directly to system prompt construction. */
440
453
  skills?: Skill[];
441
454
  /** Pre-loaded rulebook rules (descriptions, excluding TTSR and always-apply). */
@@ -519,7 +532,10 @@ export async function buildSystemPrompt(options: BuildSystemPromptOptions = {}):
519
532
  });
520
533
  const contextFilesPromise = providedContextFiles
521
534
  ? Promise.resolve(providedContextFiles)
522
- : logger.time("loadProjectContextFiles", loadProjectContextFiles, { cwd: resolvedCwd });
535
+ : logger.time("loadProjectContextFiles", loadProjectContextFiles, {
536
+ cwd: resolvedCwd,
537
+ disabledExtensions: options.disabledExtensions,
538
+ });
523
539
  const agentsMdSearchPromise = logger.time("buildAgentsMdSearch", buildAgentsMdSearch, resolvedCwd);
524
540
  const mergedSkillsSettings = {
525
541
  ...skillsSettings,