@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.
Files changed (99) hide show
  1. package/README.md +355 -7
  2. package/dist/audit/hmac-chain.d.ts +117 -0
  3. package/dist/audit/hmac-chain.d.ts.map +1 -0
  4. package/dist/audit/hmac-chain.js +811 -0
  5. package/dist/audit/hmac-chain.js.map +1 -0
  6. package/dist/audit/ocsf.d.ts +108 -0
  7. package/dist/audit/ocsf.d.ts.map +1 -0
  8. package/dist/audit/ocsf.js +204 -0
  9. package/dist/audit/ocsf.js.map +1 -0
  10. package/dist/cli/hidden-prompt.d.ts.map +1 -1
  11. package/dist/cli/hidden-prompt.js +55 -10
  12. package/dist/cli/hidden-prompt.js.map +1 -1
  13. package/dist/cli/messages.d.ts +40 -8
  14. package/dist/cli/messages.d.ts.map +1 -1
  15. package/dist/cli/messages.js +34 -8
  16. package/dist/cli/messages.js.map +1 -1
  17. package/dist/client.d.ts +26 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +129 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/compatibility.d.ts +199 -0
  22. package/dist/compatibility.d.ts.map +1 -0
  23. package/dist/compatibility.js +419 -0
  24. package/dist/compatibility.js.map +1 -0
  25. package/dist/index.d.ts +19 -5
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +16 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/policies/audit-trail.d.ts +25 -0
  30. package/dist/policies/audit-trail.d.ts.map +1 -0
  31. package/dist/policies/audit-trail.js +31 -0
  32. package/dist/policies/audit-trail.js.map +1 -0
  33. package/dist/sinks/index.d.ts +9 -0
  34. package/dist/sinks/index.d.ts.map +1 -0
  35. package/dist/sinks/index.js +5 -0
  36. package/dist/sinks/index.js.map +1 -0
  37. package/dist/sinks/jsonl.d.ts +16 -0
  38. package/dist/sinks/jsonl.d.ts.map +1 -0
  39. package/dist/sinks/jsonl.js +51 -0
  40. package/dist/sinks/jsonl.js.map +1 -0
  41. package/dist/sinks/otel.d.ts +22 -0
  42. package/dist/sinks/otel.d.ts.map +1 -0
  43. package/dist/sinks/otel.js +155 -0
  44. package/dist/sinks/otel.js.map +1 -0
  45. package/dist/sinks/queue.d.ts +12 -0
  46. package/dist/sinks/queue.d.ts.map +1 -0
  47. package/dist/sinks/queue.js +89 -0
  48. package/dist/sinks/queue.js.map +1 -0
  49. package/dist/sinks/syslog.d.ts +17 -0
  50. package/dist/sinks/syslog.d.ts.map +1 -0
  51. package/dist/sinks/syslog.js +103 -0
  52. package/dist/sinks/syslog.js.map +1 -0
  53. package/dist/sinks/types.d.ts +27 -0
  54. package/dist/sinks/types.d.ts.map +1 -0
  55. package/dist/sinks/types.js +18 -0
  56. package/dist/sinks/types.js.map +1 -0
  57. package/dist/vault/policy.d.ts +64 -34
  58. package/dist/vault/policy.d.ts.map +1 -1
  59. package/dist/vault/policy.js +109 -67
  60. package/dist/vault/policy.js.map +1 -1
  61. package/dist/vault/session-vault.d.ts +43 -0
  62. package/dist/vault/session-vault.d.ts.map +1 -1
  63. package/dist/vault/session-vault.js +323 -36
  64. package/dist/vault/session-vault.js.map +1 -1
  65. package/dist/vault/sidecar.d.ts +9 -0
  66. package/dist/vault/sidecar.d.ts.map +1 -1
  67. package/dist/vault/sidecar.js +72 -3
  68. package/dist/vault/sidecar.js.map +1 -1
  69. package/dist/vault/types.d.ts +16 -9
  70. package/dist/vault/types.d.ts.map +1 -1
  71. package/dist/vault/vault-env.d.ts +41 -62
  72. package/dist/vault/vault-env.d.ts.map +1 -1
  73. package/dist/vault/vault-env.js +139 -75
  74. package/dist/vault/vault-env.js.map +1 -1
  75. package/dist/vault/vault-gpg.d.ts +1 -0
  76. package/dist/vault/vault-gpg.d.ts.map +1 -1
  77. package/dist/vault/vault-gpg.js +1 -0
  78. package/dist/vault/vault-gpg.js.map +1 -1
  79. package/dist/vault/vault-libsecret.d.ts +1 -0
  80. package/dist/vault/vault-libsecret.d.ts.map +1 -1
  81. package/dist/vault/vault-libsecret.js +7 -6
  82. package/dist/vault/vault-libsecret.js.map +1 -1
  83. package/dist/vault/vault-onepassword.d.ts +1 -0
  84. package/dist/vault/vault-onepassword.d.ts.map +1 -1
  85. package/dist/vault/vault-onepassword.js +1 -0
  86. package/dist/vault/vault-onepassword.js.map +1 -1
  87. package/dist/vault/vault-utils.d.ts +7 -6
  88. package/dist/vault/vault-utils.d.ts.map +1 -1
  89. package/dist/vault/vault-utils.js +8 -7
  90. package/dist/vault/vault-utils.js.map +1 -1
  91. package/dist/vault/vault-windows.d.ts +2 -1
  92. package/dist/vault/vault-windows.d.ts.map +1 -1
  93. package/dist/vault/vault-windows.js +12 -8
  94. package/dist/vault/vault-windows.js.map +1 -1
  95. package/dist/vault/vault.d.ts +6 -7
  96. package/dist/vault/vault.d.ts.map +1 -1
  97. package/dist/vault/vault.js +37 -193
  98. package/dist/vault/vault.js.map +1 -1
  99. package/package.json +8 -2
