@sfdxy/anypoint-connect 0.16.3 → 0.18.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 +17 -6
- package/dist/analysis/audit-actors.d.ts +36 -0
- package/dist/analysis/audit-actors.d.ts.map +1 -0
- package/dist/analysis/audit-actors.js +93 -0
- package/dist/analysis/audit-actors.js.map +1 -0
- package/dist/analysis/credentials.d.ts +49 -0
- package/dist/analysis/credentials.d.ts.map +1 -0
- package/dist/analysis/credentials.js +118 -0
- package/dist/analysis/credentials.js.map +1 -0
- package/dist/analysis/parser.d.ts +5 -0
- package/dist/analysis/parser.d.ts.map +1 -1
- package/dist/analysis/parser.js +10 -1
- package/dist/analysis/parser.js.map +1 -1
- package/dist/api/AlertsApi.d.ts +138 -0
- package/dist/api/AlertsApi.d.ts.map +1 -0
- package/dist/api/AlertsApi.js +168 -0
- package/dist/api/AlertsApi.js.map +1 -0
- package/dist/api/LogsApi.d.ts +88 -12
- package/dist/api/LogsApi.d.ts.map +1 -1
- package/dist/api/LogsApi.js +335 -31
- package/dist/api/LogsApi.js.map +1 -1
- package/dist/auth/BearerProvider.d.ts +12 -0
- package/dist/auth/BearerProvider.d.ts.map +1 -0
- package/dist/auth/BearerProvider.js +18 -0
- package/dist/auth/BearerProvider.js.map +1 -0
- package/dist/auth/ClientCredentialsProvider.d.ts +23 -0
- package/dist/auth/ClientCredentialsProvider.d.ts.map +1 -0
- package/dist/auth/ClientCredentialsProvider.js +59 -0
- package/dist/auth/ClientCredentialsProvider.js.map +1 -0
- package/dist/auth/TokenProvider.d.ts +12 -0
- package/dist/auth/TokenProvider.d.ts.map +1 -0
- package/dist/auth/TokenProvider.js +2 -0
- package/dist/auth/TokenProvider.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/AnypointClient.d.ts +22 -0
- package/dist/client/AnypointClient.d.ts.map +1 -1
- package/dist/client/AnypointClient.js +82 -12
- package/dist/client/AnypointClient.js.map +1 -1
- package/dist/client/HttpClient.d.ts +3 -3
- package/dist/client/HttpClient.d.ts.map +1 -1
- package/dist/client/HttpClient.js +13 -3
- package/dist/client/HttpClient.js.map +1 -1
- package/dist/commands/alerts.d.ts +16 -0
- package/dist/commands/alerts.d.ts.map +1 -0
- package/dist/commands/alerts.js +375 -0
- package/dist/commands/alerts.js.map +1 -0
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +8 -3
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/app-change-cli.d.ts +5 -2
- package/dist/commands/app-change-cli.d.ts.map +1 -1
- package/dist/commands/app-change-cli.js +19 -5
- package/dist/commands/app-change-cli.js.map +1 -1
- package/dist/commands/apps.d.ts.map +1 -1
- package/dist/commands/apps.js +69 -22
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +21 -0
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +20 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +17 -6
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/logs.d.ts +2 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +105 -10
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +29 -1
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/runtimes.d.ts.map +1 -1
- package/dist/commands/runtimes.js +38 -5
- package/dist/commands/runtimes.js.map +1 -1
- package/dist/commands/shared.d.ts.map +1 -1
- package/dist/commands/shared.js +1 -7
- package/dist/commands/shared.js.map +1 -1
- package/dist/config/auth-modes.d.ts +11 -0
- package/dist/config/auth-modes.d.ts.map +1 -0
- package/dist/config/auth-modes.js +18 -0
- package/dist/config/auth-modes.js.map +1 -0
- package/dist/config/profiles.d.ts +19 -2
- package/dist/config/profiles.d.ts.map +1 -1
- package/dist/config/profiles.js +68 -24
- package/dist/config/profiles.js.map +1 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -9
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/alerts.d.ts +82 -0
- package/dist/mcp/tools/alerts.d.ts.map +1 -0
- package/dist/mcp/tools/alerts.js +423 -0
- package/dist/mcp/tools/alerts.js.map +1 -0
- package/dist/mcp/tools/api-manager.d.ts.map +1 -1
- package/dist/mcp/tools/api-manager.js +6 -1
- package/dist/mcp/tools/api-manager.js.map +1 -1
- package/dist/mcp/tools/app-inputs.d.ts +20 -2
- package/dist/mcp/tools/app-inputs.d.ts.map +1 -1
- package/dist/mcp/tools/app-inputs.js +40 -2
- package/dist/mcp/tools/app-inputs.js.map +1 -1
- package/dist/mcp/tools/apps-deploy.d.ts.map +1 -1
- package/dist/mcp/tools/apps-deploy.js +65 -13
- package/dist/mcp/tools/apps-deploy.js.map +1 -1
- package/dist/mcp/tools/apps-lifecycle.d.ts.map +1 -1
- package/dist/mcp/tools/apps-lifecycle.js +37 -15
- package/dist/mcp/tools/apps-lifecycle.js.map +1 -1
- package/dist/mcp/tools/apps-read.d.ts.map +1 -1
- package/dist/mcp/tools/apps-read.js +11 -5
- package/dist/mcp/tools/apps-read.js.map +1 -1
- package/dist/mcp/tools/audit.d.ts.map +1 -1
- package/dist/mcp/tools/audit.js +17 -4
- package/dist/mcp/tools/audit.js.map +1 -1
- package/dist/mcp/tools/exchange.d.ts.map +1 -1
- package/dist/mcp/tools/exchange.js +38 -18
- package/dist/mcp/tools/exchange.js.map +1 -1
- package/dist/mcp/tools/identity.d.ts.map +1 -1
- package/dist/mcp/tools/identity.js +29 -2
- package/dist/mcp/tools/identity.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +1 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts +1 -1
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +34 -1
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/monitoring.d.ts.map +1 -1
- package/dist/mcp/tools/monitoring.js +5 -3
- package/dist/mcp/tools/monitoring.js.map +1 -1
- package/dist/mcp/tools/output-schemas.d.ts +83 -0
- package/dist/mcp/tools/output-schemas.d.ts.map +1 -0
- package/dist/mcp/tools/output-schemas.js +81 -0
- package/dist/mcp/tools/output-schemas.js.map +1 -0
- package/dist/mcp/tools/profile.d.ts +17 -3
- package/dist/mcp/tools/profile.d.ts.map +1 -1
- package/dist/mcp/tools/profile.js +122 -10
- package/dist/mcp/tools/profile.js.map +1 -1
- package/dist/mcp/tools/shared.d.ts +34 -2
- package/dist/mcp/tools/shared.d.ts.map +1 -1
- package/dist/mcp/tools/shared.js +37 -4
- package/dist/mcp/tools/shared.js.map +1 -1
- package/dist/safety/artifact.d.ts +45 -0
- package/dist/safety/artifact.d.ts.map +1 -1
- package/dist/safety/artifact.js +109 -0
- package/dist/safety/artifact.js.map +1 -1
- package/dist/safety/guards.d.ts +10 -0
- package/dist/safety/guards.d.ts.map +1 -1
- package/dist/safety/guards.js +16 -0
- package/dist/safety/guards.js.map +1 -1
- package/dist/safety/plan-binding.d.ts +21 -0
- package/dist/safety/plan-binding.d.ts.map +1 -0
- package/dist/safety/plan-binding.js +61 -0
- package/dist/safety/plan-binding.js.map +1 -0
- package/dist/safety/preapproval.d.ts +102 -0
- package/dist/safety/preapproval.d.ts.map +1 -0
- package/dist/safety/preapproval.js +251 -0
- package/dist/safety/preapproval.js.map +1 -0
- package/dist/safety/secrets.d.ts +7 -0
- package/dist/safety/secrets.d.ts.map +1 -1
- package/dist/safety/secrets.js +16 -0
- package/dist/safety/secrets.js.map +1 -1
- package/dist/utils/formatter.d.ts +2 -0
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +4 -0
- package/dist/utils/formatter.js.map +1 -1
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +23 -13
- package/dist/utils/logger.js.map +1 -1
- package/dist/workflows/alerts.d.ts +309 -0
- package/dist/workflows/alerts.d.ts.map +1 -0
- package/dist/workflows/alerts.js +631 -0
- package/dist/workflows/alerts.js.map +1 -0
- package/dist/workflows/app-change.d.ts +32 -1
- package/dist/workflows/app-change.d.ts.map +1 -1
- package/dist/workflows/app-change.js +57 -2
- package/dist/workflows/app-change.js.map +1 -1
- package/dist/workflows/artifact-verification.d.ts +52 -0
- package/dist/workflows/artifact-verification.d.ts.map +1 -0
- package/dist/workflows/artifact-verification.js +85 -0
- package/dist/workflows/artifact-verification.js.map +1 -0
- package/dist/workflows/jar-deployment.d.ts +37 -10
- package/dist/workflows/jar-deployment.d.ts.map +1 -1
- package/dist/workflows/jar-deployment.js +44 -13
- package/dist/workflows/jar-deployment.js.map +1 -1
- package/package.json +1 -1
package/dist/mcp/tools/shared.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { errorMessage } from '../../utils/errors.js';
|
|
7
7
|
import { isProductionEnv } from '../../safety/guards.js';
|
|
8
|
+
import { checkPreapproval, ignoredProjectApprovalWarning } from '../../safety/preapproval.js';
|
|
8
9
|
/** Resolve the default org and an environment name or ID in one step. */
|
|
9
10
|
export async function resolveEnvironment(client, environment) {
|
|
10
11
|
const orgId = await client.getDefaultOrgId();
|
|
@@ -32,6 +33,14 @@ export function mcpText(payload) {
|
|
|
32
33
|
const text = typeof payload === 'string' ? payload : JSON.stringify(payload, null, 2);
|
|
33
34
|
return { content: [{ type: 'text', text }] };
|
|
34
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* A result for a tool that declares an `outputSchema`: the JSON as text for people and hosts that
|
|
38
|
+
* read text, and the same data as `structuredContent` for programs. `text` defaults to the
|
|
39
|
+
* structured payload; pass it when the established text form differs (for example a bare array).
|
|
40
|
+
*/
|
|
41
|
+
export function mcpStructured(structured, text = structured) {
|
|
42
|
+
return { ...mcpText(text), structuredContent: structured };
|
|
43
|
+
}
|
|
35
44
|
/**
|
|
36
45
|
* Build the dry-run preview response returned by a mutating deploy tool when the caller
|
|
37
46
|
* has not passed `confirm: true`. Over stdio there is no interactive prompt, so the
|
|
@@ -55,19 +64,42 @@ export const writeInputs = {
|
|
|
55
64
|
.optional()
|
|
56
65
|
.describe('Required in addition to confirm when the target environment is production'),
|
|
57
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Production fields for previews and results: `production`, whether a user-level pre-approval for
|
|
69
|
+
* this organization, environment and tool applies, and where it is stored. Empty outside production.
|
|
70
|
+
*/
|
|
71
|
+
export function productionFields(orgId, env, tool) {
|
|
72
|
+
if (!isProductionEnv(env.name, env.isProduction))
|
|
73
|
+
return {};
|
|
74
|
+
const decision = checkPreapproval({ orgId, env }, tool);
|
|
75
|
+
const warning = ignoredProjectApprovalWarning();
|
|
76
|
+
return {
|
|
77
|
+
production: true,
|
|
78
|
+
productionPreapproved: decision.productionPreapproved,
|
|
79
|
+
...(decision.preapprovalSource ? { preapprovalSource: decision.preapprovalSource } : {}),
|
|
80
|
+
...(decision.preapprovalExpires ? { preapprovalExpires: decision.preapprovalExpires } : {}),
|
|
81
|
+
...(warning ? { preapprovalWarning: warning } : {}),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
58
84
|
/**
|
|
59
85
|
* Gate a write. Returns the response to send instead of writing (a preview, or a refusal for
|
|
60
|
-
* production without `confirmProduction`), or `null` when the caller may proceed.
|
|
86
|
+
* production without `confirmProduction`), or `null` when the caller may proceed. A user-level
|
|
87
|
+
* pre-approval for the organization, environment and `tool` stands in for `confirmProduction`;
|
|
88
|
+
* `confirm` is always required.
|
|
61
89
|
*/
|
|
62
90
|
export function guardWrite(input) {
|
|
63
|
-
const production =
|
|
91
|
+
const production = productionFields(input.orgId, input.env, input.tool);
|
|
92
|
+
const preapproved = production.productionPreapproved === true;
|
|
64
93
|
if (!input.confirm) {
|
|
65
94
|
return dryRunPreview({
|
|
66
95
|
...input.preview,
|
|
67
|
-
...
|
|
96
|
+
...production,
|
|
97
|
+
...(production.production
|
|
98
|
+
? { requires: preapproved ? 'confirm: true' : 'confirm: true and confirmProduction: true' }
|
|
99
|
+
: {}),
|
|
68
100
|
});
|
|
69
101
|
}
|
|
70
|
-
if (production && !input.confirmProduction) {
|
|
102
|
+
if (production.production && !preapproved && !input.confirmProduction) {
|
|
71
103
|
return {
|
|
72
104
|
content: [
|
|
73
105
|
{
|
|
@@ -76,6 +108,7 @@ export function guardWrite(input) {
|
|
|
76
108
|
refused: true,
|
|
77
109
|
message: `${input.env.name} is a production environment. Nothing was changed. Re-call with confirm: true and confirmProduction: true to apply.`,
|
|
78
110
|
...input.preview,
|
|
111
|
+
...production,
|
|
79
112
|
}, null, 2),
|
|
80
113
|
},
|
|
81
114
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/mcp/tools/shared.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/mcp/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,51 @@ export declare function inspectArtifact(bytes: Uint8Array, expectedArtifactId?:
|
|
|
8
8
|
sha256: string;
|
|
9
9
|
coordinates?: ArtifactCoordinates;
|
|
10
10
|
};
|
|
11
|
+
/** Where mule-build (3.2.0 and later) records how a jar was built. */
|
|
12
|
+
export declare const BUILD_INFO_PATH = "META-INF/mule-build/build-info.json";
|
|
13
|
+
/** What a jar says about its own build, read from {@link BUILD_INFO_PATH}. */
|
|
14
|
+
export type BuildProvenance = {
|
|
15
|
+
status: 'unknown';
|
|
16
|
+
} | {
|
|
17
|
+
status: 'invalid';
|
|
18
|
+
reason: string;
|
|
19
|
+
} | {
|
|
20
|
+
status: 'recorded';
|
|
21
|
+
schemaVersion: number;
|
|
22
|
+
tool: string;
|
|
23
|
+
toolVersion: string;
|
|
24
|
+
stripped: boolean;
|
|
25
|
+
productionDeployable: boolean;
|
|
26
|
+
};
|
|
27
|
+
/** Read the build-info marker without extracting anything else. A jar without one has unknown provenance. */
|
|
28
|
+
export declare function readBuildProvenance(bytes: Uint8Array): BuildProvenance;
|
|
29
|
+
/** Whether unmarked jars may go to the target; see src/safety/preapproval.ts. */
|
|
30
|
+
export interface UnmarkedPolicy {
|
|
31
|
+
unmarkedAllowed: boolean;
|
|
32
|
+
source?: string;
|
|
33
|
+
expires?: string;
|
|
34
|
+
}
|
|
35
|
+
/** The outcome of checking a jar's build provenance against where it is going. */
|
|
36
|
+
export interface ProvenanceCheck {
|
|
37
|
+
/** Serializable summary for previews. */
|
|
38
|
+
buildProvenance: BuildProvenance & {
|
|
39
|
+
note?: string;
|
|
40
|
+
};
|
|
41
|
+
/** Present for a production target: whether unmarked jars are allowed there, and by what. */
|
|
42
|
+
provenancePolicy?: UnmarkedPolicy;
|
|
43
|
+
warnings: string[];
|
|
44
|
+
/** Set when the jar must not go to the target. */
|
|
45
|
+
blocker?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Decide whether a jar may go to an environment. For production, only a marker with schemaVersion 1,
|
|
49
|
+
* tool "mule-build", stripped false and productionDeployable true passes. A jar marked not production
|
|
50
|
+
* deployable, or with an unreadable or inconsistent marker, is refused with no override. A jar
|
|
51
|
+
* without a marker is refused unless an unmarked-artifact allowance covers the org and environment.
|
|
52
|
+
* Outside production every case passes, with a warning or a note. `production` is undefined when the
|
|
53
|
+
* target is not known yet (publishing only).
|
|
54
|
+
*/
|
|
55
|
+
export declare function checkBuildProvenance(provenance: BuildProvenance, production: boolean | undefined, unmarked?: UnmarkedPolicy): ProvenanceCheck;
|
|
11
56
|
/** Compare the exact bytes that will be uploaded with the reviewed build or preview digest. */
|
|
12
57
|
export declare function verifyArtifactDigest(bytes: Uint8Array, expectedSha256?: string): string;
|
|
13
58
|
//# sourceMappingURL=artifact.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../src/safety/artifact.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAC3B,KAAK,EAAE,UAAU,EACjB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,cAAc,UAAQ,GACvB;IACC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACrC,CA4CA;AAED,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CASvF"}
|
|
1
|
+
{"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../src/safety/artifact.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAC3B,KAAK,EAAE,UAAU,EACjB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,cAAc,UAAQ,GACvB;IACC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACrC,CA4CA;AAED,sEAAsE;AACtE,eAAO,MAAM,eAAe,wCAAwC,CAAC;AAIrE,8EAA8E;AAC9E,MAAM,MAAM,eAAe,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IACI,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,oBAAoB,EAAE,OAAO,CAAC;CACjC,CAAC;AAER,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAqDtE;AAKD,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC5B,yCAAyC;IACzC,eAAe,EAAE,eAAe,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAChC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,OAAO,GAAG,SAAS,EAC/B,QAAQ,GAAE,cAA2C,GACtD,eAAe,CAsCjB;AAED,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CASvF"}
|
package/dist/safety/artifact.js
CHANGED
|
@@ -46,6 +46,115 @@ export function inspectArtifact(bytes, expectedArtifactId, allowAmbiguous = fals
|
|
|
46
46
|
}
|
|
47
47
|
return { sha256, coordinates: candidates[0] };
|
|
48
48
|
}
|
|
49
|
+
/** Where mule-build (3.2.0 and later) records how a jar was built. */
|
|
50
|
+
export const BUILD_INFO_PATH = 'META-INF/mule-build/build-info.json';
|
|
51
|
+
const BUILD_INFO_MAX_BYTES = 65536;
|
|
52
|
+
/** Read the build-info marker without extracting anything else. A jar without one has unknown provenance. */
|
|
53
|
+
export function readBuildProvenance(bytes) {
|
|
54
|
+
let seen = 0;
|
|
55
|
+
let oversized = false;
|
|
56
|
+
const entries = unzipSync(bytes, {
|
|
57
|
+
filter(entry) {
|
|
58
|
+
if (entry.name !== BUILD_INFO_PATH)
|
|
59
|
+
return false;
|
|
60
|
+
seen++;
|
|
61
|
+
if (entry.originalSize > BUILD_INFO_MAX_BYTES) {
|
|
62
|
+
oversized = true;
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
if (seen === 0)
|
|
69
|
+
return { status: 'unknown' };
|
|
70
|
+
if (seen > 1)
|
|
71
|
+
return { status: 'invalid', reason: `the jar has ${seen} ${BUILD_INFO_PATH} entries` };
|
|
72
|
+
if (oversized)
|
|
73
|
+
return { status: 'invalid', reason: `${BUILD_INFO_PATH} exceeds ${BUILD_INFO_MAX_BYTES} bytes` };
|
|
74
|
+
let info;
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(strFromU8(entries[BUILD_INFO_PATH]));
|
|
77
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
78
|
+
throw new Error('not an object');
|
|
79
|
+
info = parsed;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { status: 'invalid', reason: `${BUILD_INFO_PATH} is not a JSON object` };
|
|
83
|
+
}
|
|
84
|
+
const { schemaVersion, tool, toolVersion, stripped, productionDeployable } = info;
|
|
85
|
+
if (typeof schemaVersion !== 'number' ||
|
|
86
|
+
!Number.isInteger(schemaVersion) ||
|
|
87
|
+
schemaVersion < 1 ||
|
|
88
|
+
typeof tool !== 'string' ||
|
|
89
|
+
typeof toolVersion !== 'string' ||
|
|
90
|
+
typeof stripped !== 'boolean' ||
|
|
91
|
+
typeof productionDeployable !== 'boolean') {
|
|
92
|
+
return {
|
|
93
|
+
status: 'invalid',
|
|
94
|
+
reason: `${BUILD_INFO_PATH} lacks schemaVersion, tool, toolVersion, stripped or productionDeployable`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Only the contract this tool understands counts; anything else cannot vouch for the build.
|
|
98
|
+
if (schemaVersion !== BUILD_INFO_SCHEMA_VERSION) {
|
|
99
|
+
return { status: 'invalid', reason: `unsupported schemaVersion ${schemaVersion} (expected 1)` };
|
|
100
|
+
}
|
|
101
|
+
if (tool !== BUILD_INFO_TOOL)
|
|
102
|
+
return { status: 'invalid', reason: `unknown build tool "${tool}"` };
|
|
103
|
+
if (productionDeployable === stripped) {
|
|
104
|
+
return {
|
|
105
|
+
status: 'invalid',
|
|
106
|
+
reason: `inconsistent marker: stripped ${stripped} with productionDeployable ${productionDeployable}`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return { status: 'recorded', schemaVersion, tool, toolVersion, stripped, productionDeployable };
|
|
110
|
+
}
|
|
111
|
+
const BUILD_INFO_SCHEMA_VERSION = 1;
|
|
112
|
+
const BUILD_INFO_TOOL = 'mule-build';
|
|
113
|
+
const UNKNOWN_NOTE = `build provenance unknown: the jar has no ${BUILD_INFO_PATH} (built before mule-build 3.2.0 or by another tool)`;
|
|
114
|
+
/**
|
|
115
|
+
* Decide whether a jar may go to an environment. For production, only a marker with schemaVersion 1,
|
|
116
|
+
* tool "mule-build", stripped false and productionDeployable true passes. A jar marked not production
|
|
117
|
+
* deployable, or with an unreadable or inconsistent marker, is refused with no override. A jar
|
|
118
|
+
* without a marker is refused unless an unmarked-artifact allowance covers the org and environment.
|
|
119
|
+
* Outside production every case passes, with a warning or a note. `production` is undefined when the
|
|
120
|
+
* target is not known yet (publishing only).
|
|
121
|
+
*/
|
|
122
|
+
export function checkBuildProvenance(provenance, production, unmarked = { unmarkedAllowed: false }) {
|
|
123
|
+
const policy = production ? { provenancePolicy: unmarked } : {};
|
|
124
|
+
if (provenance.status === 'unknown') {
|
|
125
|
+
const buildProvenance = { ...provenance, note: UNKNOWN_NOTE };
|
|
126
|
+
if (production && !unmarked.unmarkedAllowed) {
|
|
127
|
+
return {
|
|
128
|
+
buildProvenance,
|
|
129
|
+
...policy,
|
|
130
|
+
warnings: [],
|
|
131
|
+
blocker: 'Refused: build provenance unknown. Production takes only jars whose mule-build marker says productionDeployable. ' +
|
|
132
|
+
'For artifacts built by another pipeline, add an unmarked-artifact allowance for this organization and environment (set_unmarked_artifact_allowance).',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return { buildProvenance, ...policy, warnings: [] };
|
|
136
|
+
}
|
|
137
|
+
if (provenance.status === 'recorded' && provenance.productionDeployable) {
|
|
138
|
+
return { buildProvenance: provenance, ...policy, warnings: [] };
|
|
139
|
+
}
|
|
140
|
+
const problem = provenance.status === 'invalid'
|
|
141
|
+
? `its build marker is not valid (${provenance.reason})`
|
|
142
|
+
: `its build marks it not production deployable (${provenance.tool} ${provenance.toolVersion}, stripped: ${provenance.stripped})`;
|
|
143
|
+
if (production) {
|
|
144
|
+
return {
|
|
145
|
+
buildProvenance: provenance,
|
|
146
|
+
...policy,
|
|
147
|
+
warnings: [],
|
|
148
|
+
blocker: `Refused: this jar cannot go to a production environment because ${problem}. Build a production-deployable jar (secure properties not stripped) and preview again.`,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
buildProvenance: provenance,
|
|
153
|
+
warnings: [
|
|
154
|
+
`This jar is not production deployable: ${problem}. Deploying it to a production environment is refused.`,
|
|
155
|
+
],
|
|
156
|
+
};
|
|
157
|
+
}
|
|
49
158
|
/** Compare the exact bytes that will be uploaded with the reviewed build or preview digest. */
|
|
50
159
|
export function verifyArtifactDigest(bytes, expectedSha256) {
|
|
51
160
|
const sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../src/safety/artifact.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../src/safety/artifact.ts"],"names":[],"mappings":"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"}
|
package/dist/safety/guards.d.ts
CHANGED
|
@@ -20,6 +20,16 @@ export declare function validateJarFile(jarPath: string): {
|
|
|
20
20
|
artifactId?: string;
|
|
21
21
|
version?: string;
|
|
22
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* Confirm a production write from the CLI. Outside production, with --force, or when a user-level
|
|
25
|
+
* pre-approval covers the organization, the environment and `tool` (the matching MCP tool name), no
|
|
26
|
+
* prompt is shown; otherwise the typed phrase is required.
|
|
27
|
+
*/
|
|
28
|
+
export declare function confirmProductionWrite(env: {
|
|
29
|
+
name: string;
|
|
30
|
+
id: string;
|
|
31
|
+
isProduction?: boolean;
|
|
32
|
+
}, orgId: string, tool: string, force?: boolean): Promise<boolean>;
|
|
23
33
|
/**
|
|
24
34
|
* Ask for production deployment confirmation
|
|
25
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/safety/guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/safety/guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAI5D;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAIhF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,GAAG,IAAI,EAC9B,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,OAAO,GACvB,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAC9C,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAuBA;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CACxC,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,EACzD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,UAAQ,GACd,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAcvG"}
|
package/dist/safety/guards.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import * as fs from 'fs';
|
|
6
6
|
import * as readline from 'readline';
|
|
7
7
|
import chalk from 'chalk';
|
|
8
|
+
import { checkPreapproval } from './preapproval.js';
|
|
8
9
|
/**
|
|
9
10
|
* Check if an environment is a production environment
|
|
10
11
|
*/
|
|
@@ -63,6 +64,21 @@ export function validateJarFile(jarPath) {
|
|
|
63
64
|
version: match?.[2],
|
|
64
65
|
};
|
|
65
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Confirm a production write from the CLI. Outside production, with --force, or when a user-level
|
|
69
|
+
* pre-approval covers the organization, the environment and `tool` (the matching MCP tool name), no
|
|
70
|
+
* prompt is shown; otherwise the typed phrase is required.
|
|
71
|
+
*/
|
|
72
|
+
export async function confirmProductionWrite(env, orgId, tool, force = false) {
|
|
73
|
+
if (!isProductionEnv(env.name, env.isProduction) || force)
|
|
74
|
+
return true;
|
|
75
|
+
const decision = checkPreapproval({ orgId, env }, tool);
|
|
76
|
+
if (decision.productionPreapproved) {
|
|
77
|
+
console.log(chalk.yellow(` Production pre-approved for ${tool} in ${env.name} (${decision.preapprovalSource}${decision.preapprovalExpires ? `, until ${decision.preapprovalExpires}` : ''})`));
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return confirmProductionDeploy(env.name, env.isProduction);
|
|
81
|
+
}
|
|
66
82
|
/**
|
|
67
83
|
* Ask for production deployment confirmation
|
|
68
84
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/safety/guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/safety/guards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding an apply to the change that was reviewed. A preview carries a digest of what it showed; the
|
|
3
|
+
* apply must present that digest, and the deployment must still be the one that was reviewed. Pure
|
|
4
|
+
* functions (no I/O). Secret values never enter a digest: it is built from the already-redacted preview.
|
|
5
|
+
*/
|
|
6
|
+
import type { CH2Deployment } from '../api/CloudHub2Api.js';
|
|
7
|
+
/** JSON with object keys sorted at every level, so equal data always serializes the same way. */
|
|
8
|
+
export declare function canonicalJson(value: unknown): string;
|
|
9
|
+
export declare function digestOf(value: unknown): string;
|
|
10
|
+
/**
|
|
11
|
+
* The refusal text for an apply that does not carry the digest of its preview, or carries one for a
|
|
12
|
+
* different change; `null` when it matches.
|
|
13
|
+
*/
|
|
14
|
+
export declare function checkReviewedPlan(presented: string | undefined, current: string): string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Refuse to write when the deployment is no longer the one that was reviewed: recreated (new id) or
|
|
17
|
+
* changed. Compares the revision fields the platform sets; when neither is present on the reviewed
|
|
18
|
+
* deployment it compares the state itself, because silence is not proof that nothing changed.
|
|
19
|
+
*/
|
|
20
|
+
export declare function assertDeploymentUnchanged(reviewed: CH2Deployment, current: CH2Deployment): void;
|
|
21
|
+
//# sourceMappingURL=plan-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-binding.d.ts","sourceRoot":"","sources":["../../src/safety/plan-binding.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAapD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ/F;AAOD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAW/F"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding an apply to the change that was reviewed. A preview carries a digest of what it showed; the
|
|
3
|
+
* apply must present that digest, and the deployment must still be the one that was reviewed. Pure
|
|
4
|
+
* functions (no I/O). Secret values never enter a digest: it is built from the already-redacted preview.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
/** JSON with object keys sorted at every level, so equal data always serializes the same way. */
|
|
8
|
+
export function canonicalJson(value) {
|
|
9
|
+
const sorted = (v) => {
|
|
10
|
+
if (Array.isArray(v))
|
|
11
|
+
return v.map(sorted);
|
|
12
|
+
if (v && typeof v === 'object') {
|
|
13
|
+
return Object.fromEntries(Object.entries(v)
|
|
14
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
15
|
+
.map(([k, x]) => [k, sorted(x)]));
|
|
16
|
+
}
|
|
17
|
+
return v;
|
|
18
|
+
};
|
|
19
|
+
return JSON.stringify(sorted(value));
|
|
20
|
+
}
|
|
21
|
+
export function digestOf(value) {
|
|
22
|
+
return createHash('sha256').update(canonicalJson(value)).digest('hex');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The refusal text for an apply that does not carry the digest of its preview, or carries one for a
|
|
26
|
+
* different change; `null` when it matches.
|
|
27
|
+
*/
|
|
28
|
+
export function checkReviewedPlan(presented, current) {
|
|
29
|
+
if (!presented) {
|
|
30
|
+
return 'planDigest is required with confirm: true. Call without confirm, review the preview, then pass its planDigest. Nothing was changed.';
|
|
31
|
+
}
|
|
32
|
+
if (presented !== current) {
|
|
33
|
+
return 'The change now differs from the one you reviewed (the application or the request changed). Nothing was changed. Preview again and pass the new planDigest.';
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/** The parts of a deployment that decide what a change would do, for when revision fields are absent. */
|
|
38
|
+
function stateOf(d) {
|
|
39
|
+
return { application: d.application, target: d.target };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Refuse to write when the deployment is no longer the one that was reviewed: recreated (new id) or
|
|
43
|
+
* changed. Compares the revision fields the platform sets; when neither is present on the reviewed
|
|
44
|
+
* deployment it compares the state itself, because silence is not proof that nothing changed.
|
|
45
|
+
*/
|
|
46
|
+
export function assertDeploymentUnchanged(reviewed, current) {
|
|
47
|
+
const changed = (what) => new Error(`The deployment changed after review (${what}). Nothing was changed; prepare the change again.`);
|
|
48
|
+
if (reviewed.id !== current.id)
|
|
49
|
+
throw changed('it was recreated');
|
|
50
|
+
const hasRevision = reviewed.desiredVersion !== undefined || reviewed.lastModifiedDate !== undefined;
|
|
51
|
+
if (hasRevision) {
|
|
52
|
+
if (reviewed.desiredVersion !== current.desiredVersion)
|
|
53
|
+
throw changed('a new revision was applied');
|
|
54
|
+
if (reviewed.lastModifiedDate !== current.lastModifiedDate)
|
|
55
|
+
throw changed('it was modified');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (canonicalJson(stateOf(reviewed)) !== canonicalJson(stateOf(current)))
|
|
59
|
+
throw changed('its state differs');
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=plan-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-binding.js","sourceRoot":"","sources":["../../src/safety/plan-binding.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,CAAC,CAAU,EAAW,EAAE;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,WAAW,CACrB,MAAM,CAAC,OAAO,CAAC,CAA4B,CAAC;iBACvC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACvC,CAAC;QACN,CAAC;QACD,OAAO,CAAC,CAAC;IACb,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAA6B,EAAE,OAAe;IAC5E,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,qIAAqI,CAAC;IACjJ,CAAC;IACD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,4JAA4J,CAAC;IACxK,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,yGAAyG;AACzG,SAAS,OAAO,CAAC,CAAgB;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAuB,EAAE,OAAsB;IACrF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7B,IAAI,KAAK,CAAC,wCAAwC,IAAI,mDAAmD,CAAC,CAAC;IAC/G,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;QAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,QAAQ,CAAC,gBAAgB,KAAK,SAAS,CAAC;IACrG,IAAI,WAAW,EAAE,CAAC;QACd,IAAI,QAAQ,CAAC,cAAc,KAAK,OAAO,CAAC,cAAc;YAAE,MAAM,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACpG,IAAI,QAAQ,CAAC,gBAAgB,KAAK,OAAO,CAAC,gBAAgB;YAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC7F,OAAO;IACX,CAAC;IACD,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AACjH,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production policy: pre-approvals and unmarked-artifact allowances
|
|
3
|
+
*
|
|
4
|
+
* Both live only in the user-level store, ~/.anypoint-connect/production-approvals.json, outside any
|
|
5
|
+
* repository, so a branch cannot plant or widen one. Every entry is bound to a resolved organization
|
|
6
|
+
* ID and environment ID; names are kept for display only and never matched. A `productionPreapproval`
|
|
7
|
+
* found in a project's .anypoint-connect.json is ignored and reported.
|
|
8
|
+
*
|
|
9
|
+
* {
|
|
10
|
+
* "productionPreapprovals": [
|
|
11
|
+
* { "orgId": "...", "environmentId": "...", "environmentName": "Production",
|
|
12
|
+
* "tools": ["update_app"] | "all-mutating", "expires": "2026-12-31T00:00:00Z", "projectPath": "/abs/repo" }
|
|
13
|
+
* ],
|
|
14
|
+
* "unmarkedArtifactAllowances": [
|
|
15
|
+
* { "orgId": "...", "environmentId": "...", "environmentName": "Production", "expires": "...", "projectPath": "..." }
|
|
16
|
+
* ]
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* A pre-approval stands in for confirmProduction (MCP) and the typed phrase (CLI). An allowance lets
|
|
20
|
+
* jars without a build marker go to that environment. Neither waives confirm: true, bound IDs,
|
|
21
|
+
* digests, or the refusal of a jar marked not production deployable.
|
|
22
|
+
*/
|
|
23
|
+
/** Tools whose production confirmation can be pre-approved. The CLI uses the same names. */
|
|
24
|
+
export declare const PREAPPROVABLE_TOOLS: readonly ["deploy_jar", "deploy_app", "update_app", "update_app_artifact", "rollback_app", "update_app_settings", "restart_app", "scale_app", "stop_app", "start_app", "smoke_test_api", "delete_app", "create_alert", "update_alert", "set_alert_enabled", "delete_alert"];
|
|
25
|
+
export type PreapprovableTool = (typeof PREAPPROVABLE_TOOLS)[number];
|
|
26
|
+
export declare const ALL_MUTATING = "all-mutating";
|
|
27
|
+
/** Tools that "all-mutating" does not cover; they are pre-approved only when named. */
|
|
28
|
+
export declare const NAMED_ONLY_TOOLS: readonly PreapprovableTool[];
|
|
29
|
+
export declare const APPROVALS_FILE_NAME = "production-approvals.json";
|
|
30
|
+
export interface ScopedEntry {
|
|
31
|
+
orgId: string;
|
|
32
|
+
environmentId: string;
|
|
33
|
+
/** Display only; never matched. */
|
|
34
|
+
environmentName?: string;
|
|
35
|
+
/** ISO 8601 date-time; the entry is ignored from then on. */
|
|
36
|
+
expires?: string;
|
|
37
|
+
/** Absolute project root; when set, the entry applies only to tools run in that project. */
|
|
38
|
+
projectPath?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ProductionPreapproval extends ScopedEntry {
|
|
41
|
+
tools: PreapprovableTool[] | typeof ALL_MUTATING;
|
|
42
|
+
}
|
|
43
|
+
export type UnmarkedArtifactAllowance = ScopedEntry;
|
|
44
|
+
export interface ApprovalStore {
|
|
45
|
+
productionPreapprovals?: ProductionPreapproval[];
|
|
46
|
+
unmarkedArtifactAllowances?: UnmarkedArtifactAllowance[];
|
|
47
|
+
}
|
|
48
|
+
/** The user-level store path. */
|
|
49
|
+
export declare function approvalsFile(): string;
|
|
50
|
+
/** Validate one pre-approval entry. Throws with every problem found. */
|
|
51
|
+
export declare function validatePreapproval(input: unknown): ProductionPreapproval;
|
|
52
|
+
/** Validate one unmarked-artifact allowance. Throws with every problem found. */
|
|
53
|
+
export declare function validateUnmarkedAllowance(input: unknown): UnmarkedArtifactAllowance;
|
|
54
|
+
export type EntryView<T> = T & {
|
|
55
|
+
expired: boolean;
|
|
56
|
+
};
|
|
57
|
+
export interface ApprovalState {
|
|
58
|
+
source: string;
|
|
59
|
+
productionPreapprovals: EntryView<ProductionPreapproval>[];
|
|
60
|
+
unmarkedArtifactAllowances: EntryView<UnmarkedArtifactAllowance>[];
|
|
61
|
+
/** Entries or files that failed validation; they are ignored. */
|
|
62
|
+
invalid: string[];
|
|
63
|
+
}
|
|
64
|
+
/** Read and validate the user-level store. */
|
|
65
|
+
export declare function readApprovalState(options?: {
|
|
66
|
+
now?: number;
|
|
67
|
+
}): ApprovalState;
|
|
68
|
+
/** Store a pre-approval (replacing one with the same scope), or remove it when `entry` is null. */
|
|
69
|
+
export declare function savePreapproval(scope: ScopedEntry, entry: ProductionPreapproval | null): string;
|
|
70
|
+
/** Store an unmarked-artifact allowance (replacing one with the same scope), or remove it. */
|
|
71
|
+
export declare function saveUnmarkedAllowance(scope: ScopedEntry, entry: UnmarkedArtifactAllowance | null): string;
|
|
72
|
+
export interface PolicyTarget {
|
|
73
|
+
orgId: string;
|
|
74
|
+
env: {
|
|
75
|
+
id: string;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
interface MatchOptions {
|
|
79
|
+
now?: number;
|
|
80
|
+
state?: ApprovalState;
|
|
81
|
+
/** The current project root; resolved only when an entry is project-scoped. */
|
|
82
|
+
projectRoot?: string;
|
|
83
|
+
}
|
|
84
|
+
export interface PreapprovalDecision {
|
|
85
|
+
productionPreapproved: boolean;
|
|
86
|
+
/** Where the matching entry lives, when one matched. */
|
|
87
|
+
preapprovalSource?: string;
|
|
88
|
+
preapprovalExpires?: string;
|
|
89
|
+
}
|
|
90
|
+
/** Whether a production write by `tool` to the target org and environment is pre-approved. */
|
|
91
|
+
export declare function checkPreapproval(target: PolicyTarget, tool: string, options?: MatchOptions): PreapprovalDecision;
|
|
92
|
+
export interface UnmarkedDecision {
|
|
93
|
+
unmarkedAllowed: boolean;
|
|
94
|
+
source?: string;
|
|
95
|
+
expires?: string;
|
|
96
|
+
}
|
|
97
|
+
/** Whether jars without a build marker may go to the target org and environment. */
|
|
98
|
+
export declare function checkUnmarkedAllowance(target: PolicyTarget, options?: MatchOptions): UnmarkedDecision;
|
|
99
|
+
/** A warning when the project's .anypoint-connect.json carries an approval, which is never honored. */
|
|
100
|
+
export declare function ignoredProjectApprovalWarning(startDir?: string): string | undefined;
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=preapproval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preapproval.d.ts","sourceRoot":"","sources":["../../src/safety/preapproval.ts"],"names":[],"mappings":"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"}
|