@calltelemetry/ct-lab-mcp 0.8.97 → 0.8.99

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.
Files changed (75) hide show
  1. package/README.md +22 -0
  2. package/assets/stig/SHA256SUMS +18 -0
  3. package/assets/stig/files/ct-luks-firstboot.service +13 -0
  4. package/assets/stig/files/ct-luks-firstboot.sh +35 -0
  5. package/assets/stig/guest/keyhash.sh +4 -0
  6. package/assets/stig/guest/read-recovery.sh +2 -0
  7. package/assets/stig/guest/scan-disa.sh +17 -0
  8. package/assets/stig/guest/scan.sh +22 -0
  9. package/assets/stig/guest/shred-recovery.sh +2 -0
  10. package/assets/stig/guest/test-recovery.sh +3 -0
  11. package/assets/stig/guest/trim.sh +3 -0
  12. package/assets/stig/guest/verify-root.sh +9 -0
  13. package/assets/stig/guest/verify-user.sh +9 -0
  14. package/assets/stig/ks.cfg.pkrtpl +95 -0
  15. package/assets/stig/scripts/assess.sh +39 -0
  16. package/assets/stig/scripts/errata.sh +19 -0
  17. package/assets/stig/scripts/remediate.sh +127 -0
  18. package/assets/stig/scripts/seal.sh +46 -0
  19. package/assets/stig/tailoring.xml +16 -0
  20. package/assets/stig/template.pkr.hcl +252 -0
  21. package/dist/src/credentials/index.d.ts +1 -0
  22. package/dist/src/credentials/index.d.ts.map +1 -1
  23. package/dist/src/credentials/index.js +1 -0
  24. package/dist/src/credentials/index.js.map +1 -1
  25. package/dist/src/credentials/remediation.d.ts +33 -0
  26. package/dist/src/credentials/remediation.d.ts.map +1 -0
  27. package/dist/src/credentials/remediation.js +105 -0
  28. package/dist/src/credentials/remediation.js.map +1 -0
  29. package/dist/src/generated-version.d.ts +1 -1
  30. package/dist/src/generated-version.js +1 -1
  31. package/dist/src/stig/live.d.ts +116 -0
  32. package/dist/src/stig/live.d.ts.map +1 -0
  33. package/dist/src/stig/live.js +339 -0
  34. package/dist/src/stig/live.js.map +1 -0
  35. package/dist/src/stig/model.d.ts +160 -0
  36. package/dist/src/stig/model.d.ts.map +1 -0
  37. package/dist/src/stig/model.js +384 -0
  38. package/dist/src/stig/model.js.map +1 -0
  39. package/dist/src/stig/ports.d.ts +149 -0
  40. package/dist/src/stig/ports.d.ts.map +1 -0
  41. package/dist/src/stig/ports.js +7 -0
  42. package/dist/src/stig/ports.js.map +1 -0
  43. package/dist/src/stig/receipt.d.ts +35 -0
  44. package/dist/src/stig/receipt.d.ts.map +1 -0
  45. package/dist/src/stig/receipt.js +112 -0
  46. package/dist/src/stig/receipt.js.map +1 -0
  47. package/dist/src/stig/runner.d.ts +109 -0
  48. package/dist/src/stig/runner.d.ts.map +1 -0
  49. package/dist/src/stig/runner.js +471 -0
  50. package/dist/src/stig/runner.js.map +1 -0
  51. package/dist/src/tools/appliance-claim-spec-schema.v1.json +1 -1
  52. package/dist/src/tools/appliance-claim-tools.d.ts +10 -4
  53. package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -1
  54. package/dist/src/tools/appliance-claim-tools.js +10 -2
  55. package/dist/src/tools/appliance-claim-tools.js.map +1 -1
  56. package/dist/src/tools/claim-creation-projection.d.ts +1 -1
  57. package/dist/src/tools/claim-creation-projection.js +1 -1
  58. package/dist/src/tools/claim-custody.d.ts +7 -7
  59. package/dist/src/tools/claimed-import-qcow.d.ts +2 -2
  60. package/dist/src/tools/credential-status.d.ts.map +1 -1
  61. package/dist/src/tools/credential-status.js +19 -0
  62. package/dist/src/tools/credential-status.js.map +1 -1
  63. package/dist/src/tools/host-maintenance-shutdown.d.ts +4 -4
  64. package/dist/src/tools/host-migrate-vm.d.ts +4 -4
  65. package/dist/src/tools/index.d.ts.map +1 -1
  66. package/dist/src/tools/index.js +6 -1
  67. package/dist/src/tools/index.js.map +1 -1
  68. package/dist/src/tools/purge-slots.d.ts +1 -1
  69. package/dist/src/tools/sandbox-tools.d.ts +8 -8
  70. package/dist/src/tools/stig-tools.d.ts +47 -0
  71. package/dist/src/tools/stig-tools.d.ts.map +1 -0
  72. package/dist/src/tools/stig-tools.js +125 -0
  73. package/dist/src/tools/stig-tools.js.map +1 -0
  74. package/dist/src/tools/vm-action.d.ts +2 -2
  75. package/package.json +2 -1
