@salesforce/b2c-tooling-sdk 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/data/guides/enrichment.json +1081 -0
- package/data/guides/index.json +1571 -36
- package/data/schemas/dw.schema.json +576 -0
- package/data/tooling/index.json +27 -9
- package/dist/esm/auth/client-credentials.d.ts +43 -0
- package/dist/esm/auth/client-credentials.js +55 -0
- package/dist/esm/auth/client-credentials.js.map +1 -1
- package/dist/esm/auth/index.d.ts +2 -1
- package/dist/esm/auth/index.js +1 -1
- package/dist/esm/auth/index.js.map +1 -1
- package/dist/esm/auth/oauth.d.ts +3 -0
- package/dist/esm/auth/oauth.js +3 -3
- package/dist/esm/auth/oauth.js.map +1 -1
- package/dist/esm/auth/resolve.d.ts +2 -0
- package/dist/esm/auth/resolve.js +3 -2
- package/dist/esm/auth/resolve.js.map +1 -1
- package/dist/esm/auth/types.d.ts +5 -0
- package/dist/esm/auth/types.js +0 -5
- package/dist/esm/auth/types.js.map +1 -1
- package/dist/esm/cli/base-command.d.ts +20 -1
- package/dist/esm/cli/base-command.js +57 -8
- package/dist/esm/cli/base-command.js.map +1 -1
- package/dist/esm/cli/command-search.d.ts +85 -0
- package/dist/esm/cli/command-search.js +147 -0
- package/dist/esm/cli/command-search.js.map +1 -0
- package/dist/esm/cli/config.d.ts +10 -1
- package/dist/esm/cli/config.js +17 -9
- package/dist/esm/cli/config.js.map +1 -1
- package/dist/esm/cli/index.d.ts +2 -0
- package/dist/esm/cli/index.js +2 -0
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/cli/instance-command.d.ts +2 -0
- package/dist/esm/cli/mrt-command.d.ts +4 -2
- package/dist/esm/cli/mrt-command.js +4 -4
- package/dist/esm/cli/mrt-command.js.map +1 -1
- package/dist/esm/cli/oauth-command.d.ts +2 -0
- package/dist/esm/cli/oauth-command.js +8 -0
- package/dist/esm/cli/oauth-command.js.map +1 -1
- package/dist/esm/cli/ods-command.d.ts +2 -0
- package/dist/esm/cli/webdav-command.d.ts +2 -0
- package/dist/esm/clients/custom-apis.d.ts +36 -2
- package/dist/esm/clients/custom-apis.js +57 -4
- package/dist/esm/clients/custom-apis.js.map +1 -1
- package/dist/esm/clients/index.d.ts +1 -1
- package/dist/esm/clients/index.js +1 -1
- package/dist/esm/clients/index.js.map +1 -1
- package/dist/esm/clients/slas-shopper.generated.d.ts +2 -1
- package/dist/esm/config/dw-json-schema.d.ts +14 -0
- package/dist/esm/config/dw-json-schema.js +265 -0
- package/dist/esm/config/dw-json-schema.js.map +1 -0
- package/dist/esm/config/dw-json.d.ts +3 -0
- package/dist/esm/config/dw-json.js.map +1 -1
- package/dist/esm/config/index.d.ts +6 -2
- package/dist/esm/config/index.js +4 -2
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/config/mapping.d.ts +5 -0
- package/dist/esm/config/mapping.js +21 -1
- package/dist/esm/config/mapping.js.map +1 -1
- package/dist/esm/config/project-environment.d.ts +62 -0
- package/dist/esm/config/project-environment.js +113 -0
- package/dist/esm/config/project-environment.js.map +1 -1
- package/dist/esm/config/resolved-config.js +1 -0
- package/dist/esm/config/resolved-config.js.map +1 -1
- package/dist/esm/config/resolver.js +52 -8
- package/dist/esm/config/resolver.js.map +1 -1
- package/dist/esm/config/sources/dw-json-source.js +25 -3
- package/dist/esm/config/sources/dw-json-source.js.map +1 -1
- package/dist/esm/config/sources/env-source.d.ts +42 -8
- package/dist/esm/config/sources/env-source.js +86 -50
- package/dist/esm/config/sources/env-source.js.map +1 -1
- package/dist/esm/config/sources/index.d.ts +1 -1
- package/dist/esm/config/sources/index.js +1 -1
- package/dist/esm/config/sources/index.js.map +1 -1
- package/dist/esm/config/types.d.ts +10 -3
- package/dist/esm/docs/search.js +4 -1
- package/dist/esm/docs/search.js.map +1 -1
- package/dist/esm/docs/types.d.ts +5 -1
- package/dist/esm/guidance/bundle.d.ts +33 -0
- package/dist/esm/guidance/bundle.js +268 -0
- package/dist/esm/guidance/bundle.js.map +1 -0
- package/dist/esm/guidance/catalog.d.ts +8 -1
- package/dist/esm/guidance/catalog.js +48 -6
- package/dist/esm/guidance/catalog.js.map +1 -1
- package/dist/esm/guidance/index.d.ts +1 -0
- package/dist/esm/guidance/index.js +1 -0
- package/dist/esm/guidance/index.js.map +1 -1
- package/dist/esm/guidance/types.d.ts +17 -1
- package/dist/esm/guidance/types.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instance/index.js +1 -0
- package/dist/esm/instance/index.js.map +1 -1
- package/dist/esm/openshell/apply.d.ts +90 -0
- package/dist/esm/openshell/apply.js +225 -0
- package/dist/esm/openshell/apply.js.map +1 -0
- package/dist/esm/openshell/index.d.ts +30 -0
- package/dist/esm/openshell/index.js +34 -0
- package/dist/esm/openshell/index.js.map +1 -0
- package/dist/esm/openshell/setup.d.ts +94 -0
- package/dist/esm/openshell/setup.js +307 -0
- package/dist/esm/openshell/setup.js.map +1 -0
- package/dist/esm/scapi/auth-primitives.js +1 -0
- package/dist/esm/scapi/auth-primitives.js.map +1 -1
- package/dist/esm/scapi/authentication.d.ts +19 -0
- package/dist/esm/scapi/authentication.js +65 -6
- package/dist/esm/scapi/authentication.js.map +1 -1
- package/dist/esm/scapi/catalog.d.ts +5 -0
- package/dist/esm/scapi/catalog.js.map +1 -1
- package/dist/esm/scapi/index.d.ts +8 -3
- package/dist/esm/scapi/index.js +5 -2
- package/dist/esm/scapi/index.js.map +1 -1
- package/dist/esm/scapi/live.d.ts +52 -0
- package/dist/esm/scapi/live.js +142 -0
- package/dist/esm/scapi/live.js.map +1 -0
- package/dist/esm/scapi/local.d.ts +9 -0
- package/dist/esm/scapi/local.js +91 -0
- package/dist/esm/scapi/local.js.map +1 -0
- package/dist/esm/scapi/request.d.ts +6 -0
- package/dist/esm/scapi/request.js +84 -61
- package/dist/esm/scapi/request.js.map +1 -1
- package/dist/esm/scapi/shopper.d.ts +31 -0
- package/dist/esm/scapi/shopper.js +79 -0
- package/dist/esm/scapi/shopper.js.map +1 -0
- package/dist/esm/scapi/worker-source.js +2 -2
- package/dist/esm/slas/index.d.ts +1 -1
- package/dist/esm/slas/index.js +1 -1
- package/dist/esm/slas/index.js.map +1 -1
- package/dist/esm/slas/token.d.ts +10 -0
- package/dist/esm/slas/token.js +27 -0
- package/dist/esm/slas/token.js.map +1 -1
- package/dist/esm/telemetry/telemetry.d.ts +1 -0
- package/dist/esm/telemetry/telemetry.js +18 -1
- package/dist/esm/telemetry/telemetry.js.map +1 -1
- package/dist/esm/telemetry/types.d.ts +9 -0
- package/dist/esm/test-utils/config-isolation.js +12 -13
- package/dist/esm/test-utils/config-isolation.js.map +1 -1
- package/dist/esm/ux/agent-context.d.ts +69 -0
- package/dist/esm/ux/agent-context.js +133 -0
- package/dist/esm/ux/agent-context.js.map +1 -0
- package/dist/esm/ux/confirm.d.ts +27 -0
- package/dist/esm/ux/confirm.js +32 -0
- package/dist/esm/ux/confirm.js.map +1 -1
- package/dist/esm/ux/index.d.ts +2 -1
- package/dist/esm/ux/index.js +2 -1
- package/dist/esm/ux/index.js.map +1 -1
- package/package.json +8 -1
- package/specs/slas-shopper-v1.yaml +2 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { MiddlewareRegistry } from '../clients/middleware-registry.js';
|
|
2
|
+
export interface ScapiShopperConfig {
|
|
3
|
+
shortCode: string;
|
|
4
|
+
tenantId: string;
|
|
5
|
+
slasClientId?: string;
|
|
6
|
+
slasClientSecret?: string;
|
|
7
|
+
/** Redirect URI registered on a public SLAS client. Defaults to `http://localhost:3000/callback`. */
|
|
8
|
+
redirectUri?: string;
|
|
9
|
+
middlewareRegistry?: MiddlewareRegistry;
|
|
10
|
+
}
|
|
11
|
+
/** Host-held shopper access; the token never reaches executed code. */
|
|
12
|
+
export interface ScapiShopperAuth {
|
|
13
|
+
/** Bearer token for a guest shopper on the site. */
|
|
14
|
+
getAccessToken(siteId: string, signal: AbortSignal): Promise<string>;
|
|
15
|
+
/** Drop a rejected token so the next request starts a new session. */
|
|
16
|
+
invalidate(siteId: string): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Guest shopper sessions per tenant, SLAS client, and site. A session outlives
|
|
20
|
+
* individual executions so baskets and other shopper state carry across them;
|
|
21
|
+
* expired tokens are refreshed, keeping the same shopper.
|
|
22
|
+
*/
|
|
23
|
+
export declare class ScapiShopperSessions {
|
|
24
|
+
private readonly pending;
|
|
25
|
+
private readonly sessions;
|
|
26
|
+
/** Shopper auth bound to one configuration. */
|
|
27
|
+
for(config: ScapiShopperConfig): ScapiShopperAuth;
|
|
28
|
+
/** Forget all sessions; subsequent requests start as new guests. */
|
|
29
|
+
reset(): void;
|
|
30
|
+
private session;
|
|
31
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2
|
|
4
|
+
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { toOrganizationId } from '../clients/custom-apis.js';
|
|
7
|
+
import { getGuestToken, refreshShopperToken } from '../slas/token.js';
|
|
8
|
+
/** Refresh this long before expiry so a request does not race the token's lifetime. */
|
|
9
|
+
const EXPIRY_MARGIN_MS = 60_000;
|
|
10
|
+
/**
|
|
11
|
+
* Guest shopper sessions per tenant, SLAS client, and site. A session outlives
|
|
12
|
+
* individual executions so baskets and other shopper state carry across them;
|
|
13
|
+
* expired tokens are refreshed, keeping the same shopper.
|
|
14
|
+
*/
|
|
15
|
+
export class ScapiShopperSessions {
|
|
16
|
+
pending = new Map();
|
|
17
|
+
sessions = new Map();
|
|
18
|
+
/** Shopper auth bound to one configuration. */
|
|
19
|
+
for(config) {
|
|
20
|
+
return {
|
|
21
|
+
getAccessToken: async (siteId, signal) => (await this.session(config, siteId, signal)).token.access_token,
|
|
22
|
+
invalidate: (siteId) => {
|
|
23
|
+
if (config.slasClientId)
|
|
24
|
+
this.sessions.delete(sessionKey(config, siteId));
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** Forget all sessions; subsequent requests start as new guests. */
|
|
29
|
+
reset() {
|
|
30
|
+
this.sessions.clear();
|
|
31
|
+
this.pending.clear();
|
|
32
|
+
}
|
|
33
|
+
async session(config, siteId, signal) {
|
|
34
|
+
if (!config.slasClientId)
|
|
35
|
+
throw new Error('SCAPI_SHOPPER_CONFIG_MISSING: Shopper APIs require slasClientId (and slasClientSecret for private clients). Use config_inspect; Storefront Next projects provide these through .env.');
|
|
36
|
+
const key = sessionKey(config, siteId);
|
|
37
|
+
const current = this.sessions.get(key);
|
|
38
|
+
if (current && current.expiresAt - EXPIRY_MARGIN_MS > Date.now())
|
|
39
|
+
return current;
|
|
40
|
+
let pending = this.pending.get(key);
|
|
41
|
+
if (!pending) {
|
|
42
|
+
const tokenConfig = {
|
|
43
|
+
shortCode: config.shortCode,
|
|
44
|
+
organizationId: toOrganizationId(config.tenantId),
|
|
45
|
+
slasClientId: config.slasClientId,
|
|
46
|
+
slasClientSecret: config.slasClientSecret,
|
|
47
|
+
siteId,
|
|
48
|
+
redirectUri: config.redirectUri ?? 'http://localhost:3000/callback',
|
|
49
|
+
middlewareRegistry: config.middlewareRegistry,
|
|
50
|
+
};
|
|
51
|
+
pending = (async () => {
|
|
52
|
+
let token;
|
|
53
|
+
if (current?.token.refresh_token)
|
|
54
|
+
token = await refreshShopperToken(tokenConfig, current.token.refresh_token).catch(() => undefined);
|
|
55
|
+
token ??= await getGuestToken(tokenConfig);
|
|
56
|
+
const session = { token, expiresAt: Date.now() + token.expires_in * 1000 };
|
|
57
|
+
this.sessions.set(key, session);
|
|
58
|
+
return session;
|
|
59
|
+
})().finally(() => this.pending.delete(key));
|
|
60
|
+
this.pending.set(key, pending);
|
|
61
|
+
}
|
|
62
|
+
// A shared token request is not tied to the first caller's signal.
|
|
63
|
+
return await abortable(pending, signal);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function sessionKey(config, siteId) {
|
|
67
|
+
return [config.shortCode, toOrganizationId(config.tenantId), config.slasClientId, siteId]
|
|
68
|
+
.map((part) => String(part).toLowerCase())
|
|
69
|
+
.join('/');
|
|
70
|
+
}
|
|
71
|
+
function abortable(promise, signal) {
|
|
72
|
+
signal.throwIfAborted();
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
const onAbort = () => reject(signal.reason);
|
|
75
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
76
|
+
promise.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=shopper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopper.js","sourceRoot":"","sources":["../../../src/scapi/shopper.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,7 +50,7 @@ process.on('message', async message => {
|
|
|
50
50
|
parameters: [...(item.parameters || []), ...(item[method].parameters || [])],
|
|
51
51
|
security: item[method].security ?? schema.security ?? []}, entry.id);
|
|
52
52
|
}
|
|
53
|
-
spec.paths['/' + entry.id + path] = methods;
|
|
53
|
+
spec.paths['/' + entry.id + (entry.apiFamily === 'custom' ? '/organizations/{organizationId}' : '') + path] = methods;
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
const scapi = {request: options => new Promise((resolve, reject) => {
|
|
@@ -71,7 +71,7 @@ process.on('message', async message => {
|
|
|
71
71
|
});
|
|
72
72
|
let runningSnippets = 0;
|
|
73
73
|
const evaluate = (code, input) => new Function('spec', 'scapi', 'codemode', 'auth', 'organizationId', 'siteId', 'input',
|
|
74
|
-
'return (' + code + ')(input);')(spec, scapi, codemode, auth, message.organizationId, message.siteId, input);
|
|
74
|
+
'return (' + code.trim().replace(/;+$/, '') + '\n)(input);')(spec, scapi, codemode, auth, message.organizationId, message.siteId, input);
|
|
75
75
|
const codemode = {
|
|
76
76
|
search: (query = '') => snippetCall('search', String(query)),
|
|
77
77
|
describe: name => snippetCall('describe', String(name)),
|
package/dist/esm/slas/index.d.ts
CHANGED
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export type { SlasTokenConfig, SlasTokenResponse, SlasRegisteredLoginConfig } from './types.js';
|
|
11
11
|
export { generateCodeChallenge, generateCodeVerifier } from './pkce.js';
|
|
12
|
-
export { getGuestToken, getRegisteredToken } from './token.js';
|
|
12
|
+
export { getGuestToken, getRegisteredToken, refreshShopperToken } from './token.js';
|
package/dist/esm/slas/index.js
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
5
|
*/
|
|
6
6
|
export { generateCodeChallenge, generateCodeVerifier } from './pkce.js';
|
|
7
|
-
export { getGuestToken, getRegisteredToken } from './token.js';
|
|
7
|
+
export { getGuestToken, getRegisteredToken, refreshShopperToken } from './token.js';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/slas/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,WAAW,CAAC;AACtE,OAAO,EAAC,aAAa,EAAE,kBAAkB,EAAC,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/slas/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,WAAW,CAAC;AACtE,OAAO,EAAC,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,EAAC,MAAM,YAAY,CAAC"}
|
package/dist/esm/slas/token.d.ts
CHANGED
|
@@ -29,3 +29,13 @@ export declare function getGuestToken(config: SlasTokenConfig): Promise<SlasToke
|
|
|
29
29
|
* @returns The token response including access_token and refresh_token
|
|
30
30
|
*/
|
|
31
31
|
export declare function getRegisteredToken(config: SlasRegisteredLoginConfig): Promise<SlasTokenResponse>;
|
|
32
|
+
/**
|
|
33
|
+
* Refreshes a shopper access token, keeping the shopper's session (usid).
|
|
34
|
+
*
|
|
35
|
+
* Private clients authenticate with HTTP Basic using the client secret.
|
|
36
|
+
*
|
|
37
|
+
* @param config - SLAS token configuration
|
|
38
|
+
* @param refreshToken - Refresh token from a previous token response
|
|
39
|
+
* @returns The token response including a new access_token and refresh_token
|
|
40
|
+
*/
|
|
41
|
+
export declare function refreshShopperToken(config: SlasTokenConfig, refreshToken: string): Promise<SlasTokenResponse>;
|
package/dist/esm/slas/token.js
CHANGED
|
@@ -201,4 +201,31 @@ export async function getRegisteredToken(config) {
|
|
|
201
201
|
checkResponse(tokenResponse, 'token exchange (authorization_code_pkce)', error);
|
|
202
202
|
return data;
|
|
203
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Refreshes a shopper access token, keeping the shopper's session (usid).
|
|
206
|
+
*
|
|
207
|
+
* Private clients authenticate with HTTP Basic using the client secret.
|
|
208
|
+
*
|
|
209
|
+
* @param config - SLAS token configuration
|
|
210
|
+
* @param refreshToken - Refresh token from a previous token response
|
|
211
|
+
* @returns The token response including a new access_token and refresh_token
|
|
212
|
+
*/
|
|
213
|
+
export async function refreshShopperToken(config, refreshToken) {
|
|
214
|
+
const client = createSlasShopperClient(config);
|
|
215
|
+
const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
|
|
216
|
+
if (config.slasClientSecret)
|
|
217
|
+
headers.Authorization = `Basic ${encodeBasicClientCredentials(config.slasClientId, config.slasClientSecret)}`;
|
|
218
|
+
const { data, error, response: tokenResponse, } = await client.POST('/oauth2/token', {
|
|
219
|
+
redirect: 'error',
|
|
220
|
+
headers,
|
|
221
|
+
body: {
|
|
222
|
+
grant_type: 'refresh_token',
|
|
223
|
+
client_id: config.slasClientId,
|
|
224
|
+
channel_id: config.siteId,
|
|
225
|
+
refresh_token: refreshToken,
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
checkResponse(tokenResponse, 'token refresh (refresh_token)', error);
|
|
229
|
+
return data;
|
|
230
|
+
}
|
|
204
231
|
//# sourceMappingURL=token.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/slas/token.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/slas/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@ export declare class Telemetry {
|
|
|
29
29
|
private flushIntervalMs;
|
|
30
30
|
private flushTimer;
|
|
31
31
|
private isCI;
|
|
32
|
+
private agentAttributes;
|
|
32
33
|
/**
|
|
33
34
|
* Check if telemetry is disabled via environment variables.
|
|
34
35
|
* Supports both SF_DISABLE_TELEMETRY (sf CLI standard) and SFCC_DISABLE_TELEMETRY.
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2
|
|
4
4
|
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { randomBytes } from 'node:crypto';
|
|
6
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
7
7
|
import fs from 'node:fs';
|
|
8
8
|
import path from 'node:path';
|
|
9
9
|
import { AppInsightsClient } from './app-insights-client.js';
|
|
10
10
|
import { getLogger } from '../logging/index.js';
|
|
11
|
+
import { getAgentContext } from '../ux/agent-context.js';
|
|
11
12
|
const generateRandomId = () => randomBytes(20).toString('hex');
|
|
12
13
|
/**
|
|
13
14
|
* Best-effort detection of a CI / non-interactive automation environment.
|
|
@@ -38,6 +39,19 @@ function detectCI() {
|
|
|
38
39
|
env.BITBUCKET_BUILD_NUMBER ||
|
|
39
40
|
env.CODEBUILD_BUILD_ID);
|
|
40
41
|
}
|
|
42
|
+
function buildAgentAttributes(cliId) {
|
|
43
|
+
const context = getAgentContext();
|
|
44
|
+
if (!context.isAgentic || !context.harness)
|
|
45
|
+
return { isAgent: false };
|
|
46
|
+
const attributes = { isAgent: true, agent: context.harness.id };
|
|
47
|
+
if (context.sessionId) {
|
|
48
|
+
attributes.agentSessionKey = createHash('sha256')
|
|
49
|
+
.update(`b2c-agent-session-v1\0${cliId}\0${context.harness.id}\0${context.sessionId}`)
|
|
50
|
+
.digest('hex')
|
|
51
|
+
.slice(0, 32);
|
|
52
|
+
}
|
|
53
|
+
return attributes;
|
|
54
|
+
}
|
|
41
55
|
/**
|
|
42
56
|
* Sanitize attributes to only include string, number, boolean (App Insights–safe).
|
|
43
57
|
* Aligns with sf CLI telemetry record() validation.
|
|
@@ -147,6 +161,7 @@ export class Telemetry {
|
|
|
147
161
|
flushIntervalMs;
|
|
148
162
|
flushTimer;
|
|
149
163
|
isCI;
|
|
164
|
+
agentAttributes;
|
|
150
165
|
/**
|
|
151
166
|
* Check if telemetry is disabled via environment variables.
|
|
152
167
|
* Supports both SF_DISABLE_TELEMETRY (sf CLI standard) and SFCC_DISABLE_TELEMETRY.
|
|
@@ -175,6 +190,7 @@ export class Telemetry {
|
|
|
175
190
|
this.version = options.version ?? '0.0.0';
|
|
176
191
|
this.flushIntervalMs = options.flushIntervalMs;
|
|
177
192
|
this.isCI = detectCI();
|
|
193
|
+
this.agentAttributes = buildAgentAttributes(this.cliId);
|
|
178
194
|
if (process.env.SFCC_TELEMETRY_LOG === 'true') {
|
|
179
195
|
this.traceLog = getLogger().child({ component: 'telemetry' });
|
|
180
196
|
}
|
|
@@ -309,6 +325,7 @@ export class Telemetry {
|
|
|
309
325
|
timestamp: String(Date.now()),
|
|
310
326
|
processUptime: process.uptime() * 1000,
|
|
311
327
|
isCI: this.isCI,
|
|
328
|
+
...this.agentAttributes,
|
|
312
329
|
};
|
|
313
330
|
}
|
|
314
331
|
createClient() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,UAAU,EAAE,WAAW,EAAC,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAC,SAAS,EAAc,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AAEvD,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEvE;;;;;;;;;GASG;AACH,SAAS,QAAQ;IACf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,2EAA2E;IAC3E,uEAAuE;IACvE,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,OAAO,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CACZ,GAAG,CAAC,sBAAsB;QAC1B,GAAG,CAAC,YAAY;QAChB,GAAG,CAAC,cAAc;QAClB,GAAG,CAAC,SAAS;QACb,GAAG,CAAC,QAAQ;QACZ,GAAG,CAAC,MAAM;QACV,GAAG,CAAC,WAAW;QACf,GAAG,CAAC,gBAAgB;QACpB,GAAG,CAAC,QAAQ;QACZ,GAAG,CAAC,sBAAsB;QAC1B,GAAG,CAAC,kBAAkB,CACvB,CAAC;AACJ,CAAC;AAYD,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,EAAC,OAAO,EAAE,KAAK,EAAC,CAAC;IACpE,MAAM,UAAU,GAAoB,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,UAAU,CAAC,eAAe,GAAG,UAAU,CAAC,QAAQ,CAAC;aAC9C,MAAM,CAAC,yBAAyB,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;aACrF,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,UAA+B;IACzD,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACzF,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,SAAS,8BAA8B,CAAC,UAA+B;IAIrE,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5D,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACtC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,EAAC,UAAU,EAAE,YAAY,EAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAiB,EAAE;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAU,EAAE;IACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ;QAAE,OAAO,gBAAgB,EAAE,CAAC;IAEzC,0BAA0B;IAC1B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;YAC9B,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;QACpD,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,SAAS;IACZ,UAAU,CAAsB;IAChC,KAAK,CAAS;IACd,OAAO,CAAS;IAChB,MAAM,CAAgC;IACtC,SAAS,CAAS;IAClB,OAAO,CAAU;IACjB,OAAO,CAAS;IAChB,cAAc,CAAqB;IACnC,QAAQ,CAAqB;IAC7B,eAAe,CAAqB;IACpC,UAAU,CAA6C;IACvD,IAAI,CAAU;IACd,eAAe,CAAkB;IAEzC;;;OAGG;IACH,MAAM,CAAC,UAAU;QACf,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,MAAM,CAAC;IACtG,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,CAAC,cAAuB;QAChD,IAAI,SAAS,CAAC,UAAU,EAAE;YAAE,OAAO,SAAS,CAAC;QAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,cAAc,CAAC;IAC7D,CAAC;IAED,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,UAAU,GAAG,EAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;YAC9C,IAAI,CAAC,QAAQ,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,EAAC,SAAS,EAAE,WAAW,EAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,UAA+B;QAC3C,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAC,UAAU,EAAC,EAAE,yBAAyB,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,GAAG,EAAC,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,UAAU,EAAC,CAAC;IACxD,CAAC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,SAAiB,EAAE,aAAkC,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;YAC5C,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAC,EAAE,qBAAqB,CAAC,CAAC;YACvE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAC9D,MAAM,EAAC,UAAU,EAAE,YAAY,EAAC,GAAG,8BAA8B,CAAC,eAAe,CAAC,CAAC;YACnF,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,EAAE,UAAU,EAAE,YAAY,EAAC,CAAC,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,aAAkC,EAAE;QAC7E,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,KAAY,EAAE,aAAkC,EAAE;QAC9D,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAC,EAAE,yBAAyB,CAAC,CAAC;YAC7F,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;YAClF,MAAM,EAAC,UAAU,EAAE,YAAY,EAAC,GAAG,8BAA8B,CAAC,eAAe,CAAC,CAAC;YACnF,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,4CAA4C;QAC5C,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAEjC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAClB,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,EAAC,EACzF,iBAAiB,CAClB,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;QAClE,CAAC;QAED,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,sEAAsE;QACtE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAC7E,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAE1C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,CAAC;QAED,2EAA2E;QAC3E,4EAA4E;QAC5E,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEO,oBAAoB,CAAC,aAAkC,EAAE;QAC/D,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAC,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,UAAU,EAAC,CAAC,CAAC;QAC1E,OAAO;YACL,GAAG,SAAS;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,OAAO;YAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ;YAC7B,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI;YACtC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,IAAI,CAAC,eAAe;SACxB,CAAC;IACJ,CAAC;IAEO,YAAY;QAClB,oEAAoE;QACpE,2EAA2E;QAC3E,+CAA+C;QAC/C,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,cAAwB,CAAC,CAAC;QAEpE,oCAAoC;QACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7D,sDAAsD;QACtD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAEhE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -36,6 +36,15 @@ export interface TelemetryEventProperties extends TelemetryAttributes {
|
|
|
36
36
|
* can otherwise dominate volume and skew blended KPIs.
|
|
37
37
|
*/
|
|
38
38
|
isCI: boolean;
|
|
39
|
+
/** Whether the event originated from a process driven by an AI coding agent. */
|
|
40
|
+
isAgent: boolean;
|
|
41
|
+
/** Detected agent harness id (e.g. `claude-code`), when {@link isAgent} is true. */
|
|
42
|
+
agent?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Salted, truncated hash of the agent harness session id, for grouping events
|
|
45
|
+
* from one agent session. The raw session id is never sent.
|
|
46
|
+
*/
|
|
47
|
+
agentSessionKey?: string;
|
|
39
48
|
}
|
|
40
49
|
/**
|
|
41
50
|
* Options for creating a Telemetry instance.
|
|
@@ -5,22 +5,23 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { resetLogger } from '../logging/index.js';
|
|
7
7
|
const ADDITIONAL_ENV_VARS = ['COMMERCE_API_SLAS_SECRET', 'LANGUAGE', 'NO_COLOR'];
|
|
8
|
+
function isIsolatedEnvVar(key) {
|
|
9
|
+
return (key.startsWith('SFCC_') || key.startsWith('MRT_') || key.startsWith('PUBLIC__') || ADDITIONAL_ENV_VARS.includes(key));
|
|
10
|
+
}
|
|
8
11
|
let state = null;
|
|
9
12
|
export function isolateConfig() {
|
|
10
13
|
if (state)
|
|
11
14
|
throw new Error('isolateConfig() called without cleanup - call restoreConfig() first');
|
|
12
15
|
const savedEnvVars = {};
|
|
13
16
|
for (const key of Object.keys(process.env)) {
|
|
14
|
-
if (
|
|
17
|
+
if (isIsolatedEnvVar(key)) {
|
|
15
18
|
savedEnvVars[key] = process.env[key];
|
|
16
19
|
delete process.env[key];
|
|
17
20
|
}
|
|
18
21
|
}
|
|
19
|
-
for (const key of ADDITIONAL_ENV_VARS) {
|
|
20
|
-
savedEnvVars[key] = process.env[key];
|
|
21
|
-
delete process.env[key];
|
|
22
|
-
}
|
|
23
22
|
process.env.SFCC_CONFIG = '/dev/null';
|
|
23
|
+
// Commands load no .env during tests
|
|
24
|
+
process.env.SFCC_DOTENV_FILE = '';
|
|
24
25
|
process.env.MRT_CREDENTIALS_FILE = '/dev/null';
|
|
25
26
|
process.env.SFCC_LOG_LEVEL = 'silent';
|
|
26
27
|
// Reset global logger so it picks up the new SFCC_LOG_LEVEL
|
|
@@ -32,16 +33,14 @@ export function restoreConfig() {
|
|
|
32
33
|
return;
|
|
33
34
|
// Reset logger before restoring env vars
|
|
34
35
|
resetLogger();
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
for (const [key, value] of Object.entries(state.savedEnvVars)) {
|
|
39
|
-
if (value === undefined) {
|
|
36
|
+
// Drop anything the test set, not just the variables isolateConfig() replaced
|
|
37
|
+
for (const key of Object.keys(process.env)) {
|
|
38
|
+
if (isIsolatedEnvVar(key))
|
|
40
39
|
delete process.env[key];
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
}
|
|
41
|
+
for (const [key, value] of Object.entries(state.savedEnvVars)) {
|
|
42
|
+
if (value !== undefined)
|
|
43
43
|
process.env[key] = value;
|
|
44
|
-
}
|
|
45
44
|
}
|
|
46
45
|
state = null;
|
|
47
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-isolation.js","sourceRoot":"","sources":["../../../src/test-utils/config-isolation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAEhD,MAAM,mBAAmB,GAAG,CAAC,0BAA0B,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config-isolation.js","sourceRoot":"","sources":["../../../src/test-utils/config-isolation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAEhD,MAAM,mBAAmB,GAAG,CAAC,0BAA0B,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAEjF,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,CACL,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CACrH,CAAC;AACJ,CAAC;AAMD,IAAI,KAAK,GAA0B,IAAI,CAAC;AAExC,MAAM,UAAU,aAAa;IAC3B,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IAElG,MAAM,YAAY,GAAuC,EAAE,CAAC;IAE5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC;IACtC,qCAAqC;IACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,WAAW,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,CAAC;IAEtC,4DAA4D;IAC5D,WAAW,EAAE,CAAC;IAEd,KAAK,GAAG,EAAC,YAAY,EAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,yCAAyC;IACzC,WAAW,EAAE,CAAC;IAEd,8EAA8E;IAC9E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,IAAI,gBAAgB,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpD,CAAC;IAED,KAAK,GAAG,IAAI,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort detection of AI coding agent harnesses (Claude Code, Cursor,
|
|
3
|
+
* Codex, etc.) from the environment of the current process.
|
|
4
|
+
*
|
|
5
|
+
* Detection is advisory: it tailors help output, disables interactive prompts,
|
|
6
|
+
* and attributes telemetry. It must never block or fail a command.
|
|
7
|
+
*
|
|
8
|
+
* Detection relies only on environment variables that harnesses set for their
|
|
9
|
+
* child processes. Users can override detection with `SFCC_AGENT`:
|
|
10
|
+
*
|
|
11
|
+
* - `SFCC_AGENT=<name>` forces agent mode and reports `<name>` as the harness
|
|
12
|
+
* - `SFCC_AGENT=0` (or `false`/`no`/`off`) disables detection entirely
|
|
13
|
+
*
|
|
14
|
+
* @module ux/agent-context
|
|
15
|
+
*/
|
|
16
|
+
/** An AI coding agent harness (the tool driving the CLI). */
|
|
17
|
+
export interface AgentHarness {
|
|
18
|
+
/** Stable identifier (e.g. `claude-code`). */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Human-readable name (e.g. `Claude Code`). */
|
|
21
|
+
name: string;
|
|
22
|
+
}
|
|
23
|
+
/** A single detector match. */
|
|
24
|
+
export interface AgentMatch {
|
|
25
|
+
harness: AgentHarness;
|
|
26
|
+
/** Harness session/thread/conversation identifier, when exposed. */
|
|
27
|
+
sessionId?: string;
|
|
28
|
+
/** Environment variable names that produced the match. */
|
|
29
|
+
signals: readonly string[];
|
|
30
|
+
}
|
|
31
|
+
/** Result of agent detection. */
|
|
32
|
+
export interface AgentContext {
|
|
33
|
+
/** True when any harness was detected (or forced via `SFCC_AGENT`). */
|
|
34
|
+
isAgentic: boolean;
|
|
35
|
+
/** Highest-precedence harness, or null. */
|
|
36
|
+
harness: AgentHarness | null;
|
|
37
|
+
/** First available session identifier across matches, or null. */
|
|
38
|
+
sessionId: null | string;
|
|
39
|
+
/** All matches in precedence order. */
|
|
40
|
+
matches: readonly AgentMatch[];
|
|
41
|
+
}
|
|
42
|
+
export type AgentEnvironment = Readonly<Record<string, string | undefined>>;
|
|
43
|
+
export type AgentDetector = (env: AgentEnvironment) => AgentMatch | null;
|
|
44
|
+
/**
|
|
45
|
+
* Detectors in precedence order. Direct agents precede host surfaces so that,
|
|
46
|
+
* for example, Claude Code launched inside Warp is reported as Claude Code
|
|
47
|
+
* while the Warp match is retained in `matches`.
|
|
48
|
+
*/
|
|
49
|
+
export declare const agentDetectors: readonly AgentDetector[];
|
|
50
|
+
/**
|
|
51
|
+
* Detects whether the current process is being driven by an AI coding agent.
|
|
52
|
+
*
|
|
53
|
+
* @param env - Environment to inspect (defaults to `process.env`)
|
|
54
|
+
* @param detectors - Detectors in precedence order (defaults to {@link agentDetectors})
|
|
55
|
+
*/
|
|
56
|
+
export declare function detectAgentContext(env?: AgentEnvironment, detectors?: readonly AgentDetector[]): AgentContext;
|
|
57
|
+
/**
|
|
58
|
+
* Cached {@link detectAgentContext} for `process.env`. The environment of a
|
|
59
|
+
* process does not change in ways relevant to detection, so detect once.
|
|
60
|
+
*/
|
|
61
|
+
export declare function getAgentContext(): AgentContext;
|
|
62
|
+
/** Clears the cached agent context (for tests). */
|
|
63
|
+
export declare function resetAgentContext(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Whether interactive prompts can be shown: stdin is a TTY and the process is
|
|
66
|
+
* not driven by an AI agent (agents typically cannot answer prompts, and
|
|
67
|
+
* hanging on one wastes the agent's turn).
|
|
68
|
+
*/
|
|
69
|
+
export declare function isInteractive(): boolean;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2
|
|
4
|
+
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
*/
|
|
6
|
+
const FALSE_LIKE_VALUES = new Set(['', '0', 'false', 'no', 'off']);
|
|
7
|
+
/** Returns the trimmed value, treating false-like values as unset. */
|
|
8
|
+
function value(env, name) {
|
|
9
|
+
const raw = env[name];
|
|
10
|
+
if (typeof raw !== 'string')
|
|
11
|
+
return undefined;
|
|
12
|
+
const normalized = raw.trim();
|
|
13
|
+
return FALSE_LIKE_VALUES.has(normalized.toLowerCase()) ? undefined : normalized;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Builds a detector that matches when any marker env var equals its expected
|
|
17
|
+
* value (or is set to any truthy value when `expected` is omitted).
|
|
18
|
+
*/
|
|
19
|
+
function markerDetector(harness, markers, sessionVars = []) {
|
|
20
|
+
return (env) => {
|
|
21
|
+
const signals = [];
|
|
22
|
+
for (const { name, expected } of markers) {
|
|
23
|
+
const matched = expected === undefined ? value(env, name) !== undefined : env[name] === expected;
|
|
24
|
+
if (matched)
|
|
25
|
+
signals.push(name);
|
|
26
|
+
}
|
|
27
|
+
if (signals.length === 0)
|
|
28
|
+
return null;
|
|
29
|
+
let sessionId;
|
|
30
|
+
for (const name of sessionVars) {
|
|
31
|
+
const v = value(env, name);
|
|
32
|
+
if (v) {
|
|
33
|
+
signals.push(name);
|
|
34
|
+
sessionId ??= v;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { harness, sessionId, signals };
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Detectors in precedence order. Direct agents precede host surfaces so that,
|
|
42
|
+
* for example, Claude Code launched inside Warp is reported as Claude Code
|
|
43
|
+
* while the Warp match is retained in `matches`.
|
|
44
|
+
*/
|
|
45
|
+
export const agentDetectors = [
|
|
46
|
+
markerDetector({ id: 'opencode', name: 'OpenCode' }, [{ name: 'OPENCODE', expected: '1' }]),
|
|
47
|
+
markerDetector({ id: 'qwen-code', name: 'Qwen Code' }, [{ name: 'QWEN_CODE_SESSION_ID' }], ['QWEN_CODE_SESSION_ID']),
|
|
48
|
+
markerDetector({ id: 'pi', name: 'Pi' }, [
|
|
49
|
+
{ name: 'PI_CODING_AGENT', expected: 'true' },
|
|
50
|
+
{ name: 'AI_AGENT', expected: 'pi' },
|
|
51
|
+
], ['PI_SESSION_ID']),
|
|
52
|
+
markerDetector({ id: 'cursor-agent', name: 'Cursor Agent' }, [{ name: 'CURSOR_AGENT', expected: '1' }], ['CURSOR_CONVERSATION_ID']),
|
|
53
|
+
markerDetector({ id: 'claude-code', name: 'Claude Code' }, [{ name: 'CLAUDECODE', expected: '1' }], ['CLAUDE_CODE_SESSION_ID']),
|
|
54
|
+
markerDetector({ id: 'codex', name: 'OpenAI Codex' }, [{ name: 'CODEX_THREAD_ID' }], ['CODEX_THREAD_ID']),
|
|
55
|
+
markerDetector({ id: 'amp', name: 'Amp' }, [{ name: 'AMP_CURRENT_THREAD_ID' }], ['AMP_CURRENT_THREAD_ID']),
|
|
56
|
+
markerDetector({ id: 'gemini-cli', name: 'Gemini CLI' }, [{ name: 'GEMINI_CLI', expected: '1' }]),
|
|
57
|
+
markerDetector({ id: 'auggie', name: 'Auggie' }, [{ name: 'AUGMENT_AGENT', expected: '1' }]),
|
|
58
|
+
markerDetector({ id: 'crush', name: 'Crush' }, [
|
|
59
|
+
{ name: 'CRUSH', expected: '1' },
|
|
60
|
+
{ name: 'AI_AGENT', expected: 'crush' },
|
|
61
|
+
]),
|
|
62
|
+
markerDetector({ id: 'vscode-copilot-agent', name: 'GitHub Copilot in VS Code' }, [
|
|
63
|
+
{ name: 'AI_AGENT', expected: 'github_copilot_vscode_agent' },
|
|
64
|
+
{ name: 'COPILOT_AGENT', expected: '1' },
|
|
65
|
+
]),
|
|
66
|
+
markerDetector({ id: 'warp', name: 'Warp' }, [{ name: 'OZ_RUN_ID' }], ['OZ_RUN_ID']),
|
|
67
|
+
];
|
|
68
|
+
const NOT_AGENTIC = { isAgentic: false, harness: null, sessionId: null, matches: [] };
|
|
69
|
+
/** Normalizes a user-supplied agent name into an id (lowercase, dash-separated). */
|
|
70
|
+
function toAgentId(name) {
|
|
71
|
+
return (name
|
|
72
|
+
.toLowerCase()
|
|
73
|
+
.replaceAll(/[^a-z0-9]+/g, '-')
|
|
74
|
+
.replaceAll(/^-|-$/g, '') || 'custom');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Detects whether the current process is being driven by an AI coding agent.
|
|
78
|
+
*
|
|
79
|
+
* @param env - Environment to inspect (defaults to `process.env`)
|
|
80
|
+
* @param detectors - Detectors in precedence order (defaults to {@link agentDetectors})
|
|
81
|
+
*/
|
|
82
|
+
export function detectAgentContext(env = process.env, detectors = agentDetectors) {
|
|
83
|
+
const override = env.SFCC_AGENT;
|
|
84
|
+
if (override !== undefined) {
|
|
85
|
+
const forced = value(env, 'SFCC_AGENT');
|
|
86
|
+
if (!forced)
|
|
87
|
+
return NOT_AGENTIC;
|
|
88
|
+
// Values like "1"/"true" force agent mode without naming a harness.
|
|
89
|
+
const generic = ['1', 'true', 'yes', 'on'].includes(forced.toLowerCase());
|
|
90
|
+
const harness = generic ? { id: 'unknown', name: 'Unknown agent' } : { id: toAgentId(forced), name: forced };
|
|
91
|
+
const match = { harness, signals: ['SFCC_AGENT'] };
|
|
92
|
+
return { isAgentic: true, harness, sessionId: null, matches: [match] };
|
|
93
|
+
}
|
|
94
|
+
const matches = [];
|
|
95
|
+
for (const detector of detectors) {
|
|
96
|
+
try {
|
|
97
|
+
const match = detector(env);
|
|
98
|
+
if (match)
|
|
99
|
+
matches.push(match);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Detection is advisory and must never prevent a command from running.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
isAgentic: matches.length > 0,
|
|
107
|
+
harness: matches[0]?.harness ?? null,
|
|
108
|
+
sessionId: matches.find((m) => m.sessionId)?.sessionId ?? null,
|
|
109
|
+
matches,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
let cached;
|
|
113
|
+
/**
|
|
114
|
+
* Cached {@link detectAgentContext} for `process.env`. The environment of a
|
|
115
|
+
* process does not change in ways relevant to detection, so detect once.
|
|
116
|
+
*/
|
|
117
|
+
export function getAgentContext() {
|
|
118
|
+
cached ??= detectAgentContext();
|
|
119
|
+
return cached;
|
|
120
|
+
}
|
|
121
|
+
/** Clears the cached agent context (for tests). */
|
|
122
|
+
export function resetAgentContext() {
|
|
123
|
+
cached = undefined;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Whether interactive prompts can be shown: stdin is a TTY and the process is
|
|
127
|
+
* not driven by an AI agent (agents typically cannot answer prompts, and
|
|
128
|
+
* hanging on one wastes the agent's turn).
|
|
129
|
+
*/
|
|
130
|
+
export function isInteractive() {
|
|
131
|
+
return Boolean(process.stdin.isTTY) && !getAgentContext().isAgentic;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=agent-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context.js","sourceRoot":"","sources":["../../../src/ux/agent-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkDH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAEnE,sEAAsE;AACtE,SAAS,KAAK,CAAC,GAAqB,EAAE,IAAY;IAChD,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,OAAqB,EACrB,OAAiD,EACjD,cAAwB,EAAE;IAE1B,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,EAAC,IAAI,EAAE,QAAQ,EAAC,IAAI,OAAO,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;YACjG,IAAI,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,IAAI,SAA6B,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,EAAE,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,SAAS,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAA6B;IACtD,cAAc,CAAC,EAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAC,EAAE,CAAC,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAC,CAAC,CAAC;IACvF,cAAc,CAAC,EAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAC,EAAE,CAAC,EAAC,IAAI,EAAE,sBAAsB,EAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC;IAChH,cAAc,CACZ,EAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,EACtB;QACE,EAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAC;QAC3C,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAC;KACnC,EACD,CAAC,eAAe,CAAC,CAClB;IACD,cAAc,CACZ,EAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAC,EAC1C,CAAC,EAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,EAAC,CAAC,EACvC,CAAC,wBAAwB,CAAC,CAC3B;IACD,cAAc,CACZ,EAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAC,EACxC,CAAC,EAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAC,CAAC,EACrC,CAAC,wBAAwB,CAAC,CAC3B;IACD,cAAc,CAAC,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAC,EAAE,CAAC,EAAC,IAAI,EAAE,iBAAiB,EAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;IACrG,cAAc,CAAC,EAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAC,EAAE,CAAC,EAAC,IAAI,EAAE,uBAAuB,EAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC;IACtG,cAAc,CAAC,EAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAC,EAAE,CAAC,EAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAC,CAAC,CAAC;IAC7F,cAAc,CAAC,EAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAC,EAAE,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAC,CAAC,CAAC;IACxF,cAAc,CAAC,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAC,EAAE;QAC3C,EAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAC;QAC9B,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAC;KACtC,CAAC;IACF,cAAc,CAAC,EAAC,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,2BAA2B,EAAC,EAAE;QAC9E,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,6BAA6B,EAAC;QAC3D,EAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAC;KACvC,CAAC;IACF,cAAc,CAAC,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAC,EAAE,CAAC,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;CACjF,CAAC;AAEF,MAAM,WAAW,GAAiB,EAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAC,CAAC;AAElG,oFAAoF;AACpF,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,CACL,IAAI;SACD,WAAW,EAAE;SACb,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC;SAC9B,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,QAAQ,CACxC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAwB,OAAO,CAAC,GAAG,EACnC,YAAsC,cAAc;IAEpD,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC;IAChC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC;QAChC,oEAAoE;QACpE,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,EAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAC,CAAC,CAAC,CAAC,EAAC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAC,CAAC;QACzG,MAAM,KAAK,GAAe,EAAC,OAAO,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAC,CAAC;QAC7D,OAAO,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAC,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;QAC7B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,IAAI;QACpC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,IAAI,IAAI;QAC9D,OAAO;KACR,CAAC;AACJ,CAAC;AAED,IAAI,MAAgC,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,kBAAkB,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,SAAS,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC;AACtE,CAAC"}
|