@decionis/agent-safe-pipeline 0.1.3 → 0.2.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 +477 -16
- package/dist/Index.d.ts +9 -0
- package/dist/Index.d.ts.map +1 -1
- package/dist/Index.js +8 -0
- package/dist/Index.js.map +1 -1
- package/dist/approval/PresenceApprovalCoordinator.d.ts +25 -0
- package/dist/approval/PresenceApprovalCoordinator.d.ts.map +1 -1
- package/dist/approval/PresenceApprovalCoordinator.js +54 -6
- package/dist/approval/PresenceApprovalCoordinator.js.map +1 -1
- package/dist/audit/AuditRecorder.d.ts +122 -0
- package/dist/audit/AuditRecorder.d.ts.map +1 -0
- package/dist/audit/AuditRecorder.js +312 -0
- package/dist/audit/AuditRecorder.js.map +1 -0
- package/dist/decision/CreateGate.d.ts +123 -0
- package/dist/decision/CreateGate.d.ts.map +1 -0
- package/dist/decision/CreateGate.js +211 -0
- package/dist/decision/CreateGate.js.map +1 -0
- package/dist/decision/DecionisGate.d.ts +109 -3
- package/dist/decision/DecionisGate.d.ts.map +1 -1
- package/dist/decision/DecionisGate.js +823 -46
- package/dist/decision/DecionisGate.js.map +1 -1
- package/dist/decision/DecisionAuthority.d.ts +76 -1
- package/dist/decision/DecisionAuthority.d.ts.map +1 -1
- package/dist/decision/DecisionAuthority.js.map +1 -1
- package/dist/decision/FixtureDecisionAuthority.d.ts +27 -1
- package/dist/decision/FixtureDecisionAuthority.d.ts.map +1 -1
- package/dist/decision/FixtureDecisionAuthority.js +47 -0
- package/dist/decision/FixtureDecisionAuthority.js.map +1 -1
- package/dist/decision/ImmutableGateDecision.d.ts.map +1 -1
- package/dist/decision/ImmutableGateDecision.js +26 -0
- package/dist/decision/ImmutableGateDecision.js.map +1 -1
- package/dist/decision/Provision.d.ts +33 -0
- package/dist/decision/Provision.d.ts.map +1 -0
- package/dist/decision/Provision.js +116 -0
- package/dist/decision/Provision.js.map +1 -0
- package/dist/decision/ShadowGate.d.ts +31 -0
- package/dist/decision/ShadowGate.d.ts.map +1 -0
- package/dist/decision/ShadowGate.js +79 -0
- package/dist/decision/ShadowGate.js.map +1 -0
- package/dist/execution/ActionRegistry.d.ts +66 -0
- package/dist/execution/ActionRegistry.d.ts.map +1 -1
- package/dist/execution/ActionRegistry.js +110 -1
- package/dist/execution/ActionRegistry.js.map +1 -1
- package/dist/execution/AuthorizationVerifier.d.ts +149 -1
- package/dist/execution/AuthorizationVerifier.d.ts.map +1 -1
- package/dist/execution/AuthorizationVerifier.js +302 -27
- package/dist/execution/AuthorizationVerifier.js.map +1 -1
- package/dist/execution/SafeExecutor.d.ts +102 -7
- package/dist/execution/SafeExecutor.d.ts.map +1 -1
- package/dist/execution/SafeExecutor.js +288 -17
- package/dist/execution/SafeExecutor.js.map +1 -1
- package/dist/http/ClientIdentification.d.ts +22 -0
- package/dist/http/ClientIdentification.d.ts.map +1 -0
- package/dist/http/ClientIdentification.js +44 -0
- package/dist/http/ClientIdentification.js.map +1 -0
- package/dist/http/Credential.d.ts +17 -0
- package/dist/http/Credential.d.ts.map +1 -0
- package/dist/http/Credential.js +5 -0
- package/dist/http/Credential.js.map +1 -0
- package/dist/http/StoredCredentials.d.ts +34 -0
- package/dist/http/StoredCredentials.d.ts.map +1 -0
- package/dist/http/StoredCredentials.js +85 -0
- package/dist/http/StoredCredentials.js.map +1 -0
- package/dist/intent/CanonicalIntentHasher.d.ts +1 -1
- package/dist/intent/CanonicalIntentHasher.d.ts.map +1 -1
- package/dist/intent/CanonicalIntentHasher.js +9 -2
- package/dist/intent/CanonicalIntentHasher.js.map +1 -1
- package/dist/intent/ExecutionIntent.d.ts +26 -2
- package/dist/intent/ExecutionIntent.d.ts.map +1 -1
- package/dist/intent/ExecutionIntent.js +11 -0
- package/dist/intent/ExecutionIntent.js.map +1 -1
- package/dist/intent/IntentCapture.d.ts +5 -0
- package/dist/intent/IntentCapture.d.ts.map +1 -1
- package/dist/intent/IntentCapture.js +15 -1
- package/dist/intent/IntentCapture.js.map +1 -1
- package/dist/report/DecisionReport.d.ts +22 -0
- package/dist/report/DecisionReport.d.ts.map +1 -0
- package/dist/report/DecisionReport.js +37 -0
- package/dist/report/DecisionReport.js.map +1 -0
- package/dist/report/DossierReport.d.ts +43 -0
- package/dist/report/DossierReport.d.ts.map +1 -0
- package/dist/report/DossierReport.js +130 -0
- package/dist/report/DossierReport.js.map +1 -0
- package/dist/report/HostedOutcome.d.ts +18 -0
- package/dist/report/HostedOutcome.d.ts.map +1 -0
- package/dist/report/HostedOutcome.js +24 -0
- package/dist/report/HostedOutcome.js.map +1 -0
- package/dist/shadow/ShadowPipeline.d.ts +75 -5
- package/dist/shadow/ShadowPipeline.d.ts.map +1 -1
- package/dist/shadow/ShadowPipeline.js +157 -7
- package/dist/shadow/ShadowPipeline.js.map +1 -1
- package/dist/testing/Index.d.ts +12 -0
- package/dist/testing/Index.d.ts.map +1 -0
- package/dist/testing/Index.js +12 -0
- package/dist/testing/Index.js.map +1 -0
- package/dist/testing/LocalAuthority.d.ts +292 -0
- package/dist/testing/LocalAuthority.d.ts.map +1 -0
- package/dist/testing/LocalAuthority.js +1124 -0
- package/dist/testing/LocalAuthority.js.map +1 -0
- package/dist/testing/LocalPresence.d.ts +210 -0
- package/dist/testing/LocalPresence.d.ts.map +1 -0
- package/dist/testing/LocalPresence.js +473 -0
- package/dist/testing/LocalPresence.js.map +1 -0
- package/package.json +40 -4
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { DecionisGrantVerifier, } from "../execution/AuthorizationVerifier.js";
|
|
2
|
+
import { credentialsPath, readStoredCredentials, writeStoredCredentials, } from "../http/StoredCredentials.js";
|
|
3
|
+
import { DecionisGate } from "./DecionisGate.js";
|
|
4
|
+
import { fetchSignedDossier } from "../report/DossierReport.js";
|
|
5
|
+
import { provisionWorkspace, } from "./Provision.js";
|
|
6
|
+
import { ShadowGate } from "./ShadowGate.js";
|
|
7
|
+
const DEFAULT_API_URL = "https://api.decionis.com";
|
|
8
|
+
const TIMEOUT_PATTERN = /^\d{1,6}$/;
|
|
9
|
+
/**
|
|
10
|
+
* Selects the gate from the environment.
|
|
11
|
+
*
|
|
12
|
+
* `DECIONIS_API_KEY` unset: returns `local` itself, the same authority and
|
|
13
|
+
* verifier objects, with no client constructed and no network call. A caller
|
|
14
|
+
* that sets nothing gets exactly what it gets today.
|
|
15
|
+
*
|
|
16
|
+
* `DECIONIS_API_KEY` set: `DecionisGate` runs beside `local` through
|
|
17
|
+
* `ShadowGate`, in `DECIONIS_MODE` (`SHADOW` by default, `ENFORCEMENT` on
|
|
18
|
+
* request). `DECIONIS_TENANT_ID` is then required, because Decionis binds
|
|
19
|
+
* every intent to the key's own organization and refuses any other tenant.
|
|
20
|
+
* `DECIONIS_API_URL`, `DECIONIS_TIMEOUT_MS` and `DECIONIS_ALLOW_INSECURE_LOOPBACK`
|
|
21
|
+
* configure the connection the way the trusted executor's do.
|
|
22
|
+
*/
|
|
23
|
+
export function createGate(options) {
|
|
24
|
+
const env = options.env ?? process.env;
|
|
25
|
+
const apiKey = env["DECIONIS_API_KEY"]?.trim();
|
|
26
|
+
if (apiKey === undefined || apiKey === "") {
|
|
27
|
+
return { ...options.local, mode: "LOCAL", tenantId: options.tenantId };
|
|
28
|
+
}
|
|
29
|
+
const mode = evaluationMode(env["DECIONIS_MODE"]);
|
|
30
|
+
const tenantId = env["DECIONIS_TENANT_ID"]?.trim();
|
|
31
|
+
if (tenantId === undefined || tenantId === "") {
|
|
32
|
+
throw new Error("DECIONIS_TENANT_ID_MISSING");
|
|
33
|
+
}
|
|
34
|
+
const timeoutMs = timeout(env["DECIONIS_TIMEOUT_MS"]);
|
|
35
|
+
const connection = {
|
|
36
|
+
baseUrl: env["DECIONIS_API_URL"]?.trim() || DEFAULT_API_URL,
|
|
37
|
+
apiKey,
|
|
38
|
+
allowInsecureLoopback: env["DECIONIS_ALLOW_INSECURE_LOOPBACK"]?.trim() === "true",
|
|
39
|
+
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
40
|
+
...(options.fetch === undefined ? {} : { fetch: options.fetch }),
|
|
41
|
+
};
|
|
42
|
+
const hosted = new DecionisGate({
|
|
43
|
+
...connection,
|
|
44
|
+
mode,
|
|
45
|
+
...(options.source === undefined ? {} : { source: options.source }),
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
mode,
|
|
49
|
+
tenantId,
|
|
50
|
+
authority: new ShadowGate(options.local.authority, hosted, mode),
|
|
51
|
+
// Only an ENFORCEMENT decision carries a grant Decionis will let a
|
|
52
|
+
// verifier claim; a SHADOW decision keeps the local verifier and grant.
|
|
53
|
+
verifier: mode === "ENFORCEMENT" ? new DecionisGrantVerifier(connection) : options.local.verifier,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function evaluationMode(raw) {
|
|
57
|
+
const value = raw?.trim().toUpperCase();
|
|
58
|
+
if (value === undefined || value === "" || value === "SHADOW")
|
|
59
|
+
return "SHADOW";
|
|
60
|
+
if (value === "ENFORCE" || value === "ENFORCEMENT")
|
|
61
|
+
return "ENFORCEMENT";
|
|
62
|
+
throw new Error("DECIONIS_MODE_INVALID");
|
|
63
|
+
}
|
|
64
|
+
function timeout(raw) {
|
|
65
|
+
const value = raw?.trim();
|
|
66
|
+
if (value === undefined || value === "")
|
|
67
|
+
return undefined;
|
|
68
|
+
if (!TIMEOUT_PATTERN.test(value))
|
|
69
|
+
throw new Error("DECIONIS_TIMEOUT_MS_INVALID");
|
|
70
|
+
return Number(value);
|
|
71
|
+
}
|
|
72
|
+
const HOSTED_VALUES = new Set(["1", "true", "yes", "on"]);
|
|
73
|
+
/** Whether `DECIONIS_HOSTED` asks for the hosted gate. */
|
|
74
|
+
export function hostedRequested(env) {
|
|
75
|
+
const value = env["DECIONIS_HOSTED"]?.trim().toLowerCase();
|
|
76
|
+
return value !== undefined && HOSTED_VALUES.has(value);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Where a hosted run's key comes from, in order: the environment, the
|
|
80
|
+
* credential this user keeps for this authority, and when there is none and
|
|
81
|
+
* `DECIONIS_HOSTED` asks, a free provisional workspace minted now, kept for
|
|
82
|
+
* the next run and named on standard error once. Null when nothing asks for
|
|
83
|
+
* the hosted path at all.
|
|
84
|
+
*/
|
|
85
|
+
export async function resolveHostedCredentials(options = {}) {
|
|
86
|
+
const env = options.env ?? process.env;
|
|
87
|
+
const endpoint = env["DECIONIS_API_URL"]?.trim() || DEFAULT_API_URL;
|
|
88
|
+
const keyInEnvironment = env["DECIONIS_API_KEY"]?.trim() ?? "";
|
|
89
|
+
if (keyInEnvironment !== "") {
|
|
90
|
+
const tenantId = env["DECIONIS_TENANT_ID"]?.trim();
|
|
91
|
+
if (tenantId === undefined || tenantId === "")
|
|
92
|
+
throw new Error("DECIONIS_TENANT_ID_MISSING");
|
|
93
|
+
return {
|
|
94
|
+
credentials: {
|
|
95
|
+
source: "environment",
|
|
96
|
+
tenantId,
|
|
97
|
+
endpoint,
|
|
98
|
+
path: null,
|
|
99
|
+
provisional: false,
|
|
100
|
+
claim: null,
|
|
101
|
+
},
|
|
102
|
+
apiKey: keyInEnvironment,
|
|
103
|
+
env,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (!hostedRequested(env))
|
|
107
|
+
return null;
|
|
108
|
+
if (env["NODE_ENV"] === "production")
|
|
109
|
+
throw new Error("DECIONIS_HOSTED_REFUSED_IN_PRODUCTION");
|
|
110
|
+
const storeOptions = options.store === false
|
|
111
|
+
? null
|
|
112
|
+
: {
|
|
113
|
+
env,
|
|
114
|
+
...(options.store?.home === undefined ? {} : { home: options.store.home }),
|
|
115
|
+
...(options.store?.files === undefined ? {} : { files: options.store.files }),
|
|
116
|
+
};
|
|
117
|
+
const stored = storeOptions === null ? null : readStoredCredentials(storeOptions);
|
|
118
|
+
if (stored !== null &&
|
|
119
|
+
stored.tenantId !== null &&
|
|
120
|
+
(stored.endpoint ?? DEFAULT_API_URL) === endpoint) {
|
|
121
|
+
return {
|
|
122
|
+
credentials: {
|
|
123
|
+
source: "stored",
|
|
124
|
+
tenantId: stored.tenantId,
|
|
125
|
+
endpoint,
|
|
126
|
+
path: storeOptions === null ? null : credentialsPath(storeOptions),
|
|
127
|
+
provisional: stored.provisional === true,
|
|
128
|
+
claim: null,
|
|
129
|
+
},
|
|
130
|
+
apiKey: stored.apiKey,
|
|
131
|
+
env: { ...env, DECIONIS_API_KEY: stored.apiKey, DECIONIS_TENANT_ID: stored.tenantId },
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const workspace = await (options.provision ?? provisionWorkspace)({
|
|
135
|
+
baseUrl: endpoint,
|
|
136
|
+
allowInsecureLoopback: env["DECIONIS_ALLOW_INSECURE_LOOPBACK"]?.trim() === "true",
|
|
137
|
+
...(options.fetch === undefined ? {} : { fetch: options.fetch }),
|
|
138
|
+
...(options.source === undefined ? {} : { source: options.source }),
|
|
139
|
+
...(options.source?.example === undefined
|
|
140
|
+
? {}
|
|
141
|
+
: { agentName: `agent-safe-pipeline ${options.source.example}` }),
|
|
142
|
+
});
|
|
143
|
+
const path = storeOptions === null
|
|
144
|
+
? null
|
|
145
|
+
: writeStoredCredentials(storeOptions, {
|
|
146
|
+
apiKey: workspace.rawKey,
|
|
147
|
+
tenantId: workspace.orgId,
|
|
148
|
+
endpoint,
|
|
149
|
+
provisional: true,
|
|
150
|
+
});
|
|
151
|
+
const notice = options.notice ??
|
|
152
|
+
((line) => {
|
|
153
|
+
process.stderr.write(`${line}\n`);
|
|
154
|
+
});
|
|
155
|
+
const decisions = workspace.limits["governed_decisions_per_month"];
|
|
156
|
+
notice(`decionis: provisioned a free workspace ${workspace.orgId} (provisional, no account${typeof decisions === "number" ? `; ${String(decisions)} governed decisions a month` : ""})`);
|
|
157
|
+
notice(path === null
|
|
158
|
+
? "decionis: the key was not stored; the next run mints another workspace"
|
|
159
|
+
: `decionis: key stored at ${path}; the next run reuses this workspace`);
|
|
160
|
+
const note = workspace.claim["note"];
|
|
161
|
+
if (typeof note === "string" && note.length <= 500)
|
|
162
|
+
notice(`decionis: ${note}`);
|
|
163
|
+
return {
|
|
164
|
+
credentials: {
|
|
165
|
+
source: "provisioned",
|
|
166
|
+
tenantId: workspace.orgId,
|
|
167
|
+
endpoint,
|
|
168
|
+
path,
|
|
169
|
+
provisional: true,
|
|
170
|
+
claim: workspace.claim,
|
|
171
|
+
},
|
|
172
|
+
apiKey: workspace.rawKey,
|
|
173
|
+
env: { ...env, DECIONIS_API_KEY: workspace.rawKey, DECIONIS_TENANT_ID: workspace.orgId },
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* The gate `createGate` selects, with one more way onto Decionis: a single
|
|
178
|
+
* variable. `DECIONIS_HOSTED=1` with no key means the key this user already
|
|
179
|
+
* keeps for this authority, and when there is none, a free provisional
|
|
180
|
+
* workspace minted now, kept for the next run, and named on standard error
|
|
181
|
+
* once. A key in the environment still wins, and no variable at all is
|
|
182
|
+
* still the local pair. A provisional key evaluates in `SHADOW` only:
|
|
183
|
+
* recorded beside the local verdict, with a signed dossier, never governing
|
|
184
|
+
* execution; an owned key set in the environment takes the mode asked for.
|
|
185
|
+
*/
|
|
186
|
+
export async function createHostedGate(options) {
|
|
187
|
+
const env = options.env ?? process.env;
|
|
188
|
+
const resolved = await resolveHostedCredentials(options);
|
|
189
|
+
if (resolved === null) {
|
|
190
|
+
return { ...createGate(options), credentials: null, fetchDossier: null };
|
|
191
|
+
}
|
|
192
|
+
const { credentials, apiKey } = resolved;
|
|
193
|
+
const gate = createGate({
|
|
194
|
+
...options,
|
|
195
|
+
env: credentials.provisional ? { ...resolved.env, DECIONIS_MODE: "SHADOW" } : resolved.env,
|
|
196
|
+
});
|
|
197
|
+
return {
|
|
198
|
+
...gate,
|
|
199
|
+
credentials,
|
|
200
|
+
fetchDossier: (dossierId) => fetchSignedDossier({
|
|
201
|
+
baseUrl: credentials.endpoint,
|
|
202
|
+
apiKey,
|
|
203
|
+
tenantId: credentials.tenantId,
|
|
204
|
+
dossierId,
|
|
205
|
+
allowInsecureLoopback: env["DECIONIS_ALLOW_INSECURE_LOOPBACK"]?.trim() === "true",
|
|
206
|
+
...(options.fetch === undefined ? {} : { fetch: options.fetch }),
|
|
207
|
+
...(options.source === undefined ? {} : { source: options.source }),
|
|
208
|
+
}),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=CreateGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateGate.js","sourceRoot":"","sources":["../../src/decision/CreateGate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,124 @@
|
|
|
1
|
+
import { type Credential } from "../http/Credential.js";
|
|
2
|
+
import { type ClientSource } from "../http/ClientIdentification.js";
|
|
1
3
|
import type { CapturedIntent } from "../intent/ExecutionIntent.js";
|
|
2
|
-
import { type DecisionAuthority, type DecisionEvidence, type GateDecision } from "./DecisionAuthority.js";
|
|
4
|
+
import { type DecisionAuthority, type DecisionEvaluationMode, type DecisionEvaluationOptions, type DecisionEvidence, type GateDecision, type ManagedEscalationState } from "./DecisionAuthority.js";
|
|
5
|
+
export type ManagedEscalationPendingStatus = "PENDING_PRESENCE" | "PRESENCE_REQUESTED" | "AWAITING_APPROVER" | "PRESENCE_VERIFIED" | "REAUTHORIZING";
|
|
6
|
+
export type ManagedEscalationBlockedStatus = "EXPIRED" | "REJECTED" | "BLOCKED" | "CANCELLED";
|
|
7
|
+
interface ManagedEscalationStatusBase {
|
|
8
|
+
readonly escalationId: string;
|
|
9
|
+
readonly intentId: string;
|
|
10
|
+
readonly actionHash: string;
|
|
11
|
+
readonly expiresAt: string;
|
|
12
|
+
readonly reasonCodes: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
/** Strict, secret-free view of one Decionis-managed Presence escalation. */
|
|
15
|
+
export type ManagedEscalationStatusResult = ManagedEscalationStatusBase & ({
|
|
16
|
+
readonly status: ManagedEscalationPendingStatus;
|
|
17
|
+
readonly outcome: "ESCALATE_PENDING";
|
|
18
|
+
readonly decision: null;
|
|
19
|
+
} | {
|
|
20
|
+
readonly status: "GRANT_READY";
|
|
21
|
+
readonly outcome: "ALLOW";
|
|
22
|
+
readonly decision: GateDecision;
|
|
23
|
+
} | {
|
|
24
|
+
readonly status: ManagedEscalationBlockedStatus;
|
|
25
|
+
readonly outcome: "BLOCK";
|
|
26
|
+
readonly decision: null;
|
|
27
|
+
} | {
|
|
28
|
+
readonly status: "FAILED";
|
|
29
|
+
readonly outcome: "ERROR";
|
|
30
|
+
readonly decision: null;
|
|
31
|
+
});
|
|
32
|
+
export interface ManagedEscalationStatusOptions {
|
|
33
|
+
readonly signal?: AbortSignal;
|
|
34
|
+
/** Injectable epoch-millisecond clock for deterministic tests. */
|
|
35
|
+
readonly clock?: () => number;
|
|
36
|
+
}
|
|
37
|
+
export interface ManagedAuthorizationWaitOptions extends ManagedEscalationStatusOptions {
|
|
38
|
+
readonly maxAttempts?: number;
|
|
39
|
+
readonly initialDelayMs?: number;
|
|
40
|
+
readonly maxDelayMs?: number;
|
|
41
|
+
readonly sleep?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
|
|
42
|
+
/** Injectable [0, 1] jitter source for deterministic tests. */
|
|
43
|
+
readonly random?: () => number;
|
|
44
|
+
}
|
|
3
45
|
export interface DecionisGateOptions {
|
|
4
46
|
readonly baseUrl: string;
|
|
5
|
-
|
|
47
|
+
/**
|
|
48
|
+
* The server-side Decionis credential, as a value or as a function read at
|
|
49
|
+
* the moment of use. A deployment whose credential rotates gives the
|
|
50
|
+
* function: the next request carries the new value, and a request already
|
|
51
|
+
* in flight keeps the one it started with, without anyone rebuilding this
|
|
52
|
+
* client and the executor around it.
|
|
53
|
+
*/
|
|
54
|
+
readonly apiKey: Credential;
|
|
6
55
|
readonly timeoutMs?: number;
|
|
7
56
|
readonly fetch?: typeof fetch;
|
|
8
57
|
readonly allowInsecureLoopback?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* `ENFORCEMENT` (default) asks Decionis for an executable decision.
|
|
60
|
+
* `SHADOW` asks Decionis to evaluate and record the exact intent without
|
|
61
|
+
* issuing a grant; the gate then never returns an authorization, even if a
|
|
62
|
+
* response carries one.
|
|
63
|
+
*/
|
|
64
|
+
readonly mode?: DecisionEvaluationMode;
|
|
65
|
+
/**
|
|
66
|
+
* Where this integration came from, carried in the `User-Agent` of every
|
|
67
|
+
* call beside the package name and version. It is client identification
|
|
68
|
+
* for the authority's own accounting: not decision input, not part of the
|
|
69
|
+
* intent or its hash, and not part of the record the authority leaves.
|
|
70
|
+
*/
|
|
71
|
+
readonly source?: ClientSource;
|
|
9
72
|
}
|
|
10
73
|
export declare class DecionisGate implements DecisionAuthority {
|
|
74
|
+
readonly evaluationMode: DecisionEvaluationMode;
|
|
11
75
|
private readonly baseUrl;
|
|
12
76
|
private readonly apiKey;
|
|
13
77
|
private readonly timeoutMs;
|
|
14
78
|
private readonly fetchImpl;
|
|
79
|
+
private readonly userAgent;
|
|
80
|
+
private readonly pendingAuthorizationWaits;
|
|
15
81
|
constructor(options: DecionisGateOptions);
|
|
16
|
-
evaluate(captured: CapturedIntent, evidence?: DecisionEvidence): Promise<GateDecision>;
|
|
82
|
+
evaluate(captured: CapturedIntent, evidence?: DecisionEvidence, options?: DecisionEvaluationOptions): Promise<GateDecision>;
|
|
83
|
+
/** Performs one authenticated, read-only status lookup against Decionis. */
|
|
84
|
+
getManagedEscalationStatus(captured: CapturedIntent, escalation: ManagedEscalationState, options?: ManagedEscalationStatusOptions): Promise<ManagedEscalationStatusResult>;
|
|
85
|
+
/**
|
|
86
|
+
* Waits only on Decionis. Presence credentials, invitation locators, and
|
|
87
|
+
* receipt evidence never cross this client boundary in managed mode.
|
|
88
|
+
*/
|
|
89
|
+
waitForAuthorization(captured: CapturedIntent, pendingDecision: GateDecision, options?: ManagedAuthorizationWaitOptions): Promise<GateDecision>;
|
|
90
|
+
private waitForAuthorizationInternal;
|
|
91
|
+
private decisionFromResponse;
|
|
92
|
+
private initialManagedState;
|
|
93
|
+
private statusResult;
|
|
94
|
+
private expectedStateFailure;
|
|
95
|
+
private statusBindingFailure;
|
|
96
|
+
private managedDeadline;
|
|
97
|
+
private waitBoundaryFailure;
|
|
98
|
+
private terminalWaitDecision;
|
|
99
|
+
private expiredWaitDecision;
|
|
100
|
+
private failedWaitDecision;
|
|
101
|
+
private failedManagedStatus;
|
|
102
|
+
private expiredManagedStatus;
|
|
103
|
+
private failedStatusFromBase;
|
|
104
|
+
private validEscalationRequest;
|
|
105
|
+
private static managedStateFromWire;
|
|
106
|
+
private static managedStateFromStatus;
|
|
107
|
+
private static managedStateFromStatusResult;
|
|
108
|
+
private static isPendingStatus;
|
|
109
|
+
private static validManagedStateSemantics;
|
|
110
|
+
private static waitConfiguration;
|
|
111
|
+
private static backoffDelay;
|
|
112
|
+
private static boundedSleep;
|
|
113
|
+
private static sleep;
|
|
114
|
+
private static clockNow;
|
|
115
|
+
private static signalAborted;
|
|
116
|
+
private static isBoundedIdentifier;
|
|
117
|
+
/**
|
|
118
|
+
* The contract returns an `ERROR` decision body on 409 and 503 so the
|
|
119
|
+
* refusal is evidence-bearing. Anything else fails closed generically.
|
|
120
|
+
*/
|
|
121
|
+
private static failedResponse;
|
|
17
122
|
}
|
|
123
|
+
export {};
|
|
18
124
|
//# sourceMappingURL=DecionisGate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DecionisGate.d.ts","sourceRoot":"","sources":["../../src/decision/DecionisGate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DecionisGate.d.ts","sourceRoot":"","sources":["../../src/decision/DecionisGate.ts"],"names":[],"mappings":"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"}
|