@@ -0,0 +1,252 @@
1
+ packer {
2
+ required_version = "= 1.16.0"
3
+ required_plugins {
4
+ proxmox = {
5
+ version = "= 1.2.4"
6
+ source = "github.com/hashicorp/proxmox"
7
+ }
8
+ }
9
+ }
10
+
11
+ variable "proxmox_url" { type = string }
12
+ variable "proxmox_username" { type = string }
13
+ variable "proxmox_token" {
14
+ type = string
15
+ sensitive = true
16
+ }
17
+ variable "proxmox_node" {
18
+ type = string
19
+ default = "minis"
20
+ }
21
+ variable "vm_id" { type = number }
22
+ variable "template_name" { type = string }
23
+ variable "disk_storage_pool" {
24
+ type = string
25
+ default = "local-lvm"
26
+ }
27
+ variable "bridge" {
28
+ type = string
29
+ default = "vmbr0"
30
+ }
31
+ variable "vlan_tag" {
32
+ type = string
33
+ default = "" # untagged lab network: VLAN126 has no internet egress/DNS, and the build needs RHSM errata
34
+ }
35
+ variable "disk_size" {
36
+ type = string
37
+ default = "128G"
38
+ }
39
+ variable "vcpus" {
40
+ type = number
41
+ default = 4
42
+ }
43
+ variable "memory_mb" {
44
+ type = number
45
+ default = 8192
46
+ }
47
+ variable "iso_file" {
48
+ type = string
49
+ default = "synology-cisco-isos:iso/rhel-8.10-x86_64-dvd.iso"
50
+ }
51
+
52
+ variable "ssh_username" {
53
+ type = string
54
+ default = "ctbuild"
55
+ }
56
+ variable "ssh_private_key_file" { type = string }
57
+ variable "ssh_public_key" { type = string }
58
+ variable "build_password" {
59
+ type = string
60
+ sensitive = true
61
+ }
62
+ variable "build_password_hash" {
63
+ type = string
64
+ sensitive = true
65
+ }
66
+ variable "grub_pbkdf2" {
67
+ type = string
68
+ sensitive = true
69
+ }
70
+
71
+ variable "luks_bootstrap" {
72
+ type = string
73
+ sensitive = true
74
+ }
75
+ variable "rhsm_org" {
76
+ type = string
77
+ sensitive = true
78
+ }
79
+ variable "rhsm_key" {
80
+ type = string
81
+ sensitive = true
82
+ }
83
+ variable "dns_servers" {
84
+ type = string
85
+ default = "192.168.126.1,192.168.68.125"
86
+ }
87
+ variable "ntp_servers" {
88
+ type = string
89
+ default = "0.rhel.pool.ntp.org,1.rhel.pool.ntp.org"
90
+ }
91
+ variable "tailoring_file" { type = string }
92
+
93
+ variable "ssg_datastream" { type = string }
94
+ variable "ssg_datastream_sha256" {
95
+ type = string
96
+ default = "82592d3cff74a82ce652a65ba67cd755cf57550269798d4c449c2069417c1028"
97
+ }
98
+ variable "evidence_dir" { type = string }
99
+
100
+ locals {
101
+ sudo = "echo '${var.build_password}' | sudo -S -p '' env {{ .Vars }} bash '{{ .Path }}'"
102
+ }
103
+
104
+ source "proxmox-iso" "rhel810_stig" {
105
+ proxmox_url = var.proxmox_url
106
+ username = var.proxmox_username
107
+ token = var.proxmox_token
108
+ insecure_skip_tls_verify = true # lab self-signed PVE certificate
109
+ node = var.proxmox_node
110
+ vm_id = var.vm_id
111
+ vm_name = var.template_name
112
+ template_name = var.template_name
113
+ template_description = "RHEL 8.10 DISA STIG template. SSG 0.1.82 / RHEL 8 STIG V2R8. Built ${timestamp()}. LUKS2 PV with template bootstrap key; each clone re-encrypts and binds its own TPM2 at first boot."
114
+ tags = "rhel8-stig-template;ssg-0-1-82;stig-v2r8"
115
+ os = "l26"
116
+ machine = "q35"
117
+ bios = "ovmf"
118
+ cpu_type = "host"
119
+ cores = var.vcpus
120
+ memory = var.memory_mb
121
+ qemu_agent = true
122
+ scsi_controller = "virtio-scsi-single"
123
+ boot = "order=scsi0;ide2;net0"
124
+ onboot = false
125
+
126
+ efi_config {
127
+ efi_storage_pool = var.disk_storage_pool
128
+ efi_type = "4m"
129
+ pre_enrolled_keys = true
130
+ }
131
+
132
+ boot_iso {
133
+ type = "ide"
134
+ index = "2"
135
+ iso_file = var.iso_file
136
+ iso_checksum = "sha256:9b3c8e31bc2cdd2de9cf96abb3726347f5840ff3b176270647b3e66639af291b"
137
+ unmount = true
138
+ }
139
+
140
+ additional_iso_files {
141
+ type = "ide"
142
+ index = "3"
143
+ iso_storage_pool = "local"
144
+ cd_label = "OEMDRV"
145
+ cd_content = {
146
+ "ks.cfg" = templatefile("${path.root}/ks.cfg.pkrtpl", {
147
+ hostname = var.template_name
148
+ ssh_username = var.ssh_username
149
+ ssh_public_key = trimspace(var.ssh_public_key)
150
+ build_password_hash = var.build_password_hash
151
+ grub_pbkdf2 = var.grub_pbkdf2
152
+ luks_bootstrap = var.luks_bootstrap
153
+ })
154
+ }
155
+ unmount = true
156
+ keep_cdrom_device = false
157
+ }
158
+
159
+ disks {
160
+ type = "scsi"
161
+ storage_pool = var.disk_storage_pool
162
+ disk_size = var.disk_size
163
+ discard = true
164
+ io_thread = true
165
+ }
166
+
167
+ network_adapters {
168
+ model = "virtio"
169
+ bridge = var.bridge
170
+ vlan_tag = var.vlan_tag
171
+ }
172
+
173
+ cloud_init = true
174
+ cloud_init_storage_pool = var.disk_storage_pool
175
+
176
+ boot_wait = "3m15s" # OVMF reaches the DVD GRUB menu ~3m after power-on on minis
177
+ boot_command = [
178
+ "<up><wait>e<wait><down><down><end>",
179
+ " fips=1 inst.text inst.ks=hd:LABEL=OEMDRV:/ks.cfg",
180
+ "<leftCtrlOn>x<leftCtrlOff>",
181
+ ]
182
+
183
+ communicator = "ssh"
184
+ ssh_username = var.ssh_username
185
+ ssh_private_key_file = var.ssh_private_key_file
186
+ ssh_timeout = "75m"
187
+ }
188
+
189
+ build {
190
+ name = "rhel810-stig-template"
191
+ sources = ["source.proxmox-iso.rhel810_stig"]
192
+
193
+ provisioner "file" {
194
+ source = var.ssg_datastream
195
+ destination = "/home/${var.ssh_username}/ssg-rhel8-ds.xml"
196
+ }
197
+ provisioner "file" {
198
+ source = var.tailoring_file
199
+ destination = "/home/${var.ssh_username}/tailoring.xml"
200
+ }
201
+ provisioner "file" {
202
+ source = "${path.root}/files"
203
+ destination = "/home/${var.ssh_username}/"
204
+ }
205
+
206
+ # Current errata through RHSM, then reboot into the updated kernel.
207
+ provisioner "shell" {
208
+ execute_command = local.sudo
209
+ environment_vars = [
210
+ "RHSM_ORG=${var.rhsm_org}",
211
+ "RHSM_KEY=${var.rhsm_key}",
212
+ ]
213
+ scripts = ["${path.root}/scripts/errata.sh"]
214
+ expect_disconnect = true
215
+ }
216
+
217
+ # Organization settings + pinned SSG STIG remediation, then reboot.
218
+ provisioner "shell" {
219
+ pause_before = "90s"
220
+ execute_command = local.sudo
221
+ environment_vars = [
222
+ "SSG_DATASTREAM=/home/${var.ssh_username}/ssg-rhel8-ds.xml",
223
+ "SSG_DATASTREAM_SHA256=${var.ssg_datastream_sha256}",
224
+ "TAILORING=/home/${var.ssh_username}/tailoring.xml",
225
+ "FILES_DIR=/home/${var.ssh_username}/files",
226
+ "BUILD_USER=${var.ssh_username}",
227
+ "DNS_SERVERS=${var.dns_servers}",
228
+ "NTP_SERVERS=${var.ntp_servers}",
229
+ ]
230
+ scripts = ["${path.root}/scripts/remediate.sh"]
231
+ expect_disconnect = true
232
+ }
233
+
234
+ provisioner "shell" {
235
+ pause_before = "90s"
236
+ execute_command = local.sudo
237
+ environment_vars = ["BUILD_USER=${var.ssh_username}"]
238
+ scripts = ["${path.root}/scripts/assess.sh"]
239
+ }
240
+
241
+ provisioner "file" {
242
+ direction = "download"
243
+ source = "/home/${var.ssh_username}/stig-report/"
244
+ destination = "${var.evidence_dir}/"
245
+ }
246
+
247
+ provisioner "shell" {
248
+ execute_command = local.sudo
249
+ environment_vars = ["BUILD_USER=${var.ssh_username}"]
250
+ scripts = ["${path.root}/scripts/seal.sh"]
251
+ }
252
+ }
@@ -1,4 +1,5 @@
1
1
  export * from "./types.js";
