@apexops/capabilities 0.10.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/dist/.tsbuildinfo +1 -0
- package/dist/bound-envelope-transport.d.ts +27 -0
- package/dist/bound-envelope-transport.d.ts.map +1 -0
- package/dist/bound-envelope-transport.js +96 -0
- package/dist/bound-envelope-transport.js.map +1 -0
- package/dist/capability.d.ts +36 -0
- package/dist/capability.d.ts.map +1 -0
- package/dist/capability.js +83 -0
- package/dist/capability.js.map +1 -0
- package/dist/command-plans.d.ts +49 -0
- package/dist/command-plans.d.ts.map +1 -0
- package/dist/command-plans.js +157 -0
- package/dist/command-plans.js.map +1 -0
- package/dist/design-capabilities.d.ts +23 -0
- package/dist/design-capabilities.d.ts.map +1 -0
- package/dist/design-capabilities.js +32 -0
- package/dist/design-capabilities.js.map +1 -0
- package/dist/encrypted-envelope-transport.d.ts +32 -0
- package/dist/encrypted-envelope-transport.d.ts.map +1 -0
- package/dist/encrypted-envelope-transport.js +138 -0
- package/dist/encrypted-envelope-transport.js.map +1 -0
- package/dist/iac-generation.d.ts +52 -0
- package/dist/iac-generation.d.ts.map +1 -0
- package/dist/iac-generation.js +645 -0
- package/dist/iac-generation.js.map +1 -0
- package/dist/iac-normalizers.d.ts +22 -0
- package/dist/iac-normalizers.d.ts.map +1 -0
- package/dist/iac-normalizers.js +198 -0
- package/dist/iac-normalizers.js.map +1 -0
- package/dist/iac.d.ts +83 -0
- package/dist/iac.d.ts.map +1 -0
- package/dist/iac.js +217 -0
- package/dist/iac.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/local-plan-transport.d.ts +29 -0
- package/dist/local-plan-transport.d.ts.map +1 -0
- package/dist/local-plan-transport.js +101 -0
- package/dist/local-plan-transport.js.map +1 -0
- package/dist/native-iac-providers.d.ts +96 -0
- package/dist/native-iac-providers.d.ts.map +1 -0
- package/dist/native-iac-providers.js +487 -0
- package/dist/native-iac-providers.js.map +1 -0
- package/dist/operations-placeholders.d.ts +5 -0
- package/dist/operations-placeholders.d.ts.map +1 -0
- package/dist/operations-placeholders.js +23 -0
- package/dist/operations-placeholders.js.map +1 -0
- package/dist/pack-manager.d.ts +95 -0
- package/dist/pack-manager.d.ts.map +1 -0
- package/dist/pack-manager.js +556 -0
- package/dist/pack-manager.js.map +1 -0
- package/dist/packs.d.ts +29 -0
- package/dist/packs.d.ts.map +1 -0
- package/dist/packs.js +51 -0
- package/dist/packs.js.map +1 -0
- package/dist/process-runner.d.ts +30 -0
- package/dist/process-runner.d.ts.map +1 -0
- package/dist/process-runner.js +97 -0
- package/dist/process-runner.js.map +1 -0
- package/dist/secret-redaction.d.ts +3 -0
- package/dist/secret-redaction.d.ts.map +1 -0
- package/dist/secret-redaction.js +48 -0
- package/dist/secret-redaction.js.map +1 -0
- package/dist/terraform-provider-schema.d.ts +75 -0
- package/dist/terraform-provider-schema.d.ts.map +1 -0
- package/dist/terraform-provider-schema.js +307 -0
- package/dist/terraform-provider-schema.js.map +1 -0
- package/dist/terraform-registry-client.d.ts +63 -0
- package/dist/terraform-registry-client.d.ts.map +1 -0
- package/dist/terraform-registry-client.js +388 -0
- package/dist/terraform-registry-client.js.map +1 -0
- package/dist/test/bound-envelope-transport.test.d.ts +2 -0
- package/dist/test/bound-envelope-transport.test.d.ts.map +1 -0
- package/dist/test/bound-envelope-transport.test.js +30 -0
- package/dist/test/bound-envelope-transport.test.js.map +1 -0
- package/dist/test/capabilities.test.d.ts +2 -0
- package/dist/test/capabilities.test.d.ts.map +1 -0
- package/dist/test/capabilities.test.js +86 -0
- package/dist/test/capabilities.test.js.map +1 -0
- package/dist/test/encrypted-envelope-transport.test.d.ts +2 -0
- package/dist/test/encrypted-envelope-transport.test.d.ts.map +1 -0
- package/dist/test/encrypted-envelope-transport.test.js +74 -0
- package/dist/test/encrypted-envelope-transport.test.js.map +1 -0
- package/dist/test/fixtures/terraform-provider-schema.d.ts +65 -0
- package/dist/test/fixtures/terraform-provider-schema.d.ts.map +1 -0
- package/dist/test/fixtures/terraform-provider-schema.js +29 -0
- package/dist/test/fixtures/terraform-provider-schema.js.map +1 -0
- package/dist/test/fixtures/terraform-registry.d.ts +54 -0
- package/dist/test/fixtures/terraform-registry.d.ts.map +1 -0
- package/dist/test/fixtures/terraform-registry.js +42 -0
- package/dist/test/fixtures/terraform-registry.js.map +1 -0
- package/dist/test/iac-generation.test.d.ts +2 -0
- package/dist/test/iac-generation.test.d.ts.map +1 -0
- package/dist/test/iac-generation.test.js +271 -0
- package/dist/test/iac-generation.test.js.map +1 -0
- package/dist/test/iac.test.d.ts +2 -0
- package/dist/test/iac.test.d.ts.map +1 -0
- package/dist/test/iac.test.js +161 -0
- package/dist/test/iac.test.js.map +1 -0
- package/dist/test/native-iac-providers.test.d.ts +2 -0
- package/dist/test/native-iac-providers.test.d.ts.map +1 -0
- package/dist/test/native-iac-providers.test.js +594 -0
- package/dist/test/native-iac-providers.test.js.map +1 -0
- package/dist/test/operations-placeholders.test.d.ts +2 -0
- package/dist/test/operations-placeholders.test.d.ts.map +1 -0
- package/dist/test/operations-placeholders.test.js +34 -0
- package/dist/test/operations-placeholders.test.js.map +1 -0
- package/dist/test/pack-manager.test.d.ts +2 -0
- package/dist/test/pack-manager.test.d.ts.map +1 -0
- package/dist/test/pack-manager.test.js +379 -0
- package/dist/test/pack-manager.test.js.map +1 -0
- package/dist/test/packs-and-commands.test.d.ts +2 -0
- package/dist/test/packs-and-commands.test.d.ts.map +1 -0
- package/dist/test/packs-and-commands.test.js +131 -0
- package/dist/test/packs-and-commands.test.js.map +1 -0
- package/dist/test/process-runner.test.d.ts +2 -0
- package/dist/test/process-runner.test.d.ts.map +1 -0
- package/dist/test/process-runner.test.js +42 -0
- package/dist/test/process-runner.test.js.map +1 -0
- package/dist/test/terraform-provider-schema.test.d.ts +2 -0
- package/dist/test/terraform-provider-schema.test.d.ts.map +1 -0
- package/dist/test/terraform-provider-schema.test.js +259 -0
- package/dist/test/terraform-provider-schema.test.js.map +1 -0
- package/dist/test/terraform-registry-client.test.d.ts +2 -0
- package/dist/test/terraform-registry-client.test.d.ts.map +1 -0
- package/dist/test/terraform-registry-client.test.js +321 -0
- package/dist/test/terraform-registry-client.test.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bound-envelope-transport.js","sourceRoot":"","sources":["../src/bound-envelope-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { TaskEnvelopeV1 } from "@apexops/contracts";
|
|
2
|
+
export type CapabilitySideEffect = "none" | "local" | "remote";
|
|
3
|
+
export type CapabilityIdempotency = "none" | "supported" | "required";
|
|
4
|
+
export type CapabilityLifecycle = "active" | "implemented-unqualified" | "external-trusted";
|
|
5
|
+
export interface CapabilityContext {
|
|
6
|
+
readonly envelope: TaskEnvelopeV1;
|
|
7
|
+
readonly attempt: number;
|
|
8
|
+
readonly signal: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
export interface Capability<TInput = unknown, TOutput = unknown> {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly lifecycle?: CapabilityLifecycle;
|
|
13
|
+
readonly sideEffect: CapabilitySideEffect;
|
|
14
|
+
readonly requiredRole: string;
|
|
15
|
+
readonly timeoutMs: number;
|
|
16
|
+
readonly retries: number;
|
|
17
|
+
readonly idempotency: CapabilityIdempotency;
|
|
18
|
+
execute(context: CapabilityContext, input: TInput): Promise<TOutput>;
|
|
19
|
+
reconcile?(context: CapabilityContext, input: TInput): Promise<TOutput>;
|
|
20
|
+
}
|
|
21
|
+
export type CapabilityErrorCode = "CAPABILITY_DUPLICATE" | "CAPABILITY_EXPIRED" | "CAPABILITY_GRANT_DENIED" | "CAPABILITY_OUTPUT_LIMIT" | "CAPABILITY_ROLE_DENIED" | "CAPABILITY_SIDE_EFFECT_DENIED" | "CAPABILITY_TIMEOUT" | "CAPABILITY_UNAVAILABLE" | "CAPABILITY_UNQUALIFIED" | "CAPABILITY_UNKNOWN";
|
|
22
|
+
export declare class CapabilityError extends Error {
|
|
23
|
+
readonly code: CapabilityErrorCode;
|
|
24
|
+
constructor(code: CapabilityErrorCode, message: string);
|
|
25
|
+
}
|
|
26
|
+
export interface CapabilityRegistryOptions {
|
|
27
|
+
readonly now?: () => Date;
|
|
28
|
+
readonly measureOutputBytes?: (output: unknown) => number;
|
|
29
|
+
}
|
|
30
|
+
export declare class CapabilityRegistry {
|
|
31
|
+
#private;
|
|
32
|
+
constructor(options?: CapabilityRegistryOptions);
|
|
33
|
+
register<TInput, TOutput>(capability: Capability<TInput, TOutput>): void;
|
|
34
|
+
execute<TOutput>(id: string, envelope: TaskEnvelopeV1, input: unknown): Promise<TOutput>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC/D,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,yBAAyB,GAAG,kBAAkB,CAAC;AAE5F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAC7D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,SAAS,CAAC,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzE;AAED,MAAM,MAAM,mBAAmB,GAC3B,sBAAsB,GACtB,oBAAoB,GACpB,yBAAyB,GACzB,yBAAyB,GACzB,wBAAwB,GACxB,+BAA+B,GAC/B,oBAAoB,GACpB,wBAAwB,GACxB,wBAAwB,GACxB,oBAAoB,CAAC;AAEzB,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,IAAI,EAAE,mBAAmB;IAD3C,YACkB,IAAI,EAAE,mBAAmB,EACzC,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC;CAC3D;AAED,qBAAa,kBAAkB;;IAK7B,YAAY,OAAO,GAAE,yBAA8B,EAIlD;IAED,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKvE;IAEK,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAqC7F;CAgCF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export class CapabilityError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.code = code;
|
|
6
|
+
this.name = "CapabilityError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class CapabilityRegistry {
|
|
10
|
+
#capabilities = new Map();
|
|
11
|
+
#now;
|
|
12
|
+
#measureOutputBytes;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.#now = options.now ?? (() => new Date());
|
|
15
|
+
this.#measureOutputBytes =
|
|
16
|
+
options.measureOutputBytes ?? ((output) => Buffer.byteLength(JSON.stringify(output), "utf8"));
|
|
17
|
+
}
|
|
18
|
+
register(capability) {
|
|
19
|
+
if (this.#capabilities.has(capability.id)) {
|
|
20
|
+
throw new CapabilityError("CAPABILITY_DUPLICATE", `Capability '${capability.id}' is already registered`);
|
|
21
|
+
}
|
|
22
|
+
this.#capabilities.set(capability.id, capability);
|
|
23
|
+
}
|
|
24
|
+
async execute(id, envelope, input) {
|
|
25
|
+
const capability = this.#authorize(id, envelope);
|
|
26
|
+
let lastError;
|
|
27
|
+
for (let attempt = 1; attempt <= capability.retries + 1; attempt += 1) {
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
const timeout = setTimeout(() => controller.abort(), capability.timeoutMs);
|
|
30
|
+
try {
|
|
31
|
+
const output = await Promise.race([
|
|
32
|
+
capability.execute({ envelope, attempt, signal: controller.signal }, input),
|
|
33
|
+
new Promise((_resolve, reject) => {
|
|
34
|
+
controller.signal.addEventListener("abort", () => reject(new CapabilityError("CAPABILITY_TIMEOUT", `Capability '${id}' timed out`)), { once: true });
|
|
35
|
+
}),
|
|
36
|
+
]);
|
|
37
|
+
const bytes = this.#measureOutputBytes(output);
|
|
38
|
+
if (bytes > envelope.maxOutputBytes) {
|
|
39
|
+
throw new CapabilityError("CAPABILITY_OUTPUT_LIMIT", `Capability '${id}' produced ${bytes} bytes; budget is ${envelope.maxOutputBytes}`);
|
|
40
|
+
}
|
|
41
|
+
return output;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
lastError = error;
|
|
45
|
+
if (error instanceof CapabilityError || attempt > capability.retries) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
clearTimeout(timeout);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw lastError;
|
|
54
|
+
}
|
|
55
|
+
#authorize(id, envelope) {
|
|
56
|
+
const capability = this.#capabilities.get(id);
|
|
57
|
+
if (capability === undefined) {
|
|
58
|
+
throw new CapabilityError("CAPABILITY_UNKNOWN", `Capability '${id}' is not registered`);
|
|
59
|
+
}
|
|
60
|
+
if (capability.lifecycle === "implemented-unqualified") {
|
|
61
|
+
throw new CapabilityError("CAPABILITY_UNQUALIFIED", `Capability '${id}' is not qualified for execution`);
|
|
62
|
+
}
|
|
63
|
+
const now = this.#now().getTime();
|
|
64
|
+
if (new Date(envelope.expiresAt).getTime() <= now) {
|
|
65
|
+
throw new CapabilityError("CAPABILITY_EXPIRED", `Task '${envelope.taskId}' has expired`);
|
|
66
|
+
}
|
|
67
|
+
if (envelope.role !== capability.requiredRole) {
|
|
68
|
+
throw new CapabilityError("CAPABILITY_ROLE_DENIED", `Role '${envelope.role}' cannot execute capability '${id}'`);
|
|
69
|
+
}
|
|
70
|
+
const grant = envelope.capabilityGrants.find((candidate) => candidate.capability === id);
|
|
71
|
+
if (grant === undefined) {
|
|
72
|
+
throw new CapabilityError("CAPABILITY_GRANT_DENIED", `No grant exists for capability '${id}'`);
|
|
73
|
+
}
|
|
74
|
+
if (new Date(grant.expiresAt).getTime() <= now) {
|
|
75
|
+
throw new CapabilityError("CAPABILITY_EXPIRED", `Grant for capability '${id}' has expired`);
|
|
76
|
+
}
|
|
77
|
+
if (grant.sideEffect !== capability.sideEffect) {
|
|
78
|
+
throw new CapabilityError("CAPABILITY_SIDE_EFFECT_DENIED", `Grant side effect '${grant.sideEffect}' does not match '${capability.sideEffect}'`);
|
|
79
|
+
}
|
|
80
|
+
return capability;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface CommandPlan {
|
|
2
|
+
readonly executable: string;
|
|
3
|
+
readonly args: readonly string[];
|
|
4
|
+
readonly cwd?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface BicepTarget {
|
|
7
|
+
readonly resourceGroup: string;
|
|
8
|
+
readonly deploymentName: string;
|
|
9
|
+
readonly templateFile: string;
|
|
10
|
+
readonly parametersFile?: string;
|
|
11
|
+
readonly cwd?: string;
|
|
12
|
+
}
|
|
13
|
+
export type BicepStackActionOnUnmanage = "deleteAll" | "deleteResources" | "detachAll";
|
|
14
|
+
export type BicepStackDenySettingsMode = "denyDelete" | "denyWriteAndDelete" | "none";
|
|
15
|
+
export interface BicepStackTarget extends BicepTarget {
|
|
16
|
+
readonly stackName: string;
|
|
17
|
+
readonly actionOnUnmanage?: BicepStackActionOnUnmanage;
|
|
18
|
+
readonly denySettingsMode: BicepStackDenySettingsMode;
|
|
19
|
+
readonly ownershipAuthorizesDeleteResources?: boolean;
|
|
20
|
+
readonly dedicatedSandboxResourceGroup?: boolean;
|
|
21
|
+
readonly allowDeleteAll?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ResolvedBicepStackTarget extends BicepStackTarget {
|
|
24
|
+
readonly actionOnUnmanage: BicepStackActionOnUnmanage;
|
|
25
|
+
}
|
|
26
|
+
export declare class BicepCommandAdapter {
|
|
27
|
+
validate(templateFile: string, cwd?: string): CommandPlan;
|
|
28
|
+
preview(target: BicepTarget): CommandPlan;
|
|
29
|
+
apply(target: BicepTarget): CommandPlan;
|
|
30
|
+
stackApply(target: ResolvedBicepStackTarget): CommandPlan;
|
|
31
|
+
stackDestroy(target: ResolvedBicepStackTarget): CommandPlan;
|
|
32
|
+
stackList(target: BicepStackTarget): CommandPlan;
|
|
33
|
+
}
|
|
34
|
+
export declare class TerraformCommandAdapter {
|
|
35
|
+
#private;
|
|
36
|
+
providerSchemas(cwd: string): CommandPlan;
|
|
37
|
+
versionJson(cwd: string): CommandPlan;
|
|
38
|
+
init(cwd: string, backend: boolean): CommandPlan;
|
|
39
|
+
validate(cwd: string): readonly CommandPlan[];
|
|
40
|
+
preview(cwd: string, savedPlanPath: string, destroy?: boolean): CommandPlan;
|
|
41
|
+
applyExact(cwd: string, savedPlanPath: string): CommandPlan;
|
|
42
|
+
showJson(cwd: string, savedPlanPath: string): CommandPlan;
|
|
43
|
+
statePull(cwd: string): CommandPlan;
|
|
44
|
+
}
|
|
45
|
+
export declare class AzureCliReadAdapter {
|
|
46
|
+
resourceGraph(query: string, subscriptions?: readonly string[]): CommandPlan;
|
|
47
|
+
armGet(resourceId: string, apiVersion: string): CommandPlan;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=command-plans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-plans.d.ts","sourceRoot":"","sources":["../src/command-plans.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,0BAA0B,GAAG,WAAW,GAAG,iBAAiB,GAAG,WAAW,CAAC;AACvF,MAAM,MAAM,0BAA0B,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM,CAAC;AAEtF,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;IACvD,QAAQ,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;IACtD,QAAQ,CAAC,kCAAkC,CAAC,EAAE,OAAO,CAAC;IACtD,QAAQ,CAAC,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,QAAQ,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;CACvD;AAMD,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAExD;IAED,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAmBxC;IAED,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAkBtC;IAED,UAAU,CAAC,MAAM,EAAE,wBAAwB,GAAG,WAAW,CAuBxD;IAED,YAAY,CAAC,MAAM,EAAE,wBAAwB,GAAG,WAAW,CAmB1D;IAED,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,WAAW,CAM/C;CACF;AAED,qBAAa,uBAAuB;;IAClC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAExC;IAED,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAEpC;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CAM/C;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CAK5C;IAED,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,WAAW,CAOxE;IAED,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,WAAW,CAG1D;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,WAAW,CAGxD;IAED,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAElC;CAOF;AAED,qBAAa,mBAAmB;IAC9B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,GAAE,SAAS,MAAM,EAAO,GAAG,WAAW,CAa/E;IAED,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAK1D;CACF"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
function withBicepParameters(args, parametersFile) {
|
|
2
|
+
return parametersFile === undefined ? args : [...args, "--parameters", parametersFile];
|
|
3
|
+
}
|
|
4
|
+
export class BicepCommandAdapter {
|
|
5
|
+
validate(templateFile, cwd) {
|
|
6
|
+
return { executable: "bicep", args: ["build", templateFile], ...(cwd === undefined ? {} : { cwd }) };
|
|
7
|
+
}
|
|
8
|
+
preview(target) {
|
|
9
|
+
const args = withBicepParameters([
|
|
10
|
+
"deployment",
|
|
11
|
+
"group",
|
|
12
|
+
"what-if",
|
|
13
|
+
"--resource-group",
|
|
14
|
+
target.resourceGroup,
|
|
15
|
+
"--name",
|
|
16
|
+
target.deploymentName,
|
|
17
|
+
"--template-file",
|
|
18
|
+
target.templateFile,
|
|
19
|
+
"--no-pretty-print",
|
|
20
|
+
"--output",
|
|
21
|
+
"json",
|
|
22
|
+
], target.parametersFile);
|
|
23
|
+
return { executable: "az", args, ...(target.cwd === undefined ? {} : { cwd: target.cwd }) };
|
|
24
|
+
}
|
|
25
|
+
apply(target) {
|
|
26
|
+
const args = withBicepParameters([
|
|
27
|
+
"deployment",
|
|
28
|
+
"group",
|
|
29
|
+
"create",
|
|
30
|
+
"--resource-group",
|
|
31
|
+
target.resourceGroup,
|
|
32
|
+
"--name",
|
|
33
|
+
target.deploymentName,
|
|
34
|
+
"--template-file",
|
|
35
|
+
target.templateFile,
|
|
36
|
+
"--output",
|
|
37
|
+
"json",
|
|
38
|
+
], target.parametersFile);
|
|
39
|
+
return { executable: "az", args, ...(target.cwd === undefined ? {} : { cwd: target.cwd }) };
|
|
40
|
+
}
|
|
41
|
+
stackApply(target) {
|
|
42
|
+
const args = withBicepParameters([
|
|
43
|
+
"stack",
|
|
44
|
+
"group",
|
|
45
|
+
"create",
|
|
46
|
+
"--resource-group",
|
|
47
|
+
target.resourceGroup,
|
|
48
|
+
"--name",
|
|
49
|
+
target.stackName,
|
|
50
|
+
"--template-file",
|
|
51
|
+
target.templateFile,
|
|
52
|
+
"--action-on-unmanage",
|
|
53
|
+
target.actionOnUnmanage,
|
|
54
|
+
"--deny-settings-mode",
|
|
55
|
+
target.denySettingsMode,
|
|
56
|
+
"--yes",
|
|
57
|
+
"--output",
|
|
58
|
+
"json",
|
|
59
|
+
], target.parametersFile);
|
|
60
|
+
return { executable: "az", args, ...(target.cwd === undefined ? {} : { cwd: target.cwd }) };
|
|
61
|
+
}
|
|
62
|
+
stackDestroy(target) {
|
|
63
|
+
return {
|
|
64
|
+
executable: "az",
|
|
65
|
+
args: [
|
|
66
|
+
"stack",
|
|
67
|
+
"group",
|
|
68
|
+
"delete",
|
|
69
|
+
"--resource-group",
|
|
70
|
+
target.resourceGroup,
|
|
71
|
+
"--name",
|
|
72
|
+
target.stackName,
|
|
73
|
+
"--action-on-unmanage",
|
|
74
|
+
target.actionOnUnmanage,
|
|
75
|
+
"--yes",
|
|
76
|
+
"--output",
|
|
77
|
+
"json",
|
|
78
|
+
],
|
|
79
|
+
...(target.cwd === undefined ? {} : { cwd: target.cwd }),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
stackList(target) {
|
|
83
|
+
return {
|
|
84
|
+
executable: "az",
|
|
85
|
+
args: ["stack", "group", "list", "--resource-group", target.resourceGroup, "--output", "json"],
|
|
86
|
+
...(target.cwd === undefined ? {} : { cwd: target.cwd }),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export class TerraformCommandAdapter {
|
|
91
|
+
providerSchemas(cwd) {
|
|
92
|
+
return { executable: "terraform", args: ["providers", "schema", "-json"], cwd };
|
|
93
|
+
}
|
|
94
|
+
versionJson(cwd) {
|
|
95
|
+
return { executable: "terraform", args: ["version", "-json"], cwd };
|
|
96
|
+
}
|
|
97
|
+
init(cwd, backend) {
|
|
98
|
+
return {
|
|
99
|
+
executable: "terraform",
|
|
100
|
+
args: ["init", `-backend=${String(backend)}`, "-input=false"],
|
|
101
|
+
cwd,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
validate(cwd) {
|
|
105
|
+
return [
|
|
106
|
+
{ executable: "terraform", args: ["fmt", "-check"], cwd },
|
|
107
|
+
{ executable: "terraform", args: ["validate"], cwd },
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
preview(cwd, savedPlanPath, destroy = false) {
|
|
111
|
+
this.#requirePlanPath(savedPlanPath);
|
|
112
|
+
return {
|
|
113
|
+
executable: "terraform",
|
|
114
|
+
args: ["plan", ...(destroy ? ["-destroy"] : []), `-out=${savedPlanPath}`, "-input=false"],
|
|
115
|
+
cwd,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
applyExact(cwd, savedPlanPath) {
|
|
119
|
+
this.#requirePlanPath(savedPlanPath);
|
|
120
|
+
return { executable: "terraform", args: ["apply", "-input=false", savedPlanPath], cwd };
|
|
121
|
+
}
|
|
122
|
+
showJson(cwd, savedPlanPath) {
|
|
123
|
+
this.#requirePlanPath(savedPlanPath);
|
|
124
|
+
return { executable: "terraform", args: ["show", "-json", savedPlanPath], cwd };
|
|
125
|
+
}
|
|
126
|
+
statePull(cwd) {
|
|
127
|
+
return { executable: "terraform", args: ["state", "pull"], cwd };
|
|
128
|
+
}
|
|
129
|
+
#requirePlanPath(savedPlanPath) {
|
|
130
|
+
if (savedPlanPath.trim().length === 0 || savedPlanPath.startsWith("-")) {
|
|
131
|
+
throw new TypeError("A concrete saved Terraform plan path is required");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export class AzureCliReadAdapter {
|
|
136
|
+
resourceGraph(query, subscriptions = []) {
|
|
137
|
+
return {
|
|
138
|
+
executable: "az",
|
|
139
|
+
args: [
|
|
140
|
+
"graph",
|
|
141
|
+
"query",
|
|
142
|
+
"--graph-query",
|
|
143
|
+
query,
|
|
144
|
+
...(subscriptions.length === 0 ? [] : ["--subscriptions", ...subscriptions]),
|
|
145
|
+
"--output",
|
|
146
|
+
"json",
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
armGet(resourceId, apiVersion) {
|
|
151
|
+
return {
|
|
152
|
+
executable: "az",
|
|
153
|
+
args: ["rest", "--method", "get", "--url", `${resourceId}?api-version=${encodeURIComponent(apiVersion)}`],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=command-plans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-plans.js","sourceRoot":"","sources":["../src/command-plans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Capability, type CapabilityRegistry } from "./capability.js";
|
|
2
|
+
export declare const designCapabilityIds: {
|
|
3
|
+
readonly documentationResearch: "design.documentation.research";
|
|
4
|
+
readonly rbacCatalog: "design.rbac.catalog";
|
|
5
|
+
readonly computeRegionEvidence: "design.compute.region-evidence";
|
|
6
|
+
readonly entraApplicationIntent: "design.entra.application-intent";
|
|
7
|
+
};
|
|
8
|
+
export type DesignCapabilityId = (typeof designCapabilityIds)[keyof typeof designCapabilityIds];
|
|
9
|
+
export interface DocumentationResearchInput {
|
|
10
|
+
readonly question: string;
|
|
11
|
+
}
|
|
12
|
+
export interface RbacCatalogInput {
|
|
13
|
+
readonly operation: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ComputeRegionEvidenceInput {
|
|
16
|
+
readonly region: string;
|
|
17
|
+
}
|
|
18
|
+
export interface EntraApplicationIntentInput {
|
|
19
|
+
readonly applicationName: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const unavailableDesignCapabilities: readonly [Capability<DocumentationResearchInput, never>, Capability<RbacCatalogInput, never>, Capability<ComputeRegionEvidenceInput, never>, Capability<EntraApplicationIntentInput, never>];
|
|
22
|
+
export declare function registerUnavailableDesignCapabilities(registry: CapabilityRegistry): void;
|
|
23
|
+
//# sourceMappingURL=design-capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-capabilities.d.ts","sourceRoot":"","sources":["../src/design-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE5F,eAAO,MAAM,mBAAmB;aAC9B,qBAAqB,EAAE,+BAA+B;aACtD,WAAW,EAAE,qBAAqB;aAClC,qBAAqB,EAAE,gCAAgC;aACvD,sBAAsB,EAAE,iCAAiC;CACjD,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEhG,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAgBD,eAAO,MAAM,6BAA6B,8LAKhC,CAAC;AAEX,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAIxF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CapabilityError } from "./capability.js";
|
|
2
|
+
export const designCapabilityIds = {
|
|
3
|
+
documentationResearch: "design.documentation.research",
|
|
4
|
+
rbacCatalog: "design.rbac.catalog",
|
|
5
|
+
computeRegionEvidence: "design.compute.region-evidence",
|
|
6
|
+
entraApplicationIntent: "design.entra.application-intent",
|
|
7
|
+
};
|
|
8
|
+
function unavailableCapability(id) {
|
|
9
|
+
return {
|
|
10
|
+
id,
|
|
11
|
+
sideEffect: "none",
|
|
12
|
+
requiredRole: "architect",
|
|
13
|
+
timeoutMs: 1_000,
|
|
14
|
+
retries: 0,
|
|
15
|
+
idempotency: "supported",
|
|
16
|
+
async execute() {
|
|
17
|
+
throw new CapabilityError("CAPABILITY_UNAVAILABLE", `Capability '${id}' is unavailable until qualified`);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export const unavailableDesignCapabilities = [
|
|
22
|
+
unavailableCapability(designCapabilityIds.documentationResearch),
|
|
23
|
+
unavailableCapability(designCapabilityIds.rbacCatalog),
|
|
24
|
+
unavailableCapability(designCapabilityIds.computeRegionEvidence),
|
|
25
|
+
unavailableCapability(designCapabilityIds.entraApplicationIntent),
|
|
26
|
+
];
|
|
27
|
+
export function registerUnavailableDesignCapabilities(registry) {
|
|
28
|
+
for (const capability of unavailableDesignCapabilities) {
|
|
29
|
+
registry.register(capability);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=design-capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-capabilities.js","sourceRoot":"","sources":["../src/design-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA4C,MAAM,iBAAiB,CAAC;AAE5F,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,qBAAqB,EAAE,+BAA+B;IACtD,WAAW,EAAE,qBAAqB;IAClC,qBAAqB,EAAE,gCAAgC;IACvD,sBAAsB,EAAE,iCAAiC;CACjD,CAAC;AAoBX,SAAS,qBAAqB,CAAS,EAAsB;IAC3D,OAAO;QACL,EAAE;QACF,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE,WAAW;QACzB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,WAAW;QACxB,KAAK,CAAC,OAAO;YACX,MAAM,IAAI,eAAe,CAAC,wBAAwB,EAAE,eAAe,EAAE,kCAAkC,CAAC,CAAC;QAC3G,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,qBAAqB,CAA6B,mBAAmB,CAAC,qBAAqB,CAAC;IAC5F,qBAAqB,CAAmB,mBAAmB,CAAC,WAAW,CAAC;IACxE,qBAAqB,CAA6B,mBAAmB,CAAC,qBAAqB,CAAC;IAC5F,qBAAqB,CAA8B,mBAAmB,CAAC,sBAAsB,CAAC;CACtF,CAAC;AAEX,MAAM,UAAU,qCAAqC,CAAC,QAA4B;IAChF,KAAK,MAAM,UAAU,IAAI,6BAA6B,EAAE,CAAC;QACvD,QAAQ,CAAC,QAAQ,CAAC,UAAwC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type EnvelopeBindingValue = string | number;
|
|
2
|
+
export type EnvelopeBindings = Readonly<Record<string, EnvelopeBindingValue>>;
|
|
3
|
+
export interface EncryptedEnvelopeMetadata {
|
|
4
|
+
readonly implementation: "apex-encrypted-envelope";
|
|
5
|
+
readonly version: 1;
|
|
6
|
+
readonly algorithm: "aes-256-gcm";
|
|
7
|
+
readonly kind: string;
|
|
8
|
+
readonly digest: string;
|
|
9
|
+
readonly recipient: string;
|
|
10
|
+
readonly createdAt: string;
|
|
11
|
+
readonly expiresAt: string;
|
|
12
|
+
readonly bindings: EnvelopeBindings;
|
|
13
|
+
}
|
|
14
|
+
export interface EncryptedEnvelope {
|
|
15
|
+
readonly metadata: EncryptedEnvelopeMetadata;
|
|
16
|
+
readonly iv: string;
|
|
17
|
+
readonly authTag: string;
|
|
18
|
+
readonly ciphertext: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class EncryptedEnvelopeTransport {
|
|
21
|
+
private readonly now;
|
|
22
|
+
private readonly nonce;
|
|
23
|
+
constructor(now?: () => Date, nonce?: () => Uint8Array);
|
|
24
|
+
encrypt(plaintext: Uint8Array, key: Uint8Array, options: {
|
|
25
|
+
readonly kind: string;
|
|
26
|
+
readonly recipient: string;
|
|
27
|
+
readonly ttlMs: number;
|
|
28
|
+
readonly bindings: EnvelopeBindings;
|
|
29
|
+
}): EncryptedEnvelope;
|
|
30
|
+
decrypt(envelope: EncryptedEnvelope, key: Uint8Array, recipient: string): Buffer;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=encrypted-envelope-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypted-envelope-transport.d.ts","sourceRoot":"","sources":["../src/encrypted-envelope-transport.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,CAAC;AACnD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAE9E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAuFD,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFxB,YACmB,GAAG,GAAE,MAAM,IAAuB,EAClC,KAAK,GAAE,MAAM,UAAkC,EAC9D;IAEJ,OAAO,CACL,SAAS,EAAE,UAAU,EACrB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE;QACP,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KACrC,GACA,iBAAiB,CA4BnB;IAED,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAoB/E;CACF"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, createHash, randomBytes } from "node:crypto";
|
|
2
|
+
function requireKey(key) {
|
|
3
|
+
if (key.byteLength !== 32)
|
|
4
|
+
throw new TypeError("Encrypted envelope requires a 32-byte key");
|
|
5
|
+
return Buffer.from(key);
|
|
6
|
+
}
|
|
7
|
+
function sha256(bytes) {
|
|
8
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
9
|
+
}
|
|
10
|
+
function canonicalBindings(bindings) {
|
|
11
|
+
const canonical = {};
|
|
12
|
+
for (const key of Object.keys(bindings).sort()) {
|
|
13
|
+
if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(key)) {
|
|
14
|
+
throw new TypeError("Encrypted envelope binding names must be identifier-shaped");
|
|
15
|
+
}
|
|
16
|
+
const value = bindings[key];
|
|
17
|
+
if ((typeof value !== "string" && typeof value !== "number") ||
|
|
18
|
+
(typeof value === "number" && !Number.isFinite(value))) {
|
|
19
|
+
throw new TypeError(`Encrypted envelope binding ${key} must be a finite string or number`);
|
|
20
|
+
}
|
|
21
|
+
canonical[key] = value;
|
|
22
|
+
}
|
|
23
|
+
return canonical;
|
|
24
|
+
}
|
|
25
|
+
function authenticatedMetadata(metadata) {
|
|
26
|
+
return Buffer.from(JSON.stringify({
|
|
27
|
+
implementation: metadata.implementation,
|
|
28
|
+
version: metadata.version,
|
|
29
|
+
algorithm: metadata.algorithm,
|
|
30
|
+
kind: metadata.kind,
|
|
31
|
+
digest: metadata.digest,
|
|
32
|
+
recipient: metadata.recipient,
|
|
33
|
+
createdAt: metadata.createdAt,
|
|
34
|
+
expiresAt: metadata.expiresAt,
|
|
35
|
+
bindings: canonicalBindings(metadata.bindings),
|
|
36
|
+
}), "utf8");
|
|
37
|
+
}
|
|
38
|
+
function decodeBase64(value, label) {
|
|
39
|
+
if (value.length === 0 || !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value)) {
|
|
40
|
+
throw new Error(`Encrypted envelope ${label} is invalid base64`);
|
|
41
|
+
}
|
|
42
|
+
return Buffer.from(value, "base64");
|
|
43
|
+
}
|
|
44
|
+
function requireMetadata(metadata) {
|
|
45
|
+
const expectedKeys = [
|
|
46
|
+
"algorithm",
|
|
47
|
+
"bindings",
|
|
48
|
+
"createdAt",
|
|
49
|
+
"digest",
|
|
50
|
+
"expiresAt",
|
|
51
|
+
"implementation",
|
|
52
|
+
"kind",
|
|
53
|
+
"recipient",
|
|
54
|
+
"version",
|
|
55
|
+
];
|
|
56
|
+
if (Object.keys(metadata).sort().join("\0") !== expectedKeys.join("\0")) {
|
|
57
|
+
throw new Error("Encrypted envelope metadata shape is invalid");
|
|
58
|
+
}
|
|
59
|
+
if (metadata.implementation !== "apex-encrypted-envelope" ||
|
|
60
|
+
metadata.version !== 1 ||
|
|
61
|
+
metadata.algorithm !== "aes-256-gcm") {
|
|
62
|
+
throw new Error("Unsupported encrypted envelope");
|
|
63
|
+
}
|
|
64
|
+
if (metadata.kind.trim().length === 0 || metadata.recipient.trim().length === 0) {
|
|
65
|
+
throw new Error("Encrypted envelope kind and recipient are required");
|
|
66
|
+
}
|
|
67
|
+
if (!/^[0-9a-f]{64}$/.test(metadata.digest))
|
|
68
|
+
throw new Error("Encrypted envelope digest is invalid");
|
|
69
|
+
const createdAt = Date.parse(metadata.createdAt);
|
|
70
|
+
const expiresAt = Date.parse(metadata.expiresAt);
|
|
71
|
+
if (!Number.isFinite(createdAt) || !Number.isFinite(expiresAt) || expiresAt <= createdAt) {
|
|
72
|
+
throw new Error("Encrypted envelope timestamps are invalid");
|
|
73
|
+
}
|
|
74
|
+
canonicalBindings(metadata.bindings);
|
|
75
|
+
}
|
|
76
|
+
export class EncryptedEnvelopeTransport {
|
|
77
|
+
now;
|
|
78
|
+
nonce;
|
|
79
|
+
constructor(now = () => new Date(), nonce = () => randomBytes(12)) {
|
|
80
|
+
this.now = now;
|
|
81
|
+
this.nonce = nonce;
|
|
82
|
+
}
|
|
83
|
+
encrypt(plaintext, key, options) {
|
|
84
|
+
if (options.kind.trim().length === 0 || options.recipient.trim().length === 0 || options.ttlMs <= 0) {
|
|
85
|
+
throw new TypeError("Encrypted envelope kind, recipient, and positive TTL are required");
|
|
86
|
+
}
|
|
87
|
+
if (!Number.isFinite(options.ttlMs))
|
|
88
|
+
throw new TypeError("Encrypted envelope TTL must be finite");
|
|
89
|
+
const createdAt = this.now();
|
|
90
|
+
const metadata = {
|
|
91
|
+
implementation: "apex-encrypted-envelope",
|
|
92
|
+
version: 1,
|
|
93
|
+
algorithm: "aes-256-gcm",
|
|
94
|
+
kind: options.kind,
|
|
95
|
+
digest: sha256(plaintext),
|
|
96
|
+
recipient: options.recipient,
|
|
97
|
+
createdAt: createdAt.toISOString(),
|
|
98
|
+
expiresAt: new Date(createdAt.getTime() + options.ttlMs).toISOString(),
|
|
99
|
+
bindings: canonicalBindings(options.bindings),
|
|
100
|
+
};
|
|
101
|
+
const iv = Buffer.from(this.nonce());
|
|
102
|
+
if (iv.byteLength !== 12)
|
|
103
|
+
throw new TypeError("Encrypted envelope nonce must contain 12 bytes");
|
|
104
|
+
const cipher = createCipheriv("aes-256-gcm", requireKey(key), iv);
|
|
105
|
+
cipher.setAAD(authenticatedMetadata(metadata));
|
|
106
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
107
|
+
return {
|
|
108
|
+
metadata,
|
|
109
|
+
iv: iv.toString("base64"),
|
|
110
|
+
authTag: cipher.getAuthTag().toString("base64"),
|
|
111
|
+
ciphertext: ciphertext.toString("base64"),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
decrypt(envelope, key, recipient) {
|
|
115
|
+
requireMetadata(envelope.metadata);
|
|
116
|
+
if (recipient.trim().length === 0 || envelope.metadata.recipient !== recipient) {
|
|
117
|
+
throw new Error("Encrypted envelope recipient does not match");
|
|
118
|
+
}
|
|
119
|
+
if (Date.parse(envelope.metadata.expiresAt) <= this.now().getTime()) {
|
|
120
|
+
throw new Error("Encrypted envelope has expired");
|
|
121
|
+
}
|
|
122
|
+
const iv = decodeBase64(envelope.iv, "IV");
|
|
123
|
+
const authTag = decodeBase64(envelope.authTag, "authentication tag");
|
|
124
|
+
if (iv.byteLength !== 12 || authTag.byteLength !== 16)
|
|
125
|
+
throw new Error("Encrypted envelope parameters are invalid");
|
|
126
|
+
const decipher = createDecipheriv("aes-256-gcm", requireKey(key), iv);
|
|
127
|
+
decipher.setAAD(authenticatedMetadata(envelope.metadata));
|
|
128
|
+
decipher.setAuthTag(authTag);
|
|
129
|
+
const plaintext = Buffer.concat([
|
|
130
|
+
decipher.update(decodeBase64(envelope.ciphertext, "ciphertext")),
|
|
131
|
+
decipher.final(),
|
|
132
|
+
]);
|
|
133
|
+
if (sha256(plaintext) !== envelope.metadata.digest)
|
|
134
|
+
throw new Error("Encrypted envelope digest mismatch");
|
|
135
|
+
return plaintext;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=encrypted-envelope-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypted-envelope-transport.js","sourceRoot":"","sources":["../src/encrypted-envelope-transport.ts"],"names":[],"mappings":"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"}
|