@centient/secrets 0.10.0 → 0.11.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 +355 -7
- package/dist/audit/hmac-chain.d.ts +117 -0
- package/dist/audit/hmac-chain.d.ts.map +1 -0
- package/dist/audit/hmac-chain.js +811 -0
- package/dist/audit/hmac-chain.js.map +1 -0
- package/dist/audit/ocsf.d.ts +108 -0
- package/dist/audit/ocsf.d.ts.map +1 -0
- package/dist/audit/ocsf.js +204 -0
- package/dist/audit/ocsf.js.map +1 -0
- package/dist/cli/hidden-prompt.d.ts.map +1 -1
- package/dist/cli/hidden-prompt.js +55 -10
- package/dist/cli/hidden-prompt.js.map +1 -1
- package/dist/cli/messages.d.ts +40 -8
- package/dist/cli/messages.d.ts.map +1 -1
- package/dist/cli/messages.js +34 -8
- package/dist/cli/messages.js.map +1 -1
- package/dist/client.d.ts +26 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +129 -0
- package/dist/client.js.map +1 -0
- package/dist/compatibility.d.ts +199 -0
- package/dist/compatibility.d.ts.map +1 -0
- package/dist/compatibility.js +419 -0
- package/dist/compatibility.js.map +1 -0
- package/dist/index.d.ts +19 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/policies/audit-trail.d.ts +25 -0
- package/dist/policies/audit-trail.d.ts.map +1 -0
- package/dist/policies/audit-trail.js +31 -0
- package/dist/policies/audit-trail.js.map +1 -0
- package/dist/sinks/index.d.ts +9 -0
- package/dist/sinks/index.d.ts.map +1 -0
- package/dist/sinks/index.js +5 -0
- package/dist/sinks/index.js.map +1 -0
- package/dist/sinks/jsonl.d.ts +16 -0
- package/dist/sinks/jsonl.d.ts.map +1 -0
- package/dist/sinks/jsonl.js +51 -0
- package/dist/sinks/jsonl.js.map +1 -0
- package/dist/sinks/otel.d.ts +22 -0
- package/dist/sinks/otel.d.ts.map +1 -0
- package/dist/sinks/otel.js +155 -0
- package/dist/sinks/otel.js.map +1 -0
- package/dist/sinks/queue.d.ts +12 -0
- package/dist/sinks/queue.d.ts.map +1 -0
- package/dist/sinks/queue.js +89 -0
- package/dist/sinks/queue.js.map +1 -0
- package/dist/sinks/syslog.d.ts +17 -0
- package/dist/sinks/syslog.d.ts.map +1 -0
- package/dist/sinks/syslog.js +103 -0
- package/dist/sinks/syslog.js.map +1 -0
- package/dist/sinks/types.d.ts +27 -0
- package/dist/sinks/types.d.ts.map +1 -0
- package/dist/sinks/types.js +18 -0
- package/dist/sinks/types.js.map +1 -0
- package/dist/vault/policy.d.ts +64 -34
- package/dist/vault/policy.d.ts.map +1 -1
- package/dist/vault/policy.js +109 -67
- package/dist/vault/policy.js.map +1 -1
- package/dist/vault/session-vault.d.ts +43 -0
- package/dist/vault/session-vault.d.ts.map +1 -1
- package/dist/vault/session-vault.js +323 -36
- package/dist/vault/session-vault.js.map +1 -1
- package/dist/vault/sidecar.d.ts +9 -0
- package/dist/vault/sidecar.d.ts.map +1 -1
- package/dist/vault/sidecar.js +72 -3
- package/dist/vault/sidecar.js.map +1 -1
- package/dist/vault/types.d.ts +16 -9
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/vault-env.d.ts +41 -62
- package/dist/vault/vault-env.d.ts.map +1 -1
- package/dist/vault/vault-env.js +139 -75
- package/dist/vault/vault-env.js.map +1 -1
- package/dist/vault/vault-gpg.d.ts +1 -0
- package/dist/vault/vault-gpg.d.ts.map +1 -1
- package/dist/vault/vault-gpg.js +1 -0
- package/dist/vault/vault-gpg.js.map +1 -1
- package/dist/vault/vault-libsecret.d.ts +1 -0
- package/dist/vault/vault-libsecret.d.ts.map +1 -1
- package/dist/vault/vault-libsecret.js +7 -6
- package/dist/vault/vault-libsecret.js.map +1 -1
- package/dist/vault/vault-onepassword.d.ts +1 -0
- package/dist/vault/vault-onepassword.d.ts.map +1 -1
- package/dist/vault/vault-onepassword.js +1 -0
- package/dist/vault/vault-onepassword.js.map +1 -1
- package/dist/vault/vault-utils.d.ts +7 -6
- package/dist/vault/vault-utils.d.ts.map +1 -1
- package/dist/vault/vault-utils.js +8 -7
- package/dist/vault/vault-utils.js.map +1 -1
- package/dist/vault/vault-windows.d.ts +2 -1
- package/dist/vault/vault-windows.d.ts.map +1 -1
- package/dist/vault/vault-windows.js +12 -8
- package/dist/vault/vault-windows.js.map +1 -1
- package/dist/vault/vault.d.ts +6 -7
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +37 -193
- package/dist/vault/vault.js.map +1 -1
- package/package.json +8 -2
package/dist/vault/policy.d.ts
CHANGED
|
@@ -1,42 +1,50 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SecretsPolicy — Middleware layer for credential operations.
|
|
3
3
|
*
|
|
4
|
-
* Policies are cross-cutting concerns (audit, rate limiting, access
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* stack
|
|
4
|
+
* Policies are cross-cutting concerns (audit, rate limiting, access control,
|
|
5
|
+
* attestation) applied to every credential operation. Explicit clients own an
|
|
6
|
+
* isolated stack supplied to `createSecretsClient`; `setSecretsPolicies`
|
|
7
|
+
* remains as the deprecated configuration path for the module-level shims and
|
|
8
|
+
* SessionVault. The API shape is designed for the full stack in ADR-002.
|
|
9
9
|
*
|
|
10
10
|
* Execution model:
|
|
11
11
|
* 1. `before` hooks run top-to-bottom. If one throws, the operation
|
|
12
12
|
* is aborted and the error propagates to the caller — but the
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* rejecting policy and already-entered policies still fire their
|
|
14
|
+
* `after` hooks with a `*_rejected` event, so
|
|
15
15
|
* a policy-denied operation is audited rather than vanishing
|
|
16
|
-
* (
|
|
17
|
-
* not fire — its `before` hook did not complete.
|
|
16
|
+
* (issue #98). Policies not yet reached do not fire.
|
|
18
17
|
* 2. The backend operation executes.
|
|
19
18
|
* 3. `after` hooks run bottom-to-top with a structured event
|
|
20
19
|
* describing the outcome. Exceptions in `after` hooks are
|
|
21
20
|
* swallowed with a one-time stderr warning — audit infrastructure
|
|
22
21
|
* failures must never break credential operations.
|
|
23
22
|
*/
|
|
24
|
-
import type { VaultType } from "./types.js";
|
|
25
23
|
export type SecretsEventType = "credential_read" | "credential_read_missing" | "credential_read_failed" | "credential_read_rejected" | "credential_written" | "credential_write_failed" | "credential_write_rejected" | "credential_deleted" | "credential_delete_failed" | "credential_delete_rejected" | "credential_enumerated" | "credential_enumerate_failed" | "credential_enumerate_rejected";
|
|
26
24
|
export interface SecretsEvent {
|
|
27
|
-
type: SecretsEventType;
|
|
28
|
-
timestamp: string;
|
|
29
|
-
backend:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
readonly type: SecretsEventType;
|
|
26
|
+
readonly timestamp: string;
|
|
27
|
+
readonly backend: string;
|
|
28
|
+
/** Full value-free operation descriptor supplied to policy hooks. */
|
|
29
|
+
readonly operation: SecretsOperation;
|
|
30
|
+
readonly key?: string;
|
|
31
|
+
readonly keyCount?: number;
|
|
32
|
+
readonly prefix?: string;
|
|
33
|
+
readonly error?: string;
|
|
34
|
+
readonly durationMs: number;
|
|
35
|
+
}
|
|
36
|
+
export interface SecretsCaller {
|
|
37
|
+
readonly id: string;
|
|
38
|
+
readonly kind?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface SecretsOperationContext {
|
|
41
|
+
readonly caller?: SecretsCaller;
|
|
35
42
|
}
|
|
36
43
|
export interface SecretsOperation {
|
|
37
|
-
type: "read" | "write" | "delete" | "enumerate";
|
|
38
|
-
key?: string;
|
|
39
|
-
prefix?: string;
|
|
44
|
+
readonly type: "read" | "write" | "delete" | "enumerate";
|
|
45
|
+
readonly key?: string;
|
|
46
|
+
readonly prefix?: string;
|
|
47
|
+
readonly caller?: SecretsCaller;
|
|
40
48
|
}
|
|
41
49
|
/**
|
|
42
50
|
* The audit event type emitted when a `before` hook rejects an
|
|
@@ -46,6 +54,12 @@ export interface SecretsOperation {
|
|
|
46
54
|
export declare function rejectedEventType(op: SecretsOperation): SecretsEventType;
|
|
47
55
|
export interface SecretsPolicy {
|
|
48
56
|
readonly name: string;
|
|
57
|
+
/**
|
|
58
|
+
* Set by policies whose contract includes observing every policy denial.
|
|
59
|
+
* Such a policy must appear before every `before` hook, because a preceding
|
|
60
|
+
* hook can reject before the observer is entered.
|
|
61
|
+
*/
|
|
62
|
+
readonly observesPolicyRejections?: true;
|
|
49
63
|
/** `before` hooks may be async; they are awaited before the operation runs. */
|
|
50
64
|
before?(op: SecretsOperation): void | Promise<void>;
|
|
51
65
|
/**
|
|
@@ -59,23 +73,39 @@ export interface SecretsPolicy {
|
|
|
59
73
|
*/
|
|
60
74
|
after?(event: SecretsEvent): void;
|
|
61
75
|
}
|
|
76
|
+
export type PolicyStackFrame = readonly SecretsPolicy[];
|
|
77
|
+
export interface PolicyRunner {
|
|
78
|
+
runBefore(op: SecretsOperation, makeRejectionEvent: (error: string) => SecretsEvent): Promise<PolicyStackFrame>;
|
|
79
|
+
runAfter(event: SecretsEvent, frame?: PolicyStackFrame): void;
|
|
80
|
+
getPolicies(): readonly SecretsPolicy[];
|
|
81
|
+
replacePolicies(policies: readonly SecretsPolicy[]): void;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Build an isolated policy runner. Its input is snapshotted immediately, and
|
|
85
|
+
* every operation captures the current immutable frame so replacement cannot
|
|
86
|
+
* splice two different stacks across an await boundary.
|
|
87
|
+
*/
|
|
88
|
+
export declare function createPolicyRunner(initialPolicies?: readonly SecretsPolicy[]): PolicyRunner;
|
|
89
|
+
/** Global runner retained only for legacy module APIs and SessionVault. */
|
|
90
|
+
export declare const defaultPolicyRunner: PolicyRunner;
|
|
91
|
+
/**
|
|
92
|
+
* @deprecated Configure policies on an isolated client created with
|
|
93
|
+
* `createSecretsClient`. This setter remains for module-level shims and
|
|
94
|
+
* SessionVault compatibility through the 1.x deprecation window.
|
|
95
|
+
*/
|
|
62
96
|
export declare function setSecretsPolicies(policies: SecretsPolicy[]): void;
|
|
97
|
+
/** @deprecated Inspect the policy list owned by the legacy default client. */
|
|
63
98
|
export declare function getActivePolicies(): readonly SecretsPolicy[];
|
|
64
99
|
/**
|
|
65
100
|
* Run `before` hooks top-to-bottom. If a hook throws, the operation is
|
|
66
|
-
* rejected: the
|
|
67
|
-
* `0..i
|
|
101
|
+
* rejected: the rejecting policy and already-entered policies (indices
|
|
102
|
+
* `0..i`, bottom-to-top) fire `after` with the event built by
|
|
68
103
|
* `makeRejectionEvent` so the denied operation is still audited, then the
|
|
69
|
-
* original error is re-thrown to abort the operation.
|
|
70
|
-
*
|
|
71
|
-
* did not complete, so the policy was not fully entered. See ADR-002
|
|
72
|
-
* §1.0.0.
|
|
104
|
+
* original error is re-thrown to abort the operation. This follows issue
|
|
105
|
+
* #98's acceptance contract; policies after the rejector are never entered.
|
|
73
106
|
*/
|
|
74
|
-
export declare function runBeforeHooks(op: SecretsOperation, makeRejectionEvent: (error: string) => SecretsEvent): Promise<
|
|
75
|
-
export declare function runAfterHooks(event: SecretsEvent): void;
|
|
76
|
-
export
|
|
77
|
-
|
|
78
|
-
includeReads?: boolean;
|
|
79
|
-
}
|
|
80
|
-
export declare function auditTrail(opts: AuditTrailOptions): SecretsPolicy;
|
|
107
|
+
export declare function runBeforeHooks(op: SecretsOperation, makeRejectionEvent: (error: string) => SecretsEvent): Promise<PolicyStackFrame>;
|
|
108
|
+
export declare function runAfterHooks(event: SecretsEvent, frame?: PolicyStackFrame): void;
|
|
109
|
+
export { auditTrail } from "../policies/audit-trail.js";
|
|
110
|
+
export type { AuditEventChain, AuditTrailOptions, } from "../policies/audit-trail.js";
|
|
81
111
|
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/vault/policy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/vault/policy.ts"],"names":[],"mappings":"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"}
|
package/dist/vault/policy.js
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SecretsPolicy — Middleware layer for credential operations.
|
|
3
3
|
*
|
|
4
|
-
* Policies are cross-cutting concerns (audit, rate limiting, access
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* stack
|
|
4
|
+
* Policies are cross-cutting concerns (audit, rate limiting, access control,
|
|
5
|
+
* attestation) applied to every credential operation. Explicit clients own an
|
|
6
|
+
* isolated stack supplied to `createSecretsClient`; `setSecretsPolicies`
|
|
7
|
+
* remains as the deprecated configuration path for the module-level shims and
|
|
8
|
+
* SessionVault. The API shape is designed for the full stack in ADR-002.
|
|
9
9
|
*
|
|
10
10
|
* Execution model:
|
|
11
11
|
* 1. `before` hooks run top-to-bottom. If one throws, the operation
|
|
12
12
|
* is aborted and the error propagates to the caller — but the
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* rejecting policy and already-entered policies still fire their
|
|
14
|
+
* `after` hooks with a `*_rejected` event, so
|
|
15
15
|
* a policy-denied operation is audited rather than vanishing
|
|
16
|
-
* (
|
|
17
|
-
* not fire — its `before` hook did not complete.
|
|
16
|
+
* (issue #98). Policies not yet reached do not fire.
|
|
18
17
|
* 2. The backend operation executes.
|
|
19
18
|
* 3. `after` hooks run bottom-to-top with a structured event
|
|
20
19
|
* describing the outcome. Exceptions in `after` hooks are
|
|
@@ -44,59 +43,57 @@ export function rejectedEventType(op) {
|
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
46
|
+
function snapshotPolicies(configured) {
|
|
47
|
+
const snapshot = configured.map((policy) => {
|
|
48
|
+
// Capture the complete callable shape, not just the containing array.
|
|
49
|
+
// Otherwise a caller could add or replace a before hook after ordering
|
|
50
|
+
// validation and make a rejection observer silently miss denials.
|
|
51
|
+
const name = policy.name;
|
|
52
|
+
const observesPolicyRejections = policy.observesPolicyRejections;
|
|
53
|
+
const configuredBefore = policy.before;
|
|
54
|
+
const configuredAfter = policy.after;
|
|
55
|
+
// ADR-002 permits a policy object to retain mutable internal state. Bind
|
|
56
|
+
// the captured hooks to that original receiver while freezing only the
|
|
57
|
+
// validated public wrapper and its hook identities.
|
|
58
|
+
const before = configuredBefore?.bind(policy);
|
|
59
|
+
const after = configuredAfter?.bind(policy);
|
|
60
|
+
return Object.freeze({
|
|
61
|
+
name,
|
|
62
|
+
...(observesPolicyRejections === true
|
|
63
|
+
? { observesPolicyRejections: true }
|
|
64
|
+
: {}),
|
|
65
|
+
...(before !== undefined ? { before } : {}),
|
|
66
|
+
...(after !== undefined ? { after } : {}),
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
let precedingBeforePolicy;
|
|
70
|
+
for (const policy of snapshot) {
|
|
71
|
+
if (policy.observesPolicyRejections === true &&
|
|
72
|
+
precedingBeforePolicy !== undefined) {
|
|
73
|
+
throw new TypeError(`policy "${policy.name}" observes policy rejections and must precede ` +
|
|
74
|
+
`policy "${precedingBeforePolicy.name}" (and every other policy with a before hook)`);
|
|
76
75
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
runAfterHooksForRange(makeRejectionEvent(msg), i - 1);
|
|
80
|
-
throw err;
|
|
76
|
+
if (policy.before !== undefined && precedingBeforePolicy === undefined) {
|
|
77
|
+
precedingBeforePolicy = policy;
|
|
81
78
|
}
|
|
82
79
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
// The registry's public inspection API returns this same value. Freeze the
|
|
81
|
+
// array so a cast to a mutable type cannot bypass replacement validation.
|
|
82
|
+
return Object.freeze(snapshot);
|
|
86
83
|
}
|
|
87
84
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* warning — audit-infrastructure failures must never break credential
|
|
92
|
-
* operations. `after` hooks are synchronous by contract (see
|
|
93
|
-
* `SecretsPolicy.after`); a hook that returns a rejected `Promise` is
|
|
94
|
-
* not awaited here, so it would surface as an unhandled rejection.
|
|
85
|
+
* Build an isolated policy runner. Its input is snapshotted immediately, and
|
|
86
|
+
* every operation captures the current immutable frame so replacement cannot
|
|
87
|
+
* splice two different stacks across an await boundary.
|
|
95
88
|
*/
|
|
96
|
-
function
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
89
|
+
export function createPolicyRunner(initialPolicies = []) {
|
|
90
|
+
let policies = snapshotPolicies(initialPolicies);
|
|
91
|
+
let afterWarningEmitted = false;
|
|
92
|
+
const runAfterForFrame = (event, frame) => {
|
|
93
|
+
for (let i = frame.length - 1; i >= 0; i--) {
|
|
94
|
+
const policy = frame[i];
|
|
95
|
+
if (!policy.after)
|
|
96
|
+
continue;
|
|
100
97
|
try {
|
|
101
98
|
policy.after(event);
|
|
102
99
|
}
|
|
@@ -108,20 +105,65 @@ function runAfterHooksForRange(event, fromIndex) {
|
|
|
108
105
|
}
|
|
109
106
|
}
|
|
110
107
|
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
export function auditTrail(opts) {
|
|
114
|
-
const includeReads = opts.includeReads ?? true;
|
|
108
|
+
};
|
|
115
109
|
return {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
110
|
+
async runBefore(op, makeRejectionEvent) {
|
|
111
|
+
const frame = policies;
|
|
112
|
+
for (let i = 0; i < frame.length; i++) {
|
|
113
|
+
const policy = frame[i];
|
|
114
|
+
try {
|
|
115
|
+
await policy.before?.(op);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
119
|
+
// Issue #98 is authoritative: the rejecting policy is part of the
|
|
120
|
+
// unwind, followed by already-entered outer policies.
|
|
121
|
+
runAfterForFrame(makeRejectionEvent(msg), frame.slice(0, i + 1));
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
122
124
|
}
|
|
123
|
-
|
|
125
|
+
return frame;
|
|
126
|
+
},
|
|
127
|
+
runAfter(event, frame = policies) {
|
|
128
|
+
runAfterForFrame(event, frame);
|
|
129
|
+
},
|
|
130
|
+
getPolicies() {
|
|
131
|
+
return policies;
|
|
132
|
+
},
|
|
133
|
+
replacePolicies(nextPolicies) {
|
|
134
|
+
policies = snapshotPolicies(nextPolicies);
|
|
135
|
+
afterWarningEmitted = false;
|
|
124
136
|
},
|
|
125
137
|
};
|
|
126
138
|
}
|
|
139
|
+
/** Global runner retained only for legacy module APIs and SessionVault. */
|
|
140
|
+
export const defaultPolicyRunner = createPolicyRunner();
|
|
141
|
+
/**
|
|
142
|
+
* @deprecated Configure policies on an isolated client created with
|
|
143
|
+
* `createSecretsClient`. This setter remains for module-level shims and
|
|
144
|
+
* SessionVault compatibility through the 1.x deprecation window.
|
|
145
|
+
*/
|
|
146
|
+
export function setSecretsPolicies(policies) {
|
|
147
|
+
defaultPolicyRunner.replacePolicies(policies);
|
|
148
|
+
}
|
|
149
|
+
/** @deprecated Inspect the policy list owned by the legacy default client. */
|
|
150
|
+
export function getActivePolicies() {
|
|
151
|
+
return defaultPolicyRunner.getPolicies();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Run `before` hooks top-to-bottom. If a hook throws, the operation is
|
|
155
|
+
* rejected: the rejecting policy and already-entered policies (indices
|
|
156
|
+
* `0..i`, bottom-to-top) fire `after` with the event built by
|
|
157
|
+
* `makeRejectionEvent` so the denied operation is still audited, then the
|
|
158
|
+
* original error is re-thrown to abort the operation. This follows issue
|
|
159
|
+
* #98's acceptance contract; policies after the rejector are never entered.
|
|
160
|
+
*/
|
|
161
|
+
export async function runBeforeHooks(op, makeRejectionEvent) {
|
|
162
|
+
return defaultPolicyRunner.runBefore(op, makeRejectionEvent);
|
|
163
|
+
}
|
|
164
|
+
export function runAfterHooks(event, frame) {
|
|
165
|
+
defaultPolicyRunner.runAfter(event, frame);
|
|
166
|
+
}
|
|
167
|
+
// Compatibility re-export: the built-in now lives with the other policies.
|
|
168
|
+
export { auditTrail } from "../policies/audit-trail.js";
|
|
127
169
|
//# sourceMappingURL=policy.js.map
|
package/dist/vault/policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/vault/policy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/vault/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -123,6 +123,29 @@ export interface OpenVaultOptions {
|
|
|
123
123
|
*/
|
|
124
124
|
keychain?: KeychainProviderOptions;
|
|
125
125
|
}
|
|
126
|
+
/** Options for {@link createVault}. */
|
|
127
|
+
export interface CreateVaultOptions {
|
|
128
|
+
/** Alternate vault file path. Defaults to the same path the CLI uses. */
|
|
129
|
+
path?: string;
|
|
130
|
+
/** Alternate sidecar path. Defaults to vault directory + `vault.seen-version`. */
|
|
131
|
+
sidecarPath?: string;
|
|
132
|
+
/**
|
|
133
|
+
* Caller-owned AES-256 key used to encrypt the empty vault.
|
|
134
|
+
*
|
|
135
|
+
* This function neither stores nor zeroes the key. Key-provider setup is a
|
|
136
|
+
* separate, potentially irreversible transaction; keeping it outside this
|
|
137
|
+
* filesystem primitive prevents a failed create from deleting or replacing
|
|
138
|
+
* a key that another vault may share.
|
|
139
|
+
*/
|
|
140
|
+
key: Buffer;
|
|
141
|
+
}
|
|
142
|
+
/** Result of an idempotent {@link createVault} call. */
|
|
143
|
+
export interface CreateVaultResult {
|
|
144
|
+
/** True when this call created the vault/sidecar pair; false when both existed. */
|
|
145
|
+
created: boolean;
|
|
146
|
+
/** Canonical absolute vault path used for AAD binding. */
|
|
147
|
+
path: string;
|
|
148
|
+
}
|
|
126
149
|
/**
|
|
127
150
|
* A long-lived handle to an unlocked vault. Construct with {@link openVault};
|
|
128
151
|
* close with {@link SessionVault.close}. Operations are async so policy
|
|
@@ -148,6 +171,26 @@ export interface SessionVault {
|
|
|
148
171
|
/** Diagnostic — the current in-memory vault version. */
|
|
149
172
|
readonly vaultVersion: number;
|
|
150
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Create an empty, AAD-bound session vault and its rollback sidecar.
|
|
176
|
+
*
|
|
177
|
+
* Creation is idempotent only for a complete pair: if both files already
|
|
178
|
+
* exist they are left byte-for-byte untouched and `created` is false. A
|
|
179
|
+
* vault-only or sidecar-only state is refused rather than "repaired" because
|
|
180
|
+
* replacing either half could erase rollback evidence or make existing
|
|
181
|
+
* ciphertext permanently unreadable.
|
|
182
|
+
*
|
|
183
|
+
* Both destinations use no-clobber publication: the completed vault temp is
|
|
184
|
+
* linked into place first, then the sidecar is the logical commit point. A
|
|
185
|
+
* successful return therefore means both public paths exist, and a competing
|
|
186
|
+
* destination is never replaced. This is temp-file/link crash safety, not an
|
|
187
|
+
* fsync or power-loss durability guarantee.
|
|
188
|
+
*
|
|
189
|
+
* The caller retains ownership of `opts.key`; this function snapshots it for
|
|
190
|
+
* the duration of the call, zeroes that private copy, and never mutates,
|
|
191
|
+
* zeroes, or stores the caller's buffer.
|
|
192
|
+
*/
|
|
193
|
+
export declare function createVault(opts: CreateVaultOptions): Promise<CreateVaultResult>;
|
|
151
194
|
/**
|
|
152
195
|
* Open an encrypted session vault.
|
|
153
196
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-vault.d.ts","sourceRoot":"","sources":["../../src/vault/session-vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;
|
|
1
|
+
{"version":3,"file":"session-vault.d.ts","sourceRoot":"","sources":["../../src/vault/session-vault.ts"],"names":[],"mappings":"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"}
|