2
2
  export * from "./doppler.js";
3
3
  export * from "./resolver.js";
4
+ export * from "./remediation.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/credentials/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/credentials/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from "./types.js";
2
2
  export * from "./doppler.js";
3
3
  export * from "./resolver.js";
4
+ export * from "./remediation.js";
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/credentials/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/credentials/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Actionable credential remediation for credential_status and the
3
+ * CREDENTIALS_UNAVAILABLE gate.
4
+ *
5
+ * The resolver's own `remediation` string is generic (and leads with mock
6
+ * mode). In a governed local-stdio install the failure is almost always the
7
+ * same: the harness that spawned this process never injected the lab
8
+ * variables, and the governed runtime wrapper strips DOPPLER_TOKEN so the
9
+ * Tier-2 Doppler path is unreachable. This module inspects which variable
10
+ * groups the process actually received (names only, never values) and says
11
+ * exactly what to change.
12
+ */
13
+ import type { CredentialResolutionError } from "./errors.js";
14
+ export interface CredentialGroupStatus {
15
+ group: "proxmox-lab" | "proxmox-mini" | "appliance-ssh";
16
+ present: boolean;
17
+ /** Variable names that satisfy this group (name-only; never values). */
18
+ needs: string;
19
+ }
20
+ export interface CredentialRemediation {
21
+ /** One sentence naming the concrete gap; safe to embed in an error. */
22
+ headline: string;
23
+ /** Ordered, copy-pasteable steps. Never contains a secret value. */
24
+ steps: string[];
25
+ /** Which variable groups the aggregate resolver found in this process. */
26
+ inspected: CredentialGroupStatus[];
27
+ dopplerTokenInProcess: boolean;
28
+ }
29
+ type Env = Record<string, string | undefined>;
30
+ export declare function inspectCredentialEnvironment(env?: Env): CredentialGroupStatus[];
31
+ export declare function buildCredentialRemediation(error: Pick<CredentialResolutionError, "reason" | "missing" | "message"> | undefined, env?: Env): CredentialRemediation;
32
+ export {};
33
+ //# sourceMappingURL=remediation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remediation.d.ts","sourceRoot":"","sources":["../../../src/credentials/remediation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,eAAe,CAAC;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0EAA0E;IAC1E,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAe9C,wBAAgB,4BAA4B,CAAC,GAAG,GAAE,GAAiB,GAAG,qBAAqB,EAAE,CAqB5F;AAcD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,IAAI,CAAC,yBAAyB,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG,SAAS,EACpF,GAAG,GAAE,GAAiB,GACrB,qBAAqB,CAqEvB"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Actionable credential remediation for credential_status and the
3
+ * CREDENTIALS_UNAVAILABLE gate.
4
+ *
5
+ * The resolver's own `remediation` string is generic (and leads with mock
6
+ * mode). In a governed local-stdio install the failure is almost always the
7
+ * same: the harness that spawned this process never injected the lab
8
+ * variables, and the governed runtime wrapper strips DOPPLER_TOKEN so the
9
+ * Tier-2 Doppler path is unreachable. This module inspects which variable
10
+ * groups the process actually received (names only, never values) and says
11
+ * exactly what to change.
12
+ */
13
+ const set = (env, key) => typeof env[key] === "string" && env[key].length > 0;
14
+ const anySet = (env, keys) => keys.some((key) => set(env, key));
15
+ function proxmoxGroupPresent(env, prefix) {
16
+ const endpoint = anySet(env, [`${prefix}URL`, `${prefix}BASE_URL`, `${prefix}HOST`, `${prefix}IP`]);
17
+ const auth = set(env, `${prefix}API_TOKEN`) ||
18
+ (anySet(env, [`${prefix}TOKEN_ID`, `${prefix}API_TOKEN_ID`]) &&
19
+ anySet(env, [`${prefix}TOKEN_SECRET`, `${prefix}API_TOKEN_SECRET`])) ||
20
+ (anySet(env, [`${prefix}USERNAME`, `${prefix}USER`]) && anySet(env, [`${prefix}PASSWORD`, `${prefix}PASS`]));
21
+ return endpoint && auth;
22
+ }
23
+ export function inspectCredentialEnvironment(env = process.env) {
24
+ return [
25
+ {
26
+ group: "proxmox-lab",
27
+ present: proxmoxGroupPresent(env, "LAB_PROXMOX_"),
28
+ needs: "LAB_PROXMOX_URL (or _HOST) + LAB_PROXMOX_API_TOKEN (or _USERNAME/_PASSWORD)",
29
+ },
30
+ {
31
+ group: "proxmox-mini",
32
+ present: proxmoxGroupPresent(env, "LAB_PROXMOX_MINIS_") || proxmoxGroupPresent(env, "LAB_PROXMOX_MINI_"),
33
+ needs: "LAB_PROXMOX_MINIS_URL (or _HOST) + LAB_PROXMOX_MINIS_API_TOKEN (or _USERNAME/_PASSWORD)",
34
+ },
35
+ {
36
+ group: "appliance-ssh",
37
+ present: anySet(env, ["LAB_VM_CREDENTIALS", "VM_CREDENTIALS"]) ||
38
+ (anySet(env, ["LAB_VM_CREDENTIALS_USERNAME", "LAB_VM_CREDENTIALS_USER", "LAB_VM_USER", "VM_USER"]) &&
39
+ anySet(env, ["LAB_VM_CREDENTIALS_PASSWORD", "LAB_VM_CREDENTIALS_PASS", "LAB_VM_PASS", "VM_PASS"])),
40
+ needs: "LAB_VM_CREDENTIALS (JSON or user:pass) or LAB_VM_CREDENTIALS_USERNAME + LAB_VM_CREDENTIALS_PASSWORD",
41
+ },
42
+ ];
43
+ }
44
+ const CANONICAL_ALTERNATIVE = "Reads that do not need this aggregate bundle: list_hosts and list_inventory (target-scoped credentials via the " +
45
+ "canonical lab-inventory CLI), the ApplianceClaim tools, and `lab-inventory` itself. Legacy tools such as " +
46
+ "list_slots stay blocked with CREDENTIALS_UNAVAILABLE until the bundle resolves; do not inject unrelated hosts' " +
47
+ "credentials just to unblock one VM.";
48
+ const VERIFY_STEP = "Reload the server (manage_mcp_server reload, or restart the harness) and call credential_status again: the " +
49
+ "tier should read direct_env or doppler_api and the legacy aggregate source resolved. A host listed here as " +
50
+ "reachable is the only evidence the credentials work; mock mode (CT_LAB_MCP_ALLOW_MOCK=1) is for offline tests " +
51
+ "and its results are not evidence.";
52
+ export function buildCredentialRemediation(error, env = process.env) {
53
+ const inspected = inspectCredentialEnvironment(env);
54
+ const missingGroups = inspected.filter((g) => !g.present);
55
+ const dopplerTokenInProcess = set(env, "DOPPLER_TOKEN");
56
+ const reason = error?.reason ?? "no_credentials_found";
57
+ const steps = [];
58
+ const injectSteps = () => [
59
+ "Confirm the source has the values (names only; never print values): " +
60
+ "`doppler secrets --only-names --project ai-workspace --config dev | grep -E 'LAB_PROXMOX|LAB_VM_CREDENTIALS'`.",
61
+ "Inject them into this process from the parent, because it only sees the environment its harness gave it " +
62
+ "(DOPPLER_PROJECT/DOPPLER_CONFIG are not credentials). Either add `env` refs to the ct-lab entry of the " +
63
+ "harness MCP config, e.g. `\"LAB_PROXMOX_URL\": \"doppler://ai-workspace/dev/LAB_PROXMOX_URL\"` for each " +
64
+ "variable below, which the governed runtime wrapper (tools/mcp-runtime-exec.mjs) resolves through the " +
65
+ "Doppler CLI without a login prompt, or start the harness itself under " +
66
+ "`doppler run --project ai-workspace --config dev --`.",
67
+ dopplerTokenInProcess
68
+ ? "DOPPLER_TOKEN is present in this process, so the Tier-2 Doppler API path was attempted; check the " +
69
+ "`doppler_unreachable` / `partial_credentials` detail above instead of the injection steps."
70
+ : "A DOPPLER_TOKEN exported in the harness is not enough: the governed runtime wrapper strips it before " +
71
+ "spawning this server (by design), so the Doppler API tier is unreachable here. Use the env refs above.",
72
+ ];
73
+ if (reason === "doppler_unreachable") {
74
+ steps.push("The Doppler API tier was attempted and failed. Check that DOPPLER_TOKEN is a valid config-scoped token for " +
75
+ "DOPPLER_PROJECT/DOPPLER_CONFIG (not expired or revoked) and that api.doppler.com is reachable.", "The fetch is bounded by CT_LAB_MCP_RESOLVE_TIMEOUT_MS (default 8000, 250-30000); raise it only for a slow link.", "Or bypass Doppler by injecting the variables directly (see the groups below).");
76
+ }
77
+ else if (reason === "partial_credentials") {
78
+ steps.push(`The aggregate resolver found some but not all required groups; still missing: ${(error?.missing.length ? error.missing : missingGroups.map((g) => g.group)).join(", ") || "unknown"}.`, ...injectSteps().slice(1));
79
+ }
80
+ else {
81
+ steps.push(...injectSteps());
82
+ }
83
+ if (missingGroups.length > 0) {
84
+ steps.push("Variable groups still missing from this process: " +
85
+ missingGroups.map((g) => `${g.group} (${g.needs})`).join("; ") +
86
+ ".");
87
+ }
88
+ if (missingGroups.some((g) => g.group === "appliance-ssh")) {
89
+ steps.push("Note: the aggregate resolver reads one shared appliance login (LAB_VM_CREDENTIALS or the _USERNAME/_PASSWORD " +
90
+ "pair). Per-VM `LAB_VM_CREDENTIALS_<UUID>` secrets are consumed only by the canonical CLI and do not satisfy " +
91
+ "it; if the secret store has no shared entry the aggregate bundle cannot resolve from it.");
92
+ }
93
+ steps.push(CANONICAL_ALTERNATIVE, VERIFY_STEP);
94
+ const groupSummary = missingGroups.length
95
+ ? `no ${missingGroups.map((g) => g.group).join(", ")} variables reached this process`
96
+ : "the expected variables are present but did not resolve";
97
+ const headline = reason === "doppler_unreachable"
98
+ ? "The Doppler API tier failed; fix the token/connectivity or inject LAB_* variables directly."
99
+ : `Aggregate lab credentials unavailable: ${groupSummary}. Inject LAB_PROXMOX_*, LAB_PROXMOX_MINIS_* and ` +
100
+ "LAB_VM_CREDENTIALS from the parent (doppler:// env refs in the MCP config, or run the harness under " +
101
+ "`doppler run`); credential_status lists the exact steps. list_hosts/list_inventory and claim tools do " +
102
+ "not need this bundle.";
103
+ return { headline, steps, inspected, dopplerTokenInProcess };
104
+ }
105
+ //# sourceMappingURL=remediation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remediation.js","sourceRoot":"","sources":["../../../src/credentials/remediation.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@
2
2
  * Auto-synced package version fallback for non-filesystem runtimes (Cloudflare Workers).
