@402flow/sdk 0.1.0-alpha.12 → 0.1.0-alpha.14

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.
@@ -0,0 +1,371 @@
1
+ /**
2
+ * AgentHarness provides a small in-memory orchestration layer on top of
3
+ * AgentPayClient for hosts that prefer preparedId-based handoffs over holding
4
+ * full prepared request objects.
5
+ *
6
+ * The intended host-facing flow is:
7
+ *
8
+ * 1. prepare a candidate request and receive a preparedId plus the preparation summary
9
+ * 2. execute later by preparedId once nextAction is execute
10
+ * 3. read back the stored execution result by preparedId
11
+ *
12
+ * This is useful for tool-driven hosts such as OpenAI tools, MCP servers,
13
+ * Claude tools, LangGraph nodes, or custom orchestrators where passing a small
14
+ * opaque id between turns is easier than preserving the full prepared object.
15
+ *
16
+ * This file implements only a convenience layer. The core SDK contract remains
17
+ * AgentPayClient with preparePaidRequest() and executePreparedRequest().
18
+ *
19
+ * Important behavior:
20
+ * - State is kept only in memory inside this process.
21
+ * - Prepared requests expire after a TTL.
22
+ * - A newer active preparation for the same method + origin + pathname supersedes
23
+ * the older one.
24
+ * - Execution is rejected locally unless the stored preparation is still active,
25
+ * kind === 'ready', and nextAction === 'execute'.
26
+ */
27
+ import { randomUUID } from 'node:crypto';
28
+ /** Typed error used internally to convert local state failures into stable results. */
29
+ export class AgentHarnessError extends Error {
30
+ code;
31
+ preparedId;
32
+ constructor(code, message, preparedId) {
33
+ super(message);
34
+ this.name = 'AgentHarnessError';
35
+ this.code = code;
36
+ this.preparedId = preparedId;
37
+ Object.setPrototypeOf(this, new.target.prototype);
38
+ }
39
+ }
40
+ const defaultPreparedTtlMs = 5 * 60 * 1000;
41
+ // Preparations supersede by stable execution target, not by full query/body, so a
42
+ // newer attempt for the same endpoint path invalidates older active ones.
43
+ function createSupersessionKey(binding) {
44
+ const url = new URL(binding.url);
45
+ return `${binding.method}:${url.origin}${url.pathname}`;
46
+ }
47
+ function deepFreeze(value) {
48
+ if (value === null || typeof value !== 'object' || Object.isFrozen(value)) {
49
+ return value;
50
+ }
51
+ if (Array.isArray(value)) {
52
+ for (const entry of value) {
53
+ deepFreeze(entry);
54
+ }
55
+ }
56
+ else {
57
+ for (const entry of Object.values(value)) {
58
+ deepFreeze(entry);
59
+ }
60
+ }
61
+ return Object.freeze(value);
62
+ }
63
+ // All records exposed back to callers are cloned and frozen so host code cannot
64
+ // mutate the harness' in-memory state by retaining object references.
65
+ function cloneValue(value) {
66
+ return structuredClone(value);
67
+ }
68
+ function createFrozenClone(value) {
69
+ return deepFreeze(cloneValue(value));
70
+ }
71
+ function normalizeHeaders(headers) {
72
+ const normalizedHeaders = {};
73
+ if (!headers) {
74
+ return normalizedHeaders;
75
+ }
76
+ const headerMap = new Headers(headers);
77
+ headerMap.forEach((value, key) => {
78
+ normalizedHeaders[key] = value;
79
+ });
80
+ return normalizedHeaders;
81
+ }
82
+ function buildExecutionBinding(prepared) {
83
+ // Capture the exact prepared execution payload once so later execute calls do
84
+ // not depend on the host resending or reconstructing it correctly.
85
+ return createFrozenClone({
86
+ method: prepared.request.method,
87
+ url: prepared.request.url,
88
+ headers: normalizeHeaders(prepared.request.headers),
89
+ ...(prepared.request.body !== undefined ? { body: prepared.request.body } : {}),
90
+ ...(prepared.request.bodyHash !== undefined
91
+ ? { bodyHash: prepared.request.bodyHash }
92
+ : {}),
93
+ ...(prepared.kind === 'ready'
94
+ ? {
95
+ challenge: {
96
+ protocol: prepared.challenge.protocol,
97
+ headers: normalizeHeaders(prepared.challenge.headers),
98
+ ...(prepared.challenge.body !== undefined
99
+ ? { body: cloneValue(prepared.challenge.body) }
100
+ : {}),
101
+ },
102
+ }
103
+ : {}),
104
+ merchantOrigin: new URL(prepared.request.url).origin,
105
+ });
106
+ }
107
+ function summarizePreparedRecord(record) {
108
+ return cloneValue({
109
+ preparedId: record.preparedId,
110
+ state: 'active',
111
+ kind: record.prepared.kind,
112
+ protocol: record.prepared.protocol,
113
+ ...(record.prepared.kind === 'ready' && record.prepared.paymentRequirement
114
+ ? { paymentRequirement: record.prepared.paymentRequirement }
115
+ : {}),
116
+ hints: record.prepared.hints,
117
+ ...(record.prepared.probe ? { probe: record.prepared.probe } : {}),
118
+ validationIssues: record.prepared.validationIssues,
119
+ nextAction: record.prepared.nextAction,
120
+ expiresAt: record.expiresAt,
121
+ });
122
+ }
123
+ async function summarizeMerchantResponse(response) {
124
+ const headers = {};
125
+ response.headers.forEach((value, key) => {
126
+ headers[key] = value;
127
+ });
128
+ return {
129
+ status: response.status,
130
+ headers,
131
+ body: await response.clone().text(),
132
+ };
133
+ }
134
+ async function summarizeExecutionOutcome(preparedId, outcome) {
135
+ return {
136
+ preparedId,
137
+ harnessDisposition: 'executed',
138
+ sdkOutcomeKind: outcome.kind,
139
+ status: outcome.response.status,
140
+ merchantResponse: await summarizeMerchantResponse(outcome.response),
141
+ ...('receiptId' in outcome && outcome.receiptId
142
+ ? { receiptId: outcome.receiptId }
143
+ : {}),
144
+ ...('paidRequestId' in outcome && outcome.paidRequestId
145
+ ? { paidRequestId: outcome.paidRequestId }
146
+ : {}),
147
+ ...('paymentAttemptId' in outcome && outcome.paymentAttemptId
148
+ ? { paymentAttemptId: outcome.paymentAttemptId }
149
+ : {}),
150
+ ...('reason' in outcome && typeof outcome.reason === 'string'
151
+ ? { reason: outcome.reason }
152
+ : {}),
153
+ ...('policyReviewEventId' in outcome && outcome.policyReviewEventId
154
+ ? { policyReviewEventId: outcome.policyReviewEventId }
155
+ : {}),
156
+ };
157
+ }
158
+ function isFetchPaidFailureResponse(value) {
159
+ if (typeof value !== 'object' || value === null) {
160
+ return false;
161
+ }
162
+ const candidate = value;
163
+ return (typeof candidate.kind === 'string' &&
164
+ typeof candidate.protocol === 'string' &&
165
+ candidate.response instanceof Response &&
166
+ typeof candidate.reason === 'string' &&
167
+ typeof candidate.decision === 'object' &&
168
+ candidate.decision !== null);
169
+ }
170
+ function isFetchPaidErrorLike(error) {
171
+ if (!(error instanceof Error) || error.name !== 'FetchPaidError') {
172
+ return false;
173
+ }
174
+ const candidate = error;
175
+ return isFetchPaidFailureResponse(candidate.details);
176
+ }
177
+ /**
178
+ * Optional in-memory preparedId wrapper over AgentPayClient.
179
+ */
180
+ export class AgentHarness {
181
+ client;
182
+ preparedTtlMs;
183
+ now;
184
+ createPreparedId;
185
+ preparedRecords = new Map();
186
+ constructor(options) {
187
+ this.client = options.client;
188
+ this.preparedTtlMs = options.preparedTtlMs ?? defaultPreparedTtlMs;
189
+ this.now = options.now ?? (() => new Date());
190
+ this.createPreparedId = options.createPreparedId ?? (() => randomUUID());
191
+ }
192
+ /**
193
+ * Prepare a candidate request through the core SDK and store the immutable
194
+ * prepared result behind a generated preparedId for later execution.
195
+ */
196
+ async preparePaidRequest(input) {
197
+ // Prepare against the SDK, then store the exact prepared request behind a
198
+ // deterministic id so later tool calls do not need to resend the full payload.
199
+ const prepared = await this.client.preparePaidRequest(input.url, {
200
+ ...(input.method ? { method: input.method } : {}),
201
+ ...(input.headers ? { headers: input.headers } : {}),
202
+ ...(input.body !== undefined ? { body: input.body } : {}),
203
+ }, {
204
+ ...(input.discoveryMetadata
205
+ ? { discoveryMetadata: input.discoveryMetadata }
206
+ : {}),
207
+ });
208
+ const createdAt = this.now();
209
+ const preparedId = this.createPreparedId();
210
+ const record = {
211
+ preparedId,
212
+ state: 'active',
213
+ createdAt: createdAt.toISOString(),
214
+ expiresAt: new Date(createdAt.getTime() + this.preparedTtlMs).toISOString(),
215
+ prepared: createFrozenClone(prepared),
216
+ executionBinding: buildExecutionBinding(prepared),
217
+ };
218
+ this.supersedeActiveRecords(record);
219
+ this.preparedRecords.set(preparedId, record);
220
+ return summarizePreparedRecord(record);
221
+ }
222
+ /**
223
+ * Execute a previously stored ready preparation. Local state failures are
224
+ * converted into deterministic rejected results rather than thrown to the host.
225
+ */
226
+ async executePreparedRequest(input) {
227
+ try {
228
+ // Execution is only allowed for active, ready preparations. All rejected
229
+ // local states are converted into stored deterministic results.
230
+ const record = this.getRecordForExecution(input.preparedId);
231
+ const outcome = await this.runExecution(record, input.executionContext);
232
+ record.state = 'consumed';
233
+ record.executionResult = createFrozenClone(outcome);
234
+ return cloneValue(outcome);
235
+ }
236
+ catch (error) {
237
+ if (!(error instanceof AgentHarnessError)) {
238
+ throw error;
239
+ }
240
+ return this.handleExecutionRejection(input.preparedId, error);
241
+ }
242
+ }
243
+ /**
244
+ * Return the durable stored outcome for a preparedId without re-running any
245
+ * merchant or control-plane call.
246
+ */
247
+ getExecutionResult(preparedId) {
248
+ // This lookup lets an agent fetch the durable outcome later without re-running
249
+ // execution or depending on host-specific tool memory.
250
+ const record = this.getKnownRecord(preparedId);
251
+ this.refreshRecordState(record);
252
+ return cloneValue({
253
+ preparedId: record.preparedId,
254
+ state: record.state,
255
+ ...(record.supersededByPreparedId
256
+ ? { supersededByPreparedId: record.supersededByPreparedId }
257
+ : {}),
258
+ ...(record.executionResult
259
+ ? { executionResult: record.executionResult }
260
+ : {}),
261
+ });
262
+ }
263
+ /**
264
+ * Return the full stored record for debugging, tests, or host inspection.
265
+ */
266
+ getPreparedRecord(preparedId) {
267
+ const record = this.getKnownRecord(preparedId);
268
+ this.refreshRecordState(record);
269
+ return cloneValue({
270
+ preparedId: record.preparedId,
271
+ state: record.state,
272
+ createdAt: record.createdAt,
273
+ expiresAt: record.expiresAt,
274
+ ...(record.supersededByPreparedId
275
+ ? { supersededByPreparedId: record.supersededByPreparedId }
276
+ : {}),
277
+ prepared: record.prepared,
278
+ executionBinding: record.executionBinding,
279
+ ...(record.executionResult
280
+ ? { executionResult: record.executionResult }
281
+ : {}),
282
+ });
283
+ }
284
+ async runExecution(record, executionContext) {
285
+ try {
286
+ const response = await this.client.executePreparedRequest(record.prepared, executionContext);
287
+ return summarizeExecutionOutcome(record.preparedId, response);
288
+ }
289
+ catch (error) {
290
+ if (!isFetchPaidErrorLike(error)) {
291
+ throw error;
292
+ }
293
+ return summarizeExecutionOutcome(record.preparedId, error.details);
294
+ }
295
+ }
296
+ // Rejection results are stored so later lookups remain deterministic even when
297
+ // execution never reached the core SDK or merchant.
298
+ handleExecutionRejection(preparedId, error) {
299
+ const rejectedResult = {
300
+ preparedId,
301
+ harnessDisposition: 'rejected',
302
+ rejectionCode: error.code,
303
+ message: error.message,
304
+ };
305
+ const record = preparedId ? this.preparedRecords.get(preparedId) : undefined;
306
+ if (record &&
307
+ error.code !== 'prepared_request_consumed' &&
308
+ !record.executionResult) {
309
+ record.executionResult = createFrozenClone(rejectedResult);
310
+ }
311
+ return rejectedResult;
312
+ }
313
+ getRecordForExecution(preparedId) {
314
+ const record = this.getKnownRecord(preparedId);
315
+ this.refreshRecordState(record);
316
+ if (record.state === 'expired') {
317
+ throw new AgentHarnessError('expired_prepared_id', `Prepared request ${preparedId} has expired.`, preparedId);
318
+ }
319
+ if (record.state === 'superseded') {
320
+ throw new AgentHarnessError('prepared_request_superseded', record.supersededByPreparedId
321
+ ? `Prepared request ${preparedId} was superseded by ${record.supersededByPreparedId}.`
322
+ : `Prepared request ${preparedId} was superseded by a newer preparation.`, preparedId);
323
+ }
324
+ if (record.state === 'consumed') {
325
+ throw new AgentHarnessError('prepared_request_consumed', `Prepared request ${preparedId} has already been consumed.`, preparedId);
326
+ }
327
+ if (record.prepared.kind !== 'ready') {
328
+ throw new AgentHarnessError('prepared_request_not_ready', `Prepared request ${preparedId} is not executable because it is ${record.prepared.kind}.`, preparedId);
329
+ }
330
+ if (record.prepared.nextAction !== 'execute') {
331
+ throw new AgentHarnessError('prepared_request_not_executable', `Prepared request ${preparedId} requires ${record.prepared.nextAction} before execution.`, preparedId);
332
+ }
333
+ return record;
334
+ }
335
+ getKnownRecord(preparedId) {
336
+ if (preparedId.trim().length === 0) {
337
+ throw new AgentHarnessError('missing_prepared_id', 'A preparedId is required.');
338
+ }
339
+ const record = this.preparedRecords.get(preparedId);
340
+ if (!record) {
341
+ throw new AgentHarnessError('unknown_prepared_id', `Prepared request ${preparedId} is unknown.`, preparedId);
342
+ }
343
+ return record;
344
+ }
345
+ // Expiry is checked lazily on access so the harness does not need timers or a
346
+ // background cleanup loop.
347
+ refreshRecordState(record) {
348
+ if (record.state !== 'active') {
349
+ return;
350
+ }
351
+ if (this.now().getTime() >= new Date(record.expiresAt).getTime()) {
352
+ record.state = 'expired';
353
+ }
354
+ }
355
+ supersedeActiveRecords(nextRecord) {
356
+ // Only one active preparation should survive for the same method + origin +
357
+ // pathname. Older active preparations become stale as soon as a newer one is stored.
358
+ const nextKey = createSupersessionKey(nextRecord.executionBinding);
359
+ for (const record of this.preparedRecords.values()) {
360
+ if (record.state !== 'active') {
361
+ continue;
362
+ }
363
+ if (createSupersessionKey(record.executionBinding) !== nextKey) {
364
+ continue;
365
+ }
366
+ record.state = 'superseded';
367
+ record.supersededByPreparedId = nextRecord.preparedId;
368
+ }
369
+ }
370
+ }
371
+ //# sourceMappingURL=agent-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-harness.js","sourceRoot":"","sources":["../src/agent-harness.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,17 @@
1
+ /**
2
+ * Detects whether an unpaid merchant response is actually a payable challenge and,
3
+ * if so, which paid-request protocol it speaks.
4
+ */
1
5
  import type { PaidRequestProtocol } from './contracts.js';
