@agent-score/commerce 1.7.0 → 1.8.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 +3 -3
- package/dist/{_response-DpB-cm2c.d.mts → _response-BMt2y4Or.d.mts} +11 -8
- package/dist/{_response-C2yFQoIA.d.ts → _response-DyJ3mWI3.d.ts} +11 -8
- package/dist/challenge/index.d.mts +2 -1
- package/dist/challenge/index.d.ts +2 -1
- package/dist/challenge/index.js.map +1 -1
- package/dist/challenge/index.mjs.map +1 -1
- package/dist/core.d.mts +36 -27
- package/dist/core.d.ts +36 -27
- package/dist/core.js +21 -101
- package/dist/core.js.map +1 -1
- package/dist/core.mjs +21 -101
- package/dist/core.mjs.map +1 -1
- package/dist/identity/express.d.mts +12 -13
- package/dist/identity/express.d.ts +12 -13
- package/dist/identity/express.js +38 -121
- package/dist/identity/express.js.map +1 -1
- package/dist/identity/express.mjs +36 -118
- package/dist/identity/express.mjs.map +1 -1
- package/dist/identity/fastify.d.mts +12 -11
- package/dist/identity/fastify.d.ts +12 -11
- package/dist/identity/fastify.js +38 -121
- package/dist/identity/fastify.js.map +1 -1
- package/dist/identity/fastify.mjs +36 -118
- package/dist/identity/fastify.mjs.map +1 -1
- package/dist/identity/hono.d.mts +13 -28
- package/dist/identity/hono.d.ts +13 -28
- package/dist/identity/hono.js +31 -123
- package/dist/identity/hono.js.map +1 -1
- package/dist/identity/hono.mjs +29 -120
- package/dist/identity/hono.mjs.map +1 -1
- package/dist/identity/nextjs.d.mts +8 -7
- package/dist/identity/nextjs.d.ts +8 -7
- package/dist/identity/nextjs.js +27 -119
- package/dist/identity/nextjs.js.map +1 -1
- package/dist/identity/nextjs.mjs +27 -118
- package/dist/identity/nextjs.mjs.map +1 -1
- package/dist/identity/policy.d.mts +1 -0
- package/dist/identity/policy.d.ts +1 -0
- package/dist/identity/web.d.mts +12 -14
- package/dist/identity/web.d.ts +12 -14
- package/dist/identity/web.js +27 -119
- package/dist/identity/web.js.map +1 -1
- package/dist/identity/web.mjs +27 -118
- package/dist/identity/web.mjs.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -6
- package/dist/index.mjs.map +1 -1
- package/dist/payment/index.d.mts +1 -1
- package/dist/payment/index.d.ts +1 -1
- package/dist/payment/index.js.map +1 -1
- package/dist/payment/index.mjs.map +1 -1
- package/dist/{signer-kCAJUZwp.d.mts → signer-CFVQsWjL.d.mts} +1 -6
- package/dist/{signer-kCAJUZwp.d.ts → signer-CFVQsWjL.d.ts} +1 -6
- package/package.json +6 -6
|
@@ -15,7 +15,7 @@ function denialReasonStatus(reason) {
|
|
|
15
15
|
}
|
|
16
16
|
function buildSignerMismatchBody(input) {
|
|
17
17
|
const { result } = input;
|
|
18
|
-
if (result.kind === "pass"
|
|
18
|
+
if (result.kind === "pass") return null;
|
|
19
19
|
const learnMoreUrl = input.learnMoreUrl ?? "https://docs.agentscore.sh/guides/agent-identity";
|
|
20
20
|
if (result.kind === "wallet_signer_mismatch") {
|
|
21
21
|
const linkedWallets = result.linkedWallets ?? [];
|
|
@@ -332,7 +332,7 @@ function createAgentScoreCore(options) {
|
|
|
332
332
|
} = options;
|
|
333
333
|
const baseUrl = stripTrailingSlashes(rawBaseUrl);
|
|
334
334
|
const agentMemoryHint = buildAgentMemoryHint();
|
|
335
|
-
const defaultUa = `@agent-score/commerce@${"1.
|
|
335
|
+
const defaultUa = `@agent-score/commerce@${"1.8.0"}`;
|
|
336
336
|
const userAgentHeader = userAgent ? `${userAgent} (${defaultUa})` : defaultUa;
|
|
337
337
|
const sdk = new AgentScore({ apiKey, baseUrl, userAgent: userAgentHeader });
|
|
338
338
|
const sessionSdkCache = /* @__PURE__ */ new Map();
|
|
@@ -406,7 +406,7 @@ function createAgentScoreCore(options) {
|
|
|
406
406
|
return void 0;
|
|
407
407
|
}
|
|
408
408
|
}
|
|
409
|
-
async function evaluate(identity, ctx) {
|
|
409
|
+
async function evaluate(identity, ctx, signer) {
|
|
410
410
|
if (!identity || !identity.address && !identity.operatorToken) {
|
|
411
411
|
if (failOpen) return { kind: "allow" };
|
|
412
412
|
const sessionReason = await tryMintSessionDenial(ctx);
|
|
@@ -466,7 +466,12 @@ function createAgentScoreCore(options) {
|
|
|
466
466
|
try {
|
|
467
467
|
const opts = {
|
|
468
468
|
chain: gateChain,
|
|
469
|
-
...Object.keys(policy).length > 0 ? { policy } : {}
|
|
469
|
+
...Object.keys(policy).length > 0 ? { policy } : {},
|
|
470
|
+
// Pre-extracted payment signer (by the adapter middleware). When present, the API
|
|
471
|
+
// composes BOTH signer_match (wallet-binding) and signer_sanctions (OFAC SDN wallet
|
|
472
|
+
// check) verdicts on the response in one round trip. Under
|
|
473
|
+
// policy.require_sanctions_clear, a signer_sanctions hit flips decision -> deny inline.
|
|
474
|
+
...signer && { signer: { address: signer.address, network: signer.network } }
|
|
470
475
|
};
|
|
471
476
|
const result = identity.address ? await sdk.assess(identity.address, { ...opts, operatorToken: identity.operatorToken }) : await sdk.assess(null, { ...opts, operatorToken: identity.operatorToken });
|
|
472
477
|
data = result;
|
|
@@ -574,36 +579,6 @@ function createAgentScoreCore(options) {
|
|
|
574
579
|
console.warn("[agentscore-commerce] captureWallet failed:", err instanceof Error ? err.message : err);
|
|
575
580
|
}
|
|
576
581
|
}
|
|
577
|
-
async function resolveWalletToOperator(walletAddress) {
|
|
578
|
-
const wallet = normalizeAddress(walletAddress);
|
|
579
|
-
const extractFromCached = (raw) => {
|
|
580
|
-
const op = raw.resolved_operator;
|
|
581
|
-
const links = raw.linked_wallets;
|
|
582
|
-
return {
|
|
583
|
-
operator: typeof op === "string" ? op : null,
|
|
584
|
-
linkedWallets: Array.isArray(links) ? links.filter((w) => typeof w === "string") : []
|
|
585
|
-
};
|
|
586
|
-
};
|
|
587
|
-
const plainCached = cache.get(wallet);
|
|
588
|
-
if (plainCached?.raw) {
|
|
589
|
-
return { ok: true, ...extractFromCached(plainCached.raw) };
|
|
590
|
-
}
|
|
591
|
-
const resolveCached = cache.get(`resolve:${wallet}`);
|
|
592
|
-
if (resolveCached?.raw) {
|
|
593
|
-
return { ok: true, ...extractFromCached(resolveCached.raw) };
|
|
594
|
-
}
|
|
595
|
-
try {
|
|
596
|
-
const data = await sdk.assess(walletAddress);
|
|
597
|
-
cache.set(`resolve:${wallet}`, { allow: true, raw: data });
|
|
598
|
-
return { ok: true, ...extractFromCached(data) };
|
|
599
|
-
} catch (err) {
|
|
600
|
-
console.warn("[gate] resolveWalletToOperator failed \u2014 returning { ok:false }:", err instanceof Error ? err.message : err);
|
|
601
|
-
return { ok: false };
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
function reportSignerEvent(kind) {
|
|
605
|
-
void sdk.telemetrySignerMatch({ kind });
|
|
606
|
-
}
|
|
607
582
|
function projectSignerMatch(sm, claimedNorm, signerNorm) {
|
|
608
583
|
const kind = sm.kind;
|
|
609
584
|
if (kind === "pass") {
|
|
@@ -631,77 +606,22 @@ function createAgentScoreCore(options) {
|
|
|
631
606
|
agentInstructions: sm.agent_instructions ?? WALLET_SIGNER_MISMATCH_INSTRUCTIONS
|
|
632
607
|
};
|
|
633
608
|
}
|
|
634
|
-
|
|
635
|
-
const
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
const claimedNorm = normalizeAddress(claimedWallet);
|
|
645
|
-
const signerNorm = normalizeAddress(signer);
|
|
646
|
-
if (claimedNorm === signerNorm) {
|
|
647
|
-
reportSignerEvent("pass");
|
|
648
|
-
return { kind: "pass", claimedOperator: null, signerOperator: null };
|
|
649
|
-
}
|
|
650
|
-
const cachedEntry = cache.get(claimedNorm);
|
|
651
|
-
const cachedMatch = cachedEntry?.signerMatchBySigner?.get(signerNorm);
|
|
652
|
-
if (cachedMatch) {
|
|
653
|
-
return projectSignerMatch(cachedMatch, claimedNorm, signerNorm);
|
|
654
|
-
}
|
|
655
|
-
const inferredNetwork = network ?? (signerNorm.startsWith("0x") ? "evm" : "solana");
|
|
656
|
-
let assessResponse;
|
|
657
|
-
try {
|
|
658
|
-
assessResponse = await sdk.assess(claimedNorm, {
|
|
659
|
-
resolveSigner: { address: signerNorm, network: inferredNetwork }
|
|
660
|
-
});
|
|
661
|
-
} catch (err) {
|
|
662
|
-
console.warn("[gate] verifyWalletSignerMatch assess failed:", err instanceof Error ? err.message : err);
|
|
663
|
-
reportSignerEvent("api_error");
|
|
664
|
-
return { kind: "api_error", claimedWallet: claimedNorm };
|
|
665
|
-
}
|
|
666
|
-
const signerMatch = assessResponse.signer_match;
|
|
667
|
-
if (signerMatch && typeof signerMatch === "object") {
|
|
668
|
-
if (cachedEntry) {
|
|
669
|
-
const map = cachedEntry.signerMatchBySigner ?? /* @__PURE__ */ new Map();
|
|
670
|
-
map.set(signerNorm, signerMatch);
|
|
671
|
-
cachedEntry.signerMatchBySigner = map;
|
|
672
|
-
} else {
|
|
673
|
-
const entry = { allow: true, raw: assessResponse };
|
|
674
|
-
entry.signerMatchBySigner = /* @__PURE__ */ new Map([[signerNorm, signerMatch]]);
|
|
675
|
-
cache.set(claimedNorm, entry);
|
|
676
|
-
}
|
|
677
|
-
return projectSignerMatch(signerMatch, claimedNorm, signerNorm);
|
|
678
|
-
}
|
|
679
|
-
const [claimedResolve, signerResolve] = await Promise.all([
|
|
680
|
-
resolveWalletToOperator(claimedNorm),
|
|
681
|
-
resolveWalletToOperator(signerNorm)
|
|
682
|
-
]);
|
|
683
|
-
if (!claimedResolve.ok || !signerResolve.ok) {
|
|
684
|
-
reportSignerEvent("api_error");
|
|
685
|
-
return { kind: "api_error", claimedWallet: claimedNorm };
|
|
686
|
-
}
|
|
687
|
-
const claimedOperator = claimedResolve.operator;
|
|
688
|
-
const signerOperator = signerResolve.operator;
|
|
689
|
-
if (claimedOperator && signerOperator && claimedOperator === signerOperator) {
|
|
690
|
-
reportSignerEvent("pass");
|
|
691
|
-
return { kind: "pass", claimedOperator, signerOperator };
|
|
692
|
-
}
|
|
693
|
-
reportSignerEvent("wallet_signer_mismatch");
|
|
609
|
+
function getSignerVerdict2(claimedAddress) {
|
|
610
|
+
const claimedNorm = normalizeAddress(claimedAddress);
|
|
611
|
+
const cached = cache.get(claimedNorm);
|
|
612
|
+
if (!cached) return void 0;
|
|
613
|
+
const raw = cached.raw;
|
|
614
|
+
if (!raw) return void 0;
|
|
615
|
+
const rawMatch = raw.signer_match;
|
|
616
|
+
const rawSanctions = raw.signer_sanctions;
|
|
617
|
+
if (!rawMatch && !rawSanctions) return void 0;
|
|
618
|
+
const signerNorm = rawMatch?.actual_signer ?? claimedNorm;
|
|
694
619
|
return {
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
actualSignerOperator: signerOperator,
|
|
698
|
-
expectedSigner: claimedNorm,
|
|
699
|
-
actualSigner: signerNorm,
|
|
700
|
-
linkedWallets: claimedResolve.linkedWallets,
|
|
701
|
-
agentInstructions: WALLET_SIGNER_MISMATCH_INSTRUCTIONS
|
|
620
|
+
signer_match: rawMatch ? projectSignerMatch(rawMatch, claimedNorm, signerNorm) : null,
|
|
621
|
+
signer_sanctions: rawSanctions ?? null
|
|
702
622
|
};
|
|
703
623
|
}
|
|
704
|
-
return { evaluate, captureWallet: captureWallet2,
|
|
624
|
+
return { evaluate, captureWallet: captureWallet2, getSignerVerdict: getSignerVerdict2 };
|
|
705
625
|
}
|
|
706
626
|
|
|
707
627
|
// src/signer.ts
|
|
@@ -777,9 +697,11 @@ async function extractPaymentSigner(request, x402PaymentHeader) {
|
|
|
777
697
|
}
|
|
778
698
|
return null;
|
|
779
699
|
}
|
|
780
|
-
async function
|
|
781
|
-
const
|
|
782
|
-
|
|
700
|
+
async function extractPaymentSignerFromAuth(authHeader, x402PaymentHeader) {
|
|
701
|
+
const request = new Request("http://internal.gate/", {
|
|
702
|
+
headers: authHeader ? { authorization: authHeader } : {}
|
|
703
|
+
});
|
|
704
|
+
return extractPaymentSigner(request, x402PaymentHeader);
|
|
783
705
|
}
|
|
784
706
|
function readX402PaymentHeader(request) {
|
|
785
707
|
return request.headers.get("payment-signature") ?? request.headers.get("x-payment") ?? void 0;
|
|
@@ -809,7 +731,10 @@ function agentscoreGate(options) {
|
|
|
809
731
|
operatorToken: identity?.operatorToken,
|
|
810
732
|
walletAddress: identity?.address
|
|
811
733
|
};
|
|
812
|
-
const
|
|
734
|
+
const authHeader = req.headers.authorization ?? null;
|
|
735
|
+
const x402Header = req.headers["payment-signature"] ?? req.headers["x-payment"];
|
|
736
|
+
const signer = await extractPaymentSignerFromAuth(authHeader, x402Header);
|
|
737
|
+
const outcome = await core.evaluate(identity, req, signer);
|
|
813
738
|
if (outcome.kind === "allow") {
|
|
814
739
|
const state = req[GATE_STATE_KEY];
|
|
815
740
|
if (state) {
|
|
@@ -847,16 +772,10 @@ async function captureWallet(req, options) {
|
|
|
847
772
|
idempotencyKey: options.idempotencyKey
|
|
848
773
|
});
|
|
849
774
|
}
|
|
850
|
-
|
|
775
|
+
function getSignerVerdict(req) {
|
|
851
776
|
const state = req[GATE_STATE_KEY];
|
|
852
|
-
if (!state?.walletAddress
|
|
853
|
-
|
|
854
|
-
}
|
|
855
|
-
return state.core.verifyWalletSignerMatch({
|
|
856
|
-
claimedWallet: state.walletAddress,
|
|
857
|
-
signer: options.signer,
|
|
858
|
-
network: options.network
|
|
859
|
-
});
|
|
777
|
+
if (!state?.walletAddress) return void 0;
|
|
778
|
+
return state.core.getSignerVerdict(state.walletAddress);
|
|
860
779
|
}
|
|
861
780
|
export {
|
|
862
781
|
FIXABLE_DENIAL_REASONS,
|
|
@@ -866,13 +785,12 @@ export {
|
|
|
866
785
|
captureWallet,
|
|
867
786
|
denialReasonStatus,
|
|
868
787
|
denialReasonToBody,
|
|
869
|
-
extractPaymentSignerAddress,
|
|
870
788
|
getAgentScoreData,
|
|
871
789
|
getGateDegradedState,
|
|
872
790
|
getGateQuotaInfo,
|
|
791
|
+
getSignerVerdict,
|
|
873
792
|
isFixableDenial,
|
|
874
793
|
readX402PaymentHeader,
|
|
875
|
-
verificationAgentInstructions
|
|
876
|
-
verifyWalletSignerMatch
|
|
794
|
+
verificationAgentInstructions
|
|
877
795
|
};
|
|
878
796
|
//# sourceMappingURL=express.mjs.map
|