3
3
  * Updated automatically during release publication in .github/workflows/publish.yml.
4
4
  */
5
- export declare const PACKAGE_VERSION = "0.8.97";
5
+ export declare const PACKAGE_VERSION = "0.8.99";
6
6
  //# sourceMappingURL=generated-version.d.ts.map
@@ -2,5 +2,5 @@
2
2
  * Auto-synced package version fallback for non-filesystem runtimes (Cloudflare Workers).
3
3
  * Updated automatically during release publication in .github/workflows/publish.yml.
4
4
  */
5
- export const PACKAGE_VERSION = "0.8.97";
5
+ export const PACKAGE_VERSION = "0.8.99";
6
6
  //# sourceMappingURL=generated-version.js.map
@@ -0,0 +1,116 @@
1
+ import type { BuildMaterial, ClaimPort, ClaimRecord, GuestShell, Materials, PackerPort, PveShell, RunOpts, SecretStore, ShellResult, StigDeps, StigProvider } from "./ports.js";
2
+ /** assets/stig next to dist/src/stig (published) or next to src/stig (dev). */
3
+ export declare function defaultAssetsDir(): string;
4
+ export declare class SshPveShell implements PveShell {
5
+ private readonly host;
6
+ private readonly user;
7
+ constructor(host?: string, user?: string);
8
+ run(script: string, opts?: RunOpts): Promise<ShellResult>;
9
+ }
10
+ export declare class SshGuestShell implements GuestShell {
11
+ private user;
12
+ private keyFile;
13
+ private known;
14
+ private ip;
15
+ configure(cfg: {
16
+ user: string;
17
+ keyFile: string;
18
+ knownHostsFile: string;
19
+ }): void;
20
+ setTarget(ip: string): void;
21
+ private opts;
22
+ private ssh;
23
+ runScript(script: string, o?: {
24
+ sudo?: boolean;
25
+ stdin?: string;
26
+ timeoutMs?: number;
27
+ }): Promise<ShellResult>;
28
+ waitSsh(hostKey: "accept-new" | "yes", tries: number, intervalMs?: number): Promise<boolean>;
29
+ fileExists(path: string): Promise<boolean>;
30
+ fetchDir(remote: string, localDir: string): Promise<void>;
31
+ }
32
+ export declare class DopplerSecrets implements SecretStore {
33
+ private readonly project;
34
+ private readonly config;
35
+ constructor(project?: string, config?: string);
36
+ get(name: string): Promise<string | undefined>;
37
+ set(name: string, value: string): Promise<void>;
38
+ }
39
+ export declare class LabClaims implements ClaimPort {
40
+ private readonly ns;
41
+ private text;
42
+ list(): Promise<ClaimRecord[]>;
43
+ get(name: string): Promise<ClaimRecord | null>;
44
+ create(a: {
45
+ name: string;
46
+ vmid: number;
47
+ vmName: string;
48
+ ttlHours: number;
49
+ stig: Record<string, unknown>;
50
+ }): Promise<ClaimRecord>;
51
+ waitReady(name: string): Promise<ClaimRecord>;
52
+ annotate(name: string, annotations: Record<string, string>): Promise<void>;
53
+ renew(name: string, extendHours: number): Promise<{
54
+ ttlHours: number;
55
+ }>;
56
+ pause(name: string, paused: boolean, reason?: string): Promise<void>;
57
+ delete(name: string, expectedUid: string): Promise<void>;
58
+ }
59
+ export declare class PackerCli implements PackerPort {
60
+ private readonly cwd;
61
+ private readonly pluginPath;
62
+ constructor(cwd: string, pluginPath?: string | undefined);
63
+ version(): Promise<string>;
64
+ build(a: {
65
+ vars: Record<string, string>;
66
+ env: Record<string, string>;
67
+ logFile: string;
68
+ }): Promise<number>;
69
+ }
70
+ export declare class NodeMaterials implements Materials {
71
+ private openssl;
72
+ randomAlnum(length: number): string;
73
+ sha512Crypt(plain: string): Promise<string>;
74
+ sshKeypair(dir: string, label: string): Promise<{
75
+ privateKeyFile: string;
76
+ publicKey: string;
77
+ }>;
78
+ buildMaterial(runDir: string, label: string): Promise<BuildMaterial>;
79
+ }
80
+ /**
81
+ * Canonical provider: the `lab-inventory stig` verbs (plan, then apply with the plan digest). Secrets travel in 0600
82
+ * files inside a private temp directory that is removed afterwards; argv carries only public values.
83
+ */
84
+ export declare class CliStigProvider implements StigProvider {
85
+ private readonly cli;
86
+ private readonly exec;
87
+ private readonly tmpRoot;
88
+ constructor(cli: string, exec?: (file: string, args: string[], o?: RunOpts) => Promise<ShellResult>, tmpRoot?: string);
89
+ private call;
90
+ clone(a: {
91
+ operationId: string;
92
+ name: string;
93
+ templateName: string;
94
+ vmid: number;
95
+ claimedVmids: number[];
96
+ sshPublicKey: string;
97
+ passwordHash: string;
98
+ dns: string[];
99
+ }): Promise<{
100
+ vmid: number;
101
+ }>;
102
+ destroyTemplate(a: {
103
+ operationId: string;
104
+ name: string;
105
+ vmid: number;
106
+ }): Promise<void>;
107
+ guestIp(vmid: number): Promise<string>;
108
+ }
109
+ export declare function defaultRunDir(): string;
110
+ /** The lab-inventory CLI path when the canonical bridge is configured (CT_LAB_CANONICAL_CLI). */
111
+ export declare function canonicalCli(env?: NodeJS.ProcessEnv): string | undefined;
112
+ export declare function liveDeps(opts?: {
113
+ baseDir?: string;
114
+ log?: (line: string) => void;
115
+ }): StigDeps;
116
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../../src/stig/live.ts"],"names":[],"mappings":"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"}