@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 CHANGED
@@ -4,10 +4,16 @@ TypeScript reference implementation of Agent-Safe Pipeline: capture an immutable
4
4
 
5
5
  ## Install
6
6
 
7
- The package is versioned `0.1.2` but is not claimed as published until a registry release succeeds. Consume it from the workspace today:
7
+ Install the latest stable release:
8
8
 
9
9
  ```bash
10
- pnpm install --frozen-lockfile
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
- constructor(presence: PresenceApprovalClient, authority: DecisionAuthority, organization: string, approverId: string);
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 static evidenceOf;
15
- private static verdictOf;
16
- private static isBoundedIdentifier;
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;IAEpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAHV,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM;IAGxB,OAAO,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqC9D,qBAAqB,CAChC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,CAAC;IA4BxB,OAAO,CAAC,MAAM,CAAC,UAAU;IAgBzB,OAAO,CAAC,MAAM,CAAC,SAAS;IAWxB,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAGnC"}
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
- constructor(presence, authority, organization, approverId) {
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
- if (PresenceApprovalCoordinator.verdictOf(result) === null) {
39
- throw new Error("PRESENCE_RESPONSE_INVALID");
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
- let terminal;
49
- try {
50
- terminal =
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
- catch {
56
- return FailClosedDecision.create(captured.intentHash, "PRESENCE_UNAVAILABLE");
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 = PresenceApprovalCoordinator.verdictOf(terminal);
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 = PresenceApprovalCoordinator.evidenceOf(terminal);
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
- return await this.authority.evaluate(captured, { humanApproval: evidence });
222
+ random = this.polling.random();
71
223
  }
72
224
  catch {
73
- return FailClosedDecision.create(captured.intentHash, "AUTHORITY_UNAVAILABLE");
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
- static evidenceOf(result) {
77
- if (result === null || typeof result !== "object")
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
- static verdictOf(result) {
91
- if (result === null || typeof result !== "object")
242
+ verdictOf(result) {
243
+ if (!this.isRecord(result))
92
244
  return null;
93
- const verdict = result.verdict;
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
- static isBoundedIdentifier(value) {
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":"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"}
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.2",
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.8",
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
- "vitest": "^4.1.10"
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"