6
+ /** Minimal challenge shape the rest of the SDK needs in order to proceed. */
2
7
  export type DetectedChallenge = {
3
8
  protocol: PaidRequestProtocol;
4
9
  headers: Record<string, string>;
5
10
  body?: unknown;
6
11
  };
12
+ /**
13
+ * Inspect a merchant response for x402/l402 challenge evidence in either headers
14
+ * or a JSON body. The SDK prefers header evidence first because that is the most
15
+ * direct live protocol signal.
16
+ */
7
17
  export declare function detectChallengeFromResponse(response: Response): Promise<DetectedChallenge | undefined>;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Inspect a merchant response for x402/l402 challenge evidence in either headers
3
+ * or a JSON body. The SDK prefers header evidence first because that is the most
4
+ * direct live protocol signal.
5
+ */
1
6
  export async function detectChallengeFromResponse(response) {
2
7
  const headers = captureHeaders(response.headers);
3
8
  const protocol = sniffProtocolFromHeaders(headers);
@@ -23,6 +28,8 @@ function captureHeaders(source) {
23
28
  });
24
29
  return headers;
25
30
  }
31
+ // Header detection is the primary path because a real payable merchant usually
32
+ // signals the protocol directly in response headers.
26
33
  function sniffProtocolFromHeaders(headers) {
27
34
  if (headers['payment-required']) {
28
35
  return 'x402';
@@ -40,6 +47,8 @@ function sniffProtocolFromHeaders(headers) {
40
47
  }
41
48
  return undefined;
42
49
  }
50
+ // Some compatibility merchants embed the challenge in JSON instead of, or in
51
+ // addition to, headers. This fallback keeps the client tolerant of that shape.
43
52
  function sniffProtocolFromBody(payload) {
44
53
  if (!payload || typeof payload !== 'object') {
45
54
  return undefined;
@@ -60,6 +69,8 @@ function sniffProtocolFromBody(payload) {
60
69
  }
61
70
  return undefined;
62
71
  }
72
+ // The detector only parses JSON bodies when content-type says JSON, and it never
73
+ // consumes the original response stream thanks to clone().
63
74
  async function tryReadJsonBody(response) {
64
75
  const contentType = response.headers.get('content-type') ?? '';
65
76
  if (!contentType.includes('application/json')) {
@@ -1 +1 @@
1
- {"version":3,"file":"challenge-detection.js","sourceRoot":"","sources":["../src/challenge-detection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"challenge-detection.js","sourceRoot":"","sources":["../src/challenge-detection.ts"],"names":[],"mappings":"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"}