@aifinpay/agent 2.0.0-rc.8 → 2.0.1

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.
Files changed (121) hide show
  1. package/LICENSE +21 -0
  2. package/PAYMENT_RECEIPTS.md +114 -0
  3. package/README.md +85 -28
  4. package/dist/agent.d.ts +8 -1
  5. package/dist/agent.d.ts.map +1 -1
  6. package/dist/agent.js +50 -17
  7. package/dist/agent.js.map +1 -1
  8. package/dist/agentHistory.d.ts +55 -0
  9. package/dist/agentHistory.d.ts.map +1 -0
  10. package/dist/agentHistory.js +145 -0
  11. package/dist/agentHistory.js.map +1 -0
  12. package/dist/agentPassport.d.ts +71 -7
  13. package/dist/agentPassport.d.ts.map +1 -1
  14. package/dist/agentPassport.js +135 -27
  15. package/dist/agentPassport.js.map +1 -1
  16. package/dist/aifp1.d.ts +94 -5
  17. package/dist/aifp1.d.ts.map +1 -1
  18. package/dist/aifp1.js +370 -114
  19. package/dist/aifp1.js.map +1 -1
  20. package/dist/apiUrl.d.ts +3 -0
  21. package/dist/apiUrl.d.ts.map +1 -0
  22. package/dist/apiUrl.js +8 -0
  23. package/dist/apiUrl.js.map +1 -0
  24. package/dist/chains.d.ts +7 -0
  25. package/dist/chains.d.ts.map +1 -1
  26. package/dist/chains.js +19 -1
  27. package/dist/chains.js.map +1 -1
  28. package/dist/crossChain.d.ts.map +1 -1
  29. package/dist/crossChain.js.map +1 -1
  30. package/dist/crypto.d.ts.map +1 -1
  31. package/dist/crypto.js.map +1 -1
  32. package/dist/deploymentResolver.d.ts +95 -0
  33. package/dist/deploymentResolver.d.ts.map +1 -0
  34. package/dist/deploymentResolver.js +169 -0
  35. package/dist/deploymentResolver.js.map +1 -0
  36. package/dist/errors.d.ts +17 -0
  37. package/dist/errors.d.ts.map +1 -1
  38. package/dist/errors.js +14 -0
  39. package/dist/errors.js.map +1 -1
  40. package/dist/facilitators/aifinpay.d.ts +4 -5
  41. package/dist/facilitators/aifinpay.d.ts.map +1 -1
  42. package/dist/facilitators/aifinpay.js +50 -21
  43. package/dist/facilitators/aifinpay.js.map +1 -1
  44. package/dist/facilitators/base.d.ts +12 -1
  45. package/dist/facilitators/base.d.ts.map +1 -1
  46. package/dist/facilitators/coinbase.d.ts.map +1 -1
  47. package/dist/facilitators/coinbase.js +3 -7
  48. package/dist/facilitators/coinbase.js.map +1 -1
  49. package/dist/facilitators/detect.d.ts.map +1 -1
  50. package/dist/facilitators/detect.js +2 -7
  51. package/dist/facilitators/detect.js.map +1 -1
  52. package/dist/facilitators/standard-x402.d.ts.map +1 -1
  53. package/dist/facilitators/standard-x402.js +40 -30
  54. package/dist/facilitators/standard-x402.js.map +1 -1
  55. package/dist/generated/solanaV14Deployments.generated.d.ts +25 -0
  56. package/dist/generated/solanaV14Deployments.generated.d.ts.map +1 -0
  57. package/dist/generated/solanaV14Deployments.generated.js +39 -0
  58. package/dist/generated/solanaV14Deployments.generated.js.map +1 -0
  59. package/dist/generated/splitterRoutes.generated.d.ts +24 -0
  60. package/dist/generated/splitterRoutes.generated.d.ts.map +1 -0
  61. package/dist/generated/splitterRoutes.generated.js +453 -0
  62. package/dist/generated/splitterRoutes.generated.js.map +1 -0
  63. package/dist/generated/v14Deployments.generated.d.ts +49 -0
  64. package/dist/generated/v14Deployments.generated.d.ts.map +1 -0
  65. package/dist/generated/v14Deployments.generated.js +415 -0
  66. package/dist/generated/v14Deployments.generated.js.map +1 -0
  67. package/dist/index.d.ts +27 -13
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +16 -7
  70. package/dist/index.js.map +1 -1
  71. package/dist/localIdentity.d.ts +17 -0
  72. package/dist/localIdentity.d.ts.map +1 -0
  73. package/dist/localIdentity.js +95 -0
  74. package/dist/localIdentity.js.map +1 -0
  75. package/dist/settlement.d.ts +34 -4
  76. package/dist/settlement.d.ts.map +1 -1
  77. package/dist/settlement.js +233 -75
  78. package/dist/settlement.js.map +1 -1
  79. package/dist/settlementHttp.d.ts +10 -0
  80. package/dist/settlementHttp.d.ts.map +1 -0
  81. package/dist/settlementHttp.js +78 -0
  82. package/dist/settlementHttp.js.map +1 -0
  83. package/dist/settlementV14.d.ts +10 -9
  84. package/dist/settlementV14.d.ts.map +1 -1
  85. package/dist/settlementV14.js +43 -55
  86. package/dist/settlementV14.js.map +1 -1
  87. package/dist/solanaDeploymentResolver.d.ts +98 -0
  88. package/dist/solanaDeploymentResolver.d.ts.map +1 -0
  89. package/dist/solanaDeploymentResolver.js +162 -0
  90. package/dist/solanaDeploymentResolver.js.map +1 -0
  91. package/dist/solanaV14Deployments.generated.d.ts +25 -0
  92. package/dist/solanaV14Deployments.generated.d.ts.map +1 -0
  93. package/dist/solanaV14Deployments.generated.js +39 -0
  94. package/dist/solanaV14Deployments.generated.js.map +1 -0
  95. package/dist/spendLedger.d.ts.map +1 -1
  96. package/dist/spendLedger.js +1 -3
  97. package/dist/spendLedger.js.map +1 -1
  98. package/dist/splitterRoutes.d.ts +11 -4
  99. package/dist/splitterRoutes.d.ts.map +1 -1
  100. package/dist/splitterRoutes.generated.d.ts +11 -9
  101. package/dist/splitterRoutes.generated.d.ts.map +1 -1
  102. package/dist/splitterRoutes.generated.js +72 -18
  103. package/dist/splitterRoutes.generated.js.map +1 -1
  104. package/dist/splitterRoutes.js +7 -5
  105. package/dist/splitterRoutes.js.map +1 -1
  106. package/dist/unifiedAgent.d.ts +96 -28
  107. package/dist/unifiedAgent.d.ts.map +1 -1
  108. package/dist/unifiedAgent.js +219 -348
  109. package/dist/unifiedAgent.js.map +1 -1
  110. package/dist/v14Deployments.generated.d.ts +49 -0
  111. package/dist/v14Deployments.generated.d.ts.map +1 -0
  112. package/dist/v14Deployments.generated.js +413 -0
  113. package/dist/v14Deployments.generated.js.map +1 -0
  114. package/dist/wallet.d.ts.map +1 -1
  115. package/dist/wallet.js +2 -2
  116. package/dist/wallet.js.map +1 -1
  117. package/package.json +27 -6
  118. package/dist/cli.d.ts +0 -3
  119. package/dist/cli.d.ts.map +0 -1
  120. package/dist/cli.js +0 -127
  121. package/dist/cli.js.map +0 -1
