@decionis/agent-safe-pipeline 0.1.2 → 0.1.3
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 +8 -2
- package/dist/approval/PresenceApprovalCoordinator.d.ts +43 -5
- package/dist/approval/PresenceApprovalCoordinator.d.ts.map +1 -1
- package/dist/approval/PresenceApprovalCoordinator.js +250 -31
- package/dist/approval/PresenceApprovalCoordinator.js.map +1 -1
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -4,10 +4,16 @@ TypeScript reference implementation of Agent-Safe Pipeline: capture an immutable
|
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Install the latest stable release:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
10
|
+
npm install @decionis/agent-safe-pipeline
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
To evaluate this prerelease explicitly:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @decionis/agent-safe-pipeline@0.1.3-rc.2
|
|
11
17
|
```
|
|
12
18
|
|
|
13
19
|
Production credentials belong in the trusted executor process, never the agent runtime:
|
|
@@ -3,16 +3,54 @@ import type { DecisionAuthority, GateDecision } from "../decision/DecisionAuthor
|
|
|
3
3
|
import type { CapturedIntent } from "../intent/ExecutionIntent.js";
|
|
4
4
|
export type PresenceGateResult = GateResult;
|
|
5
5
|
export type PresenceApprovalClient = Pick<HumanApprovalGate, "gate" | "outcome">;
|
|
6
|
+
export interface PresenceApprovalCoordinatorOptions {
|
|
7
|
+
/** Maximum number of outcome lookups after Presence returns HUMAN_REQUIRED. */
|
|
8
|
+
readonly maxAttempts?: number;
|
|
9
|
+
/** Initial exponential-backoff delay in milliseconds. */
|
|
10
|
+
readonly initialDelayMs?: number;
|
|
11
|
+
/** Maximum exponential-backoff delay in milliseconds. */
|
|
12
|
+
readonly maxDelayMs?: number;
|
|
13
|
+
/** Maximum wall-clock duration spent waiting for a terminal Presence outcome. */
|
|
14
|
+
readonly deadlineMs?: number;
|
|
15
|
+
/** Injectable epoch-millisecond clock for deterministic tests. */
|
|
16
|
+
readonly clock?: () => number;
|
|
17
|
+
/** Injectable abort-aware sleeper for deterministic tests. */
|
|
18
|
+
readonly sleep?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
|
|
19
|
+
/** Injectable [0, 1] jitter source for deterministic tests. */
|
|
20
|
+
readonly random?: () => number;
|
|
21
|
+
}
|
|
22
|
+
export interface PresenceResolutionOptions {
|
|
23
|
+
readonly signal?: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Coordinates a Presence human-approval flow and deliberately returns the
|
|
27
|
+
* terminal receipt to Decionis for a fresh authorization decision.
|
|
28
|
+
*
|
|
29
|
+
* A Presence PROCEED result is evidence, not executable authority.
|
|
30
|
+
*/
|
|
6
31
|
export declare class PresenceApprovalCoordinator {
|
|
7
32
|
private readonly presence;
|
|
8
33
|
private readonly authority;
|
|
9
34
|
private readonly organization;
|
|
10
35
|
private readonly approverId;
|
|
11
|
-
|
|
36
|
+
private readonly polling;
|
|
37
|
+
constructor(presence: PresenceApprovalClient, authority: DecisionAuthority, organization: string, approverId: string, options?: PresenceApprovalCoordinatorOptions);
|
|
12
38
|
request(captured: CapturedIntent): Promise<PresenceGateResult>;
|
|
13
|
-
resolveAndReauthorize(captured: CapturedIntent, result: PresenceGateResult): Promise<GateDecision>;
|
|
14
|
-
private
|
|
15
|
-
private
|
|
16
|
-
private
|
|
39
|
+
resolveAndReauthorize(captured: CapturedIntent, result: PresenceGateResult, options?: PresenceResolutionOptions): Promise<GateDecision>;
|
|
40
|
+
private terminalResult;
|
|
41
|
+
private lookupOutcome;
|
|
42
|
+
private evaluateAuthority;
|
|
43
|
+
private boundedOperation;
|
|
44
|
+
private pollingBoundaryFailure;
|
|
45
|
+
private boundaryFailure;
|
|
46
|
+
private backoffDelay;
|
|
47
|
+
private clockNow;
|
|
48
|
+
private verdictOf;
|
|
49
|
+
private requestIdOf;
|
|
50
|
+
private evidenceOf;
|
|
51
|
+
private boundedIdentifier;
|
|
52
|
+
private isRecord;
|
|
53
|
+
private static pollingConfiguration;
|
|
54
|
+
private static sleep;
|
|
17
55
|
}
|
|
18
56
|
//# sourceMappingURL=PresenceApprovalCoordinator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresenceApprovalCoordinator.d.ts","sourceRoot":"","sources":["../../src/approval/PresenceApprovalCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAEb,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC5C,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEjF,qBAAa,2BAA2B;
|
|
1
|
+
{"version":3,"file":"PresenceApprovalCoordinator.d.ts","sourceRoot":"","sources":["../../src/approval/PresenceApprovalCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAEb,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC5C,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEjF,MAAM,WAAW,kCAAkC;IACjD,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,yDAAyD;IACzD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AA4BD;;;;;GAKG;AACH,qBAAa,2BAA2B;IAIpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAG5B,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EACnC,OAAO,GAAE,kCAAuC;IAKrC,OAAO,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwC9D,qBAAqB,CAChC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,YAAY,CAAC;YAyCV,cAAc;YA2Fd,aAAa;YAiBb,iBAAiB;YAqBjB,gBAAgB;IAgC9B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM,CAAC,oBAAoB;mBAuCd,KAAK;CAkB3B"}
|
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
import { FailClosedDecision } from "../decision/DecisionAuthority.js";
|
|
2
|
+
const DEFAULT_MAX_ATTEMPTS = 20;
|
|
3
|
+
const DEFAULT_INITIAL_DELAY_MS = 250;
|
|
4
|
+
const DEFAULT_MAX_DELAY_MS = 2_000;
|
|
5
|
+
const DEFAULT_DEADLINE_MS = 60_000;
|
|
6
|
+
const MAX_ATTEMPTS_LIMIT = 100;
|
|
7
|
+
const MAX_DELAY_LIMIT_MS = 60_000;
|
|
8
|
+
const MAX_DEADLINE_LIMIT_MS = 300_000;
|
|
9
|
+
/**
|
|
10
|
+
* Coordinates a Presence human-approval flow and deliberately returns the
|
|
11
|
+
* terminal receipt to Decionis for a fresh authorization decision.
|
|
12
|
+
*
|
|
13
|
+
* A Presence PROCEED result is evidence, not executable authority.
|
|
14
|
+
*/
|
|
2
15
|
export class PresenceApprovalCoordinator {
|
|
3
16
|
presence;
|
|
4
17
|
authority;
|
|
5
18
|
organization;
|
|
6
19
|
approverId;
|
|
7
|
-
|
|
20
|
+
polling;
|
|
21
|
+
constructor(presence, authority, organization, approverId, options = {}) {
|
|
8
22
|
this.presence = presence;
|
|
9
23
|
this.authority = authority;
|
|
10
24
|
this.organization = organization;
|
|
11
25
|
this.approverId = approverId;
|
|
26
|
+
this.polling = PresenceApprovalCoordinator.pollingConfiguration(options);
|
|
12
27
|
}
|
|
13
28
|
async request(captured) {
|
|
14
29
|
try {
|
|
@@ -35,8 +50,9 @@ export class PresenceApprovalCoordinator {
|
|
|
35
50
|
],
|
|
36
51
|
},
|
|
37
52
|
}, `presence:${captured.intent.idempotencyKey}`);
|
|
38
|
-
|
|
39
|
-
|
|
53
|
+
const verdict = this.verdictOf(result);
|
|
54
|
+
if (verdict === null || (verdict === "HUMAN_REQUIRED" && this.requestIdOf(result) === null)) {
|
|
55
|
+
throw new Error("Presence returned an invalid gate response");
|
|
40
56
|
}
|
|
41
57
|
return result;
|
|
42
58
|
}
|
|
@@ -44,53 +60,189 @@ export class PresenceApprovalCoordinator {
|
|
|
44
60
|
throw new Error("PRESENCE_REQUEST_FAILED");
|
|
45
61
|
}
|
|
46
62
|
}
|
|
47
|
-
async resolveAndReauthorize(captured, result) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
result.verdict === "HUMAN_REQUIRED" && result.request_id !== undefined
|
|
52
|
-
? await this.presence.outcome(result.request_id)
|
|
53
|
-
: result;
|
|
63
|
+
async resolveAndReauthorize(captured, result, options = {}) {
|
|
64
|
+
const initialBoundaryFailure = this.boundaryFailure(captured, options.signal);
|
|
65
|
+
if (initialBoundaryFailure !== null) {
|
|
66
|
+
return FailClosedDecision.create(captured.intentHash, initialBoundaryFailure);
|
|
54
67
|
}
|
|
55
|
-
|
|
56
|
-
|
|
68
|
+
const resolution = await this.terminalResult(captured, result, options.signal);
|
|
69
|
+
if (resolution.reasonCode !== undefined) {
|
|
70
|
+
return FailClosedDecision.create(captured.intentHash, resolution.reasonCode);
|
|
57
71
|
}
|
|
58
|
-
const verdict =
|
|
72
|
+
const verdict = this.verdictOf(resolution.result);
|
|
59
73
|
if (verdict === null) {
|
|
60
74
|
return FailClosedDecision.create(captured.intentHash, "PRESENCE_RESPONSE_INVALID");
|
|
61
75
|
}
|
|
62
76
|
if (verdict !== "PROCEED") {
|
|
63
77
|
return FailClosedDecision.create(captured.intentHash, `PRESENCE_${verdict}`);
|
|
64
78
|
}
|
|
65
|
-
const evidence =
|
|
79
|
+
const evidence = this.evidenceOf(resolution.result);
|
|
66
80
|
if (evidence === null) {
|
|
67
81
|
return FailClosedDecision.create(captured.intentHash, "PRESENCE_PROOF_MISSING");
|
|
68
82
|
}
|
|
83
|
+
const preAuthorizationFailure = this.boundaryFailure(captured, options.signal);
|
|
84
|
+
if (preAuthorizationFailure !== null) {
|
|
85
|
+
return FailClosedDecision.create(captured.intentHash, preAuthorizationFailure);
|
|
86
|
+
}
|
|
87
|
+
const evaluation = await this.evaluateAuthority(captured, evidence, options.signal);
|
|
88
|
+
if (evaluation.reasonCode !== undefined) {
|
|
89
|
+
return FailClosedDecision.create(captured.intentHash, evaluation.reasonCode);
|
|
90
|
+
}
|
|
91
|
+
const postAuthorizationFailure = this.boundaryFailure(captured, options.signal);
|
|
92
|
+
return postAuthorizationFailure === null
|
|
93
|
+
? evaluation.value
|
|
94
|
+
: FailClosedDecision.create(captured.intentHash, postAuthorizationFailure);
|
|
95
|
+
}
|
|
96
|
+
async terminalResult(captured, initialResult, signal) {
|
|
97
|
+
const initialVerdict = this.verdictOf(initialResult);
|
|
98
|
+
if (initialVerdict === null) {
|
|
99
|
+
return { reasonCode: "PRESENCE_RESPONSE_INVALID" };
|
|
100
|
+
}
|
|
101
|
+
if (initialVerdict !== "HUMAN_REQUIRED") {
|
|
102
|
+
return { result: initialResult };
|
|
103
|
+
}
|
|
104
|
+
const requestId = this.requestIdOf(initialResult);
|
|
105
|
+
if (requestId === null) {
|
|
106
|
+
return { reasonCode: "PRESENCE_RESPONSE_INVALID" };
|
|
107
|
+
}
|
|
108
|
+
const startedAt = this.clockNow();
|
|
109
|
+
const intentExpiresAt = Date.parse(captured.intent.expiresAt);
|
|
110
|
+
if (startedAt === null || !Number.isFinite(intentExpiresAt)) {
|
|
111
|
+
return { reasonCode: "PRESENCE_CLOCK_INVALID" };
|
|
112
|
+
}
|
|
113
|
+
const pollingDeadline = Math.min(startedAt + this.polling.deadlineMs, intentExpiresAt);
|
|
114
|
+
const deadlineReason = intentExpiresAt <= startedAt + this.polling.deadlineMs
|
|
115
|
+
? "PRESENCE_INTENT_EXPIRED"
|
|
116
|
+
: "PRESENCE_TIMEOUT";
|
|
117
|
+
for (let attempt = 1; attempt <= this.polling.maxAttempts; attempt += 1) {
|
|
118
|
+
const boundaryFailure = this.pollingBoundaryFailure(captured, pollingDeadline, signal);
|
|
119
|
+
if (boundaryFailure !== null) {
|
|
120
|
+
return { reasonCode: boundaryFailure };
|
|
121
|
+
}
|
|
122
|
+
const lookup = await this.lookupOutcome(requestId, pollingDeadline, deadlineReason, signal);
|
|
123
|
+
if (lookup.reasonCode !== undefined) {
|
|
124
|
+
return { reasonCode: lookup.reasonCode };
|
|
125
|
+
}
|
|
126
|
+
const verdict = this.verdictOf(lookup.value);
|
|
127
|
+
if (verdict === null) {
|
|
128
|
+
return { reasonCode: "PRESENCE_RESPONSE_INVALID" };
|
|
129
|
+
}
|
|
130
|
+
if (verdict !== "HUMAN_REQUIRED") {
|
|
131
|
+
if (verdict === "PROCEED" && this.requestIdOf(lookup.value) !== requestId) {
|
|
132
|
+
return { reasonCode: "PRESENCE_RESPONSE_INVALID" };
|
|
133
|
+
}
|
|
134
|
+
return { result: lookup.value };
|
|
135
|
+
}
|
|
136
|
+
if (this.requestIdOf(lookup.value) !== requestId) {
|
|
137
|
+
return { reasonCode: "PRESENCE_RESPONSE_INVALID" };
|
|
138
|
+
}
|
|
139
|
+
if (attempt === this.polling.maxAttempts) {
|
|
140
|
+
return { reasonCode: "PRESENCE_TIMEOUT" };
|
|
141
|
+
}
|
|
142
|
+
const delayMs = this.backoffDelay(attempt);
|
|
143
|
+
if (delayMs === null) {
|
|
144
|
+
return { reasonCode: "PRESENCE_POLLING_RANDOM_INVALID" };
|
|
145
|
+
}
|
|
146
|
+
const now = this.clockNow();
|
|
147
|
+
if (now === null) {
|
|
148
|
+
return { reasonCode: "PRESENCE_CLOCK_INVALID" };
|
|
149
|
+
}
|
|
150
|
+
const remainingMs = pollingDeadline - now;
|
|
151
|
+
if (remainingMs <= 0) {
|
|
152
|
+
const reasonCode = this.pollingBoundaryFailure(captured, pollingDeadline, signal);
|
|
153
|
+
return { reasonCode: reasonCode ?? "PRESENCE_TIMEOUT" };
|
|
154
|
+
}
|
|
155
|
+
const backoff = await this.boundedOperation(async () => await this.polling.sleep(Math.min(delayMs, remainingMs), signal), remainingMs, deadlineReason, "PRESENCE_UNAVAILABLE", signal);
|
|
156
|
+
if (backoff.reasonCode !== undefined) {
|
|
157
|
+
return { reasonCode: backoff.reasonCode };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return { reasonCode: "PRESENCE_TIMEOUT" };
|
|
161
|
+
}
|
|
162
|
+
async lookupOutcome(requestId, pollingDeadline, deadlineReason, signal) {
|
|
163
|
+
const now = this.clockNow();
|
|
164
|
+
if (now === null)
|
|
165
|
+
return { reasonCode: "PRESENCE_CLOCK_INVALID" };
|
|
166
|
+
return await this.boundedOperation(async () => await this.presence.outcome(requestId), pollingDeadline - now, deadlineReason, "PRESENCE_UNAVAILABLE", signal);
|
|
167
|
+
}
|
|
168
|
+
async evaluateAuthority(captured, evidence, signal) {
|
|
169
|
+
const boundaryFailure = this.boundaryFailure(captured, signal);
|
|
170
|
+
if (boundaryFailure !== null) {
|
|
171
|
+
return { reasonCode: boundaryFailure };
|
|
172
|
+
}
|
|
173
|
+
const now = this.clockNow();
|
|
174
|
+
if (now === null)
|
|
175
|
+
return { reasonCode: "PRESENCE_CLOCK_INVALID" };
|
|
176
|
+
return await this.boundedOperation(async () => await this.authority.evaluate(captured, { humanApproval: evidence }), Date.parse(captured.intent.expiresAt) - now, "PRESENCE_INTENT_EXPIRED", "AUTHORITY_UNAVAILABLE", signal);
|
|
177
|
+
}
|
|
178
|
+
async boundedOperation(operation, timeoutMs, timeoutReason, failureReason, signal) {
|
|
179
|
+
if (signal?.aborted === true)
|
|
180
|
+
return { reasonCode: "PRESENCE_ABORTED" };
|
|
181
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
|
|
182
|
+
return { reasonCode: timeoutReason };
|
|
183
|
+
return await new Promise((resolve) => {
|
|
184
|
+
let settled = false;
|
|
185
|
+
const settle = (value) => {
|
|
186
|
+
if (settled)
|
|
187
|
+
return;
|
|
188
|
+
settled = true;
|
|
189
|
+
clearTimeout(timer);
|
|
190
|
+
signal?.removeEventListener("abort", onAbort);
|
|
191
|
+
resolve(value);
|
|
192
|
+
};
|
|
193
|
+
const onAbort = () => settle({ reasonCode: "PRESENCE_ABORTED" });
|
|
194
|
+
const timer = setTimeout(() => settle({ reasonCode: timeoutReason }), timeoutMs);
|
|
195
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
196
|
+
void Promise.resolve()
|
|
197
|
+
.then(operation)
|
|
198
|
+
.then((value) => settle({ value }), () => settle({ reasonCode: failureReason }));
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
pollingBoundaryFailure(captured, pollingDeadline, signal) {
|
|
202
|
+
const generalFailure = this.boundaryFailure(captured, signal);
|
|
203
|
+
if (generalFailure !== null)
|
|
204
|
+
return generalFailure;
|
|
205
|
+
const now = this.clockNow();
|
|
206
|
+
if (now === null)
|
|
207
|
+
return "PRESENCE_CLOCK_INVALID";
|
|
208
|
+
return now >= pollingDeadline ? "PRESENCE_TIMEOUT" : null;
|
|
209
|
+
}
|
|
210
|
+
boundaryFailure(captured, signal) {
|
|
211
|
+
if (signal?.aborted === true)
|
|
212
|
+
return "PRESENCE_ABORTED";
|
|
213
|
+
const now = this.clockNow();
|
|
214
|
+
const intentExpiresAt = Date.parse(captured.intent.expiresAt);
|
|
215
|
+
if (now === null || !Number.isFinite(intentExpiresAt))
|
|
216
|
+
return "PRESENCE_CLOCK_INVALID";
|
|
217
|
+
return now >= intentExpiresAt ? "PRESENCE_INTENT_EXPIRED" : null;
|
|
218
|
+
}
|
|
219
|
+
backoffDelay(attempt) {
|
|
220
|
+
let random;
|
|
69
221
|
try {
|
|
70
|
-
|
|
222
|
+
random = this.polling.random();
|
|
71
223
|
}
|
|
72
224
|
catch {
|
|
73
|
-
return
|
|
225
|
+
return null;
|
|
74
226
|
}
|
|
227
|
+
if (!Number.isFinite(random) || random < 0 || random > 1)
|
|
228
|
+
return null;
|
|
229
|
+
const exponentialDelay = this.polling.initialDelayMs * 2 ** Math.min(attempt - 1, 30);
|
|
230
|
+
const cappedDelay = Math.min(exponentialDelay, this.polling.maxDelayMs);
|
|
231
|
+
return Math.max(1, Math.floor(cappedDelay * (0.5 + random * 0.5)));
|
|
75
232
|
}
|
|
76
|
-
|
|
77
|
-
|
|
233
|
+
clockNow() {
|
|
234
|
+
try {
|
|
235
|
+
const now = this.polling.clock();
|
|
236
|
+
return Number.isFinite(now) ? now : null;
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
78
239
|
return null;
|
|
79
|
-
const candidate = result;
|
|
80
|
-
if (PresenceApprovalCoordinator.isBoundedIdentifier(candidate.receipt_dossier_id) &&
|
|
81
|
-
PresenceApprovalCoordinator.isBoundedIdentifier(candidate.request_id)) {
|
|
82
|
-
return {
|
|
83
|
-
provider: "presence",
|
|
84
|
-
requestId: candidate.request_id,
|
|
85
|
-
receiptDossierId: candidate.receipt_dossier_id,
|
|
86
|
-
};
|
|
87
240
|
}
|
|
88
|
-
return null;
|
|
89
241
|
}
|
|
90
|
-
|
|
91
|
-
if (result
|
|
242
|
+
verdictOf(result) {
|
|
243
|
+
if (!this.isRecord(result))
|
|
92
244
|
return null;
|
|
93
|
-
const verdict = result
|
|
245
|
+
const verdict = result["verdict"];
|
|
94
246
|
return verdict === "PROCEED" ||
|
|
95
247
|
verdict === "HUMAN_REQUIRED" ||
|
|
96
248
|
verdict === "DENIED" ||
|
|
@@ -98,8 +250,75 @@ export class PresenceApprovalCoordinator {
|
|
|
98
250
|
? verdict
|
|
99
251
|
: null;
|
|
100
252
|
}
|
|
101
|
-
|
|
253
|
+
requestIdOf(result) {
|
|
254
|
+
if (!this.isRecord(result))
|
|
255
|
+
return null;
|
|
256
|
+
const requestId = result["request_id"];
|
|
257
|
+
return this.boundedIdentifier(requestId) ? requestId : null;
|
|
258
|
+
}
|
|
259
|
+
evidenceOf(result) {
|
|
260
|
+
if (!this.isRecord(result))
|
|
261
|
+
return null;
|
|
262
|
+
const requestId = result["request_id"];
|
|
263
|
+
const receiptDossierId = result["receipt_dossier_id"];
|
|
264
|
+
if (!this.boundedIdentifier(requestId) || !this.boundedIdentifier(receiptDossierId))
|
|
265
|
+
return null;
|
|
266
|
+
return { provider: "presence", requestId, receiptDossierId };
|
|
267
|
+
}
|
|
268
|
+
boundedIdentifier(value) {
|
|
102
269
|
return typeof value === "string" && value.length > 0 && value.length <= 200;
|
|
103
270
|
}
|
|
271
|
+
isRecord(value) {
|
|
272
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
273
|
+
}
|
|
274
|
+
static pollingConfiguration(options) {
|
|
275
|
+
const maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
276
|
+
const initialDelayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS;
|
|
277
|
+
const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
|
|
278
|
+
const deadlineMs = options.deadlineMs ?? DEFAULT_DEADLINE_MS;
|
|
279
|
+
if (!Number.isInteger(maxAttempts) ||
|
|
280
|
+
maxAttempts < 1 ||
|
|
281
|
+
maxAttempts > MAX_ATTEMPTS_LIMIT ||
|
|
282
|
+
!Number.isInteger(initialDelayMs) ||
|
|
283
|
+
initialDelayMs < 1 ||
|
|
284
|
+
initialDelayMs > MAX_DELAY_LIMIT_MS ||
|
|
285
|
+
!Number.isInteger(maxDelayMs) ||
|
|
286
|
+
maxDelayMs < initialDelayMs ||
|
|
287
|
+
maxDelayMs > MAX_DELAY_LIMIT_MS ||
|
|
288
|
+
!Number.isInteger(deadlineMs) ||
|
|
289
|
+
deadlineMs < 1 ||
|
|
290
|
+
deadlineMs > MAX_DEADLINE_LIMIT_MS ||
|
|
291
|
+
(options.clock !== undefined && typeof options.clock !== "function") ||
|
|
292
|
+
(options.sleep !== undefined && typeof options.sleep !== "function") ||
|
|
293
|
+
(options.random !== undefined && typeof options.random !== "function")) {
|
|
294
|
+
throw new Error("PRESENCE_POLLING_OPTIONS_INVALID");
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
maxAttempts,
|
|
298
|
+
initialDelayMs,
|
|
299
|
+
maxDelayMs,
|
|
300
|
+
deadlineMs,
|
|
301
|
+
clock: options.clock ?? Date.now,
|
|
302
|
+
sleep: options.sleep ?? PresenceApprovalCoordinator.sleep,
|
|
303
|
+
random: options.random ?? Math.random,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
static async sleep(delayMs, signal) {
|
|
307
|
+
await new Promise((resolve, reject) => {
|
|
308
|
+
if (signal?.aborted === true) {
|
|
309
|
+
reject(new Error("PRESENCE_ABORTED"));
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const onAbort = () => {
|
|
313
|
+
clearTimeout(timer);
|
|
314
|
+
reject(new Error("PRESENCE_ABORTED"));
|
|
315
|
+
};
|
|
316
|
+
const timer = setTimeout(() => {
|
|
317
|
+
signal?.removeEventListener("abort", onAbort);
|
|
318
|
+
resolve();
|
|
319
|
+
}, delayMs);
|
|
320
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
321
|
+
});
|
|
322
|
+
}
|
|
104
323
|
}
|
|
105
324
|
//# sourceMappingURL=PresenceApprovalCoordinator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresenceApprovalCoordinator.js","sourceRoot":"","sources":["../../src/approval/PresenceApprovalCoordinator.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAMtE,MAAM,OAAO,2BAA2B;IAEnB;IACA;IACA;IACA;IAJnB,YACmB,QAAgC,EAChC,SAA4B,EAC5B,YAAoB,EACpB,UAAkB;QAHlB,aAAQ,GAAR,QAAQ,CAAwB;QAChC,cAAS,GAAT,SAAS,CAAmB;QAC5B,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAQ;IAClC,CAAC;IAEG,KAAK,CAAC,OAAO,CAAC,QAAwB;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACrC;gBACE,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;oBAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;oBAC9B,OAAO,EAAE,qBAAqB;iBAC/B;gBACD,KAAK,EAAE;oBACL,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBAC5B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBACjC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI;iBACjC;gBACD,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE;gBACjC,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,YAAY,EAAE;oBACZ,KAAK,EAAE,WAAW,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;oBAC1C,WAAW,EAAE,uCAAuC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG;oBAC7E,aAAa,EAAE;wBACb,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;wBACjE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;wBACjE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE;qBACzE;iBACF;aACF,EACD,YAAY,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAC7C,CAAC;YACF,IAAI,2BAA2B,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,QAAwB,EACxB,MAA0B;QAE1B,IAAI,QAAiB,CAAC;QACtB,IAAI,CAAC;YACH,QAAQ;gBACN,MAAM,CAAC,OAAO,KAAK,gBAAgB,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;oBACpE,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;oBAChD,CAAC,CAAC,MAAM,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,OAAO,GAAG,2BAA2B,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,QAAQ,GAAG,2BAA2B,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,MAAe;QACvC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAgE,CAAC;QACnF,IACE,2BAA2B,CAAC,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,CAAC;YAC7E,2BAA2B,CAAC,mBAAmB,CAAC,SAAS,CAAC,UAAU,CAAC,EACrE,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,gBAAgB,EAAE,SAAS,CAAC,kBAAkB;aAC/C,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,MAAe;QACtC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/D,MAAM,OAAO,GAAI,MAAgC,CAAC,OAAO,CAAC;QAC1D,OAAO,OAAO,KAAK,SAAS;YAC1B,OAAO,KAAK,gBAAgB;YAC5B,OAAO,KAAK,QAAQ;YACpB,OAAO,KAAK,WAAW;YACvB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAAC,KAAc;QAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC;IAC9E,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"PresenceApprovalCoordinator.js","sourceRoot":"","sources":["../../src/approval/PresenceApprovalCoordinator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decionis/agent-safe-pipeline",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "An execution architecture where AI agents may propose actions but cannot authorize their own execution.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Decionis, Inc.",
|
|
@@ -34,14 +34,15 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@decionis/presence-node": "^0.2.0",
|
|
37
|
-
"jose": "^6.2.
|
|
37
|
+
"jose": "^6.2.9",
|
|
38
38
|
"zod": "^4.4.3"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@stryker-mutator/core": "10.0.0",
|
|
42
42
|
"@stryker-mutator/vitest-runner": "10.0.0",
|
|
43
43
|
"@vitest/coverage-v8": "^4.1.10",
|
|
44
|
-
"
|
|
44
|
+
"fast-check": "4.9.0",
|
|
45
|
+
"vitest": "^4.1.11"
|
|
45
46
|
},
|
|
46
47
|
"publishConfig": {
|
|
47
48
|
"access": "public",
|
|
@@ -50,6 +51,7 @@
|
|
|
50
51
|
"scripts": {
|
|
51
52
|
"build": "node ../../scripts/CleanBuildOutput.mjs && tsc -p tsconfig.build.json",
|
|
52
53
|
"test": "vitest run --coverage",
|
|
54
|
+
"test:fuzz": "vitest run test/fuzz",
|
|
53
55
|
"test:mutation": "stryker run",
|
|
54
56
|
"test:performance": "vitest run test/performance",
|
|
55
57
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|