@@ -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
- * control, attestation) applied to every credential operation via
6
- * `setSecretsPolicies([...])`. In 0.5.0 only the audit policy is
7
- * shipped; the API shape is designed to grow into the full policy
8
- * stack described in ADR-002.
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
- * `after` hooks of already-entered policies (those whose `before`
14
- * hook already completed) still fire with a `*_rejected` event, so
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
- * (ADR-002 §1.0.0). The rejecting policy's own `after` hook does
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: VaultType;
30
- key?: string;
31
- keyCount?: number;
32
- prefix?: string;
33
- error?: string;
34
- durationMs: number;
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 `after` hooks of the already-entered policies (indices
67
- * `0..i-1`, bottom-to-top) fire with the event built by
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. The rejecting
70
- * policy's own `after` hook is intentionally skipped its `before` hook
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<void>;
75
- export declare function runAfterHooks(event: SecretsEvent): void;
76
- export interface AuditTrailOptions {
77
- sink: (event: SecretsEvent) => void;
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;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,yBAAyB,GACzB,wBAAwB,GACxB,0BAA0B,GAC1B,oBAAoB,GACpB,yBAAyB,GACzB,2BAA2B,GAC3B,oBAAoB,GACpB,0BAA0B,GAC1B,4BAA4B,GAC5B,uBAAuB,GACvB,6BAA6B,GAC7B,+BAA+B,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,gBAAgB,GAAG,gBAAgB,CAiBxE;AAMD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,MAAM,CAAC,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD;;;;;;;;OAQG;IACH,KAAK,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CACnC;AASD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAGlE;AAED,wBAAgB,iBAAiB,IAAI,SAAS,aAAa,EAAE,CAE5D;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,gBAAgB,EACpB,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,YAAY,GAClD,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAEvD;AAkCD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAejE"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/vault/policy.ts"],"names":[],"mappings":"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"}
@@ -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
- * control, attestation) applied to every credential operation via
6
- * `setSecretsPolicies([...])`. In 0.5.0 only the audit policy is
7
- * shipped; the API shape is designed to grow into the full policy
8
- * stack described in ADR-002.
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
- * `after` hooks of already-entered policies (those whose `before`
14
- * hook already completed) still fire with a `*_rejected` event, so
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
- * (ADR-002 §1.0.0). The rejecting policy's own `after` hook does
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
- // Policy registry
49
- // =============================================================================
50
- let activePolicies = [];
51
- let afterWarningEmitted = false;
52
- export function setSecretsPolicies(policies) {
53
- activePolicies = [...policies];
54
- afterWarningEmitted = false;
55
- }
56
- export function getActivePolicies() {
57
- return activePolicies;
58
- }
59
- /**
60
- * Run `before` hooks top-to-bottom. If a hook throws, the operation is
61
- * rejected: the `after` hooks of the already-entered policies (indices
62
- * `0..i-1`, bottom-to-top) fire with the event built by
63
- * `makeRejectionEvent` so the denied operation is still audited, then the
64
- * original error is re-thrown to abort the operation. The rejecting
65
- * policy's own `after` hook is intentionally skipped — its `before` hook
66
- * did not complete, so the policy was not fully entered. See ADR-002
67
- * §1.0.0.
68
- */
69
- export async function runBeforeHooks(op, makeRejectionEvent) {
70
- for (let i = 0; i < activePolicies.length; i++) {
71
- const policy = activePolicies[i];
72
- if (!policy.before)
73
- continue;
74
- try {
75
- await policy.before(op);
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
- catch (err) {
78
- const msg = err instanceof Error ? err.message : String(err);
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
- export function runAfterHooks(event) {
85
- runAfterHooksForRange(event, activePolicies.length - 1);
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
- * Run `after` hooks for policies `fromIndex..0` (bottom-to-top). A
89
- * negative `fromIndex` is a no-op (no policy was entered). Synchronous
90
- * hook exceptions are swallowed best-effort with a one-time stderr
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 runAfterHooksForRange(event, fromIndex) {
97
- for (let i = fromIndex; i >= 0; i--) {
98
- const policy = activePolicies[i];
99
- if (policy.after) {
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
- name: "auditTrail",
117
- after(event) {
118
- if (!includeReads &&
119
- (event.type === "credential_read" ||
120
- event.type === "credential_read_missing")) {
121
- return;
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
- opts.sink(event);
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
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/vault/policy.ts"],"names":[],"mappings":"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"}
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":"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"}
1
+ {"version":3,"file":"session-vault.d.ts","sourceRoot":"","sources":["../../src/vault/session-vault.ts"],"names":[],"mappings":"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"}