@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 +9 -9
- package/scripts/bun-test-guarded.ts +54 -0
- package/src/commands/worker.ts +20 -0
- package/src/internal-urls/build-info.generated.ts +8 -8
- package/src/internal-urls/terraform-index.generated.ts +174 -110
- package/src/session/agent-session.ts +30 -21
- package/src/system-prompt.ts +18 -2
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.
|
|
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.
|
|
60
|
-
"@f5-sales-demo/pi-agent-core": "19.61.
|
|
61
|
-
"@f5-sales-demo/pi-ai": "19.61.
|
|
62
|
-
"@f5-sales-demo/pi-natives": "19.61.
|
|
63
|
-
"@f5-sales-demo/pi-resource-management": "19.61.
|
|
64
|
-
"@f5-sales-demo/pi-tui": "19.61.
|
|
65
|
-
"@f5-sales-demo/pi-utils": "19.61.
|
|
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);
|
package/src/commands/worker.ts
CHANGED
|
@@ -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.
|
|
21
|
-
"commit": "
|
|
22
|
-
"shortCommit": "
|
|
20
|
+
"version": "19.61.3",
|
|
21
|
+
"commit": "1546a875f07608812967e1169ea86c2bd3f837ac",
|
|
22
|
+
"shortCommit": "1546a87",
|
|
23
23
|
"branch": "main",
|
|
24
|
-
"tag": "v19.61.
|
|
25
|
-
"commitDate": "2026-07-
|
|
26
|
-
"buildDate": "2026-07-
|
|
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/
|
|
32
|
-
"releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v19.61.
|
|
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:
|
|
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", "
|
|
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 = "
|
|
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 = "
|
|
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"
|
|
305
|
+
required: ["name"],
|
|
298
306
|
minimal_config:
|
|
299
|
-
'resource "xcsh_api_crawler" "example" {\n name = "example-api-crawler"\n namespace = "
|
|
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 = "
|
|
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 = "
|
|
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", "
|
|
338
|
+
required: ["name", "custom_header_value"],
|
|
331
339
|
minimal_config:
|
|
332
|
-
'resource "xcsh_api_testing" "example" {\n name = "example-api-testing"\n namespace = "
|
|
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"
|
|
359
|
+
required: ["name"],
|
|
352
360
|
minimal_config:
|
|
353
|
-
'resource "xcsh_app_api_group" "example" {\n name = "example-app-api-group"\n namespace = "
|
|
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"
|
|
381
|
+
required: ["name"],
|
|
374
382
|
minimal_config:
|
|
375
|
-
'resource "xcsh_app_setting" "example" {\n name = "example-app-setting"\n namespace = "
|
|
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"
|
|
392
|
+
required: ["name"],
|
|
385
393
|
minimal_config:
|
|
386
|
-
'resource "xcsh_app_type" "example" {\n name = "example-app-type"\n namespace = "
|
|
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"
|
|
436
|
+
required: ["name"],
|
|
429
437
|
minimal_config:
|
|
430
|
-
'resource "xcsh_aws_tgw_site" "example" {\n name = "example-aws-tgw-site"\n namespace = "
|
|
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", "
|
|
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 = "
|
|
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", "
|
|
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 = "
|
|
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"
|
|
463
|
-
minimal_config: 'resource "xcsh_bgp" "example" {\n name = "example-bgp"\n namespace = "
|
|
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"
|
|
480
|
+
required: ["name"],
|
|
473
481
|
minimal_config:
|
|
474
|
-
'resource "xcsh_bgp_asn_set" "example" {\n name = "example-bgp-asn-set"\n namespace = "
|
|
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
|
|
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"
|
|
591
|
+
required: ["name"],
|
|
584
592
|
minimal_config:
|
|
585
|
-
'resource "xcsh_cloud_credentials" "example" {\n name = "example-cloud-credentials"\n namespace = "
|
|
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", "
|
|
602
|
+
required: ["name", "item_count"],
|
|
595
603
|
minimal_config:
|
|
596
|
-
'resource "xcsh_cloud_elastic_ip" "example" {\n name = "example-cloud-elastic-ip"\n namespace = "
|
|
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"
|
|
654
|
+
required: ["name"],
|
|
647
655
|
minimal_config:
|
|
648
|
-
'resource "xcsh_code_base_integration" "example" {\n name = "example-code-base-integration"\n namespace = "
|
|
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"
|
|
709
|
+
required: ["name"],
|
|
702
710
|
minimal_config:
|
|
703
|
-
'resource "xcsh_dc_cluster_group" "example" {\n name = "example-dc-cluster-group"\n namespace = "
|
|
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"
|
|
720
|
+
required: ["name"],
|
|
713
721
|
minimal_config:
|
|
714
|
-
'resource "xcsh_discovery" "example" {\n name = "example-discovery"\n namespace = "
|
|
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", "
|
|
743
|
+
required: ["name", "dnssec_mode"],
|
|
736
744
|
minimal_config:
|
|
737
|
-
'resource "xcsh_dns_domain" "example" {\n name = "example-dns-domain"\n namespace = "
|
|
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", "
|
|
809
|
+
required: ["name", "health_check_port", "port", "protocol"],
|
|
758
810
|
minimal_config:
|
|
759
|
-
'resource "xcsh_endpoint" "example" {\n name = "example-endpoint"\n namespace = "
|
|
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"
|
|
854
|
+
required: ["name"],
|
|
803
855
|
minimal_config:
|
|
804
|
-
'resource "xcsh_fast_acl_rule" "example" {\n name = "example-fast-acl-rule"\n namespace = "
|
|
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 = "
|
|
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", "
|
|
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 = "
|
|
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 = "
|
|
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", "
|
|
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 = "
|
|
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"
|
|
1050
|
+
required: ["name"],
|
|
988
1051
|
minimal_config:
|
|
989
|
-
'resource "xcsh_k8s_cluster_role" "example" {\n name = "example-k8s-cluster-role"\n namespace = "
|
|
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"
|
|
1062
|
+
required: ["name"],
|
|
1000
1063
|
minimal_config:
|
|
1001
|
-
'resource "xcsh_k8s_cluster_role_binding" "example" {\n name = "example-k8s-cluster-role-binding"\n namespace = "
|
|
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"
|
|
1096
|
+
required: ["name"],
|
|
1034
1097
|
minimal_config:
|
|
1035
|
-
'resource "xcsh_log_receiver" "example" {\n name = "example-log-receiver"\n namespace = "
|
|
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"
|
|
1142
|
+
required: ["name"],
|
|
1080
1143
|
minimal_config:
|
|
1081
|
-
'resource "xcsh_nat_policy" "example" {\n name = "example-nat-policy"\n namespace = "
|
|
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"
|
|
1153
|
+
required: ["name"],
|
|
1091
1154
|
minimal_config:
|
|
1092
|
-
'resource "xcsh_network_connector" "example" {\n name = "example-network-connector"\n namespace = "
|
|
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 = "
|
|
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"
|
|
1176
|
+
required: ["name"],
|
|
1114
1177
|
minimal_config:
|
|
1115
|
-
'resource "xcsh_network_interface" "example" {\n name = "example-network-interface"\n namespace = "
|
|
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"
|
|
1198
|
+
required: ["name"],
|
|
1136
1199
|
minimal_config:
|
|
1137
|
-
'resource "xcsh_network_policy_rule" "example" {\n name = "example-network-policy-rule"\n namespace = "
|
|
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"
|
|
1220
|
+
required: ["name"],
|
|
1158
1221
|
minimal_config:
|
|
1159
|
-
'resource "xcsh_nfv_service" "example" {\n name = "example-nfv-service"\n namespace = "
|
|
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"
|
|
1232
|
+
required: ["name"],
|
|
1170
1233
|
minimal_config:
|
|
1171
|
-
'resource "xcsh_nginx_service_discovery" "example" {\n name = "example-nginx-service-discovery"\n namespace = "
|
|
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 = "
|
|
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", "
|
|
1346
|
+
required: ["name", "provider_name"],
|
|
1283
1347
|
minimal_config:
|
|
1284
|
-
'resource "xcsh_secret_management_access" "example" {\n name = "example-secret-management-access"\n namespace = "
|
|
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", "
|
|
1357
|
+
required: ["name", "address", "volterra_certified_hw"],
|
|
1294
1358
|
minimal_config:
|
|
1295
|
-
'resource "xcsh_securemesh_site" "example" {\n name = "example-securemesh-site"\n namespace = "
|
|
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"
|
|
1368
|
+
required: ["name"],
|
|
1305
1369
|
minimal_config:
|
|
1306
|
-
'resource "xcsh_securemesh_site_v2" "example" {\n name = "example-securemesh-site-v2"\n namespace = "
|
|
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", "
|
|
1423
|
+
required: ["name", "site_type"],
|
|
1360
1424
|
minimal_config:
|
|
1361
|
-
'resource "xcsh_site" "example" {\n name = "example-site"\n namespace = "
|
|
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"
|
|
1434
|
+
required: ["name"],
|
|
1371
1435
|
minimal_config:
|
|
1372
|
-
'resource "xcsh_site_mesh_group" "example" {\n name = "example-site-mesh-group"\n namespace = "
|
|
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"
|
|
1485
|
+
required: ["name"],
|
|
1422
1486
|
minimal_config:
|
|
1423
|
-
'resource "xcsh_tenant_configuration" "example" {\n name = "example-tenant-configuration"\n namespace = "
|
|
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"
|
|
1529
|
+
required: ["name"],
|
|
1466
1530
|
minimal_config:
|
|
1467
|
-
'resource "xcsh_usb_policy" "example" {\n name = "example-usb-policy"\n namespace = "
|
|
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", "
|
|
1583
|
+
required: ["name", "legacy_type"],
|
|
1520
1584
|
minimal_config:
|
|
1521
|
-
'resource "xcsh_virtual_network" "example" {\n name = "example-virtual-network"\n namespace = "
|
|
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 = "
|
|
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", "
|
|
1605
|
+
required: ["name", "address", "volterra_certified_hw"],
|
|
1542
1606
|
minimal_config:
|
|
1543
|
-
'resource "xcsh_voltstack_site" "example" {\n name = "example-voltstack-site"\n namespace = "
|
|
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
|
-
|
|
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
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
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
|
-
|
|
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
|
|
2717
|
-
|
|
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
|
|
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
|
}
|
package/src/system-prompt.ts
CHANGED
|
@@ -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, {
|
|
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, {
|
|
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,
|