@@ -0,0 +1,145 @@
1
+ import { resolveAgentPassport, agentPassportWallet } from "./agentPassport.js";
2
+ import { aifinpayApiUrl } from "./apiUrl.js";
3
+ /** Public fields returned for source="receipts". Single source of truth — MCP must import, not copy. */
4
+ export const AGENT_RECEIPT_FIELDS = [
5
+ "receipt_id",
6
+ "merchant_id",
7
+ "resource",
8
+ "scope",
9
+ "tier",
10
+ "quota",
11
+ "used",
12
+ "remaining",
13
+ "amount",
14
+ "currency",
15
+ "exp",
16
+ "chain",
17
+ "tx_ref",
18
+ "payer",
19
+ "network_mode",
20
+ "settled_at",
21
+ "expires_at",
22
+ "unit_quota",
23
+ "metering_version",
24
+ ];
25
+ /** Public fields returned for source="transactions". Single source of truth — MCP must import, not copy. */
26
+ export const AGENT_TRANSACTION_FIELDS = [
27
+ "tx_hash",
28
+ "log_index",
29
+ "chain",
30
+ "payment_id",
31
+ "block_number",
32
+ "block_ts",
33
+ "agent_address",
34
+ "merchant_address",
35
+ "token_address",
36
+ "total_amount",
37
+ "merchant_amount",
38
+ "treasury_fee",
39
+ "ip_creator_fee",
40
+ ];
41
+ /** Read public payment metadata. A passport is resolved to a verified wallet first. */
42
+ export async function getAgentHistory(options) {
43
+ const base = options.baseUrl || "https://aifinpay.io";
44
+ const fetchImpl = options.fetchImpl || fetch;
45
+ const network = options.network || "polygon";
46
+ const source = options.source || "transactions";
47
+ const limit = options.limit ?? 25, offset = options.offset ?? 0;
48
+ if (!Number.isSafeInteger(limit) ||
49
+ limit < 1 ||
50
+ limit > 100 ||
51
+ !Number.isSafeInteger(offset) ||
52
+ offset < 0 ||
53
+ offset > 100000) {
54
+ throw new Error("History limit must be 1..100 and offset 0..100000");
55
+ }
56
+ if (source !== "transactions" && source !== "receipts")
57
+ throw new Error("Unknown history source");
58
+ let address = options.address;
59
+ if (options.passport) {
60
+ const identity = await resolveAgentPassport(options.passport, base, fetchImpl);
61
+ identity.wallets = identity.wallets.filter((wallet) => wallet.chain_family === "evm" && Number(wallet.verified_at) > 0);
62
+ const wallet = agentPassportWallet(identity, network);
63
+ if (address && address.toLowerCase() !== wallet.address.toLowerCase()) {
64
+ throw new Error("Address does not match this passport's verified wallet on the requested network");
65
+ }
66
+ address = wallet.address;
67
+ }
68
+ if (!address || !/^0x[0-9a-fA-F]{40}$/.test(address))
69
+ throw new Error("History requires an EVM address or a passport with an EVM wallet binding");
70
+ const query = new URLSearchParams({ limit: String(limit), offset: String(offset) });
71
+ if (source === "transactions")
72
+ query.set("chain", network);
73
+ const response = await fetchImpl(aifinpayApiUrl(base, `/v1/agents/${address.toLowerCase()}/${source}?${query}`), {
74
+ headers: { accept: "application/json" },
75
+ });
76
+ if (!response.ok)
77
+ throw new Error(`Payment history unavailable: HTTP ${response.status}; source=${source}. Use receipts for retained prepaid batches; indexed transactions currently cover Polygon only.`);
78
+ const body = (await response.json());
79
+ if (!body || typeof body !== "object" || !Array.isArray(body[source]))
80
+ throw new Error("Invalid history response");
81
+ // Defense in depth: even a misconfigured/older backend must not send bearer
82
+ // tokens to a caller of this metadata-only API.
83
+ const fields = source === "receipts" ? AGENT_RECEIPT_FIELDS : AGENT_TRANSACTION_FIELDS;
84
+ const items = body[source].map((item) => Object.fromEntries(fields.filter((field) => item[field] !== undefined).map((field) => [field, item[field]])));
85
+ return {
86
+ address: address.toLowerCase(),
87
+ ...(options.passport ? { passport: options.passport } : {}),
88
+ source,
89
+ items,
90
+ limit,
91
+ offset,
92
+ next_offset: typeof body.next_offset === "number" ? body.next_offset : null,
93
+ coverage: source === "receipts"
94
+ ? "Retained AiFinPay receipts only; external merchant quota may lag"
95
+ : "Indexed AiFinPay Polygon settlements only; excludes arbitrary wallet transfers and may lag the chain",
96
+ };
97
+ }
98
+ /**
99
+ * Prepaid quota batches for an address, most room first, rolled up per
100
+ * merchant. Data only — the human-facing "no quota, go pay a 402" note stays
101
+ * with the caller (MCP). `remaining` is authoritative where AiFinPay meters;
102
+ * merchants running their own gate meter locally and our copy can lag.
103
+ */
104
+ export async function getQuota(options) {
105
+ const base = (options.baseUrl || "https://aifinpay.io").replace(/\/+$/, "");
106
+ const fetchImpl = options.fetchImpl || fetch;
107
+ const address = options.address.toLowerCase();
108
+ if (!/^0x[0-9a-fA-F]{40}$/.test(address))
109
+ throw new Error("Quota requires an EVM address");
110
+ const response = await fetchImpl(aifinpayApiUrl(base, `/v1/agents/${address}/receipts`), {
111
+ headers: { accept: "application/json" },
112
+ });
113
+ if (!response.ok)
114
+ throw new Error(`Quota lookup failed: HTTP ${response.status}`);
115
+ const body = (await response.json());
116
+ const now = Math.floor(Date.now() / 1000);
117
+ const num = (v, dflt) => (typeof v === "number" && Number.isFinite(v) ? v : dflt);
118
+ const batches = (body.receipts ?? [])
119
+ .filter((r) => r.exp == null || num(r.exp, 0) > now)
120
+ .filter((r) => (options.merchantId ? r.merchant_id === options.merchantId : true))
121
+ .filter((r) => options.includeExhausted || num(r.remaining, 0) > 0)
122
+ .map((r) => ({
123
+ merchant_id: typeof r.merchant_id === "string" ? r.merchant_id : undefined,
124
+ resource: typeof r.resource === "string" ? r.resource : undefined,
125
+ scope: typeof r.scope === "string" ? r.scope : "exact",
126
+ tier: typeof r.tier === "string" ? r.tier : undefined,
127
+ used: num(r.used, 0),
128
+ remaining: num(r.remaining, 0),
129
+ quota: num(r.quota, 1),
130
+ paid: r.amount != null ? `${r.amount} ${typeof r.currency === "string" ? r.currency : "USD"}` : undefined,
131
+ expires: typeof r.exp === "number" ? new Date(r.exp * 1000).toISOString() : undefined,
132
+ receipt_id: typeof r.receipt_id === "string" ? r.receipt_id : undefined,
133
+ }))
134
+ .sort((a, b) => b.remaining - a.remaining);
135
+ const totals = {};
136
+ for (const b of batches) {
137
+ const key = b.merchant_id ?? "unknown";
138
+ const cur = totals[key] ?? { remaining: 0, batches: 0 };
139
+ cur.remaining += b.remaining;
140
+ cur.batches += 1;
141
+ totals[key] = cur;
142
+ }
143
+ return { agent: address, totals, batches };
144
+ }
145
+ //# sourceMappingURL=agentHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentHistory.js","sourceRoot":"","sources":["../src/agentHistory.ts"],"names":[],"mappings":"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"}
@@ -1,35 +1,99 @@
1
+ /**
2
+ * Networks supported in Agent Passport.
3
+ * @deprecated "botchain" is deprecated. Use "robinhood" instead.
4
+ */
1
5
  export type AgentPassportNetwork = "polygon" | "avalanche" | "arbitrum" | "bnb" | "base" | "unichain" | "optimism" | "botchain" | "xrplevm" | "solana" | "near" | "aptos" | "casper";
