@decionis/agent-safe-pipeline 0.3.5 → 0.3.7
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 +7 -6
- package/dist/Index.d.ts +6 -0
- package/dist/Index.d.ts.map +1 -1
- package/dist/Index.js +6 -0
- package/dist/Index.js.map +1 -1
- package/dist/approval/PresenceApprovalCoordinator.d.ts +2 -2
- package/dist/audit/AuditRecorder.d.ts +6 -6
- package/dist/audit/AuditRecorder.d.ts.map +1 -1
- package/dist/audit/AuditRecorder.js.map +1 -1
- package/dist/decision/DecionisGate.d.ts +16 -5
- package/dist/decision/DecionisGate.d.ts.map +1 -1
- package/dist/decision/DecionisGate.js +113 -11
- package/dist/decision/DecionisGate.js.map +1 -1
- package/dist/decision/DecisionAuthority.d.ts +42 -4
- package/dist/decision/DecisionAuthority.d.ts.map +1 -1
- package/dist/decision/DecisionAuthority.js +2 -2
- package/dist/decision/DecisionAuthority.js.map +1 -1
- package/dist/decision/FixtureDecisionAuthority.d.ts +7 -3
- package/dist/decision/FixtureDecisionAuthority.d.ts.map +1 -1
- package/dist/decision/FixtureDecisionAuthority.js +26 -3
- package/dist/decision/FixtureDecisionAuthority.js.map +1 -1
- package/dist/decision/ImmutableDecisionGate.d.ts +3 -0
- package/dist/decision/ImmutableDecisionGate.d.ts.map +1 -0
- package/dist/decision/{ImmutableGateDecision.js → ImmutableDecisionGate.js} +2 -2
- package/dist/decision/{ImmutableGateDecision.js.map → ImmutableDecisionGate.js.map} +1 -1
- package/dist/decision/ShadowGate.d.ts +2 -2
- package/dist/decision/ShadowGate.js +2 -2
- package/dist/decision/edge/BundleWindow.d.ts +43 -0
- package/dist/decision/edge/BundleWindow.d.ts.map +1 -0
- package/dist/decision/edge/BundleWindow.js +41 -0
- package/dist/decision/edge/BundleWindow.js.map +1 -0
- package/dist/decision/edge/EdgeBundleManager.d.ts +87 -0
- package/dist/decision/edge/EdgeBundleManager.d.ts.map +1 -0
- package/dist/decision/edge/EdgeBundleManager.js +175 -0
- package/dist/decision/edge/EdgeBundleManager.js.map +1 -0
- package/dist/decision/edge/EdgeBundleSource.d.ts +59 -0
- package/dist/decision/edge/EdgeBundleSource.d.ts.map +1 -0
- package/dist/decision/edge/EdgeBundleSource.js +99 -0
- package/dist/decision/edge/EdgeBundleSource.js.map +1 -0
- package/dist/decision/edge/EdgeDecisionAuthority.d.ts +104 -0
- package/dist/decision/edge/EdgeDecisionAuthority.d.ts.map +1 -0
- package/dist/decision/edge/EdgeDecisionAuthority.js +197 -0
- package/dist/decision/edge/EdgeDecisionAuthority.js.map +1 -0
- package/dist/decision/edge/EdgeModule.d.ts +63 -0
- package/dist/decision/edge/EdgeModule.d.ts.map +1 -0
- package/dist/decision/edge/EdgeModule.js +147 -0
- package/dist/decision/edge/EdgeModule.js.map +1 -0
- package/dist/execution/ActionRegistry.d.ts +23 -0
- package/dist/execution/ActionRegistry.d.ts.map +1 -1
- package/dist/execution/ActionRegistry.js +32 -2
- package/dist/execution/ActionRegistry.js.map +1 -1
- package/dist/execution/AuthorizationVerifier.d.ts +19 -4
- package/dist/execution/AuthorizationVerifier.d.ts.map +1 -1
- package/dist/execution/AuthorizationVerifier.js +41 -2
- package/dist/execution/AuthorizationVerifier.js.map +1 -1
- package/dist/execution/LocalAuthorizationVerifier.d.ts +74 -0
- package/dist/execution/LocalAuthorizationVerifier.d.ts.map +1 -0
- package/dist/execution/LocalAuthorizationVerifier.js +138 -0
- package/dist/execution/LocalAuthorizationVerifier.js.map +1 -0
- package/dist/execution/PostgresReplayStore.d.ts +57 -0
- package/dist/execution/PostgresReplayStore.d.ts.map +1 -0
- package/dist/execution/PostgresReplayStore.js +81 -0
- package/dist/execution/PostgresReplayStore.js.map +1 -0
- package/dist/execution/ReplayStore.d.ts +14 -0
- package/dist/execution/ReplayStore.d.ts.map +1 -1
- package/dist/execution/ReplayStore.js +8 -0
- package/dist/execution/ReplayStore.js.map +1 -1
- package/dist/execution/SafeExecutor.d.ts +117 -5
- package/dist/execution/SafeExecutor.d.ts.map +1 -1
- package/dist/execution/SafeExecutor.js +259 -67
- package/dist/execution/SafeExecutor.js.map +1 -1
- package/dist/report/DecisionReport.d.ts +2 -2
- package/dist/report/HostedOutcome.d.ts +2 -2
- package/dist/shadow/ShadowPipeline.d.ts +1 -1
- package/dist/testing/LocalAuthority.d.ts +35 -2
- package/dist/testing/LocalAuthority.d.ts.map +1 -1
- package/dist/testing/LocalAuthority.js +54 -1
- package/dist/testing/LocalAuthority.js.map +1 -1
- package/package.json +3 -3
- package/dist/decision/ImmutableGateDecision.d.ts +0 -3
- package/dist/decision/ImmutableGateDecision.d.ts.map +0 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { DecionisGate } from "../DecionisGate.js";
|
|
4
|
+
import { FailClosedDecision, } from "../DecisionAuthority.js";
|
|
5
|
+
import { immutableDecisionGate } from "../ImmutableDecisionGate.js";
|
|
6
|
+
const sha256 = z.string().regex(/^sha256:[0-9a-f]{64}$/);
|
|
7
|
+
const identifier = z.string().min(1).max(200);
|
|
8
|
+
/** The `decide` result (module ABI 3). Fields beyond these are not read. */
|
|
9
|
+
const DecideResultSchema = z.object({
|
|
10
|
+
verdict: z.enum(["ALLOW", "ESCALATE", "BLOCK"]),
|
|
11
|
+
reason_codes: z.array(identifier).max(50),
|
|
12
|
+
policy_version: identifier,
|
|
13
|
+
bundle: z.object({
|
|
14
|
+
bundle_id: identifier,
|
|
15
|
+
policy_version: identifier,
|
|
16
|
+
kid: identifier,
|
|
17
|
+
jti: identifier,
|
|
18
|
+
}),
|
|
19
|
+
authority_requirement: z.record(z.string(), z.unknown()).nullable(),
|
|
20
|
+
evaluation_digest: sha256,
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* A `DecisionAuthority` that decides inside the deployment, with the Decionis
|
|
24
|
+
* edge evaluator: the same verdict hosted `enforce-and-bind` gives for the
|
|
25
|
+
* same binding and bundle, with no network call on the way.
|
|
26
|
+
*
|
|
27
|
+
* - `ALLOW` in enforcement becomes a local authorization, held in
|
|
28
|
+
* `LocalGrants` and consumed once by `LocalAuthorizationVerifier`; there is
|
|
29
|
+
* no Decionis grant on this path and nothing to claim.
|
|
30
|
+
* - `BLOCK` is a refusal, as it is hosted.
|
|
31
|
+
* - `ESCALATE` in enforcement hands the same intent, with the same escalation
|
|
32
|
+
* options, to the hosted authority: the human-approval paths are hosted.
|
|
33
|
+
* - Approval evidence is only ever evaluated hosted.
|
|
34
|
+
* - No usable bundle, a module fault, or a result this host cannot read
|
|
35
|
+
* follows `onUnavailable`: the hosted authority, or a fail-closed `BLOCK`.
|
|
36
|
+
*
|
|
37
|
+
* This class is the open host. The evaluator is a separately licensed
|
|
38
|
+
* module this package does not contain; without it the executor runs on the
|
|
39
|
+
* hosted authority alone, exactly as it does without this class.
|
|
40
|
+
*/
|
|
41
|
+
export class EdgeDecisionAuthority {
|
|
42
|
+
options;
|
|
43
|
+
evaluationMode;
|
|
44
|
+
onUnavailable;
|
|
45
|
+
clock;
|
|
46
|
+
constructor(options) {
|
|
47
|
+
this.options = options;
|
|
48
|
+
const mode = options.mode ?? "ENFORCEMENT";
|
|
49
|
+
if (mode !== "ENFORCEMENT" && mode !== "SHADOW")
|
|
50
|
+
throw new Error("EDGE_MODE_INVALID");
|
|
51
|
+
const hostedMode = options.hosted.evaluationMode;
|
|
52
|
+
if (hostedMode !== undefined && hostedMode !== mode)
|
|
53
|
+
throw new Error("EDGE_MODE_MISMATCH");
|
|
54
|
+
const onUnavailable = options.onUnavailable ?? "hosted";
|
|
55
|
+
if (onUnavailable !== "hosted" && onUnavailable !== "block") {
|
|
56
|
+
throw new Error("EDGE_ON_UNAVAILABLE_INVALID");
|
|
57
|
+
}
|
|
58
|
+
this.evaluationMode = mode;
|
|
59
|
+
this.onUnavailable = onUnavailable;
|
|
60
|
+
this.clock = options.clock ?? Date.now;
|
|
61
|
+
}
|
|
62
|
+
async evaluate(captured, evidence, options = {}) {
|
|
63
|
+
if (evidence !== undefined)
|
|
64
|
+
return await this.options.hosted.evaluate(captured, evidence, options);
|
|
65
|
+
const replayed = await this.replayed(captured);
|
|
66
|
+
if (replayed !== null)
|
|
67
|
+
return FailClosedDecision.create(captured.intentHash, replayed);
|
|
68
|
+
const now = this.clock();
|
|
69
|
+
const bundle = this.options.bundles.current(now);
|
|
70
|
+
if (bundle === null) {
|
|
71
|
+
return await this.unavailable(captured, "EDGE_BUNDLE_UNAVAILABLE", null, options);
|
|
72
|
+
}
|
|
73
|
+
let envelope;
|
|
74
|
+
try {
|
|
75
|
+
envelope = this.options.module.decide(bundle.handle, {
|
|
76
|
+
binding: DecionisGate.binding(captured),
|
|
77
|
+
mode: this.evaluationMode,
|
|
78
|
+
now: new Date(now).toISOString(),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return await this.unavailable(captured, "EDGE_MODULE_FAULTED", null, options);
|
|
83
|
+
}
|
|
84
|
+
if (!envelope.ok) {
|
|
85
|
+
return await this.unavailable(captured, "EDGE_MODULE_REFUSED", envelope.code, options);
|
|
86
|
+
}
|
|
87
|
+
const parsed = DecideResultSchema.safeParse(envelope.result);
|
|
88
|
+
if (!parsed.success || !EdgeDecisionAuthority.sameBundle(parsed.data, bundle)) {
|
|
89
|
+
return await this.unavailable(captured, "EDGE_RESULT_INVALID", null, options);
|
|
90
|
+
}
|
|
91
|
+
const result = parsed.data;
|
|
92
|
+
const delegated = result.verdict === "ESCALATE" && this.evaluationMode === "ENFORCEMENT";
|
|
93
|
+
const decisionId = EdgeDecisionAuthority.decisionId(captured, result);
|
|
94
|
+
try {
|
|
95
|
+
this.options.record?.({
|
|
96
|
+
event: "EDGE_DECISION",
|
|
97
|
+
mode: this.evaluationMode,
|
|
98
|
+
intent_id: captured.intent.intentId,
|
|
99
|
+
intent_hash: captured.intentHash,
|
|
100
|
+
decision_id: decisionId,
|
|
101
|
+
verdict: result.verdict,
|
|
102
|
+
reason_codes: [...result.reason_codes],
|
|
103
|
+
policy_version: result.policy_version,
|
|
104
|
+
bundle_id: result.bundle.bundle_id,
|
|
105
|
+
kid: result.bundle.kid,
|
|
106
|
+
jti: result.bundle.jti,
|
|
107
|
+
evaluation_digest: result.evaluation_digest,
|
|
108
|
+
delegated,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return FailClosedDecision.create(captured.intentHash, "EDGE_RECORD_UNAVAILABLE");
|
|
113
|
+
}
|
|
114
|
+
if (delegated)
|
|
115
|
+
return await this.options.hosted.evaluate(captured, undefined, options);
|
|
116
|
+
return this.local(captured, result, decisionId, bundle, now);
|
|
117
|
+
}
|
|
118
|
+
local(captured, result, decisionId, bundle, now) {
|
|
119
|
+
const dossierId = `edge:${result.evaluation_digest}`;
|
|
120
|
+
let authorization = null;
|
|
121
|
+
if (result.verdict === "ALLOW" && this.evaluationMode === "ENFORCEMENT") {
|
|
122
|
+
// The authorization lives no longer than the intent or the bundle.
|
|
123
|
+
const expiresAtMs = Math.min(Date.parse(captured.intent.expiresAt), bundle.expiresAtMs);
|
|
124
|
+
if (!(expiresAtMs > now)) {
|
|
125
|
+
return FailClosedDecision.create(captured.intentHash, "INTENT_EXPIRED");
|
|
126
|
+
}
|
|
127
|
+
const expiresAt = new Date(expiresAtMs).toISOString();
|
|
128
|
+
const token = this.options.grants.issue({
|
|
129
|
+
intentId: captured.intent.intentId,
|
|
130
|
+
intentHash: captured.intentHash,
|
|
131
|
+
decisionId,
|
|
132
|
+
dossierId,
|
|
133
|
+
expiresAt,
|
|
134
|
+
});
|
|
135
|
+
authorization = { token, expiresAt };
|
|
136
|
+
}
|
|
137
|
+
return immutableDecisionGate({
|
|
138
|
+
verdict: result.verdict,
|
|
139
|
+
decisionId,
|
|
140
|
+
dossierId,
|
|
141
|
+
intentHash: captured.intentHash,
|
|
142
|
+
reasonCodes: result.reason_codes,
|
|
143
|
+
authorization,
|
|
144
|
+
failClosed: false,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
async unavailable(captured, reason, moduleCode, options) {
|
|
148
|
+
const fallback = this.onUnavailable === "hosted" ? "HOSTED" : "BLOCK";
|
|
149
|
+
try {
|
|
150
|
+
this.options.record?.({
|
|
151
|
+
event: "EDGE_UNAVAILABLE",
|
|
152
|
+
mode: this.evaluationMode,
|
|
153
|
+
intent_id: captured.intent.intentId,
|
|
154
|
+
intent_hash: captured.intentHash,
|
|
155
|
+
reason,
|
|
156
|
+
module_code: moduleCode !== null && /^[a-z][a-z0-9_]{0,62}$/.test(moduleCode) ? moduleCode : null,
|
|
157
|
+
fallback,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return FailClosedDecision.create(captured.intentHash, "EDGE_RECORD_UNAVAILABLE");
|
|
162
|
+
}
|
|
163
|
+
if (fallback === "HOSTED")
|
|
164
|
+
return await this.options.hosted.evaluate(captured, undefined, options);
|
|
165
|
+
return FailClosedDecision.create(captured.intentHash, reason);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Why an enforcement decision must not be made: the intent has already
|
|
169
|
+
* been claimed, or the store that would say so cannot be asked. Neither is
|
|
170
|
+
* a decision, so neither is recorded or counted.
|
|
171
|
+
*/
|
|
172
|
+
async replayed(captured) {
|
|
173
|
+
const store = this.options.replay;
|
|
174
|
+
if (this.evaluationMode !== "ENFORCEMENT" || store?.consumed === undefined)
|
|
175
|
+
return null;
|
|
176
|
+
try {
|
|
177
|
+
return (await store.consumed(captured.intent.intentId)) ? "INTENT_ALREADY_CONSUMED" : null;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return "EDGE_REPLAY_STORE_UNAVAILABLE";
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** The module must have decided on the bundle this host gave it. */
|
|
184
|
+
static sameBundle(result, bundle) {
|
|
185
|
+
return (result.bundle.bundle_id === bundle.bundleId &&
|
|
186
|
+
result.bundle.policy_version === bundle.policyVersion &&
|
|
187
|
+
result.bundle.kid === bundle.kid);
|
|
188
|
+
}
|
|
189
|
+
/** Unique per intent and evaluation, and derivable from the record that names it. */
|
|
190
|
+
static decisionId(captured, result) {
|
|
191
|
+
const digest = createHash("sha256")
|
|
192
|
+
.update(`${captured.intentHash}\n${result.evaluation_digest}\n${result.bundle.jti}`, "utf8")
|
|
193
|
+
.digest("hex");
|
|
194
|
+
return `edge:${digest.slice(0, 40)}`;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=EdgeDecisionAuthority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EdgeDecisionAuthority.js","sourceRoot":"","sources":["../../../src/decision/edge/EdgeDecisionAuthority.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** The module ABI this host speaks: ABI 2's bundle exports plus `decide`. */
|
|
2
|
+
export declare const EDGE_MODULE_ABI_VERSION = 3;
|
|
3
|
+
/** Why a module was refused, or why a call into it failed. Never a message from the module. */
|
|
4
|
+
export type EdgeModuleErrorCode = "EDGE_MODULE_UNREADABLE" | "EDGE_MODULE_INVALID" | "EDGE_MODULE_ABI_UNSUPPORTED" | "EDGE_MODULE_FAULTED";
|
|
5
|
+
export declare class EdgeModuleError extends Error {
|
|
6
|
+
readonly code: EdgeModuleErrorCode;
|
|
7
|
+
constructor(code: EdgeModuleErrorCode);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* One answer from the module: its result, or the refusal code it gave. The
|
|
11
|
+
* module's own message is dropped here; it may quote the input, and nothing
|
|
12
|
+
* of the input belongs in a log line.
|
|
13
|
+
*/
|
|
14
|
+
export type EdgeEnvelope = {
|
|
15
|
+
readonly ok: true;
|
|
16
|
+
readonly result: unknown;
|
|
17
|
+
} | {
|
|
18
|
+
readonly ok: false;
|
|
19
|
+
readonly code: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* The host side of the Decionis edge evaluator: the proprietary WebAssembly
|
|
23
|
+
* module, licensed separately and not part of this package, instantiated with
|
|
24
|
+
* no imports. This class knows the module's calling convention and nothing of
|
|
25
|
+
* its policy semantics.
|
|
26
|
+
*
|
|
27
|
+
* A module that does not export ABI 3 is refused at construction, so a
|
|
28
|
+
* process configured for the edge never starts on an older or a foreign
|
|
29
|
+
* module. A call that traps marks the instance faulted: its memory can no
|
|
30
|
+
* longer be trusted, so every later call refuses rather than answering from
|
|
31
|
+
* it.
|
|
32
|
+
*/
|
|
33
|
+
export declare class EdgeModule {
|
|
34
|
+
private readonly exports;
|
|
35
|
+
private faulted;
|
|
36
|
+
private readonly encoder;
|
|
37
|
+
private readonly decoder;
|
|
38
|
+
private constructor();
|
|
39
|
+
/** Reads, compiles and instantiates the module at `path`. */
|
|
40
|
+
static fromFile(path: string): EdgeModule;
|
|
41
|
+
/**
|
|
42
|
+
* Compiles and instantiates `bytes` synchronously, so a refusal is a
|
|
43
|
+
* refusal to start rather than a promise someone forgets to await.
|
|
44
|
+
*/
|
|
45
|
+
static fromBytes(bytes: Uint8Array<ArrayBuffer>): EdgeModule;
|
|
46
|
+
/** Checks an instance's exports against ABI 3. */
|
|
47
|
+
static fromExports(exports: WebAssembly.Exports): EdgeModule;
|
|
48
|
+
/** True once a call trapped; the instance answers nothing after that. */
|
|
49
|
+
get isFaulted(): boolean;
|
|
50
|
+
/** `load_bundle({signed_bundle, org_id, now})`. */
|
|
51
|
+
loadBundle(input: {
|
|
52
|
+
readonly signed_bundle: string;
|
|
53
|
+
readonly org_id: string;
|
|
54
|
+
readonly now: string;
|
|
55
|
+
}): EdgeEnvelope;
|
|
56
|
+
/** `decide(handle, {binding, mode, now})`. */
|
|
57
|
+
decide(handle: number, input: unknown): EdgeEnvelope;
|
|
58
|
+
/** `unload_bundle(handle)`: true when the handle was loaded and is now released. */
|
|
59
|
+
unloadBundle(handle: number): boolean;
|
|
60
|
+
private call;
|
|
61
|
+
private static envelope;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=EdgeModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EdgeModule.d.ts","sourceRoot":"","sources":["../../../src/decision/edge/EdgeModule.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,+FAA+F;AAC/F,MAAM,MAAM,mBAAmB,GAC3B,wBAAwB,GACxB,qBAAqB,GACrB,6BAA6B,GAC7B,qBAAqB,CAAC;AAE1B,qBAAa,eAAgB,SAAQ,KAAK;aACL,IAAI,EAAE,mBAAmB;gBAAzB,IAAI,EAAE,mBAAmB;CAI7D;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAuBlG;;;;;;;;;;;GAWG;AACH,qBAAa,UAAU;IAKD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IAErE,OAAO;IAEP,6DAA6D;WAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAUhD;;;OAGG;WACW,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,UAAU;IAUnE,kDAAkD;WACpC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,UAAU;IAyBnE,yEAAyE;IACzE,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,mDAAmD;IAC5C,UAAU,CAAC,KAAK,EAAE;QACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;KACtB,GAAG,YAAY;IAIhB,8CAA8C;IACvC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY;IAI3D,oFAAoF;IAC7E,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAU5C,OAAO,CAAC,IAAI;IAuBZ,OAAO,CAAC,MAAM,CAAC,QAAQ;CAYxB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
/** The module ABI this host speaks: ABI 2's bundle exports plus `decide`. */
|
|
3
|
+
export const EDGE_MODULE_ABI_VERSION = 3;
|
|
4
|
+
export class EdgeModuleError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code) {
|
|
7
|
+
super(code);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "EdgeModuleError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const FUNCTIONS = [
|
|
13
|
+
"alloc",
|
|
14
|
+
"dealloc",
|
|
15
|
+
"abi_version",
|
|
16
|
+
"load_bundle",
|
|
17
|
+
"evaluate_bundle",
|
|
18
|
+
"decide",
|
|
19
|
+
"unload_bundle",
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* The host side of the Decionis edge evaluator: the proprietary WebAssembly
|
|
23
|
+
* module, licensed separately and not part of this package, instantiated with
|
|
24
|
+
* no imports. This class knows the module's calling convention and nothing of
|
|
25
|
+
* its policy semantics.
|
|
26
|
+
*
|
|
27
|
+
* A module that does not export ABI 3 is refused at construction, so a
|
|
28
|
+
* process configured for the edge never starts on an older or a foreign
|
|
29
|
+
* module. A call that traps marks the instance faulted: its memory can no
|
|
30
|
+
* longer be trusted, so every later call refuses rather than answering from
|
|
31
|
+
* it.
|
|
32
|
+
*/
|
|
33
|
+
export class EdgeModule {
|
|
34
|
+
exports;
|
|
35
|
+
faulted = false;
|
|
36
|
+
encoder = new TextEncoder();
|
|
37
|
+
decoder = new TextDecoder("utf-8", { fatal: true });
|
|
38
|
+
constructor(exports) {
|
|
39
|
+
this.exports = exports;
|
|
40
|
+
}
|
|
41
|
+
/** Reads, compiles and instantiates the module at `path`. */
|
|
42
|
+
static fromFile(path) {
|
|
43
|
+
let bytes;
|
|
44
|
+
try {
|
|
45
|
+
bytes = readFileSync(path);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new EdgeModuleError("EDGE_MODULE_UNREADABLE");
|
|
49
|
+
}
|
|
50
|
+
return EdgeModule.fromBytes(bytes);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Compiles and instantiates `bytes` synchronously, so a refusal is a
|
|
54
|
+
* refusal to start rather than a promise someone forgets to await.
|
|
55
|
+
*/
|
|
56
|
+
static fromBytes(bytes) {
|
|
57
|
+
let instance;
|
|
58
|
+
try {
|
|
59
|
+
instance = new WebAssembly.Instance(new WebAssembly.Module(bytes), {});
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new EdgeModuleError("EDGE_MODULE_INVALID");
|
|
63
|
+
}
|
|
64
|
+
return EdgeModule.fromExports(instance.exports);
|
|
65
|
+
}
|
|
66
|
+
/** Checks an instance's exports against ABI 3. */
|
|
67
|
+
static fromExports(exports) {
|
|
68
|
+
if (!(exports["memory"] instanceof WebAssembly.Memory)) {
|
|
69
|
+
throw new EdgeModuleError("EDGE_MODULE_INVALID");
|
|
70
|
+
}
|
|
71
|
+
for (const name of FUNCTIONS) {
|
|
72
|
+
if (typeof exports[name] !== "function") {
|
|
73
|
+
// An ABI 2 module lacks `decide`; it is an older module, not a broken one.
|
|
74
|
+
throw new EdgeModuleError(name === "decide" ? "EDGE_MODULE_ABI_UNSUPPORTED" : "EDGE_MODULE_INVALID");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const module = new EdgeModule(exports);
|
|
78
|
+
let version;
|
|
79
|
+
try {
|
|
80
|
+
version = module.exports.abi_version();
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
throw new EdgeModuleError("EDGE_MODULE_INVALID");
|
|
84
|
+
}
|
|
85
|
+
if (version !== EDGE_MODULE_ABI_VERSION) {
|
|
86
|
+
throw new EdgeModuleError("EDGE_MODULE_ABI_UNSUPPORTED");
|
|
87
|
+
}
|
|
88
|
+
return module;
|
|
89
|
+
}
|
|
90
|
+
/** True once a call trapped; the instance answers nothing after that. */
|
|
91
|
+
get isFaulted() {
|
|
92
|
+
return this.faulted;
|
|
93
|
+
}
|
|
94
|
+
/** `load_bundle({signed_bundle, org_id, now})`. */
|
|
95
|
+
loadBundle(input) {
|
|
96
|
+
return this.call(input, (ptr, len) => this.exports.load_bundle(ptr, len));
|
|
97
|
+
}
|
|
98
|
+
/** `decide(handle, {binding, mode, now})`. */
|
|
99
|
+
decide(handle, input) {
|
|
100
|
+
return this.call(input, (ptr, len) => this.exports.decide(handle, ptr, len));
|
|
101
|
+
}
|
|
102
|
+
/** `unload_bundle(handle)`: true when the handle was loaded and is now released. */
|
|
103
|
+
unloadBundle(handle) {
|
|
104
|
+
if (this.faulted)
|
|
105
|
+
return false;
|
|
106
|
+
try {
|
|
107
|
+
return this.exports.unload_bundle(handle) === 1;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
this.faulted = true;
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
call(input, invoke) {
|
|
115
|
+
if (this.faulted)
|
|
116
|
+
throw new EdgeModuleError("EDGE_MODULE_FAULTED");
|
|
117
|
+
try {
|
|
118
|
+
const bytes = this.encoder.encode(JSON.stringify(input));
|
|
119
|
+
const ptr = this.exports.alloc(bytes.length);
|
|
120
|
+
if (ptr === 0)
|
|
121
|
+
throw new EdgeModuleError("EDGE_MODULE_FAULTED");
|
|
122
|
+
// The buffer is read after `alloc`, which may have grown the memory.
|
|
123
|
+
new Uint8Array(this.exports.memory.buffer, ptr, bytes.length).set(bytes);
|
|
124
|
+
const packed = invoke(ptr, bytes.length);
|
|
125
|
+
this.exports.dealloc(ptr, bytes.length);
|
|
126
|
+
const outPtr = Number(packed >> 32n);
|
|
127
|
+
const outLen = Number(packed & 0xffffffffn);
|
|
128
|
+
const text = this.decoder.decode(new Uint8Array(this.exports.memory.buffer, outPtr, outLen).slice());
|
|
129
|
+
this.exports.dealloc(outPtr, outLen);
|
|
130
|
+
return EdgeModule.envelope(JSON.parse(text));
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
this.faulted = true;
|
|
134
|
+
throw new EdgeModuleError("EDGE_MODULE_FAULTED");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
static envelope(value) {
|
|
138
|
+
const envelope = value;
|
|
139
|
+
if (envelope.ok === true && "result" in envelope)
|
|
140
|
+
return { ok: true, result: envelope.result };
|
|
141
|
+
if (envelope.ok === false && typeof envelope.error?.code === "string") {
|
|
142
|
+
return { ok: false, code: envelope.error.code };
|
|
143
|
+
}
|
|
144
|
+
throw new EdgeModuleError("EDGE_MODULE_FAULTED");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=EdgeModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EdgeModule.js","sourceRoot":"","sources":["../../../src/decision/edge/EdgeModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AASzC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACL;IAAnC,YAAmC,IAAyB;QAC1D,KAAK,CAAC,IAAI,CAAC,CAAC;QADqB,SAAI,GAAJ,IAAI,CAAqB;QAE1D,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAqBD,MAAM,SAAS,GAAG;IAChB,OAAO;IACP,SAAS;IACT,aAAa;IACb,aAAa;IACb,iBAAiB;IACjB,QAAQ;IACR,eAAe;CACP,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,UAAU;IAKgB;IAJ7B,OAAO,GAAG,KAAK,CAAC;IACP,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAC5B,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAErE,YAAqC,OAAoB;QAApB,YAAO,GAAP,OAAO,CAAa;IAAG,CAAC;IAE7D,6DAA6D;IACtD,MAAM,CAAC,QAAQ,CAAC,IAAY;QACjC,IAAI,KAA8B,CAAC;QACnC,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,SAAS,CAAC,KAA8B;QACpD,IAAI,QAA8B,CAAC;QACnC,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,kDAAkD;IAC3C,MAAM,CAAC,WAAW,CAAC,OAA4B;QACpD,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;gBACxC,2EAA2E;gBAC3E,MAAM,IAAI,eAAe,CACvB,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,qBAAqB,CAC1E,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,OAAiC,CAAC,CAAC;QACjE,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,OAAO,KAAK,uBAAuB,EAAE,CAAC;YACxC,MAAM,IAAI,eAAe,CAAC,6BAA6B,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,yEAAyE;IACzE,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,mDAAmD;IAC5C,UAAU,CAAC,KAIjB;QACC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,8CAA8C;IACvC,MAAM,CAAC,MAAc,EAAE,KAAc;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,oFAAoF;IAC7E,YAAY,CAAC,MAAc;QAChC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,KAAc,EAAE,MAA4C;QACvE,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,GAAG,KAAK,CAAC;gBAAE,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;YAChE,qEAAqE;YACrE,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CACnE,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,QAAQ,CAAC,KAAc;QACpC,MAAM,QAAQ,GAAG,KAIhB,CAAC;QACF,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,IAAI,QAAQ,IAAI,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/F,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;QACD,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;IACnD,CAAC;CACF"}
|
|
@@ -49,6 +49,8 @@ export type ActionExecutionAttempt = {
|
|
|
49
49
|
readonly receipt: string | null;
|
|
50
50
|
} | {
|
|
51
51
|
readonly status: "FAILED_BEFORE_DISPATCH";
|
|
52
|
+
/** The handler's own code, when it refused with a `PreDispatchRefusal`. */
|
|
53
|
+
readonly code?: string;
|
|
52
54
|
} | {
|
|
53
55
|
readonly status: "REFUSED_AFTER_DISPATCH";
|
|
54
56
|
readonly reason: string;
|
|
@@ -83,6 +85,27 @@ export declare class ProviderRefusal extends Error {
|
|
|
83
85
|
/** The provider's own reason, as a code; never its response body. */
|
|
84
86
|
reason: string);
|
|
85
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* What a handler throws when it refuses before anything was sent: the request
|
|
90
|
+
* cannot be built, a credential cannot be resolved, or the payload no longer
|
|
91
|
+
* matches what the authority bound.
|
|
92
|
+
*
|
|
93
|
+
* Any error thrown before the dispatch already counts as a failure before
|
|
94
|
+
* dispatch. This one says why: its code reaches the execution result and the
|
|
95
|
+
* audit trail instead of collapsing into HANDLER_FAILED_BEFORE_DISPATCH, so a
|
|
96
|
+
* payload that changed after the decision reads as PAYLOAD_BINDING_MISMATCH
|
|
97
|
+
* (BEAP-L3-ADP-05: what can fail before the dispatch boundary fails before
|
|
98
|
+
* it, and says so). A code that is not upper snake case is replaced with
|
|
99
|
+
* HANDLER_FAILED_BEFORE_DISPATCH, so a handler cannot write free text into the
|
|
100
|
+
* audit trail.
|
|
101
|
+
*
|
|
102
|
+
* Thrown inside the dispatch it means nothing more than any other error: the
|
|
103
|
+
* request left, so the outcome is unknown.
|
|
104
|
+
*/
|
|
105
|
+
export declare class PreDispatchRefusal extends Error {
|
|
106
|
+
readonly code: string;
|
|
107
|
+
constructor(code: string);
|
|
108
|
+
}
|
|
86
109
|
export declare class ActionRegistry {
|
|
87
110
|
private readonly actions;
|
|
88
111
|
private readonly pendingReconciliations;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionRegistry.d.ts","sourceRoot":"","sources":["../../src/execution/ActionRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,MAAM,WAAW,sBAAsB,CAAC,WAAW;IACjD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClG;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B,CAAC,WAAW;IACtD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,sBAAsB,CAAC,OAAO,IACtC;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,aAAa,CAAC,WAAW,EAAE,OAAO;IACjD,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClD,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAClF,gFAAgF;IAChF,SAAS,CAAC,CACR,OAAO,EAAE,2BAA2B,CAAC,WAAW,CAAC,GAChD,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;CAC/E;AAUD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC3F;
|
|
1
|
+
{"version":3,"file":"ActionRegistry.d.ts","sourceRoot":"","sources":["../../src/execution/ActionRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,34 @@ export class ProviderRefusal extends Error {
|
|
|
27
27
|
this.name = "ProviderRefusal";
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
+
/** A pre-dispatch refusal code: upper snake case, as every reason code here is. */
|
|
31
|
+
const PRE_DISPATCH_CODE = /^[A-Z][A-Z0-9_]{2,63}$/;
|
|
32
|
+
/**
|
|
33
|
+
* What a handler throws when it refuses before anything was sent: the request
|
|
34
|
+
* cannot be built, a credential cannot be resolved, or the payload no longer
|
|
35
|
+
* matches what the authority bound.
|
|
36
|
+
*
|
|
37
|
+
* Any error thrown before the dispatch already counts as a failure before
|
|
38
|
+
* dispatch. This one says why: its code reaches the execution result and the
|
|
39
|
+
* audit trail instead of collapsing into HANDLER_FAILED_BEFORE_DISPATCH, so a
|
|
40
|
+
* payload that changed after the decision reads as PAYLOAD_BINDING_MISMATCH
|
|
41
|
+
* (BEAP-L3-ADP-05: what can fail before the dispatch boundary fails before
|
|
42
|
+
* it, and says so). A code that is not upper snake case is replaced with
|
|
43
|
+
* HANDLER_FAILED_BEFORE_DISPATCH, so a handler cannot write free text into the
|
|
44
|
+
* audit trail.
|
|
45
|
+
*
|
|
46
|
+
* Thrown inside the dispatch it means nothing more than any other error: the
|
|
47
|
+
* request left, so the outcome is unknown.
|
|
48
|
+
*/
|
|
49
|
+
export class PreDispatchRefusal extends Error {
|
|
50
|
+
code;
|
|
51
|
+
constructor(code) {
|
|
52
|
+
const safe = PRE_DISPATCH_CODE.test(code) ? code : "HANDLER_FAILED_BEFORE_DISPATCH";
|
|
53
|
+
super(safe);
|
|
54
|
+
this.name = "PreDispatchRefusal";
|
|
55
|
+
this.code = safe;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
30
58
|
export class ActionRegistry {
|
|
31
59
|
actions = new Map();
|
|
32
60
|
pendingReconciliations = new Map();
|
|
@@ -107,8 +135,10 @@ export class ActionRegistry {
|
|
|
107
135
|
if (dispatched && error instanceof ProviderRefusal) {
|
|
108
136
|
return { status: "REFUSED_AFTER_DISPATCH", reason: error.reason, receipt };
|
|
109
137
|
}
|
|
110
|
-
|
|
111
|
-
|
|
138
|
+
if (dispatched)
|
|
139
|
+
return { status: "UNKNOWN_AFTER_DISPATCH", receipt };
|
|
140
|
+
return error instanceof PreDispatchRefusal
|
|
141
|
+
? { status: "FAILED_BEFORE_DISPATCH", code: error.code }
|
|
112
142
|
: { status: "FAILED_BEFORE_DISPATCH" };
|
|
113
143
|
}
|
|
114
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionRegistry.js","sourceRoot":"","sources":["../../src/execution/ActionRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ActionRegistry.js","sourceRoot":"","sources":["../../src/execution/ActionRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Credential } from "../http/Credential.js";
|
|
2
2
|
import type { CapturedIntent } from "../intent/ExecutionIntent.js";
|
|
3
3
|
import type { JsonObject } from "../intent/JsonValue.js";
|
|
4
|
-
import type {
|
|
4
|
+
import type { DecisionGate } from "../decision/DecisionAuthority.js";
|
|
5
5
|
export interface VerifiedAuthorization {
|
|
6
6
|
readonly decisionId: string;
|
|
7
7
|
readonly dossierId: string;
|
|
@@ -99,7 +99,7 @@ export interface AuthorityEffectReport {
|
|
|
99
99
|
}
|
|
100
100
|
export interface AuthorizationFinalizationInput {
|
|
101
101
|
readonly captured: CapturedIntent;
|
|
102
|
-
readonly decision:
|
|
102
|
+
readonly decision: DecisionGate;
|
|
103
103
|
readonly authorization: VerifiedAuthorization;
|
|
104
104
|
readonly outcome: ExecutionCommitOutcome;
|
|
105
105
|
/**
|
|
@@ -124,13 +124,26 @@ export interface AuthorizationFinalizationInput {
|
|
|
124
124
|
readonly effectReceipt?: string;
|
|
125
125
|
}
|
|
126
126
|
export interface AuthorizationVerifier {
|
|
127
|
-
verifyAndConsume(captured: CapturedIntent, decision:
|
|
127
|
+
verifyAndConsume(captured: CapturedIntent, decision: DecisionGate): Promise<VerifiedAuthorization | null>;
|
|
128
128
|
/**
|
|
129
129
|
* Reports the downstream attempt outcome for an authorization returned by
|
|
130
130
|
* this verifier's `verifyAndConsume`. Finalization is evidence, never
|
|
131
131
|
* authority: it must not retry a side effect, and it must not throw.
|
|
132
132
|
*/
|
|
133
133
|
finalize?(input: AuthorizationFinalizationInput): Promise<"RECORDED" | "PENDING">;
|
|
134
|
+
/**
|
|
135
|
+
* What another process needs to finalize a claim this verifier made, for
|
|
136
|
+
* a store the replicas share to keep sealed; it is claim material, which
|
|
137
|
+
* this verifier exposes nowhere else. Absent on a verifier whose claims
|
|
138
|
+
* cannot leave the process; null for an authorization it did not claim.
|
|
139
|
+
*/
|
|
140
|
+
claimMaterial?(authorization: VerifiedAuthorization): JsonObject | null;
|
|
141
|
+
/**
|
|
142
|
+
* Registers claim material read back from such a store against an
|
|
143
|
+
* authorization rebuilt from it, so `finalize` can proceed in this
|
|
144
|
+
* process. False when the material is not this verifier's.
|
|
145
|
+
*/
|
|
146
|
+
adoptClaim?(authorization: VerifiedAuthorization, material: JsonObject): boolean;
|
|
134
147
|
}
|
|
135
148
|
export interface DecionisGrantVerifierOptions {
|
|
136
149
|
readonly baseUrl: string;
|
|
@@ -163,7 +176,9 @@ export declare class DecionisGrantVerifier implements AuthorizationVerifier {
|
|
|
163
176
|
*/
|
|
164
177
|
static parametersDigest(parameters: JsonObject): `sha256:${string}`;
|
|
165
178
|
constructor(options: DecionisGrantVerifierOptions);
|
|
166
|
-
verifyAndConsume(captured: CapturedIntent, decision:
|
|
179
|
+
verifyAndConsume(captured: CapturedIntent, decision: DecisionGate): Promise<VerifiedAuthorization | null>;
|
|
180
|
+
claimMaterial(authorization: VerifiedAuthorization): JsonObject | null;
|
|
181
|
+
adoptClaim(authorization: VerifiedAuthorization, material: JsonObject): boolean;
|
|
167
182
|
finalize(input: AuthorizationFinalizationInput): Promise<"RECORDED" | "PENDING">;
|
|
168
183
|
/**
|
|
169
184
|
* What the authority reported about effect evidence for an authorization this
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationVerifier.d.ts","sourceRoot":"","sources":["../../src/execution/AuthorizationVerifier.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"AuthorizationVerifier.d.ts","sourceRoot":"","sources":["../../src/execution/AuthorizationVerifier.ts"],"names":[],"mappings":"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"}
|