@copado/agentia-cli 0.11.0-alpha.0 → 0.14.0-alpha.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/README.md +130 -92
- package/dist/commands/promotion/get.d.ts +10 -0
- package/dist/commands/promotion/get.js +31 -0
- package/dist/commands/promotion/get.js.map +1 -0
- package/dist/commands/promotion/list.d.ts +30 -0
- package/dist/commands/promotion/list.js +48 -0
- package/dist/commands/promotion/list.js.map +1 -0
- package/dist/lib/cicd-gateway.d.ts +4 -0
- package/dist/lib/cicd-gateway.js +112 -15
- package/dist/lib/cicd-gateway.js.map +1 -1
- package/dist/lib/env-file.d.ts +5 -0
- package/dist/lib/env-file.js +41 -0
- package/dist/lib/env-file.js.map +1 -0
- package/dist/lib/local-gateway-config.d.ts +21 -0
- package/dist/lib/local-gateway-config.js +53 -0
- package/dist/lib/local-gateway-config.js.map +1 -0
- package/dist/lib/mcp/tools.d.ts +12 -0
- package/dist/lib/mcp/tools.js +58 -10
- package/dist/lib/mcp/tools.js.map +1 -1
- package/dist/lib/promotion-flags.d.ts +21 -0
- package/dist/lib/promotion-flags.js +77 -0
- package/dist/lib/promotion-flags.js.map +1 -0
- package/dist/lib/promotion-types.d.ts +188 -0
- package/dist/lib/promotion-types.js +145 -0
- package/dist/lib/promotion-types.js.map +1 -0
- package/dist/lib/sf-org-context.d.ts +13 -0
- package/dist/lib/sf-org-context.js +151 -0
- package/dist/lib/sf-org-context.js.map +1 -0
- package/oclif.manifest.json +646 -476
- package/package.json +3 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { DEFAULT_LOCAL_SF_ORG_ALIAS } from './local-gateway-config.js';
|
|
4
|
+
import { normalizeSalesforceId } from './salesforce-id.js';
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
let sfOrgDisplayFn = defaultSfOrgDisplay;
|
|
7
|
+
let cachedContext;
|
|
8
|
+
function assertNonEmpty(value, field, orgAlias) {
|
|
9
|
+
if (value === undefined || value.trim().length === 0) {
|
|
10
|
+
throw new Error(`Salesforce org "${orgAlias}" did not return ${field}. Re-authenticate with \`sf org login web --alias ${orgAlias}\`.`);
|
|
11
|
+
}
|
|
12
|
+
return value.trim();
|
|
13
|
+
}
|
|
14
|
+
function sanitizeSfCliError(message, orgAlias) {
|
|
15
|
+
const cleaned = message
|
|
16
|
+
.replaceAll(/"accessToken"\s*:\s*"[^"]*"/gi, '"accessToken":"<masked>"')
|
|
17
|
+
.replaceAll(/\b00D[A-Za-z0-9]{12,15}\b/g, '<org-id>')
|
|
18
|
+
.replaceAll(/\b005[A-Za-z0-9]{12,15}\b/g, '<user-id>')
|
|
19
|
+
.trim();
|
|
20
|
+
if (cleaned.length === 0) {
|
|
21
|
+
return `Failed to resolve Salesforce org "${orgAlias}" via \`sf org display\`.`;
|
|
22
|
+
}
|
|
23
|
+
return `Failed to resolve Salesforce org "${orgAlias}" via \`sf org display\`: ${cleaned}`;
|
|
24
|
+
}
|
|
25
|
+
function extractJsonObject(raw) {
|
|
26
|
+
const start = raw.indexOf('{');
|
|
27
|
+
if (start === -1) {
|
|
28
|
+
throw new Error('Salesforce CLI returned non-JSON output.');
|
|
29
|
+
}
|
|
30
|
+
return JSON.parse(raw.slice(start));
|
|
31
|
+
}
|
|
32
|
+
function isRedactedAccessToken(value) {
|
|
33
|
+
return value.startsWith('[') || /REDACTED|show-access-token/i.test(value);
|
|
34
|
+
}
|
|
35
|
+
export function parseSfOrgDisplayJson(raw, orgAlias) {
|
|
36
|
+
const parsed = extractJsonObject(raw);
|
|
37
|
+
if (typeof parsed.status === 'number' && parsed.status !== 0) {
|
|
38
|
+
throw new Error(sanitizeSfCliError(parsed.message ?? parsed.name ?? 'unknown error', orgAlias));
|
|
39
|
+
}
|
|
40
|
+
if (parsed.result === undefined || typeof parsed.result === 'string') {
|
|
41
|
+
throw new Error(`Salesforce CLI response for org "${orgAlias}" is missing result data.`);
|
|
42
|
+
}
|
|
43
|
+
const orgId = assertNonEmpty(parsed.result.id ?? parsed.result.orgId, 'org Id', orgAlias);
|
|
44
|
+
const userId = assertNonEmpty(parsed.result.userId, 'user Id', orgAlias);
|
|
45
|
+
const accessToken = assertNonEmpty(parsed.result.accessToken, 'access token', orgAlias);
|
|
46
|
+
const instanceUrl = assertNonEmpty(parsed.result.instanceUrl, 'instance URL', orgAlias);
|
|
47
|
+
if (isRedactedAccessToken(accessToken)) {
|
|
48
|
+
throw new Error(`Salesforce org "${orgAlias}" access token is redacted. Set SF_TEMP_SHOW_SECRETS=true or upgrade the local gateway session resolver.`);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
accessToken,
|
|
52
|
+
instanceUrl: instanceUrl.replace(/\/$/, ''),
|
|
53
|
+
orgId: normalizeSalesforceId(orgId),
|
|
54
|
+
userId: normalizeSalesforceId(userId),
|
|
55
|
+
username: parsed.result.username?.trim() || undefined,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function runSfJson(args) {
|
|
59
|
+
try {
|
|
60
|
+
const { stdout } = await execFileAsync('sf', args, {
|
|
61
|
+
encoding: 'utf8',
|
|
62
|
+
env: {
|
|
63
|
+
...process.env,
|
|
64
|
+
SF_TEMP_SHOW_SECRETS: 'true',
|
|
65
|
+
},
|
|
66
|
+
maxBuffer: 2 * 1024 * 1024,
|
|
67
|
+
});
|
|
68
|
+
return extractJsonObject(stdout);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error instanceof Error && 'stdout' in error && typeof error.stdout === 'string') {
|
|
72
|
+
const { stdout } = error;
|
|
73
|
+
if (stdout.trim().length > 0) {
|
|
74
|
+
return extractJsonObject(stdout);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
78
|
+
throw new Error(sanitizeSfCliError(message, args.at(-1) ?? 'unknown'));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function resultObject(parsed, orgAlias) {
|
|
82
|
+
if (parsed.result === undefined || typeof parsed.result === 'string') {
|
|
83
|
+
throw new Error(`Salesforce CLI response for org "${orgAlias}" is missing result data.`);
|
|
84
|
+
}
|
|
85
|
+
return parsed.result;
|
|
86
|
+
}
|
|
87
|
+
async function resolveAccessToken(orgAlias, candidate) {
|
|
88
|
+
if (candidate !== undefined && candidate.trim().length > 0 && !isRedactedAccessToken(candidate)) {
|
|
89
|
+
return candidate.trim();
|
|
90
|
+
}
|
|
91
|
+
const tokenResponse = await runSfJson([
|
|
92
|
+
'org',
|
|
93
|
+
'auth',
|
|
94
|
+
'show-access-token',
|
|
95
|
+
'--target-org',
|
|
96
|
+
orgAlias,
|
|
97
|
+
'--json',
|
|
98
|
+
'--no-prompt',
|
|
99
|
+
]);
|
|
100
|
+
if (typeof tokenResponse.status === 'number' && tokenResponse.status !== 0) {
|
|
101
|
+
throw new Error(sanitizeSfCliError(tokenResponse.message ?? tokenResponse.name ?? 'unknown error', orgAlias));
|
|
102
|
+
}
|
|
103
|
+
if (typeof tokenResponse.result === 'string') {
|
|
104
|
+
return assertNonEmpty(tokenResponse.result, 'access token', orgAlias);
|
|
105
|
+
}
|
|
106
|
+
return assertNonEmpty(tokenResponse.result?.accessToken, 'access token', orgAlias);
|
|
107
|
+
}
|
|
108
|
+
async function defaultSfOrgDisplay(orgAlias) {
|
|
109
|
+
const [orgResponse, userResponse] = await Promise.all([
|
|
110
|
+
runSfJson(['org', 'display', '--target-org', orgAlias, '--json']),
|
|
111
|
+
runSfJson(['org', 'display', 'user', '--target-org', orgAlias, '--json']),
|
|
112
|
+
]);
|
|
113
|
+
if (typeof orgResponse.status === 'number' && orgResponse.status !== 0) {
|
|
114
|
+
throw new Error(sanitizeSfCliError(orgResponse.message ?? orgResponse.name ?? 'unknown error', orgAlias));
|
|
115
|
+
}
|
|
116
|
+
if (typeof userResponse.status === 'number' && userResponse.status !== 0) {
|
|
117
|
+
throw new Error(sanitizeSfCliError(userResponse.message ?? userResponse.name ?? 'unknown error', orgAlias));
|
|
118
|
+
}
|
|
119
|
+
const org = resultObject(orgResponse, orgAlias);
|
|
120
|
+
const user = resultObject(userResponse, orgAlias);
|
|
121
|
+
const accessToken = await resolveAccessToken(orgAlias, org.accessToken ?? user.accessToken);
|
|
122
|
+
const orgId = assertNonEmpty(org.id ?? org.orgId ?? user.orgId, 'org Id', orgAlias);
|
|
123
|
+
const userId = assertNonEmpty(user.id ?? user.userId ?? org.userId, 'user Id', orgAlias);
|
|
124
|
+
const instanceUrl = assertNonEmpty(org.instanceUrl ?? user.instanceUrl, 'instance URL', orgAlias);
|
|
125
|
+
return {
|
|
126
|
+
accessToken,
|
|
127
|
+
instanceUrl: instanceUrl.replace(/\/$/, ''),
|
|
128
|
+
orgId: normalizeSalesforceId(orgId),
|
|
129
|
+
userId: normalizeSalesforceId(userId),
|
|
130
|
+
username: (user.username ?? org.username)?.trim() || undefined,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export async function getSfOrgContext(orgAlias = DEFAULT_LOCAL_SF_ORG_ALIAS) {
|
|
134
|
+
if (cachedContext?.alias === orgAlias) {
|
|
135
|
+
return cachedContext.context;
|
|
136
|
+
}
|
|
137
|
+
const context = await sfOrgDisplayFn(orgAlias);
|
|
138
|
+
cachedContext = { alias: orgAlias, context };
|
|
139
|
+
return context;
|
|
140
|
+
}
|
|
141
|
+
export function setSfOrgDisplayForTests(fn) {
|
|
142
|
+
sfOrgDisplayFn = fn;
|
|
143
|
+
}
|
|
144
|
+
export function resetSfOrgDisplayForTests() {
|
|
145
|
+
sfOrgDisplayFn = defaultSfOrgDisplay;
|
|
146
|
+
cachedContext = undefined;
|
|
147
|
+
}
|
|
148
|
+
export function clearSfOrgContextCacheForTests() {
|
|
149
|
+
cachedContext = undefined;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=sf-org-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sf-org-context.js","sourceRoot":"","sources":["../../src/lib/sf-org-context.ts"],"names":[],"mappings":"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"}
|