2
6
  export type AgentPassportChainFamily = "evm" | "solana" | "near" | "aptos" | "casper";
7
+ export type AgentPassportStatus = "active" | "suspended" | "revoked";
8
+ export type AgentPassportWalletStatus = "active" | "revoked" | "blocked";
3
9
  export interface AgentPassportWalletBinding {
4
10
  network: AgentPassportNetwork;
5
11
  chain_family: AgentPassportChainFamily;
12
+ chain_ref: string | null;
6
13
  address: string;
14
+ public_key: string | null;
7
15
  is_primary: boolean;
16
+ status: AgentPassportWalletStatus;
8
17
  verified_at: number;
9
18
  }
19
+ export interface AgentPassportIssuerProof {
20
+ key_id: string;
21
+ public_key: string;
22
+ signature: string;
23
+ }
10
24
  export interface AgentPassportIdentity {
25
+ schema: "aifp3.passport.vnext" | string;
11
26
  agent_id: string;
12
27
  agent_number: number;
13
28
  agent_number_display: string;
14
- username: string;
29
+ username: string | null;
15
30
  display_name: string | null;
16
- status: "active" | "suspended" | "revoked";
31
+ status: AgentPassportStatus;
17
32
  verification_level: "self_verified" | "organization_verified" | "enhanced_verified";
33
+ holder_public_key: string;
34
+ issuer: AgentPassportIssuerProof;
35
+ protected_payload_hash: string;
36
+ integrity_state: "ok" | "failed";
37
+ version: number;
18
38
  created_at: number;
19
39
  updated_at: number;
20
40
  wallets: AgentPassportWalletBinding[];
21
41
  }
