@intutic/shared-types 2.2.0 → 2.4.0
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/dist/anomaly.d.ts +6 -10
- package/dist/anomaly.d.ts.map +1 -1
- package/dist/anomaly.js +0 -2
- package/dist/anomaly.js.map +1 -1
- package/dist/api-contracts.d.ts +1 -1
- package/dist/api-contracts.js +1 -1
- package/dist/attenuation.d.ts +1 -1
- package/dist/attenuation.js +1 -1
- package/dist/auth.d.ts +116 -9
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +20 -5
- package/dist/auth.js.map +1 -1
- package/dist/billing.d.ts +1 -1
- package/dist/billing.js +1 -1
- package/dist/cloudProbe.d.ts +54 -0
- package/dist/cloudProbe.d.ts.map +1 -0
- package/dist/cloudProbe.js +254 -0
- package/dist/cloudProbe.js.map +1 -0
- package/dist/destructiveSql.d.ts +48 -0
- package/dist/destructiveSql.d.ts.map +1 -0
- package/dist/destructiveSql.js +43 -0
- package/dist/destructiveSql.js.map +1 -0
- package/dist/devInventory.d.ts +120 -0
- package/dist/devInventory.d.ts.map +1 -0
- package/dist/devInventory.js +80 -0
- package/dist/devInventory.js.map +1 -0
- package/dist/enums.d.ts +66 -21
- package/dist/enums.d.ts.map +1 -1
- package/dist/enums.js +55 -31
- package/dist/enums.js.map +1 -1
- package/dist/errors.js +3 -3
- package/dist/errors.js.map +1 -1
- package/dist/finops.d.ts +52 -2
- package/dist/finops.d.ts.map +1 -1
- package/dist/finops.js +15 -1
- package/dist/finops.js.map +1 -1
- package/dist/gateDecisions.d.ts +18 -0
- package/dist/gateDecisions.d.ts.map +1 -0
- package/dist/gateDecisions.js +20 -0
- package/dist/gateDecisions.js.map +1 -0
- package/dist/gateIdentity.d.ts +23 -0
- package/dist/gateIdentity.d.ts.map +1 -0
- package/dist/gateIdentity.js +32 -0
- package/dist/gateIdentity.js.map +1 -0
- package/dist/gateKind.d.ts +172 -0
- package/dist/gateKind.d.ts.map +1 -0
- package/dist/gateKind.js +160 -0
- package/dist/gateKind.js.map +1 -0
- package/dist/gateLimits.d.ts +170 -0
- package/dist/gateLimits.d.ts.map +1 -0
- package/dist/gateLimits.js +96 -0
- package/dist/gateLimits.js.map +1 -0
- package/dist/gitRemote.d.ts +17 -0
- package/dist/gitRemote.d.ts.map +1 -0
- package/dist/gitRemote.js +71 -0
- package/dist/gitRemote.js.map +1 -0
- package/dist/governanceCoverage.d.ts +1 -1
- package/dist/governanceCoverage.js +1 -1
- package/dist/guardrailIr.d.ts +9 -9
- package/dist/guardrailIr.d.ts.map +1 -1
- package/dist/guardrailIr.js +3 -3
- package/dist/guardrailIr.js.map +1 -1
- package/dist/guardrailRender.d.ts +1 -1
- package/dist/guardrailRender.js +1 -1
- package/dist/harnessRules.d.ts +74 -0
- package/dist/harnessRules.d.ts.map +1 -0
- package/dist/harnessRules.js +142 -0
- package/dist/harnessRules.js.map +1 -0
- package/dist/holdMessages.d.ts +25 -0
- package/dist/holdMessages.d.ts.map +1 -0
- package/dist/holdMessages.js +34 -0
- package/dist/holdMessages.js.map +1 -0
- package/dist/identity.d.ts +1 -1
- package/dist/identity.js +2 -2
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +42 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +161 -10
- package/dist/index.js.map +1 -1
- package/dist/intelligence.d.ts +1 -1
- package/dist/mcpBudgets.d.ts +191 -0
- package/dist/mcpBudgets.d.ts.map +1 -0
- package/dist/mcpBudgets.js +144 -0
- package/dist/mcpBudgets.js.map +1 -0
- package/dist/mcpRegistryRecord.d.ts +143 -0
- package/dist/mcpRegistryRecord.d.ts.map +1 -0
- package/dist/mcpRegistryRecord.js +229 -0
- package/dist/mcpRegistryRecord.js.map +1 -0
- package/dist/mcpToolRisk.d.ts +82 -0
- package/dist/mcpToolRisk.d.ts.map +1 -0
- package/dist/mcpToolRisk.js +334 -0
- package/dist/mcpToolRisk.js.map +1 -0
- package/dist/modelCatalog.d.ts +2 -2
- package/dist/modelCatalog.generated.js +1 -1
- package/dist/modelCatalog.generated.js.map +1 -1
- package/dist/modelCatalog.js +2 -2
- package/dist/notifications.d.ts +24 -151
- package/dist/notifications.d.ts.map +1 -1
- package/dist/notifications.js +266 -1
- package/dist/notifications.js.map +1 -1
- package/dist/phrases.d.ts +87 -0
- package/dist/phrases.d.ts.map +1 -0
- package/dist/phrases.js +241 -0
- package/dist/phrases.js.map +1 -0
- package/dist/piiDetectors.d.ts +97 -0
- package/dist/piiDetectors.d.ts.map +1 -0
- package/dist/piiDetectors.js +96 -0
- package/dist/piiDetectors.js.map +1 -0
- package/dist/piiDetectors.json +71 -0
- package/dist/policy.d.ts +1 -1
- package/dist/policy.js +1 -1
- package/dist/policyGuardrails.d.ts +127 -10
- package/dist/policyGuardrails.d.ts.map +1 -1
- package/dist/policyGuardrails.js +59 -6
- package/dist/policyGuardrails.js.map +1 -1
- package/dist/posturePresets.js +1 -1
- package/dist/posturePresets.js.map +1 -1
- package/dist/providerVerification.d.ts +36 -10
- package/dist/providerVerification.d.ts.map +1 -1
- package/dist/providerVerification.js +80 -20
- package/dist/providerVerification.js.map +1 -1
- package/dist/providers.d.ts +54 -17
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +135 -26
- package/dist/providers.js.map +1 -1
- package/dist/regoBuiltins.d.ts +42 -0
- package/dist/regoBuiltins.d.ts.map +1 -0
- package/dist/regoBuiltins.js +732 -0
- package/dist/regoBuiltins.js.map +1 -0
- package/dist/regoRules.d.ts +105 -0
- package/dist/regoRules.d.ts.map +1 -0
- package/dist/regoRules.js +407 -0
- package/dist/regoRules.js.map +1 -0
- package/dist/ruleLoadFailures.d.ts +15 -0
- package/dist/ruleLoadFailures.d.ts.map +1 -0
- package/dist/ruleLoadFailures.js +26 -0
- package/dist/ruleLoadFailures.js.map +1 -0
- package/dist/scriptScan.d.ts +5 -5
- package/dist/scriptScan.js +3 -3
- package/dist/sequence.d.ts +52 -0
- package/dist/sequence.d.ts.map +1 -0
- package/dist/sequence.js +127 -0
- package/dist/sequence.js.map +1 -0
- package/dist/session.d.ts +1 -1
- package/dist/session.js +1 -1
- package/dist/skillScan.d.ts +3 -3
- package/dist/skillScan.d.ts.map +1 -1
- package/dist/skillScan.js +26 -4
- package/dist/skillScan.js.map +1 -1
- package/dist/sop.d.ts +5 -5
- package/dist/sop.js +2 -2
- package/dist/sourceProviders.d.ts +1 -8
- package/dist/sourceProviders.d.ts.map +1 -1
- package/dist/sourceProviders.js +2 -9
- package/dist/sourceProviders.js.map +1 -1
- package/dist/spendBudgets.d.ts +122 -0
- package/dist/spendBudgets.d.ts.map +1 -0
- package/dist/spendBudgets.js +92 -0
- package/dist/spendBudgets.js.map +1 -0
- package/dist/ssoGroupClearance.d.ts +18 -2
- package/dist/ssoGroupClearance.d.ts.map +1 -1
- package/dist/ssoGroupClearance.js +43 -4
- package/dist/ssoGroupClearance.js.map +1 -1
- package/dist/sync.d.ts +0 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +0 -1
- package/dist/sync.js.map +1 -1
- package/dist/taskManagement.d.ts +0 -2
- package/dist/taskManagement.d.ts.map +1 -1
- package/dist/taskManagement.js +0 -2
- package/dist/taskManagement.js.map +1 -1
- package/dist/toolPoison.d.ts +33 -0
- package/dist/toolPoison.d.ts.map +1 -0
- package/dist/toolPoison.js +85 -0
- package/dist/toolPoison.js.map +1 -0
- package/dist/upstreamRetry.d.ts +121 -0
- package/dist/upstreamRetry.d.ts.map +1 -0
- package/dist/upstreamRetry.js +90 -0
- package/dist/upstreamRetry.js.map +1 -0
- package/dist/usage.d.ts +186 -0
- package/dist/usage.d.ts.map +1 -1
- package/dist/wasmBinary.d.ts +25 -0
- package/dist/wasmBinary.d.ts.map +1 -0
- package/dist/wasmBinary.js +111 -0
- package/dist/wasmBinary.js.map +1 -0
- package/dist/wasmFuel.d.ts +52 -0
- package/dist/wasmFuel.d.ts.map +1 -0
- package/dist/wasmFuel.js +320 -0
- package/dist/wasmFuel.js.map +1 -0
- package/dist/wasmMemoryCap.d.ts +21 -0
- package/dist/wasmMemoryCap.d.ts.map +1 -0
- package/dist/wasmMemoryCap.js +58 -0
- package/dist/wasmMemoryCap.js.map +1 -0
- package/dist/wasmRuleDescriptor.d.ts +43 -0
- package/dist/wasmRuleDescriptor.d.ts.map +1 -0
- package/dist/wasmRuleDescriptor.js +65 -0
- package/dist/wasmRuleDescriptor.js.map +1 -0
- package/dist/workspaceSettings.d.ts +95 -17
- package/dist/workspaceSettings.d.ts.map +1 -1
- package/dist/workspaceSettings.js +2 -1
- package/dist/workspaceSettings.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Verification probes for cloud provider credentials: AWS Bedrock and Google
|
|
4
|
+
* Vertex AI, whose cheapest authenticated call has to be signed per request.
|
|
5
|
+
*
|
|
6
|
+
* Still no network here: this builds the request (SigV4-signed, or carrying a
|
|
7
|
+
* freshly signed service-account assertion) with WebCrypto, which Node and
|
|
8
|
+
* browsers both provide, and the executors in the CLI and the control plane
|
|
9
|
+
* send it exactly as they send every other provider's probe.
|
|
10
|
+
*
|
|
11
|
+
* - **Bedrock, access key pair**: STS `GetCallerIdentity`, which any valid
|
|
12
|
+
* key may call — it proves the key, not its Bedrock permissions, which the
|
|
13
|
+
* first model call checks.
|
|
14
|
+
* <https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html>
|
|
15
|
+
* - **Bedrock, API key**: `ListFoundationModels` with the key as a bearer
|
|
16
|
+
* token (Bedrock API keys work with Bedrock control-plane actions).
|
|
17
|
+
* <https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html>
|
|
18
|
+
* - **Vertex AI**: the service account's OAuth token exchange — the key is
|
|
19
|
+
* valid when Google mints a token for it; project access is checked on the
|
|
20
|
+
* first model call. An `authorized_user` file is checked by its refresh
|
|
21
|
+
* grant.
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.GOOGLE_TOKEN_URI = void 0;
|
|
27
|
+
exports.sigv4Headers = sigv4Headers;
|
|
28
|
+
exports.serviceAccountAssertion = serviceAccountAssertion;
|
|
29
|
+
exports.buildCloudVerificationProbe = buildCloudVerificationProbe;
|
|
30
|
+
const enc = new TextEncoder();
|
|
31
|
+
function subtle() {
|
|
32
|
+
const s = globalThis.crypto?.subtle;
|
|
33
|
+
if (!s)
|
|
34
|
+
throw new Error('WebCrypto is not available in this runtime');
|
|
35
|
+
return s;
|
|
36
|
+
}
|
|
37
|
+
function hex(buf) {
|
|
38
|
+
return [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
39
|
+
}
|
|
40
|
+
async function sha256Hex(data) {
|
|
41
|
+
return hex(await subtle().digest('SHA-256', enc.encode(data)));
|
|
42
|
+
}
|
|
43
|
+
async function hmac(key, data) {
|
|
44
|
+
const k = await subtle().importKey('raw', key, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
45
|
+
return subtle().sign('HMAC', k, enc.encode(data));
|
|
46
|
+
}
|
|
47
|
+
/** RFC 3986 encoding as SigV4 requires it (unreserved characters kept). */
|
|
48
|
+
function uriEncode(s) {
|
|
49
|
+
return [...enc.encode(s)]
|
|
50
|
+
.map((b) => {
|
|
51
|
+
const c = String.fromCharCode(b);
|
|
52
|
+
return /[A-Za-z0-9\-_.~]/.test(c) ? c : `%${b.toString(16).toUpperCase().padStart(2, '0')}`;
|
|
53
|
+
})
|
|
54
|
+
.join('');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* AWS Signature Version 4: the headers to add (`x-amz-date`,
|
|
58
|
+
* `x-amz-security-token` for temporary credentials, `authorization`).
|
|
59
|
+
* Held to AWS's published test-suite vectors in this package's tests.
|
|
60
|
+
*/
|
|
61
|
+
async function sigv4Headers(i) {
|
|
62
|
+
const amzDate = i.now.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}/, '');
|
|
63
|
+
const date = amzDate.slice(0, 8);
|
|
64
|
+
const signed = Object.entries(i.headers ?? {}).map(([k, v]) => [
|
|
65
|
+
k.toLowerCase(),
|
|
66
|
+
v.trim().replace(/\s+/g, ' '),
|
|
67
|
+
]);
|
|
68
|
+
signed.push(['host', i.host.toLowerCase()], ['x-amz-date', amzDate]);
|
|
69
|
+
if (i.sessionToken)
|
|
70
|
+
signed.push(['x-amz-security-token', i.sessionToken]);
|
|
71
|
+
signed.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
72
|
+
const query = (i.query ?? [])
|
|
73
|
+
.map(([k, v]) => [uriEncode(k), uriEncode(v)])
|
|
74
|
+
.sort(([a, x], [b, y]) => (a < b ? -1 : a > b ? 1 : x < y ? -1 : x > y ? 1 : 0))
|
|
75
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
76
|
+
.join('&');
|
|
77
|
+
const signedNames = signed.map(([k]) => k).join(';');
|
|
78
|
+
const canonical = [
|
|
79
|
+
i.method,
|
|
80
|
+
i.path,
|
|
81
|
+
query,
|
|
82
|
+
signed.map(([k, v]) => `${k}:${v}\n`).join(''),
|
|
83
|
+
signedNames,
|
|
84
|
+
await sha256Hex(i.body),
|
|
85
|
+
].join('\n');
|
|
86
|
+
const scope = `${date}/${i.region}/${i.service}/aws4_request`;
|
|
87
|
+
const stringToSign = `AWS4-HMAC-SHA256\n${amzDate}\n${scope}\n${await sha256Hex(canonical)}`;
|
|
88
|
+
let key = await hmac(enc.encode(`AWS4${i.secretAccessKey}`), date);
|
|
89
|
+
key = await hmac(key, i.region);
|
|
90
|
+
key = await hmac(key, i.service);
|
|
91
|
+
key = await hmac(key, 'aws4_request');
|
|
92
|
+
const signature = hex(await hmac(key, stringToSign));
|
|
93
|
+
const out = { 'x-amz-date': amzDate };
|
|
94
|
+
if (i.sessionToken)
|
|
95
|
+
out['x-amz-security-token'] = i.sessionToken;
|
|
96
|
+
out.authorization = `AWS4-HMAC-SHA256 Credential=${i.accessKeyId}/${scope}, SignedHeaders=${signedNames}, Signature=${signature}`;
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
function b64url(data) {
|
|
100
|
+
const bytes = typeof data === 'string' ? enc.encode(data) : new Uint8Array(data);
|
|
101
|
+
let bin = '';
|
|
102
|
+
for (const b of bytes)
|
|
103
|
+
bin += String.fromCharCode(b);
|
|
104
|
+
return btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
105
|
+
}
|
|
106
|
+
/** An RS256 JWT bearer assertion for Google's token endpoint. */
|
|
107
|
+
async function serviceAccountAssertion(clientEmail, privateKeyPem, privateKeyId, now) {
|
|
108
|
+
const der = Uint8Array.from(atob(privateKeyPem.replace(/-----[^-]+-----/g, '').replace(/\s+/g, '')), (c) => c.charCodeAt(0));
|
|
109
|
+
const key = await subtle().importKey('pkcs8', der, { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }, false, [
|
|
110
|
+
'sign',
|
|
111
|
+
]);
|
|
112
|
+
const iat = Math.floor(now.getTime() / 1000);
|
|
113
|
+
const header = { alg: 'RS256', typ: 'JWT', ...(privateKeyId ? { kid: privateKeyId } : {}) };
|
|
114
|
+
const claims = {
|
|
115
|
+
iss: clientEmail,
|
|
116
|
+
scope: 'https://www.googleapis.com/auth/cloud-platform',
|
|
117
|
+
aud: exports.GOOGLE_TOKEN_URI,
|
|
118
|
+
iat,
|
|
119
|
+
exp: iat + 3600,
|
|
120
|
+
};
|
|
121
|
+
const input = `${b64url(JSON.stringify(header))}.${b64url(JSON.stringify(claims))}`;
|
|
122
|
+
const sig = await subtle().sign('RSASSA-PKCS1-v1_5', key, enc.encode(input));
|
|
123
|
+
return `${input}.${b64url(sig)}`;
|
|
124
|
+
}
|
|
125
|
+
exports.GOOGLE_TOKEN_URI = 'https://oauth2.googleapis.com/token';
|
|
126
|
+
const AWS_INVALID = new Set([
|
|
127
|
+
'UnrecognizedClientException',
|
|
128
|
+
'InvalidClientTokenId',
|
|
129
|
+
'SignatureDoesNotMatch',
|
|
130
|
+
'InvalidSignatureException',
|
|
131
|
+
'ExpiredToken',
|
|
132
|
+
'ExpiredTokenException',
|
|
133
|
+
'IncompleteSignature',
|
|
134
|
+
]);
|
|
135
|
+
/** AWS: a credential error is invalid; `AccessDenied` means the key authenticated but lacks the permission. */
|
|
136
|
+
function classifyAws(status, headers) {
|
|
137
|
+
if (status >= 200 && status < 300)
|
|
138
|
+
return 'valid';
|
|
139
|
+
const type = (headers.get('x-amzn-errortype') ?? '').split(':')[0];
|
|
140
|
+
if (AWS_INVALID.has(type))
|
|
141
|
+
return 'invalid';
|
|
142
|
+
if (status === 401)
|
|
143
|
+
return 'invalid';
|
|
144
|
+
if (status === 403 && !type.startsWith('AccessDenied'))
|
|
145
|
+
return 'invalid';
|
|
146
|
+
return 'unknown';
|
|
147
|
+
}
|
|
148
|
+
/** Google's token endpoint answers a bad key with 400 `invalid_grant` or 401 `invalid_client`. */
|
|
149
|
+
function classifyGoogleToken(status) {
|
|
150
|
+
if (status >= 200 && status < 300)
|
|
151
|
+
return 'valid';
|
|
152
|
+
if (status === 400 || status === 401 || status === 403)
|
|
153
|
+
return 'invalid';
|
|
154
|
+
return 'unknown';
|
|
155
|
+
}
|
|
156
|
+
const REGION = /^[a-z0-9-]{1,32}$/;
|
|
157
|
+
/**
|
|
158
|
+
* The verification request for a Bedrock or Vertex AI credential, or `null`
|
|
159
|
+
* when `fields` are not a complete credential for one.
|
|
160
|
+
*/
|
|
161
|
+
async function buildCloudVerificationProbe(provider, fields, now = new Date()) {
|
|
162
|
+
if (provider === 'bedrock') {
|
|
163
|
+
const region = fields.awsRegion?.trim();
|
|
164
|
+
if (!region || !REGION.test(region))
|
|
165
|
+
return null;
|
|
166
|
+
if (fields.awsAccessKeyId && fields.awsSecretAccessKey) {
|
|
167
|
+
const host = `sts.${region}.amazonaws.com`;
|
|
168
|
+
const body = 'Action=GetCallerIdentity&Version=2011-06-15';
|
|
169
|
+
const contentType = 'application/x-www-form-urlencoded; charset=utf-8';
|
|
170
|
+
const signed = await sigv4Headers({
|
|
171
|
+
method: 'POST',
|
|
172
|
+
host,
|
|
173
|
+
path: '/',
|
|
174
|
+
headers: { 'content-type': contentType },
|
|
175
|
+
body,
|
|
176
|
+
accessKeyId: fields.awsAccessKeyId.trim(),
|
|
177
|
+
secretAccessKey: fields.awsSecretAccessKey.trim(),
|
|
178
|
+
region,
|
|
179
|
+
service: 'sts',
|
|
180
|
+
now,
|
|
181
|
+
});
|
|
182
|
+
return {
|
|
183
|
+
url: `https://${host}/`,
|
|
184
|
+
method: 'POST',
|
|
185
|
+
headers: { 'content-type': contentType, ...signed },
|
|
186
|
+
body,
|
|
187
|
+
classify: classifyAws,
|
|
188
|
+
validDetail: 'the access key is valid; Bedrock model access is checked on the first request',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (fields.apiKey) {
|
|
192
|
+
return {
|
|
193
|
+
url: `https://bedrock.${region}.amazonaws.com/foundation-models?byProvider=anthropic`,
|
|
194
|
+
method: 'GET',
|
|
195
|
+
headers: { Authorization: `Bearer ${fields.apiKey.trim()}` },
|
|
196
|
+
classify: classifyAws,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
if (provider === 'vertex_ai') {
|
|
202
|
+
let doc;
|
|
203
|
+
try {
|
|
204
|
+
doc = JSON.parse(fields.serviceAccountJson ?? '');
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
if (doc.type === 'service_account' && doc.client_email && doc.private_key) {
|
|
210
|
+
let assertion;
|
|
211
|
+
try {
|
|
212
|
+
assertion = await serviceAccountAssertion(doc.client_email, doc.private_key, doc.private_key_id, now);
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// A key that will not import is as invalid as one Google rejects.
|
|
216
|
+
return {
|
|
217
|
+
url: exports.GOOGLE_TOKEN_URI,
|
|
218
|
+
method: 'POST',
|
|
219
|
+
headers: {},
|
|
220
|
+
localVerdict: 'invalid',
|
|
221
|
+
validDetail: 'the service-account private_key is not a usable RSA key',
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
url: exports.GOOGLE_TOKEN_URI,
|
|
226
|
+
method: 'POST',
|
|
227
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
228
|
+
body: new URLSearchParams({
|
|
229
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
|
230
|
+
assertion,
|
|
231
|
+
}).toString(),
|
|
232
|
+
classify: classifyGoogleToken,
|
|
233
|
+
validDetail: 'the service-account key is valid; project access is checked on the first request',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
if (doc.type === 'authorized_user' && doc.client_id && doc.refresh_token) {
|
|
237
|
+
return {
|
|
238
|
+
url: exports.GOOGLE_TOKEN_URI,
|
|
239
|
+
method: 'POST',
|
|
240
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
241
|
+
body: new URLSearchParams({
|
|
242
|
+
grant_type: 'refresh_token',
|
|
243
|
+
client_id: doc.client_id,
|
|
244
|
+
client_secret: doc.client_secret ?? '',
|
|
245
|
+
refresh_token: doc.refresh_token,
|
|
246
|
+
}).toString(),
|
|
247
|
+
classify: classifyGoogleToken,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=cloudProbe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudProbe.js","sourceRoot":"","sources":["../src/cloudProbe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Destructive SQL as a text rule: the statements every blocking text scanner
|
|
3
|
+
* refuses in tool arguments.
|
|
4
|
+
*
|
|
5
|
+
* The control plane's DLP (`POST /api/v1/hook-gate`, which both gate SDKs'
|
|
6
|
+
* server tier, the AgentCore interceptor and the QM security screen run) and
|
|
7
|
+
* the MCP governance proxy's DLP read both from here. The harness hook gates
|
|
8
|
+
* carry the same phrases as the `destructive.sql_drop` rule
|
|
9
|
+
* (`protectedPaths.ts`). Each statement is matched as words by the phrase
|
|
10
|
+
* matcher (phrases.ts), bounded at both ends: any separator the shell or the
|
|
11
|
+
* database reads as a word break may split the keywords (a comment, an escaped
|
|
12
|
+
* newline, a line continuation, `--` options), but `DROP TABLES` and
|
|
13
|
+
* `truncate --size 0 table.log` are not the statement. No regex runs on the
|
|
14
|
+
* text, so crafted input cannot make the scan backtrack.
|
|
15
|
+
* `fixtures/destructive-sql-vectors.json` holds every implementation to the
|
|
16
|
+
* same answers.
|
|
17
|
+
*
|
|
18
|
+
* A text rule, not a SQL parser: a quoted mention (`SELECT 'drop table'`) is
|
|
19
|
+
* refused too, because quoting is how a shell command carries the real
|
|
20
|
+
* statement (`psql -c 'DROP TABLE x'`). The proxy's `sql_guard`, which parses
|
|
21
|
+
* the SQL a client will run, is the one that tells them apart.
|
|
22
|
+
*/
|
|
23
|
+
import { type PhraseText } from './phrases.js';
|
|
24
|
+
/** The statements a text scanner refuses, and the phrase that finds each. */
|
|
25
|
+
export declare const DESTRUCTIVE_SQL_STATEMENTS: readonly [{
|
|
26
|
+
readonly statement: "DROP TABLE";
|
|
27
|
+
readonly phrase: "drop table";
|
|
28
|
+
readonly description: "SQL DROP TABLE statement";
|
|
29
|
+
}, {
|
|
30
|
+
readonly statement: "DROP DATABASE";
|
|
31
|
+
readonly phrase: "drop database";
|
|
32
|
+
readonly description: "SQL DROP DATABASE statement";
|
|
33
|
+
}, {
|
|
34
|
+
readonly statement: "DROP SCHEMA";
|
|
35
|
+
readonly phrase: "drop schema";
|
|
36
|
+
readonly description: "SQL DROP SCHEMA statement";
|
|
37
|
+
}, {
|
|
38
|
+
readonly statement: "TRUNCATE TABLE";
|
|
39
|
+
readonly phrase: "truncate table";
|
|
40
|
+
readonly description: "SQL TRUNCATE TABLE statement";
|
|
41
|
+
}];
|
|
42
|
+
export type DestructiveSqlStatement = (typeof DESTRUCTIVE_SQL_STATEMENTS)[number]['statement'];
|
|
43
|
+
/**
|
|
44
|
+
* The destructive statements `text` contains, in {@link DESTRUCTIVE_SQL_STATEMENTS}
|
|
45
|
+
* order. Pass a {@link PhraseText} already cut from the text to reuse it.
|
|
46
|
+
*/
|
|
47
|
+
export declare function findDestructiveSql(text: string | PhraseText): Array<(typeof DESTRUCTIVE_SQL_STATEMENTS)[number]>;
|
|
48
|
+
//# sourceMappingURL=destructiveSql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destructiveSql.d.ts","sourceRoot":"","sources":["../src/destructiveSql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAErE,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;EAK7B,CAAA;AAEV,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAA;AAE9F;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,CAGhH"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DESTRUCTIVE_SQL_STATEMENTS = void 0;
|
|
4
|
+
exports.findDestructiveSql = findDestructiveSql;
|
|
5
|
+
/**
|
|
6
|
+
* Destructive SQL as a text rule: the statements every blocking text scanner
|
|
7
|
+
* refuses in tool arguments.
|
|
8
|
+
*
|
|
9
|
+
* The control plane's DLP (`POST /api/v1/hook-gate`, which both gate SDKs'
|
|
10
|
+
* server tier, the AgentCore interceptor and the QM security screen run) and
|
|
11
|
+
* the MCP governance proxy's DLP read both from here. The harness hook gates
|
|
12
|
+
* carry the same phrases as the `destructive.sql_drop` rule
|
|
13
|
+
* (`protectedPaths.ts`). Each statement is matched as words by the phrase
|
|
14
|
+
* matcher (phrases.ts), bounded at both ends: any separator the shell or the
|
|
15
|
+
* database reads as a word break may split the keywords (a comment, an escaped
|
|
16
|
+
* newline, a line continuation, `--` options), but `DROP TABLES` and
|
|
17
|
+
* `truncate --size 0 table.log` are not the statement. No regex runs on the
|
|
18
|
+
* text, so crafted input cannot make the scan backtrack.
|
|
19
|
+
* `fixtures/destructive-sql-vectors.json` holds every implementation to the
|
|
20
|
+
* same answers.
|
|
21
|
+
*
|
|
22
|
+
* A text rule, not a SQL parser: a quoted mention (`SELECT 'drop table'`) is
|
|
23
|
+
* refused too, because quoting is how a shell command carries the real
|
|
24
|
+
* statement (`psql -c 'DROP TABLE x'`). The proxy's `sql_guard`, which parses
|
|
25
|
+
* the SQL a client will run, is the one that tells them apart.
|
|
26
|
+
*/
|
|
27
|
+
const phrases_js_1 = require("./phrases.js");
|
|
28
|
+
/** The statements a text scanner refuses, and the phrase that finds each. */
|
|
29
|
+
exports.DESTRUCTIVE_SQL_STATEMENTS = [
|
|
30
|
+
{ statement: 'DROP TABLE', phrase: 'drop table', description: 'SQL DROP TABLE statement' },
|
|
31
|
+
{ statement: 'DROP DATABASE', phrase: 'drop database', description: 'SQL DROP DATABASE statement' },
|
|
32
|
+
{ statement: 'DROP SCHEMA', phrase: 'drop schema', description: 'SQL DROP SCHEMA statement' },
|
|
33
|
+
{ statement: 'TRUNCATE TABLE', phrase: 'truncate table', description: 'SQL TRUNCATE TABLE statement' },
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* The destructive statements `text` contains, in {@link DESTRUCTIVE_SQL_STATEMENTS}
|
|
37
|
+
* order. Pass a {@link PhraseText} already cut from the text to reuse it.
|
|
38
|
+
*/
|
|
39
|
+
function findDestructiveSql(text) {
|
|
40
|
+
const words = typeof text === 'string' ? (0, phrases_js_1.phraseText)(text) : text;
|
|
41
|
+
return exports.DESTRUCTIVE_SQL_STATEMENTS.filter((s) => (0, phrases_js_1.hasPhrase)(words, s.phrase, true));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=destructiveSql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destructiveSql.js","sourceRoot":"","sources":["../src/destructiveSql.ts"],"names":[],"mappings":";;;AAsCA,gDAGC;AAzCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,6CAAqE;AAErE,6EAA6E;AAChE,QAAA,0BAA0B,GAAG;IACxC,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,0BAA0B,EAAE;IAC1F,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,6BAA6B,EAAE;IACnG,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,2BAA2B,EAAE;IAC7F,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,8BAA8B,EAAE;CAC9F,CAAA;AAIV;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,uBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChE,OAAO,kCAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,sBAAS,EAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;AACnF,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* devInventory.ts — the AI inventory a connected developer machine reports.
|
|
3
|
+
*
|
|
4
|
+
* `intutic connect` collects it (the sync daemon's `inventory.ts`): the AI
|
|
5
|
+
* coding harnesses the machine has, whether Intutic's gate runs for each, the
|
|
6
|
+
* MCP servers their configs declare, and the skill bundles on disk. It travels
|
|
7
|
+
* as the `inventory` facet of `POST /api/v1/agents/report`, and the control
|
|
8
|
+
* plane keeps the latest copy per device with first-seen and last-seen times
|
|
9
|
+
* per item.
|
|
10
|
+
*
|
|
11
|
+
* What it may carry is deliberately narrow: names, paths relative to the home
|
|
12
|
+
* directory, content hashes and timestamps. Never file contents, environment
|
|
13
|
+
* values, command lines or URL query strings. {@link homeRelativePath} and
|
|
14
|
+
* {@link sanitizeMcpEndpoint} are where that rule is applied on the machine;
|
|
15
|
+
* the control plane applies {@link sanitizeMcpEndpoint} again on ingest, so a
|
|
16
|
+
* daemon that skipped it still cannot store a credential.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
import type { GateKind } from './gateKind.js';
|
|
21
|
+
/** Bumped when a field's meaning changes; the control plane refuses versions it does not know. */
|
|
22
|
+
export declare const DEVICE_INVENTORY_SCHEMA_VERSION = 1;
|
|
23
|
+
/** How a harness's tool calls are gated (`gateKind.ts`). */
|
|
24
|
+
export type InventoryGateKind = GateKind;
|
|
25
|
+
/** One harness found on the machine, by detection or because `intutic connect` is configured for it. */
|
|
26
|
+
export interface InventoryHarness {
|
|
27
|
+
/**
|
|
28
|
+
* A `HarnessType` value, or for the harness with two gates the gate id of
|
|
29
|
+
* the product found (`antigravity`, `gemini-cli`; see `gateIdentity.ts`).
|
|
30
|
+
*/
|
|
31
|
+
type: string;
|
|
32
|
+
/** Only where the install records it cheaply, such as a VS Code extension directory name. */
|
|
33
|
+
version?: string;
|
|
34
|
+
/** True when it is one of this machine's `intutic connect` harnesses, the ones connect installs a gate for. */
|
|
35
|
+
configured: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* True when `intutic disconnect --harness` removed Intutic from it on this
|
|
38
|
+
* machine: ungoverned by the user's choice, so its first appearance as
|
|
39
|
+
* ungoverned is not announced.
|
|
40
|
+
*/
|
|
41
|
+
disconnected?: boolean;
|
|
42
|
+
gateKind: InventoryGateKind;
|
|
43
|
+
/** For a `hook` gate, whether its gate file is on disk; null when the gate is not a file the daemon writes. */
|
|
44
|
+
gateInstalled: boolean | null;
|
|
45
|
+
/** Where the gate file was found, relative to the home directory. */
|
|
46
|
+
gateFile?: string;
|
|
47
|
+
/** Newest event this machine's gate for the harness wrote, as the daemon drained it. */
|
|
48
|
+
lastHookEventAt: string | null;
|
|
49
|
+
/** Newest `guards_disabled` event: the gate ran with `INTUTIC_GUARD_DISABLE=1`. */
|
|
50
|
+
guardsDisabledAt: string | null;
|
|
51
|
+
}
|
|
52
|
+
/** One MCP server a harness config on the machine declares. */
|
|
53
|
+
export interface InventoryMcpServer {
|
|
54
|
+
server: string;
|
|
55
|
+
harness: string;
|
|
56
|
+
transport: 'stdio' | 'http' | 'sse' | 'unknown';
|
|
57
|
+
/** True when the MCP governance proxy fronts it. */
|
|
58
|
+
wrapped: boolean;
|
|
59
|
+
/** A remote server's URL after {@link sanitizeMcpEndpoint}; absent for a local (stdio) server. */
|
|
60
|
+
endpoint?: string;
|
|
61
|
+
/** Why the harness runs it without the proxy, when the daemon can say. */
|
|
62
|
+
ungovernedReason?: string;
|
|
63
|
+
}
|
|
64
|
+
/** One skill bundle (a directory holding `SKILL.md`). */
|
|
65
|
+
export interface InventorySkill {
|
|
66
|
+
name: string;
|
|
67
|
+
/** The directory it was found in, relative to the workspace (`.agents/skills`) or the home directory (`~/.claude/skills`). */
|
|
68
|
+
source: string;
|
|
69
|
+
/** sha256 of `SKILL.md`; absent when it could not be read. */
|
|
70
|
+
sha256?: string;
|
|
71
|
+
scanned: boolean;
|
|
72
|
+
clean: boolean;
|
|
73
|
+
findingsCount: number;
|
|
74
|
+
/** Files bundled next to `SKILL.md`. */
|
|
75
|
+
scriptCount: number;
|
|
76
|
+
}
|
|
77
|
+
/** The local proxy's last scheduled guard-liveness probe run. */
|
|
78
|
+
export interface InventoryGuardProbes {
|
|
79
|
+
total: number;
|
|
80
|
+
failed: number;
|
|
81
|
+
/** Unix seconds. */
|
|
82
|
+
ranAt: number;
|
|
83
|
+
}
|
|
84
|
+
/** The whole snapshot one machine sends. */
|
|
85
|
+
export interface DeviceInventory {
|
|
86
|
+
schemaVersion: typeof DEVICE_INVENTORY_SCHEMA_VERSION;
|
|
87
|
+
collectedAt: string;
|
|
88
|
+
/** The `intutic connect` workspace root, relative to the home directory. */
|
|
89
|
+
workspace: string;
|
|
90
|
+
harnesses: InventoryHarness[];
|
|
91
|
+
mcpServers: InventoryMcpServer[];
|
|
92
|
+
skills: InventorySkill[];
|
|
93
|
+
/** Present only when the local proxy answered. */
|
|
94
|
+
guardProbes?: InventoryGuardProbes;
|
|
95
|
+
}
|
|
96
|
+
/** The machine a report comes from: the same fingerprint `intutic enforce` reports to `/api/v1/devices`. */
|
|
97
|
+
export interface InventoryDeviceIdentity {
|
|
98
|
+
fingerprint: string;
|
|
99
|
+
hostname: string;
|
|
100
|
+
platform: string;
|
|
101
|
+
cliVersion?: string;
|
|
102
|
+
}
|
|
103
|
+
/** What a path outside the home directory is reported as. */
|
|
104
|
+
export declare const REDACTED_PATH = "[redacted]";
|
|
105
|
+
/**
|
|
106
|
+
* `~/...` for a path inside `home`, `~` for `home` itself, and
|
|
107
|
+
* {@link REDACTED_PATH} for anything else: a path outside the home directory
|
|
108
|
+
* names nothing the inventory needs, and may name another user's files.
|
|
109
|
+
*/
|
|
110
|
+
export declare function homeRelativePath(absolutePath: string, home: string): string;
|
|
111
|
+
/** Replaces a URL path segment that looks like a token. */
|
|
112
|
+
export declare const REDACTED_SEGMENT = "[redacted]";
|
|
113
|
+
/**
|
|
114
|
+
* A remote MCP server's URL with what could be a credential removed: the
|
|
115
|
+
* user name and password, the query string, the fragment, and any path
|
|
116
|
+
* segment that looks like a token. `undefined` for anything that is not an
|
|
117
|
+
* http(s) or ws(s) URL, including one still holding `${VAR}` in its host.
|
|
118
|
+
*/
|
|
119
|
+
export declare function sanitizeMcpEndpoint(raw: string): string | undefined;
|
|
120
|
+
//# sourceMappingURL=devInventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devInventory.d.ts","sourceRoot":"","sources":["../src/devInventory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,kGAAkG;AAClG,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAEhD,4DAA4D;AAC5D,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAA;AAExC,wGAAwG;AACxG,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+GAA+G;IAC/G,UAAU,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,+GAA+G;IAC/G,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wFAAwF;IACxF,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,mFAAmF;IACnF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;CAChC;AAED,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAA;IAC/C,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAA;IAChB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,8HAA8H;IAC9H,MAAM,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,+BAA+B,CAAA;IACrD,WAAW,EAAE,MAAM,CAAA;IACnB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,UAAU,EAAE,kBAAkB,EAAE,CAAA;IAChC,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,kDAAkD;IAClD,WAAW,CAAC,EAAE,oBAAoB,CAAA;CACnC;AAED,4GAA4G;AAC5G,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,6DAA6D;AAC7D,eAAO,MAAM,aAAa,eAAe,CAAA;AAEzC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAW5C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAenE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* devInventory.ts — the AI inventory a connected developer machine reports.
|
|
4
|
+
*
|
|
5
|
+
* `intutic connect` collects it (the sync daemon's `inventory.ts`): the AI
|
|
6
|
+
* coding harnesses the machine has, whether Intutic's gate runs for each, the
|
|
7
|
+
* MCP servers their configs declare, and the skill bundles on disk. It travels
|
|
8
|
+
* as the `inventory` facet of `POST /api/v1/agents/report`, and the control
|
|
9
|
+
* plane keeps the latest copy per device with first-seen and last-seen times
|
|
10
|
+
* per item.
|
|
11
|
+
*
|
|
12
|
+
* What it may carry is deliberately narrow: names, paths relative to the home
|
|
13
|
+
* directory, content hashes and timestamps. Never file contents, environment
|
|
14
|
+
* values, command lines or URL query strings. {@link homeRelativePath} and
|
|
15
|
+
* {@link sanitizeMcpEndpoint} are where that rule is applied on the machine;
|
|
16
|
+
* the control plane applies {@link sanitizeMcpEndpoint} again on ingest, so a
|
|
17
|
+
* daemon that skipped it still cannot store a credential.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.REDACTED_SEGMENT = exports.REDACTED_PATH = exports.DEVICE_INVENTORY_SCHEMA_VERSION = void 0;
|
|
23
|
+
exports.homeRelativePath = homeRelativePath;
|
|
24
|
+
exports.sanitizeMcpEndpoint = sanitizeMcpEndpoint;
|
|
25
|
+
/** Bumped when a field's meaning changes; the control plane refuses versions it does not know. */
|
|
26
|
+
exports.DEVICE_INVENTORY_SCHEMA_VERSION = 1;
|
|
27
|
+
/** What a path outside the home directory is reported as. */
|
|
28
|
+
exports.REDACTED_PATH = '[redacted]';
|
|
29
|
+
/**
|
|
30
|
+
* `~/...` for a path inside `home`, `~` for `home` itself, and
|
|
31
|
+
* {@link REDACTED_PATH} for anything else: a path outside the home directory
|
|
32
|
+
* names nothing the inventory needs, and may name another user's files.
|
|
33
|
+
*/
|
|
34
|
+
function homeRelativePath(absolutePath, home) {
|
|
35
|
+
const sep = home.includes('\\') && !home.includes('/') ? '\\' : '/';
|
|
36
|
+
const base = home.endsWith(sep) ? home.slice(0, -1) : home;
|
|
37
|
+
if (base === '')
|
|
38
|
+
return exports.REDACTED_PATH;
|
|
39
|
+
if (absolutePath === base)
|
|
40
|
+
return '~';
|
|
41
|
+
if (absolutePath.startsWith(base + sep))
|
|
42
|
+
return `~/${absolutePath.slice(base.length + 1).split(sep).join('/')}`;
|
|
43
|
+
return exports.REDACTED_PATH;
|
|
44
|
+
}
|
|
45
|
+
/** Replaces a URL path segment that looks like a token. */
|
|
46
|
+
exports.REDACTED_SEGMENT = '[redacted]';
|
|
47
|
+
/**
|
|
48
|
+
* A path segment of 16 or more URL-safe characters mixing letters and digits.
|
|
49
|
+
* Some MCP services put the API key in the path (`/mcp/<key>/sse`); a
|
|
50
|
+
* readable route segment (`sse`, `v1`, `mcp-server`) does not look like this.
|
|
51
|
+
*/
|
|
52
|
+
function looksLikeToken(segment) {
|
|
53
|
+
return segment.length >= 16 && /^[A-Za-z0-9._~%-]+$/.test(segment) && /[A-Za-z]/.test(segment) && /[0-9]/.test(segment);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A remote MCP server's URL with what could be a credential removed: the
|
|
57
|
+
* user name and password, the query string, the fragment, and any path
|
|
58
|
+
* segment that looks like a token. `undefined` for anything that is not an
|
|
59
|
+
* http(s) or ws(s) URL, including one still holding `${VAR}` in its host.
|
|
60
|
+
*/
|
|
61
|
+
function sanitizeMcpEndpoint(raw) {
|
|
62
|
+
let url;
|
|
63
|
+
try {
|
|
64
|
+
url = new URL(raw);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
if (!['http:', 'https:', 'ws:', 'wss:'].includes(url.protocol))
|
|
70
|
+
return undefined;
|
|
71
|
+
// A host still templated (`${MCP_HOST}`) names no server yet.
|
|
72
|
+
if (/[${}]/.test(url.hostname))
|
|
73
|
+
return undefined;
|
|
74
|
+
const path = url.pathname
|
|
75
|
+
.split('/')
|
|
76
|
+
.map((segment) => (looksLikeToken(segment) ? exports.REDACTED_SEGMENT : segment))
|
|
77
|
+
.join('/');
|
|
78
|
+
return `${url.protocol}//${url.host}${path === '/' ? '' : path}`;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=devInventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devInventory.js","sourceRoot":"","sources":["../src/devInventory.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAsGH,4CAOC;AAoBD,kDAeC;AA5ID,kGAAkG;AACrF,QAAA,+BAA+B,GAAG,CAAC,CAAA;AAyFhD,6DAA6D;AAChD,QAAA,aAAa,GAAG,YAAY,CAAA;AAEzC;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,YAAoB,EAAE,IAAY;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1D,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,qBAAa,CAAA;IACrC,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,GAAG,CAAA;IACrC,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;IAC/G,OAAO,qBAAa,CAAA;AACtB,CAAC;AAED,2DAA2D;AAC9C,QAAA,gBAAgB,GAAG,YAAY,CAAA;AAE5C;;;;GAIG;AACH,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACzH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,GAAW;IAC7C,IAAI,GAAQ,CAAA;IACZ,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAA;IAChF,8DAA8D;IAC9D,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAA;IAChD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,wBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SACxE,IAAI,CAAC,GAAG,CAAC,CAAA;IACZ,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AAClE,CAAC"}
|