@apexops/contracts 0.10.0-next.4 → 0.11.0-next.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 +28 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/archetype-source.d.ts +70 -0
- package/dist/archetype-source.d.ts.map +1 -0
- package/dist/archetype-source.js +58 -0
- package/dist/archetype-source.js.map +1 -0
- package/dist/artifacts.d.ts +64 -0
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +69 -0
- package/dist/artifacts.js.map +1 -1
- package/dist/common.d.ts +2 -0
- package/dist/common.d.ts.map +1 -1
- package/dist/common.js +1 -0
- package/dist/common.js.map +1 -1
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +2 -0
- package/dist/evidence.js.map +1 -1
- package/dist/governance-observation.d.ts +15 -0
- package/dist/governance-observation.d.ts.map +1 -0
- package/dist/governance-observation.js +15 -0
- package/dist/governance-observation.js.map +1 -0
- package/dist/index.d.ts +627 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -4
- package/dist/index.js.map +1 -1
- package/dist/native-validation.d.ts +136 -0
- package/dist/native-validation.d.ts.map +1 -0
- package/dist/native-validation.js +276 -0
- package/dist/native-validation.js.map +1 -0
- package/dist/onboarding.d.ts +184 -3
- package/dist/onboarding.d.ts.map +1 -1
- package/dist/onboarding.js +122 -6
- package/dist/onboarding.js.map +1 -1
- package/dist/policy-validation.d.ts +45 -0
- package/dist/policy-validation.d.ts.map +1 -0
- package/dist/policy-validation.js +194 -0
- package/dist/policy-validation.js.map +1 -0
- package/dist/runtime.d.ts +94 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +53 -4
- package/dist/runtime.js.map +1 -1
- package/dist/targets.d.ts +158 -1
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +168 -2
- package/dist/targets.js.map +1 -1
- package/dist/test/contracts.test.js +769 -4
- package/dist/test/contracts.test.js.map +1 -1
- package/package.json +2 -2
- package/schemas/archetype-batch-config-v1.schema.json +51 -0
- package/schemas/archetype-batch-plan-v1.schema.json +227 -0
- package/schemas/archetype-source-proposal-v1.schema.json +113 -0
- package/schemas/architecture-v1.schema.json +278 -0
- package/schemas/bootstrap-plan-v1.schema.json +206 -0
- package/schemas/contract-metadata.json +85 -0
- package/schemas/cost-estimate-v1.schema.json +54 -1
- package/schemas/diagnosis-v1.schema.json +323 -0
- package/schemas/governance-constraints-v1.schema.json +13 -0
- package/schemas/governance-observation-receipt-v1.schema.json +60 -0
- package/schemas/governance-provision-plan-v1.schema.json +307 -0
- package/schemas/governance-setup-config-v1.schema.json +80 -0
- package/schemas/governance-setup-plan-v1.schema.json +217 -0
- package/schemas/iac-binding-v1.schema.json +60 -0
- package/schemas/input-request-v1.schema.json +296 -2
- package/schemas/logical-resource-manifest-v1.schema.json +4 -0
- package/schemas/native-validation-receipt-v1.schema.json +862 -0
- package/schemas/onboarding-config-v1.schema.json +15 -12
- package/schemas/policy-property-map-v1.schema.json +17 -0
- package/schemas/policy-validation-v1.schema.json +278 -0
- package/schemas/project-config-v1.schema.json +14 -1
- package/schemas/repeat-guard-records-v1.schema.json +76 -0
- package/schemas/repository-publish-config-v1.schema.json +52 -0
- package/schemas/repository-publish-plan-v1.schema.json +265 -0
- package/schemas/requirements-amendment-v1.schema.json +213 -0
- package/schemas/requirements-change-proposal-v1.schema.json +196 -0
- package/schemas/review-capture-v1.schema.json +67 -0
- package/schemas/review-findings-v1.schema.json +103 -0
- package/schemas/review-request-v1.schema.json +111 -0
package/dist/onboarding.d.ts
CHANGED
|
@@ -1,15 +1,196 @@
|
|
|
1
1
|
import { type Static } from "@sinclair/typebox";
|
|
2
|
-
export declare const BootstrapClientSchema: import("@sinclair/typebox").
|
|
2
|
+
export declare const BootstrapClientSchema: import("@sinclair/typebox").TLiteral<"github-copilot-cli">;
|
|
3
3
|
export declare const OnboardingConfigV1Schema: import("@sinclair/typebox").TObject<{
|
|
4
4
|
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
5
|
-
projectId: import("@sinclair/typebox").TString
|
|
5
|
+
projectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
6
6
|
displayName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
7
|
-
client: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").
|
|
7
|
+
client: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<"github-copilot-cli">>;
|
|
8
8
|
environment: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
9
|
targetScope: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
10
10
|
iacTool: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"bicep">, import("@sinclair/typebox").TLiteral<"terraform">]>>;
|
|
11
|
+
riskOwner: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"partner">, import("@sinclair/typebox").TLiteral<"customer">]>>;
|
|
11
12
|
createRepository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
12
13
|
}>;
|
|
13
14
|
export type BootstrapClient = Static<typeof BootstrapClientSchema>;
|
|
14
15
|
export type OnboardingConfigV1 = Static<typeof OnboardingConfigV1Schema>;
|
|
16
|
+
export declare const BootstrapPlanV1Schema: import("@sinclair/typebox").TObject<{
|
|
17
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
18
|
+
config: import("@sinclair/typebox").TObject<{
|
|
19
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
20
|
+
projectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
21
|
+
displayName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
22
|
+
client: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<"github-copilot-cli">>;
|
|
23
|
+
environment: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
24
|
+
targetScope: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
25
|
+
iacTool: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"bicep">, import("@sinclair/typebox").TLiteral<"terraform">]>>;
|
|
26
|
+
riskOwner: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"partner">, import("@sinclair/typebox").TLiteral<"customer">]>>;
|
|
27
|
+
createRepository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
28
|
+
}>;
|
|
29
|
+
configHash: import("@sinclair/typebox").TString;
|
|
30
|
+
runtimeVersion: import("@sinclair/typebox").TString;
|
|
31
|
+
scope: import("@sinclair/typebox").TLiteral<"local-bootstrap-preflight-v1">;
|
|
32
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"pending">, import("@sinclair/typebox").TLiteral<"blocked">]>;
|
|
33
|
+
checks: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
34
|
+
id: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"repository">, import("@sinclair/typebox").TLiteral<"workspace-runtime">, import("@sinclair/typebox").TLiteral<"apex-state">]>;
|
|
35
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"pending">, import("@sinclair/typebox").TLiteral<"blocked">]>;
|
|
36
|
+
reason: import("@sinclair/typebox").TString;
|
|
37
|
+
}>>;
|
|
38
|
+
unassessed: import("@sinclair/typebox").TTuple<[import("@sinclair/typebox").TLiteral<"machine-prerequisites">, import("@sinclair/typebox").TLiteral<"client-health">, import("@sinclair/typebox").TLiteral<"remote-coe">, import("@sinclair/typebox").TLiteral<"github-repository">, import("@sinclair/typebox").TLiteral<"governance-oidc">, import("@sinclair/typebox").TLiteral<"reviewed-baseline">]>;
|
|
39
|
+
filesModified: import("@sinclair/typebox").TLiteral<false>;
|
|
40
|
+
executionAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
41
|
+
}>;
|
|
42
|
+
export type BootstrapPlanV1 = Static<typeof BootstrapPlanV1Schema>;
|
|
43
|
+
export declare const RepositoryPublishConfigV1Schema: import("@sinclair/typebox").TObject<{
|
|
44
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
45
|
+
owner: import("@sinclair/typebox").TString;
|
|
46
|
+
name: import("@sinclair/typebox").TString;
|
|
47
|
+
visibility: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"private">, import("@sinclair/typebox").TLiteral<"internal">, import("@sinclair/typebox").TLiteral<"public">]>;
|
|
48
|
+
branch: import("@sinclair/typebox").TString;
|
|
49
|
+
remote: import("@sinclair/typebox").TLiteral<"origin">;
|
|
50
|
+
}>;
|
|
51
|
+
export type RepositoryPublishConfigV1 = Static<typeof RepositoryPublishConfigV1Schema>;
|
|
52
|
+
export declare const RepositoryPublishPlanV1Schema: import("@sinclair/typebox").TObject<{
|
|
53
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
54
|
+
config: import("@sinclair/typebox").TObject<{
|
|
55
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
56
|
+
owner: import("@sinclair/typebox").TString;
|
|
57
|
+
name: import("@sinclair/typebox").TString;
|
|
58
|
+
visibility: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"private">, import("@sinclair/typebox").TLiteral<"internal">, import("@sinclair/typebox").TLiteral<"public">]>;
|
|
59
|
+
branch: import("@sinclair/typebox").TString;
|
|
60
|
+
remote: import("@sinclair/typebox").TLiteral<"origin">;
|
|
61
|
+
}>;
|
|
62
|
+
evidenceHash: import("@sinclair/typebox").TString;
|
|
63
|
+
planHash: import("@sinclair/typebox").TString;
|
|
64
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"pending">, import("@sinclair/typebox").TLiteral<"blocked">]>;
|
|
65
|
+
repository: import("@sinclair/typebox").TObject<{
|
|
66
|
+
fullName: import("@sinclair/typebox").TString;
|
|
67
|
+
owner: import("@sinclair/typebox").TString;
|
|
68
|
+
ownerType: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"user">, import("@sinclair/typebox").TLiteral<"organization">, import("@sinclair/typebox").TLiteral<"unknown">]>;
|
|
69
|
+
visibility: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"private">, import("@sinclair/typebox").TLiteral<"internal">, import("@sinclair/typebox").TLiteral<"public">]>;
|
|
70
|
+
exists: import("@sinclair/typebox").TBoolean;
|
|
71
|
+
}>;
|
|
72
|
+
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create-repository">, import("@sinclair/typebox").TLiteral<"add-remote">, import("@sinclair/typebox").TLiteral<"push-branch">]>>;
|
|
73
|
+
push: import("@sinclair/typebox").TObject<{
|
|
74
|
+
branch: import("@sinclair/typebox").TString;
|
|
75
|
+
commit: import("@sinclair/typebox").TString;
|
|
76
|
+
commitCount: import("@sinclair/typebox").TInteger;
|
|
77
|
+
files: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
78
|
+
filesTruncated: import("@sinclair/typebox").TBoolean;
|
|
79
|
+
uncommittedChanges: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
80
|
+
forcePush: import("@sinclair/typebox").TLiteral<false>;
|
|
81
|
+
}>;
|
|
82
|
+
blockers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
83
|
+
pendingActions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
84
|
+
filesModified: import("@sinclair/typebox").TLiteral<false>;
|
|
85
|
+
executionAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
86
|
+
deploymentAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
87
|
+
}>;
|
|
88
|
+
export type RepositoryPublishPlanV1 = Static<typeof RepositoryPublishPlanV1Schema>;
|
|
89
|
+
export declare const GovernanceSetupConfigV1Schema: import("@sinclair/typebox").TObject<{
|
|
90
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
91
|
+
repository: import("@sinclair/typebox").TString;
|
|
92
|
+
tenantId: import("@sinclair/typebox").TString;
|
|
93
|
+
subscriptionId: import("@sinclair/typebox").TString;
|
|
94
|
+
managementGroupId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
95
|
+
identity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
96
|
+
mode: import("@sinclair/typebox").TLiteral<"reuse">;
|
|
97
|
+
clientId: import("@sinclair/typebox").TString;
|
|
98
|
+
principalId: import("@sinclair/typebox").TString;
|
|
99
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
100
|
+
mode: import("@sinclair/typebox").TLiteral<"create">;
|
|
101
|
+
displayName: import("@sinclair/typebox").TString;
|
|
102
|
+
}>]>;
|
|
103
|
+
}>;
|
|
104
|
+
export type GovernanceSetupConfigV1 = Static<typeof GovernanceSetupConfigV1Schema>;
|
|
105
|
+
export declare const GovernanceSetupPlanV1Schema: import("@sinclair/typebox").TObject<{
|
|
106
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
107
|
+
config: import("@sinclair/typebox").TObject<{
|
|
108
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
109
|
+
repository: import("@sinclair/typebox").TString;
|
|
110
|
+
tenantId: import("@sinclair/typebox").TString;
|
|
111
|
+
subscriptionId: import("@sinclair/typebox").TString;
|
|
112
|
+
managementGroupId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
113
|
+
identity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
114
|
+
mode: import("@sinclair/typebox").TLiteral<"reuse">;
|
|
115
|
+
clientId: import("@sinclair/typebox").TString;
|
|
116
|
+
principalId: import("@sinclair/typebox").TString;
|
|
117
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
118
|
+
mode: import("@sinclair/typebox").TLiteral<"create">;
|
|
119
|
+
displayName: import("@sinclair/typebox").TString;
|
|
120
|
+
}>]>;
|
|
121
|
+
}>;
|
|
122
|
+
evidenceHash: import("@sinclair/typebox").TString;
|
|
123
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"pending">, import("@sinclair/typebox").TLiteral<"blocked">]>;
|
|
124
|
+
federation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
125
|
+
issuer: import("@sinclair/typebox").TLiteral<"https://token.actions.githubusercontent.com">;
|
|
126
|
+
audience: import("@sinclair/typebox").TLiteral<"api://AzureADTokenExchange">;
|
|
127
|
+
subject: import("@sinclair/typebox").TString;
|
|
128
|
+
}>>;
|
|
129
|
+
environment: import("@sinclair/typebox").TLiteral<"governance">;
|
|
130
|
+
proposedRole: import("@sinclair/typebox").TObject<{
|
|
131
|
+
id: import("@sinclair/typebox").TLiteral<"acdd72a7-3385-48ef-bd42-f606fba81ae7">;
|
|
132
|
+
name: import("@sinclair/typebox").TLiteral<"Reader">;
|
|
133
|
+
scope: import("@sinclair/typebox").TString;
|
|
134
|
+
}>;
|
|
135
|
+
variables: import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TString>;
|
|
136
|
+
blockers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
137
|
+
pendingActions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
138
|
+
filesModified: import("@sinclair/typebox").TLiteral<false>;
|
|
139
|
+
executionAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
140
|
+
deploymentAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
141
|
+
planHash: import("@sinclair/typebox").TString;
|
|
142
|
+
}>;
|
|
143
|
+
export type GovernanceSetupPlanV1 = Static<typeof GovernanceSetupPlanV1Schema>;
|
|
144
|
+
export declare const GovernanceProvisionPlanV1Schema: import("@sinclair/typebox").TObject<{
|
|
145
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
146
|
+
setup: import("@sinclair/typebox").TObject<{
|
|
147
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
148
|
+
config: import("@sinclair/typebox").TObject<{
|
|
149
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
150
|
+
repository: import("@sinclair/typebox").TString;
|
|
151
|
+
tenantId: import("@sinclair/typebox").TString;
|
|
152
|
+
subscriptionId: import("@sinclair/typebox").TString;
|
|
153
|
+
managementGroupId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
154
|
+
identity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
155
|
+
mode: import("@sinclair/typebox").TLiteral<"reuse">;
|
|
156
|
+
clientId: import("@sinclair/typebox").TString;
|
|
157
|
+
principalId: import("@sinclair/typebox").TString;
|
|
158
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
159
|
+
mode: import("@sinclair/typebox").TLiteral<"create">;
|
|
160
|
+
displayName: import("@sinclair/typebox").TString;
|
|
161
|
+
}>]>;
|
|
162
|
+
}>;
|
|
163
|
+
evidenceHash: import("@sinclair/typebox").TString;
|
|
164
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"pending">, import("@sinclair/typebox").TLiteral<"blocked">]>;
|
|
165
|
+
federation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
166
|
+
issuer: import("@sinclair/typebox").TLiteral<"https://token.actions.githubusercontent.com">;
|
|
167
|
+
audience: import("@sinclair/typebox").TLiteral<"api://AzureADTokenExchange">;
|
|
168
|
+
subject: import("@sinclair/typebox").TString;
|
|
169
|
+
}>>;
|
|
170
|
+
environment: import("@sinclair/typebox").TLiteral<"governance">;
|
|
171
|
+
proposedRole: import("@sinclair/typebox").TObject<{
|
|
172
|
+
id: import("@sinclair/typebox").TLiteral<"acdd72a7-3385-48ef-bd42-f606fba81ae7">;
|
|
173
|
+
name: import("@sinclair/typebox").TLiteral<"Reader">;
|
|
174
|
+
scope: import("@sinclair/typebox").TString;
|
|
175
|
+
}>;
|
|
176
|
+
variables: import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TString>;
|
|
177
|
+
blockers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
178
|
+
pendingActions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
179
|
+
filesModified: import("@sinclair/typebox").TLiteral<false>;
|
|
180
|
+
executionAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
181
|
+
deploymentAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
182
|
+
planHash: import("@sinclair/typebox").TString;
|
|
183
|
+
}>;
|
|
184
|
+
contextHash: import("@sinclair/typebox").TString;
|
|
185
|
+
evidenceHash: import("@sinclair/typebox").TString;
|
|
186
|
+
planHash: import("@sinclair/typebox").TString;
|
|
187
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"blocked">]>;
|
|
188
|
+
applicationObjectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
189
|
+
federationName: import("@sinclair/typebox").TString;
|
|
190
|
+
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create-federation">, import("@sinclair/typebox").TLiteral<"assign-reader">]>>;
|
|
191
|
+
blockers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
192
|
+
executionAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
193
|
+
deploymentAuthorized: import("@sinclair/typebox").TLiteral<false>;
|
|
194
|
+
}>;
|
|
195
|
+
export type GovernanceProvisionPlanV1 = Static<typeof GovernanceProvisionPlanV1Schema>;
|
|
15
196
|
//# sourceMappingURL=onboarding.d.ts.map
|
package/dist/onboarding.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAWtD,eAAO,MAAM,qBAAqB,4DAAqC,CAAC;AAExE,eAAO,MAAM,wBAAwB;;;;;;;;;;EAapC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACnE,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEzE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;EA+BjC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEnE,eAAO,MAAM,+BAA+B;;;;;;;EAU3C,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAEvF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCzC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAKnF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;EAwBzC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEnF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCvC,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE/E,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmB3C,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,OAAO,+BAA+B,CAAC,CAAC"}
|
package/dist/onboarding.js
CHANGED
|
@@ -1,17 +1,133 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
-
import { ContractVersionSchema, EnvironmentSchema, IacToolSchema, NonEmptyStringSchema, ProjectIdSchema, } from "./common.js";
|
|
3
|
-
export const BootstrapClientSchema = Type.
|
|
4
|
-
Type.Literal("github-copilot-vscode"),
|
|
5
|
-
Type.Literal("github-copilot-cli"),
|
|
6
|
-
]);
|
|
2
|
+
import { ContractVersionSchema, EnvironmentSchema, IacToolSchema, NonEmptyStringSchema, ProjectIdSchema, RiskOwnerSchema, Sha256Schema, } from "./common.js";
|
|
3
|
+
export const BootstrapClientSchema = Type.Literal("github-copilot-cli");
|
|
7
4
|
export const OnboardingConfigV1Schema = Type.Object({
|
|
8
5
|
schemaVersion: ContractVersionSchema,
|
|
9
|
-
projectId: ProjectIdSchema,
|
|
6
|
+
projectId: Type.Optional(ProjectIdSchema),
|
|
10
7
|
displayName: Type.Optional(NonEmptyStringSchema),
|
|
11
8
|
client: Type.Optional(BootstrapClientSchema),
|
|
12
9
|
environment: Type.Optional(EnvironmentSchema),
|
|
13
10
|
targetScope: Type.Optional(NonEmptyStringSchema),
|
|
14
11
|
iacTool: Type.Optional(IacToolSchema),
|
|
12
|
+
riskOwner: Type.Optional(RiskOwnerSchema),
|
|
15
13
|
createRepository: Type.Optional(Type.Boolean()),
|
|
16
14
|
}, { $id: "https://schemas.apexops.dev/onboarding-config-v1.json", additionalProperties: false });
|
|
15
|
+
export const BootstrapPlanV1Schema = Type.Object({
|
|
16
|
+
schemaVersion: ContractVersionSchema,
|
|
17
|
+
config: OnboardingConfigV1Schema,
|
|
18
|
+
configHash: Sha256Schema,
|
|
19
|
+
runtimeVersion: NonEmptyStringSchema,
|
|
20
|
+
scope: Type.Literal("local-bootstrap-preflight-v1"),
|
|
21
|
+
status: Type.Union([Type.Literal("ready"), Type.Literal("pending"), Type.Literal("blocked")]),
|
|
22
|
+
checks: Type.Array(Type.Object({
|
|
23
|
+
id: Type.Union([Type.Literal("repository"), Type.Literal("workspace-runtime"), Type.Literal("apex-state")]),
|
|
24
|
+
status: Type.Union([Type.Literal("ready"), Type.Literal("pending"), Type.Literal("blocked")]),
|
|
25
|
+
reason: Type.String({ minLength: 1, maxLength: 1024 }),
|
|
26
|
+
}, { additionalProperties: false }), { minItems: 3, maxItems: 3 }),
|
|
27
|
+
unassessed: Type.Tuple([
|
|
28
|
+
Type.Literal("machine-prerequisites"),
|
|
29
|
+
Type.Literal("client-health"),
|
|
30
|
+
Type.Literal("remote-coe"),
|
|
31
|
+
Type.Literal("github-repository"),
|
|
32
|
+
Type.Literal("governance-oidc"),
|
|
33
|
+
Type.Literal("reviewed-baseline"),
|
|
34
|
+
]),
|
|
35
|
+
filesModified: Type.Literal(false),
|
|
36
|
+
executionAuthorized: Type.Literal(false),
|
|
37
|
+
}, { $id: "https://schemas.apexops.dev/bootstrap-plan-v1.json", additionalProperties: false });
|
|
38
|
+
export const RepositoryPublishConfigV1Schema = Type.Object({
|
|
39
|
+
schemaVersion: ContractVersionSchema,
|
|
40
|
+
owner: Type.String({ pattern: "^[A-Za-z0-9][A-Za-z0-9-]{0,38}$(?![\\s\\S])" }),
|
|
41
|
+
name: Type.String({ pattern: "^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$(?![\\s\\S])" }),
|
|
42
|
+
visibility: Type.Union([Type.Literal("private"), Type.Literal("internal"), Type.Literal("public")]),
|
|
43
|
+
branch: Type.String({ pattern: "^[A-Za-z0-9][A-Za-z0-9._/-]{0,254}$(?![\\s\\S])" }),
|
|
44
|
+
remote: Type.Literal("origin"),
|
|
45
|
+
}, { $id: "https://schemas.apexops.dev/repository-publish-config-v1.json", additionalProperties: false });
|
|
46
|
+
export const RepositoryPublishPlanV1Schema = Type.Object({
|
|
47
|
+
schemaVersion: ContractVersionSchema,
|
|
48
|
+
config: RepositoryPublishConfigV1Schema,
|
|
49
|
+
evidenceHash: Sha256Schema,
|
|
50
|
+
planHash: Sha256Schema,
|
|
51
|
+
status: Type.Union([Type.Literal("ready"), Type.Literal("pending"), Type.Literal("blocked")]),
|
|
52
|
+
repository: Type.Object({
|
|
53
|
+
fullName: Type.String({ minLength: 3, maxLength: 140 }),
|
|
54
|
+
owner: Type.String({ minLength: 1, maxLength: 39 }),
|
|
55
|
+
ownerType: Type.Union([Type.Literal("user"), Type.Literal("organization"), Type.Literal("unknown")]),
|
|
56
|
+
visibility: Type.Union([Type.Literal("private"), Type.Literal("internal"), Type.Literal("public")]),
|
|
57
|
+
exists: Type.Boolean(),
|
|
58
|
+
}, { additionalProperties: false }),
|
|
59
|
+
actions: Type.Array(Type.Union([Type.Literal("create-repository"), Type.Literal("add-remote"), Type.Literal("push-branch")]), { maxItems: 3, uniqueItems: true }),
|
|
60
|
+
push: Type.Object({
|
|
61
|
+
branch: Type.String({ minLength: 1, maxLength: 255 }),
|
|
62
|
+
commit: Type.String({ pattern: "^[0-9a-f]{40}$(?![\\s\\S])" }),
|
|
63
|
+
commitCount: Type.Integer({ minimum: 0, maximum: 1_000_000 }),
|
|
64
|
+
files: Type.Array(Type.String({ minLength: 1, maxLength: 1024 }), { maxItems: 512 }),
|
|
65
|
+
filesTruncated: Type.Boolean(),
|
|
66
|
+
uncommittedChanges: Type.Array(Type.String({ minLength: 1, maxLength: 1024 }), { maxItems: 512 }),
|
|
67
|
+
forcePush: Type.Literal(false),
|
|
68
|
+
}, { additionalProperties: false }),
|
|
69
|
+
blockers: Type.Array(Type.String({ minLength: 1, maxLength: 512 }), { maxItems: 16 }),
|
|
70
|
+
pendingActions: Type.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 16 }),
|
|
71
|
+
filesModified: Type.Literal(false),
|
|
72
|
+
executionAuthorized: Type.Literal(false),
|
|
73
|
+
deploymentAuthorized: Type.Literal(false),
|
|
74
|
+
}, { $id: "https://schemas.apexops.dev/repository-publish-plan-v1.json", additionalProperties: false });
|
|
75
|
+
const AzureId = Type.String({
|
|
76
|
+
pattern: "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$(?![\\s\\S])",
|
|
77
|
+
});
|
|
78
|
+
export const GovernanceSetupConfigV1Schema = Type.Object({
|
|
79
|
+
schemaVersion: ContractVersionSchema,
|
|
80
|
+
repository: Type.String({ pattern: "^[A-Za-z0-9][A-Za-z0-9-]{0,38}/[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$(?![\\s\\S])" }),
|
|
81
|
+
tenantId: AzureId,
|
|
82
|
+
subscriptionId: AzureId,
|
|
83
|
+
managementGroupId: Type.Optional(Type.String({ pattern: "^[A-Za-z0-9](?:[A-Za-z0-9_().-]{0,88}[A-Za-z0-9_()-])?$(?![\\s\\S])" })),
|
|
84
|
+
identity: Type.Union([
|
|
85
|
+
Type.Object({ mode: Type.Literal("reuse"), clientId: AzureId, principalId: AzureId }, { additionalProperties: false }),
|
|
86
|
+
Type.Object({
|
|
87
|
+
mode: Type.Literal("create"),
|
|
88
|
+
displayName: Type.String({ pattern: "^[A-Za-z][A-Za-z0-9_.-]{0,79}$(?![\\s\\S])" }),
|
|
89
|
+
}, { additionalProperties: false }),
|
|
90
|
+
]),
|
|
91
|
+
}, { $id: "https://schemas.apexops.dev/governance-setup-config-v1.json", additionalProperties: false });
|
|
92
|
+
export const GovernanceSetupPlanV1Schema = Type.Object({
|
|
93
|
+
schemaVersion: ContractVersionSchema,
|
|
94
|
+
config: GovernanceSetupConfigV1Schema,
|
|
95
|
+
evidenceHash: Sha256Schema,
|
|
96
|
+
status: Type.Union([Type.Literal("pending"), Type.Literal("blocked")]),
|
|
97
|
+
federation: Type.Optional(Type.Object({
|
|
98
|
+
issuer: Type.Literal("https://token.actions.githubusercontent.com"),
|
|
99
|
+
audience: Type.Literal("api://AzureADTokenExchange"),
|
|
100
|
+
subject: Type.String({ minLength: 1, maxLength: 512 }),
|
|
101
|
+
}, { additionalProperties: false })),
|
|
102
|
+
environment: Type.Literal("governance"),
|
|
103
|
+
proposedRole: Type.Object({
|
|
104
|
+
id: Type.Literal("acdd72a7-3385-48ef-bd42-f606fba81ae7"),
|
|
105
|
+
name: Type.Literal("Reader"),
|
|
106
|
+
scope: Type.String({ minLength: 1, maxLength: 256 }),
|
|
107
|
+
}, { additionalProperties: false }),
|
|
108
|
+
variables: Type.Record(Type.String({ pattern: "^[A-Z_]+$" }), Type.String({ maxLength: 256 })),
|
|
109
|
+
blockers: Type.Array(Type.String({ minLength: 1, maxLength: 512 }), { maxItems: 16 }),
|
|
110
|
+
pendingActions: Type.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 16 }),
|
|
111
|
+
filesModified: Type.Literal(false),
|
|
112
|
+
executionAuthorized: Type.Literal(false),
|
|
113
|
+
deploymentAuthorized: Type.Literal(false),
|
|
114
|
+
planHash: Sha256Schema,
|
|
115
|
+
}, { $id: "https://schemas.apexops.dev/governance-setup-plan-v1.json", additionalProperties: false });
|
|
116
|
+
export const GovernanceProvisionPlanV1Schema = Type.Object({
|
|
117
|
+
schemaVersion: ContractVersionSchema,
|
|
118
|
+
setup: GovernanceSetupPlanV1Schema,
|
|
119
|
+
contextHash: Sha256Schema,
|
|
120
|
+
evidenceHash: Sha256Schema,
|
|
121
|
+
planHash: Sha256Schema,
|
|
122
|
+
status: Type.Union([Type.Literal("ready"), Type.Literal("blocked")]),
|
|
123
|
+
applicationObjectId: Type.Optional(AzureId),
|
|
124
|
+
federationName: Type.String({ pattern: "^apex-governance-[a-f0-9]{24}$" }),
|
|
125
|
+
actions: Type.Array(Type.Union([Type.Literal("create-federation"), Type.Literal("assign-reader")]), {
|
|
126
|
+
maxItems: 2,
|
|
127
|
+
uniqueItems: true,
|
|
128
|
+
}),
|
|
129
|
+
blockers: Type.Array(Type.String({ minLength: 1, maxLength: 512 }), { maxItems: 16 }),
|
|
130
|
+
executionAuthorized: Type.Literal(false),
|
|
131
|
+
deploymentAuthorized: Type.Literal(false),
|
|
132
|
+
}, { $id: "https://schemas.apexops.dev/governance-provision-plan-v1.json", additionalProperties: false });
|
|
17
133
|
//# sourceMappingURL=onboarding.js.map
|
package/dist/onboarding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,eAAe,
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Static } from "@sinclair/typebox";
|
|
2
|
+
import { PolicyPropertyMapV1Schema } from "./targets.js";
|
|
3
|
+
export declare const PolicyValidationV1Schema: import("@sinclair/typebox").TObject<{
|
|
4
|
+
schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
|
|
5
|
+
projectId: import("@sinclair/typebox").TString;
|
|
6
|
+
runId: import("@sinclair/typebox").TString;
|
|
7
|
+
track: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"bicep">, import("@sinclair/typebox").TLiteral<"terraform">]>;
|
|
8
|
+
sourceHash: import("@sinclair/typebox").TString;
|
|
9
|
+
policyMapHash: import("@sinclair/typebox").TString;
|
|
10
|
+
policyMapContentHash: import("@sinclair/typebox").TString;
|
|
11
|
+
logicalResourceManifestHash: import("@sinclair/typebox").TString;
|
|
12
|
+
inputHash: import("@sinclair/typebox").TString;
|
|
13
|
+
outcome: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"pass">, import("@sinclair/typebox").TLiteral<"fail">, import("@sinclair/typebox").TLiteral<"unsupported">]>;
|
|
14
|
+
results: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
15
|
+
mappingIndex: import("@sinclair/typebox").TInteger;
|
|
16
|
+
mappingHash: import("@sinclair/typebox").TString;
|
|
17
|
+
policyAssignmentId: import("@sinclair/typebox").TString;
|
|
18
|
+
policyDefinitionId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
19
|
+
policyDefinitionReferenceId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
20
|
+
effect: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"deny">, import("@sinclair/typebox").TLiteral<"modify">, import("@sinclair/typebox").TLiteral<"append">, import("@sinclair/typebox").TLiteral<"audit">, import("@sinclair/typebox").TLiteral<"deployIfNotExists">, import("@sinclair/typebox").TLiteral<"disabled">]>;
|
|
21
|
+
disposition: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"satisfied">, import("@sinclair/typebox").TLiteral<"planned">, import("@sinclair/typebox").TLiteral<"exempt">, import("@sinclair/typebox").TLiteral<"blocked">, import("@sinclair/typebox").TLiteral<"not-applicable">]>;
|
|
22
|
+
logicalResourceId: import("@sinclair/typebox").TString;
|
|
23
|
+
propertyPath: import("@sinclair/typebox").TString;
|
|
24
|
+
expectedValueDigest: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
25
|
+
observedValueDigest: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
26
|
+
outcome: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"pass">, import("@sinclair/typebox").TLiteral<"fail">, import("@sinclair/typebox").TLiteral<"unsupported">]>;
|
|
27
|
+
reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"matched">, import("@sinclair/typebox").TLiteral<"value-mismatch">, import("@sinclair/typebox").TLiteral<"missing-property">, import("@sinclair/typebox").TLiteral<"blocked">, import("@sinclair/typebox").TLiteral<"missing-expected-value">, import("@sinclair/typebox").TLiteral<"unverified-exemption">, import("@sinclair/typebox").TLiteral<"unsupported-effect">, import("@sinclair/typebox").TLiteral<"unsupported-path">, import("@sinclair/typebox").TLiteral<"unsupported-expression">, import("@sinclair/typebox").TLiteral<"resource-not-bound">, import("@sinclair/typebox").TLiteral<"resource-not-found">, import("@sinclair/typebox").TLiteral<"ambiguous-resource">, import("@sinclair/typebox").TLiteral<"unsupported-resource">, import("@sinclair/typebox").TLiteral<"invalid-source">, import("@sinclair/typebox").TLiteral<"not-applicable">, import("@sinclair/typebox").TLiteral<"platform-remediated">]>;
|
|
28
|
+
}>>;
|
|
29
|
+
receiptHash: import("@sinclair/typebox").TString;
|
|
30
|
+
}>;
|
|
31
|
+
export type PolicyValidationV1 = Static<typeof PolicyValidationV1Schema>;
|
|
32
|
+
export declare function hasActionablePolicyMappings(policyMap: Static<typeof PolicyPropertyMapV1Schema>): boolean;
|
|
33
|
+
export type PolicyValidationResultV1 = PolicyValidationV1["results"][number];
|
|
34
|
+
export type PolicyValidationBinding = Pick<PolicyValidationV1, "track" | "sourceHash" | "policyMapHash" | "policyMapContentHash" | "logicalResourceManifestHash" | "inputHash">;
|
|
35
|
+
export declare const POLICY_VALIDATION_LIMITS: Readonly<{
|
|
36
|
+
bytes: number;
|
|
37
|
+
depth: 64;
|
|
38
|
+
nodes: 100000;
|
|
39
|
+
mappings: 1000;
|
|
40
|
+
}>;
|
|
41
|
+
export declare function assertPolicyValidationJson(value: unknown): void;
|
|
42
|
+
export declare function calculatePolicyValidationDigest(value: unknown): string;
|
|
43
|
+
export declare function calculatePolicyValidationHash(receipt: Omit<PolicyValidationV1, "receiptHash">): string;
|
|
44
|
+
export declare function hasValidPolicyValidation(value: unknown, binding: PolicyValidationBinding): value is PolicyValidationV1;
|
|
45
|
+
//# sourceMappingURL=policy-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-validation.d.ts","sourceRoot":"","sources":["../src/policy-validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAUtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAKzD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDpC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEzE,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,yBAAyB,CAAC,GAAG,OAAO,CAExG;AACD,MAAM,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7E,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,kBAAkB,EAClB,OAAO,GAAG,YAAY,GAAG,eAAe,GAAG,sBAAsB,GAAG,6BAA6B,GAAG,WAAW,CAChH,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;EAKnC,CAAC;AAEH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAyC/D;AAqBD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKtE;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,GAAG,MAAM,CAEtG;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,uBAAuB,GAC/B,KAAK,IAAI,kBAAkB,CA0D7B"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
import { Value } from "@sinclair/typebox/value";
|
|
4
|
+
import { ContractVersionSchema, IacToolSchema, NonEmptyStringSchema, ProjectIdSchema, RunIdSchema, Sha256Schema, } from "./common.js";
|
|
5
|
+
import { PolicyPropertyMapV1Schema } from "./targets.js";
|
|
6
|
+
const OutcomeSchema = Type.Union([Type.Literal("pass"), Type.Literal("fail"), Type.Literal("unsupported")]);
|
|
7
|
+
const mappingProperties = PolicyPropertyMapV1Schema.properties.mappings.items.properties;
|
|
8
|
+
export const PolicyValidationV1Schema = Type.Object({
|
|
9
|
+
schemaVersion: ContractVersionSchema,
|
|
10
|
+
projectId: ProjectIdSchema,
|
|
11
|
+
runId: RunIdSchema,
|
|
12
|
+
track: IacToolSchema,
|
|
13
|
+
sourceHash: Sha256Schema,
|
|
14
|
+
policyMapHash: Sha256Schema,
|
|
15
|
+
policyMapContentHash: Sha256Schema,
|
|
16
|
+
logicalResourceManifestHash: Sha256Schema,
|
|
17
|
+
inputHash: Sha256Schema,
|
|
18
|
+
outcome: OutcomeSchema,
|
|
19
|
+
results: Type.Array(Type.Object({
|
|
20
|
+
mappingIndex: Type.Integer({ minimum: 0 }),
|
|
21
|
+
mappingHash: Sha256Schema,
|
|
22
|
+
policyAssignmentId: NonEmptyStringSchema,
|
|
23
|
+
policyDefinitionId: Type.Optional(NonEmptyStringSchema),
|
|
24
|
+
policyDefinitionReferenceId: Type.Optional(NonEmptyStringSchema),
|
|
25
|
+
effect: mappingProperties.effect,
|
|
26
|
+
disposition: mappingProperties.disposition,
|
|
27
|
+
logicalResourceId: NonEmptyStringSchema,
|
|
28
|
+
propertyPath: NonEmptyStringSchema,
|
|
29
|
+
expectedValueDigest: Type.Optional(Sha256Schema),
|
|
30
|
+
observedValueDigest: Type.Optional(Sha256Schema),
|
|
31
|
+
outcome: OutcomeSchema,
|
|
32
|
+
reason: Type.Union([
|
|
33
|
+
Type.Literal("matched"),
|
|
34
|
+
Type.Literal("value-mismatch"),
|
|
35
|
+
Type.Literal("missing-property"),
|
|
36
|
+
Type.Literal("blocked"),
|
|
37
|
+
Type.Literal("missing-expected-value"),
|
|
38
|
+
Type.Literal("unverified-exemption"),
|
|
39
|
+
Type.Literal("unsupported-effect"),
|
|
40
|
+
Type.Literal("unsupported-path"),
|
|
41
|
+
Type.Literal("unsupported-expression"),
|
|
42
|
+
Type.Literal("resource-not-bound"),
|
|
43
|
+
Type.Literal("resource-not-found"),
|
|
44
|
+
Type.Literal("ambiguous-resource"),
|
|
45
|
+
Type.Literal("unsupported-resource"),
|
|
46
|
+
Type.Literal("invalid-source"),
|
|
47
|
+
Type.Literal("not-applicable"),
|
|
48
|
+
Type.Literal("platform-remediated"),
|
|
49
|
+
]),
|
|
50
|
+
}, { additionalProperties: false })),
|
|
51
|
+
receiptHash: Sha256Schema,
|
|
52
|
+
}, { $id: "https://schemas.apexops.dev/policy-validation-v1.json", additionalProperties: false });
|
|
53
|
+
export function hasActionablePolicyMappings(policyMap) {
|
|
54
|
+
return policyMap.mappings.some(({ disposition }) => disposition !== "not-applicable");
|
|
55
|
+
}
|
|
56
|
+
export const POLICY_VALIDATION_LIMITS = Object.freeze({
|
|
57
|
+
bytes: 16 * 1024 * 1024,
|
|
58
|
+
depth: 64,
|
|
59
|
+
nodes: 100_000,
|
|
60
|
+
mappings: 1_000,
|
|
61
|
+
});
|
|
62
|
+
export function assertPolicyValidationJson(value) {
|
|
63
|
+
const pending = [{ value, depth: 0, exit: false }];
|
|
64
|
+
const ancestors = new Set();
|
|
65
|
+
let nodes = 1;
|
|
66
|
+
let bytes = 0;
|
|
67
|
+
while (pending.length > 0) {
|
|
68
|
+
const current = pending.pop();
|
|
69
|
+
if (current.exit) {
|
|
70
|
+
ancestors.delete(current.value);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (current.depth > POLICY_VALIDATION_LIMITS.depth)
|
|
74
|
+
throw new TypeError("POLICY_VALIDATION_LIMIT_EXCEEDED");
|
|
75
|
+
const child = current.value;
|
|
76
|
+
if (child !== null && typeof child === "object") {
|
|
77
|
+
if ((!Array.isArray(child) && Object.getPrototypeOf(child) !== Object.prototype) || ancestors.has(child))
|
|
78
|
+
throw new TypeError("POLICY_VALIDATION_NON_JSON_VALUE");
|
|
79
|
+
ancestors.add(child);
|
|
80
|
+
pending.push({ ...current, exit: true });
|
|
81
|
+
const keys = Array.isArray(child) ? undefined : Object.keys(child);
|
|
82
|
+
const length = keys === undefined ? child.length : keys.length;
|
|
83
|
+
nodes += length;
|
|
84
|
+
if (nodes > POLICY_VALIDATION_LIMITS.nodes)
|
|
85
|
+
throw new TypeError("POLICY_VALIDATION_LIMIT_EXCEEDED");
|
|
86
|
+
bytes += 2 + Math.max(0, length - 1);
|
|
87
|
+
for (let index = 0; index < length; index++) {
|
|
88
|
+
const key = keys?.[index];
|
|
89
|
+
const entry = key === undefined ? child[index] : child[key];
|
|
90
|
+
if (key !== undefined)
|
|
91
|
+
bytes += Buffer.byteLength(JSON.stringify(key), "utf8") + 1;
|
|
92
|
+
pending.push({ value: entry, depth: current.depth + 1, exit: false });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (child === null ||
|
|
96
|
+
typeof child === "string" ||
|
|
97
|
+
typeof child === "boolean" ||
|
|
98
|
+
(typeof child === "number" && Number.isFinite(child))) {
|
|
99
|
+
bytes += Buffer.byteLength(JSON.stringify(child), "utf8");
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
throw new TypeError("POLICY_VALIDATION_NON_JSON_VALUE");
|
|
103
|
+
}
|
|
104
|
+
if (bytes > POLICY_VALIDATION_LIMITS.bytes)
|
|
105
|
+
throw new TypeError("POLICY_VALIDATION_LIMIT_EXCEEDED");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function canonicalValue(value) {
|
|
109
|
+
if (Array.isArray(value))
|
|
110
|
+
return value.map(canonicalValue);
|
|
111
|
+
if (value !== null && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype) {
|
|
112
|
+
return Object.fromEntries(Object.entries(value)
|
|
113
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
114
|
+
.map(([key, child]) => [key, canonicalValue(child)]));
|
|
115
|
+
}
|
|
116
|
+
if (value === null ||
|
|
117
|
+
typeof value === "string" ||
|
|
118
|
+
typeof value === "boolean" ||
|
|
119
|
+
(typeof value === "number" && Number.isFinite(value)))
|
|
120
|
+
return value;
|
|
121
|
+
throw new TypeError("POLICY_VALIDATION_NON_JSON_VALUE");
|
|
122
|
+
}
|
|
123
|
+
export function calculatePolicyValidationDigest(value) {
|
|
124
|
+
assertPolicyValidationJson(value);
|
|
125
|
+
return createHash("sha256")
|
|
126
|
+
.update(JSON.stringify(canonicalValue(value)))
|
|
127
|
+
.digest("hex");
|
|
128
|
+
}
|
|
129
|
+
export function calculatePolicyValidationHash(receipt) {
|
|
130
|
+
return calculatePolicyValidationDigest(receipt);
|
|
131
|
+
}
|
|
132
|
+
export function hasValidPolicyValidation(value, binding) {
|
|
133
|
+
try {
|
|
134
|
+
assertPolicyValidationJson(value);
|
|
135
|
+
assertPolicyValidationJson(binding);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
if (binding === null || typeof binding !== "object" || Array.isArray(binding))
|
|
141
|
+
return false;
|
|
142
|
+
if (!Value.Check(PolicyValidationV1Schema, value))
|
|
143
|
+
return false;
|
|
144
|
+
if (value.results.length > POLICY_VALIDATION_LIMITS.mappings)
|
|
145
|
+
return false;
|
|
146
|
+
const { receiptHash, ...receipt } = value;
|
|
147
|
+
const keys = [
|
|
148
|
+
"track",
|
|
149
|
+
"sourceHash",
|
|
150
|
+
"policyMapHash",
|
|
151
|
+
"policyMapContentHash",
|
|
152
|
+
"logicalResourceManifestHash",
|
|
153
|
+
"inputHash",
|
|
154
|
+
];
|
|
155
|
+
if (keys.some((key) => receipt[key] !== binding[key]))
|
|
156
|
+
return false;
|
|
157
|
+
const outcome = receipt.results.some((result) => result.outcome === "fail")
|
|
158
|
+
? "fail"
|
|
159
|
+
: receipt.results.length === 0 || receipt.results.some((result) => result.outcome === "unsupported")
|
|
160
|
+
? "unsupported"
|
|
161
|
+
: "pass";
|
|
162
|
+
if (receipt.outcome !== outcome)
|
|
163
|
+
return false;
|
|
164
|
+
if (!receipt.results.every((result, index) => {
|
|
165
|
+
if (result.mappingIndex !== index)
|
|
166
|
+
return false;
|
|
167
|
+
if (result.reason === "matched") {
|
|
168
|
+
return (result.outcome === "pass" &&
|
|
169
|
+
result.expectedValueDigest !== undefined &&
|
|
170
|
+
result.expectedValueDigest === result.observedValueDigest &&
|
|
171
|
+
result.disposition !== "blocked" &&
|
|
172
|
+
result.disposition !== "exempt" &&
|
|
173
|
+
result.disposition !== "not-applicable" &&
|
|
174
|
+
result.effect !== "disabled");
|
|
175
|
+
}
|
|
176
|
+
if (result.reason === "not-applicable")
|
|
177
|
+
return result.outcome === "pass" && result.disposition === "not-applicable";
|
|
178
|
+
if (result.reason === "platform-remediated")
|
|
179
|
+
return (result.outcome === "pass" &&
|
|
180
|
+
["modify", "deployIfNotExists"].includes(result.effect) &&
|
|
181
|
+
["satisfied", "planned"].includes(result.disposition));
|
|
182
|
+
if (["blocked", "value-mismatch", "missing-property"].includes(result.reason))
|
|
183
|
+
return result.outcome === "fail";
|
|
184
|
+
return result.outcome === "unsupported";
|
|
185
|
+
}))
|
|
186
|
+
return false;
|
|
187
|
+
try {
|
|
188
|
+
return receiptHash === calculatePolicyValidationHash(receipt);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=policy-validation.js.map
|