42
+ export interface AgentPassportHolderKeypair {
43
+ public_key_b64: string;
44
+ private_key_b64: string;
45
+ }
46
+ export interface AgentPassportWalletChallenge {
47
+ challenge_id: string;
48
+ agent_id: string;
49
+ network: AgentPassportNetwork;
50
+ chain_family: AgentPassportChainFamily;
51
+ chain_ref: string | null;
52
+ address: string;
53
+ nonce: string;
54
+ message: string;
55
+ expires_at: number;
56
+ required_signatures: ["holder_signature", "wallet_signature"] | string[];
57
+ }
22
58
  export declare class AgentPassportError extends Error {
23
59
  readonly code: string;
24
60
  constructor(message: string, code?: string);
25
61
  }
26
62
  export declare function normalizeAgentPassportIdentifier(identifier: string): string;
63
+ /** Resolve by immutable agent_id, permanent AIFP number or @username. */
64
+ export declare function resolveAgentPassport(identifier: string, baseUrl?: string, fetchImpl?: typeof fetch): Promise<AgentPassportIdentity>;
65
+ /** Generate the holder key locally. The private key is never sent to AiFinPay. */
66
+ export declare function generateAgentPassportHolderKeypair(): AgentPassportHolderKeypair;
67
+ export declare function signAgentPassportHolderMessage(privateKeyB64: string, message: string): string;
68
+ export declare function issueAgentPassport(input: {
69
+ holder_public_key: string;
70
+ username?: string;
71
+ display_name?: string;
72
+ }, baseUrl?: string): Promise<AgentPassportIdentity>;
73
+ export declare function createAgentPassport(input?: {
74
+ username?: string;
75
+ display_name?: string;
76
+ }, baseUrl?: string): Promise<{
77
+ passport: AgentPassportIdentity;
78
+ holder: AgentPassportHolderKeypair;
79
+ }>;
80
+ export declare function requestAgentPassportWalletBinding(identifier: string, input: {
81
+ network: AgentPassportNetwork;
82
+ address: string;
83
+ wallet_public_key?: string;
84
+ }, baseUrl?: string): Promise<AgentPassportWalletChallenge>;
85
+ export declare function confirmAgentPassportWalletBinding(identifier: string, input: {
86
+ challenge_id: string;
87
+ holder_signature: string;
88
+ wallet_signature: string;
89
+ wallet_signature_encoding?: "base64" | "base58" | "hex";
90
+ wallet_public_key?: string;
91
+ }, baseUrl?: string): Promise<AgentPassportIdentity>;
27
92
  /**
28
- * Resolve a public Agent Passport by @username, permanent AIFP number, or
29
- * immutable agent_id. Resolution is addressability only; callers MUST still
30
- * verify/require the destination wallet signature or payment invoice rules.
93
+ * Verify both the issuer signature and the protected payload hash against an
94
+ * independently pinned AiFinPay issuer public key. Never trust only the key
95
+ * returned inside the same passport response.
31
96
  */
