@calltelemetry/ct-lab-mcp 0.8.38 → 0.8.39
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.
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { CanonicalCommandResult } from "../canonical/types.js";
|
|
2
|
+
/** Trusted composition input, never an MCP argument or an alternate catalog. */
|
|
3
|
+
export interface CanonicalHostReader {
|
|
4
|
+
readonly isConfigured: boolean;
|
|
5
|
+
run(args: string[], timeoutMsOverride?: number): Promise<CanonicalCommandResult>;
|
|
6
|
+
}
|
|
7
|
+
export type HostResolutionCode = "HOST_ASSET_ID_INVALID" | "HOST_INVENTORY_UNAVAILABLE" | "HOST_INVENTORY_FAILED" | "HOST_INVENTORY_INVALID" | "HOST_ASSET_UNKNOWN" | "HOST_ASSET_INELIGIBLE" | "HOST_BINDING_MISSING" | "HOST_BINDING_INVALID" | "HOST_IDENTITY_MISMATCH";
|
|
8
|
+
export declare class HostResolutionError extends Error {
|
|
9
|
+
readonly code: HostResolutionCode;
|
|
10
|
+
constructor(code: HostResolutionCode);
|
|
11
|
+
}
|
|
12
|
+
/** Internal selection evidence, NOT a live identity check or permission grant. */
|
|
13
|
+
export interface ResolvedHostBinding {
|
|
14
|
+
readonly scope: "inventory_binding_not_live_identity_or_authorization";
|
|
15
|
+
readonly assetId: string;
|
|
16
|
+
readonly machineId: string;
|
|
17
|
+
readonly tailnetHostname: string;
|
|
18
|
+
readonly remoteUser: string;
|
|
19
|
+
readonly sshHostKeySha256: string;
|
|
20
|
+
readonly capabilityClass: "lab-admin" | "worker";
|
|
21
|
+
/** Digest reported by the canonical reader; not independently attested here. */
|
|
22
|
+
readonly inventorySha256: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Inert resolver behind the existing canonical bridge. No SSH, secret lookup,
|
|
26
|
+
* fallback IP/alias, MCP registration, caching, or automatic host enrollment.
|
|
27
|
+
* Only reviewed canonical relationships.host_transport metadata may select a
|
|
28
|
+
* destination. The subsequent transport must independently verify live host
|
|
29
|
+
* identity and enforce caller/action authorization.
|
|
30
|
+
*/
|
|
31
|
+
export declare class InventoryHostResolver {
|
|
32
|
+
private readonly canonical;
|
|
33
|
+
constructor(canonical: CanonicalHostReader);
|
|
34
|
+
resolve(assetId: unknown): Promise<Readonly<ResolvedHostBinding>>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/host/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAClF;AAED,MAAM,MAAM,kBAAkB,GAC1B,uBAAuB,GACvB,4BAA4B,GAC5B,uBAAuB,GACvB,wBAAwB,GACxB,oBAAoB,GACpB,uBAAuB,GACvB,sBAAsB,GACtB,sBAAsB,GACtB,wBAAwB,CAAC;AAE7B,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,IAAI,EAAE,kBAAkB;gBAAxB,IAAI,EAAE,kBAAkB;CAK9C;AAED,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,sDAAsD,CAAC;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjD,gFAAgF;IAChF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AA+DD;;;;;;GAMG;AACH,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,mBAAmB;IAErD,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;CAsDxE"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
export class HostResolutionError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code) {
|
|
4
|
+
// Never attach caller input, canonical stdout/stderr, or the original cause.
|
|
5
|
+
super(code);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "HostResolutionError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const MAX_INVENTORY_BYTES = 4 * 1024 * 1024;
|
|
11
|
+
const MAX_ASSETS = 10_000;
|
|
12
|
+
const READ_TIMEOUT_MS = 10_000;
|
|
13
|
+
const ASSET_ID = /^[a-z][a-z0-9_-]{0,127}$/;
|
|
14
|
+
const CATALOG_ID = /^[a-z0-9][a-z0-9._-]{0,255}$/;
|
|
15
|
+
const MACHINE_ID = /^(?!0{32}$)[a-f0-9]{32}$/;
|
|
16
|
+
const SHA256 = /^[a-f0-9]{64}$/;
|
|
17
|
+
const DNS_LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
|
|
18
|
+
const TAILNET = /^tail[a-z0-9]{1,59}\.ts\.net$/;
|
|
19
|
+
const REMOTE_USER = /^[a-z_][a-z0-9_-]{0,31}$/;
|
|
20
|
+
const BINDING_KEYS = [
|
|
21
|
+
"schema", "status", "asset_id", "machine_id", "tailnet", "hostname",
|
|
22
|
+
"remote_user", "ssh_host_key_sha256", "capability_class",
|
|
23
|
+
];
|
|
24
|
+
const VM_KEYS = ["host_asset_id", "vmid", "proxmox_vmid", "smbios_uuid", "instance_uuid", "esxi_vm_path"];
|
|
25
|
+
function record(value) {
|
|
26
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
function requireThat(ok, code) {
|
|
29
|
+
if (!ok)
|
|
30
|
+
throw new HostResolutionError(code);
|
|
31
|
+
}
|
|
32
|
+
function matches(value, pattern) {
|
|
33
|
+
return typeof value === "string" && !/[\r\n]/.test(value) && pattern.test(value);
|
|
34
|
+
}
|
|
35
|
+
function exactKeys(value, keys) {
|
|
36
|
+
return Object.keys(value).length === keys.length && keys.every(key => Object.hasOwn(value, key));
|
|
37
|
+
}
|
|
38
|
+
function fingerprint(value) {
|
|
39
|
+
if (typeof value !== "string" || !/^SHA256:[A-Za-z0-9+/]{43}$/.test(value))
|
|
40
|
+
return false;
|
|
41
|
+
const bytes = Buffer.from(value.slice(7), "base64");
|
|
42
|
+
return bytes.length === 32 && bytes.toString("base64").replace(/=+$/, "") === value.slice(7);
|
|
43
|
+
}
|
|
44
|
+
function inventory(stdout) {
|
|
45
|
+
requireThat(typeof stdout === "string" && Buffer.byteLength(stdout, "utf8") <= MAX_INVENTORY_BYTES, "HOST_INVENTORY_INVALID");
|
|
46
|
+
let payload;
|
|
47
|
+
try {
|
|
48
|
+
payload = JSON.parse(stdout);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw new HostResolutionError("HOST_INVENTORY_INVALID");
|
|
52
|
+
}
|
|
53
|
+
// This is the existing canonical `all --full` envelope, not `show` (which
|
|
54
|
+
// selects the first match and cannot establish the absence of duplicate IDs).
|
|
55
|
+
requireThat(record(payload) && exactKeys(payload, ["inventory_path", "inventory_sha256", "asset_count", "assets"]), "HOST_INVENTORY_INVALID");
|
|
56
|
+
requireThat(typeof payload.inventory_path === "string" && payload.inventory_path.length > 0
|
|
57
|
+
&& matches(payload.inventory_sha256, SHA256), "HOST_INVENTORY_INVALID");
|
|
58
|
+
requireThat(Array.isArray(payload.assets) && payload.assets.length <= MAX_ASSETS
|
|
59
|
+
&& Number.isInteger(payload.asset_count) && payload.asset_count === payload.assets.length, "HOST_INVENTORY_INVALID");
|
|
60
|
+
const ids = new Set();
|
|
61
|
+
const assets = [];
|
|
62
|
+
for (const asset of payload.assets) {
|
|
63
|
+
requireThat(record(asset) && matches(asset.id, CATALOG_ID) && !ids.has(asset.id), "HOST_INVENTORY_INVALID");
|
|
64
|
+
ids.add(asset.id);
|
|
65
|
+
assets.push(asset);
|
|
66
|
+
}
|
|
67
|
+
return { assets, digest: payload.inventory_sha256 };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Inert resolver behind the existing canonical bridge. No SSH, secret lookup,
|
|
71
|
+
* fallback IP/alias, MCP registration, caching, or automatic host enrollment.
|
|
72
|
+
* Only reviewed canonical relationships.host_transport metadata may select a
|
|
73
|
+
* destination. The subsequent transport must independently verify live host
|
|
74
|
+
* identity and enforce caller/action authorization.
|
|
75
|
+
*/
|
|
76
|
+
export class InventoryHostResolver {
|
|
77
|
+
canonical;
|
|
78
|
+
constructor(canonical) {
|
|
79
|
+
this.canonical = canonical;
|
|
80
|
+
}
|
|
81
|
+
async resolve(assetId) {
|
|
82
|
+
// Do not normalize identifiers: case folding or trimming changes authority.
|
|
83
|
+
requireThat(matches(assetId, ASSET_ID), "HOST_ASSET_ID_INVALID");
|
|
84
|
+
requireThat(this.canonical.isConfigured === true, "HOST_INVENTORY_UNAVAILABLE");
|
|
85
|
+
let result;
|
|
86
|
+
try {
|
|
87
|
+
result = await this.canonical.run(["all", "--full"], READ_TIMEOUT_MS);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw new HostResolutionError("HOST_INVENTORY_UNAVAILABLE");
|
|
91
|
+
}
|
|
92
|
+
requireThat(record(result) && result.exitCode === 0 && result.signalCode === undefined
|
|
93
|
+
&& (result.timedOut === undefined || result.timedOut === false), "HOST_INVENTORY_FAILED");
|
|
94
|
+
const { assets, digest } = inventory(result.stdout);
|
|
95
|
+
const asset = assets.find(candidate => candidate.id === assetId);
|
|
96
|
+
requireThat(asset, "HOST_ASSET_UNKNOWN");
|
|
97
|
+
// First slice admits only persistent Linux physical hosts. Protected
|
|
98
|
+
// fixtures, hypervisors and guests remain with their existing authorities.
|
|
99
|
+
requireThat(asset.type === "physical-host" && asset.platform === "linux"
|
|
100
|
+
&& asset.lifecycle === "persistent" && !Object.hasOwn(asset, "host"), "HOST_ASSET_INELIGIBLE");
|
|
101
|
+
requireThat(record(asset.relationships), "HOST_BINDING_MISSING");
|
|
102
|
+
const relationships = asset.relationships;
|
|
103
|
+
requireThat(!VM_KEYS.some(key => Object.hasOwn(relationships, key)), "HOST_ASSET_INELIGIBLE");
|
|
104
|
+
requireThat(Object.hasOwn(relationships, "host_transport"), "HOST_BINDING_MISSING");
|
|
105
|
+
const binding = relationships.host_transport;
|
|
106
|
+
requireThat(record(binding) && exactKeys(binding, BINDING_KEYS)
|
|
107
|
+
&& binding.schema === "ct-lab-host-transport/v1" && binding.status === "approved", "HOST_BINDING_INVALID");
|
|
108
|
+
requireThat(matches(relationships.machine_id, MACHINE_ID) && matches(binding.machine_id, MACHINE_ID)
|
|
109
|
+
&& binding.asset_id === assetId && binding.machine_id === relationships.machine_id, "HOST_IDENTITY_MISMATCH");
|
|
110
|
+
requireThat(matches(binding.tailnet, TAILNET) && typeof binding.hostname === "string", "HOST_BINDING_INVALID");
|
|
111
|
+
const suffix = `.${binding.tailnet}`;
|
|
112
|
+
requireThat(binding.hostname.endsWith(suffix)
|
|
113
|
+
&& matches(binding.hostname.slice(0, -suffix.length), DNS_LABEL)
|
|
114
|
+
&& matches(binding.remote_user, REMOTE_USER) && fingerprint(binding.ssh_host_key_sha256)
|
|
115
|
+
&& (binding.capability_class === "lab-admin" || binding.capability_class === "worker"), "HOST_BINDING_INVALID");
|
|
116
|
+
// Two durable IDs must not silently authorize the same machine/destination.
|
|
117
|
+
requireThat(!assets.some(other => {
|
|
118
|
+
if (other === asset || !record(other.relationships))
|
|
119
|
+
return false;
|
|
120
|
+
const otherBinding = other.relationships.host_transport;
|
|
121
|
+
return other.relationships.machine_id === binding.machine_id
|
|
122
|
+
|| (record(otherBinding) && (otherBinding.machine_id === binding.machine_id
|
|
123
|
+
|| otherBinding.hostname === binding.hostname));
|
|
124
|
+
}), "HOST_IDENTITY_MISMATCH");
|
|
125
|
+
return Object.freeze({
|
|
126
|
+
scope: "inventory_binding_not_live_identity_or_authorization",
|
|
127
|
+
assetId,
|
|
128
|
+
machineId: binding.machine_id,
|
|
129
|
+
tailnetHostname: binding.hostname,
|
|
130
|
+
remoteUser: binding.remote_user,
|
|
131
|
+
sshHostKeySha256: binding.ssh_host_key_sha256,
|
|
132
|
+
capabilityClass: binding.capability_class,
|
|
133
|
+
inventorySha256: digest,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/host/resolver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@calltelemetry/ct-lab-mcp",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.39",
|
|
4
4
|
"description": "Expanded Model Context Protocol (MCP) server for Call Telemetry lab, fleet, and appliance management across Proxmox VE and VMware ESXi.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|