32
- export declare function resolveAgentPassport(identifier: string, baseUrl?: string, fetchImpl?: typeof fetch): Promise<AgentPassportIdentity>;
33
- /** Pick a verified wallet binding without silently crossing networks. */
97
+ export declare function verifyAgentPassportIssuerSignature(passport: AgentPassportIdentity, trustedIssuerPublicKeyB64: string): boolean;
34
98
  export declare function agentPassportWallet(passport: AgentPassportIdentity, network: AgentPassportNetwork): AgentPassportWalletBinding;
35
99
  //# sourceMappingURL=agentPassport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agentPassport.d.ts","sourceRoot":"","sources":["../src/agentPassport.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAClE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjF,MAAM,MAAM,wBAAwB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtF,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,YAAY,EAAE,wBAAwB,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,kBAAkB,EAAE,eAAe,GAAG,uBAAuB,GAAG,mBAAmB,CAAC;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,0BAA0B,EAAE,CAAC;CACvC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aACE,IAAI;gBAArC,OAAO,EAAE,MAAM,EAAkB,IAAI,SAAyB;CAI3E;AAMD,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAY3E;AA6BD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,SAAwB,EAC/B,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAgBhC;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,oBAAoB,GAC5B,0BAA0B,CAQ5B"}
1
+ {"version":3,"file":"agentPassport.d.ts","sourceRoot":"","sources":["../src/agentPassport.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, sign, verify } from "node:crypto";
2
+ import { aifinpayApiUrl } from "./apiUrl.js";
1
3
  export class AgentPassportError extends Error {
2
4
  code;
3
5
  constructor(message, code = "agent_passport_error") {
@@ -21,64 +23,170 @@ export function normalizeAgentPassportIdentifier(identifier) {
21
23
  }
22
24
  return username;
23
25
  }
26
+ function canonicalize(value) {
27
+ if (value === null || typeof value !== "object")
28
+ return JSON.stringify(value);
29
+ if (Array.isArray(value))
30
+ return `[${value.map(canonicalize).join(",")}]`;
31
+ const record = value;
32
+ return `{${Object.keys(record)
33
+ .sort()
34
+ .map((k) => `${JSON.stringify(k)}:${canonicalize(record[k])}`)
35
+ .join(",")}}`;
36
+ }
37
+ function protectedPayload(passport) {
38
+ const wallets = passport.wallets
39
+ .map((w) => ({
40
+ network: w.network,
41
+ chain_family: w.chain_family,
42
+ chain_ref: w.chain_ref ?? null,
43
+ address: w.address,
44
+ public_key: w.public_key ?? null,
45
+ is_primary: Boolean(w.is_primary),
46
+ status: w.status,
47
+ verified_at: w.verified_at == null ? null : Number(w.verified_at),
48
+ }))
49
+ .sort((a, b) => `${a.network}:${a.address}`.localeCompare(`${b.network}:${b.address}`));
50
+ return {
51
+ schema: "aifp3.passport.vnext",
52
+ agent_id: passport.agent_id,
53
+ agent_number: Number(passport.agent_number),
54
+ agent_number_display: passport.agent_number_display,
55
+ username: passport.username ?? null,
56
+ display_name: passport.display_name ?? null,
57
+ status: passport.status,
58
+ verification_level: passport.verification_level,
59
+ holder_public_key: passport.holder_public_key,
60
+ issuer_key_id: passport.issuer.key_id,
61
+ version: Number(passport.version),
62
+ created_at: Number(passport.created_at),
63
+ updated_at: Number(passport.updated_at),
64
+ wallets,
65
+ };
66
+ }
24
67
  function validateResolvedIdentity(value) {
25
68
  if (!value || typeof value !== "object")
26
69
  throw new AgentPassportError("invalid Agent Passport response");
27
70
  const v = value;
28
- if (typeof v.agent_id !== "string" || !AGENT_ID_RE.test(v.agent_id)) {
71
+ if (typeof v.agent_id !== "string" || !AGENT_ID_RE.test(v.agent_id))
29
72
  throw new AgentPassportError("invalid agent_id in Agent Passport response");
30
- }
31
- if (typeof v.agent_number !== "number" || !Number.isSafeInteger(v.agent_number) || v.agent_number <= 0) {
73
+ if (typeof v.agent_number !== "number" || !Number.isSafeInteger(v.agent_number) || v.agent_number <= 0)
32
74
  throw new AgentPassportError("invalid agent_number in Agent Passport response");
33
- }
34
- if (typeof v.agent_number_display !== "string" || !AGENT_NUMBER_RE.test(v.agent_number_display)) {
75
+ if (typeof v.agent_number_display !== "string" || !AGENT_NUMBER_RE.test(v.agent_number_display))
35
76
  throw new AgentPassportError("invalid agent_number_display in Agent Passport response");
36
- }
37
- if (typeof v.username !== "string" || !USERNAME_RE.test(v.username)) {
77
+ if (v.username !== null && (typeof v.username !== "string" || !USERNAME_RE.test(v.username)))
38
78
  throw new AgentPassportError("invalid username in Agent Passport response");
39
- }
79
+ if (!v.issuer || typeof v.issuer !== "object")
80
+ throw new AgentPassportError("Agent Passport response has no issuer proof");
40
81
  if (!Array.isArray(v.wallets))
41
82
  throw new AgentPassportError("Agent Passport response has no wallets array");
42
83
  const wallets = v.wallets.map((raw) => {
43
84
  if (!raw || typeof raw !== "object")
44
85
  throw new AgentPassportError("invalid wallet binding");
45
86
  const w = raw;
46
- if (typeof w.network !== "string" || typeof w.chain_family !== "string" || typeof w.address !== "string") {
87
+ if (typeof w.network !== "string" || typeof w.chain_family !== "string" || typeof w.address !== "string")
47
88
  throw new AgentPassportError("invalid wallet binding fields");
48
- }
49
89
  return raw;
50
90
  });
51
91
  return { ...value, wallets };
52
92
  }
53
- /**
54
- * Resolve a public Agent Passport by @username, permanent AIFP number, or
55
- * immutable agent_id. Resolution is addressability only; callers MUST still
56
- * verify/require the destination wallet signature or payment invoice rules.
57
- */
58
- export async function resolveAgentPassport(identifier, baseUrl = "https://aifinpay.io", fetchImpl = fetch) {
59
- const normalized = normalizeAgentPassportIdentifier(identifier);
60
- const url = `${baseUrl.replace(/\/$/, "")}/api/agent/resolve/${encodeURIComponent(normalized)}`;
61
- const response = await fetchImpl(url, { headers: { accept: "application/json" } });
93
+ async function jsonRequest(url, init, fetchImpl = fetch) {
94
+ const response = await fetchImpl(url, {
95
+ ...init,
96
+ headers: {
97
+ accept: "application/json",
98
+ ...(init?.body ? { "content-type": "application/json" } : {}),
99
+ ...(init?.headers || {}),
100
+ },
101
+ });
62
102
  let body;
63
103
  try {
64
104
  body = await response.json();
65
105
  }
66
106
  catch {
67
- throw new AgentPassportError(`Agent Passport resolver returned non-JSON HTTP ${response.status}`);
107
+ throw new AgentPassportError(`Agent Passport endpoint returned non-JSON HTTP ${response.status}`, "agent_passport_non_json");
68
108
  }
69
109
  if (!response.ok) {
70
110
  const rec = body && typeof body === "object" ? body : {};
71
- throw new AgentPassportError(typeof rec.error === "string" ? rec.error : `Agent Passport HTTP ${response.status}`, response.status === 404 ? "agent_not_found" : "agent_passport_http_error");
111
+ throw new AgentPassportError(typeof rec.error === "string" ? rec.error : `Agent Passport HTTP ${response.status}`, typeof rec.error === "string" ? rec.error : "agent_passport_http_error");
112
+ }
113
+ return body;
114
+ }
115
+ /** Resolve by immutable agent_id, permanent AIFP number or @username. */
116
+ export async function resolveAgentPassport(identifier, baseUrl = "https://aifinpay.io", fetchImpl = fetch) {
117
+ const normalized = normalizeAgentPassportIdentifier(identifier);
118
+ const body = (await jsonRequest(aifinpayApiUrl(baseUrl, `/api/agent/resolve/${encodeURIComponent(normalized)}`), undefined, fetchImpl));
119
+ return validateResolvedIdentity(body.agent);
120
+ }
121
+ /** Generate the holder key locally. The private key is never sent to AiFinPay. */
122
+ export function generateAgentPassportHolderKeypair() {
123
+ const { publicKey, privateKey } = generateKeyPairSync("ed25519");
124
+ return {
125
+ public_key_b64: publicKey.export({ format: "der", type: "spki" }).toString("base64"),
126
+ private_key_b64: privateKey.export({ format: "der", type: "pkcs8" }).toString("base64"),
127
+ };
128
+ }
129
+ export function signAgentPassportHolderMessage(privateKeyB64, message) {
130
+ const key = createPrivateKey({
131
+ key: Buffer.from(privateKeyB64, "base64"),
132
+ format: "der",
133
+ type: "pkcs8",
134
+ });
135
+ return sign(null, Buffer.from(message, "utf8"), key).toString("base64");
136
+ }
137
+ export async function issueAgentPassport(input, baseUrl = "https://aifinpay.io") {
138
+ const body = (await jsonRequest(`${baseUrl.replace(/\/$/, "")}/api/aifp3/passports`, {
139
+ method: "POST",
140
+ body: JSON.stringify(input),
141
+ }));
142
+ return validateResolvedIdentity(body.passport);
143
+ }
144
+ export async function createAgentPassport(input = {}, baseUrl = "https://aifinpay.io") {
145
+ const holder = generateAgentPassportHolderKeypair();
146
+ const passport = await issueAgentPassport({ ...input, holder_public_key: holder.public_key_b64 }, baseUrl);
147
+ return { passport, holder };
148
+ }
149
+ export async function requestAgentPassportWalletBinding(identifier, input, baseUrl = "https://aifinpay.io") {
150
+ const normalized = normalizeAgentPassportIdentifier(identifier);
151
+ const body = (await jsonRequest(`${baseUrl.replace(/\/$/, "")}/api/aifp3/passports/${encodeURIComponent(normalized)}/wallets/challenge`, { method: "POST", body: JSON.stringify(input) }));
152
+ return body.challenge;
153
+ }
154
+ export async function confirmAgentPassportWalletBinding(identifier, input, baseUrl = "https://aifinpay.io") {
155
+ const normalized = normalizeAgentPassportIdentifier(identifier);
156
+ const body = (await jsonRequest(`${baseUrl.replace(/\/$/, "")}/api/aifp3/passports/${encodeURIComponent(normalized)}/wallets/confirm`, { method: "POST", body: JSON.stringify(input) }));
157
+ return validateResolvedIdentity(body.passport);
158
+ }
159
+ /**
160
+ * Verify both the issuer signature and the protected payload hash against an
161
+ * independently pinned AiFinPay issuer public key. Never trust only the key
162
+ * returned inside the same passport response.
163
+ */
164
+ export function verifyAgentPassportIssuerSignature(passport, trustedIssuerPublicKeyB64) {
165
+ if (passport.integrity_state !== "ok")
166
+ return false;
167
+ if (passport.issuer.public_key !== trustedIssuerPublicKeyB64)
168
+ return false;
169
+ try {
170
+ const canonical = canonicalize(protectedPayload(passport));
171
+ const hashOk = createHash("sha256").update(Buffer.from(canonical, "utf8")).digest("hex") === passport.protected_payload_hash;
172
+ if (!hashOk)
173
+ return false;
174
+ const key = createPublicKey({
175
+ key: Buffer.from(trustedIssuerPublicKeyB64, "base64"),
176
+ format: "der",
177
+ type: "spki",
178
+ });
179
+ return verify(null, Buffer.from(canonical, "utf8"), key, Buffer.from(passport.issuer.signature, "base64"));
180
+ }
181
+ catch {
182
+ return false;
72
183
  }
73
- const rec = body;
74
- return validateResolvedIdentity(rec.agent);
75
184
  }
76
- /** Pick a verified wallet binding without silently crossing networks. */
77
185
  export function agentPassportWallet(passport, network) {
78
- if (passport.status !== "active") {
79
- throw new AgentPassportError(`Agent Passport is ${passport.status}`, "agent_not_active");
186
+ if (passport.status !== "active" || passport.integrity_state !== "ok") {
187
+ throw new AgentPassportError(`Agent Passport is ${passport.integrity_state !== "ok" ? "integrity_failed" : passport.status}`, "agent_not_active");
80
188
  }
81
- const candidates = passport.wallets.filter((w) => w.network === network);
189
+ const candidates = passport.wallets.filter((w) => w.network === network && w.status === "active");
82
190
  const selected = candidates.find((w) => w.is_primary) ?? candidates[0];
83
191
  if (!selected)
84
192
  throw new AgentPassportError(`Agent Passport has no verified ${network} wallet`, "wallet_binding_missing");
@@ -1 +1 @@
1
- {"version":3,"file":"agentPassport.js","sourceRoot":"","sources":["../src/agentPassport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentPassport.js","sourceRoot":"","sources":["../src/agentPassport.ts"],"names":[],"mappings":"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"}