@antseed/node 0.2.20 → 0.2.22

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,50 @@
1
+ import type { PeerProfile, ProfileCapability } from '../types/peer-profile.js';
2
+ import type { Identity } from '../p2p/identity.js';
3
+ export interface ProfileManagerConfig {
4
+ configDir: string;
5
+ identity?: Identity;
6
+ }
7
+ export declare class ProfileManager {
8
+ private readonly configDir;
9
+ private readonly identity;
10
+ private profile;
11
+ constructor(config: ProfileManagerConfig);
12
+ /**
13
+ * Create a new peer profile.
14
+ */
15
+ createProfile(data: {
16
+ displayName: string;
17
+ description: string;
18
+ tags?: string[];
19
+ capabilities?: ProfileCapability[];
20
+ region?: string;
21
+ languages?: string[];
22
+ website?: string;
23
+ avatar?: string;
24
+ }): PeerProfile;
25
+ /**
26
+ * Update an existing profile.
27
+ */
28
+ updateProfile(updates: Partial<Omit<PeerProfile, 'peerId' | 'createdAt'>>): PeerProfile;
29
+ /**
30
+ * Get the current profile.
31
+ */
32
+ getProfile(): PeerProfile | null;
33
+ /**
34
+ * Get SHA-256 hash of the profile for metadata announcements.
35
+ */
36
+ getProfileHash(): string;
37
+ /**
38
+ * Sign the profile hash with the identity's private key.
39
+ */
40
+ getProfileSignature(): Promise<string>;
41
+ /**
42
+ * Save profile to disk.
43
+ */
44
+ save(): Promise<void>;
45
+ /**
46
+ * Load profile from disk.
47
+ */
48
+ load(): Promise<void>;
49
+ }
50
+ //# sourceMappingURL=profile-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-manager.d.ts","sourceRoot":"","sources":["../../src/discovery/profile-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,OAAO,CAA4B;gBAE/B,MAAM,EAAE,oBAAoB;IAKxC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,WAAW;IAuBf;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW;IAgBvF;;OAEG;IACH,UAAU,IAAI,WAAW,GAAG,IAAI;IAIhC;;OAEG;IACH,cAAc,IAAI,MAAM;IAMxB;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAU5C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU5B"}
@@ -0,0 +1,105 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { signData } from '../p2p/identity.js';
5
+ import { bytesToHex } from '../utils/hex.js';
6
+ export class ProfileManager {
7
+ configDir;
8
+ identity;
9
+ profile = null;
10
+ constructor(config) {
11
+ this.configDir = config.configDir;
12
+ this.identity = config.identity;
13
+ }
14
+ /**
15
+ * Create a new peer profile.
16
+ */
17
+ createProfile(data) {
18
+ if (!this.identity) {
19
+ throw new Error('Identity required to create profile');
20
+ }
21
+ const now = Date.now();
22
+ this.profile = {
23
+ peerId: this.identity.peerId,
24
+ displayName: data.displayName,
25
+ description: data.description,
26
+ tags: data.tags ?? [],
27
+ capabilities: data.capabilities ?? ['inference'],
28
+ region: data.region ?? 'unknown',
29
+ languages: data.languages ?? ['en'],
30
+ website: data.website,
31
+ avatar: data.avatar,
32
+ createdAt: now,
33
+ updatedAt: now,
34
+ };
35
+ return this.profile;
36
+ }
37
+ /**
38
+ * Update an existing profile.
39
+ */
40
+ updateProfile(updates) {
41
+ if (!this.profile) {
42
+ throw new Error('No profile exists — call createProfile first');
43
+ }
44
+ this.profile = {
45
+ ...this.profile,
46
+ ...updates,
47
+ peerId: this.profile.peerId, // immutable
48
+ createdAt: this.profile.createdAt, // immutable
49
+ updatedAt: Date.now(),
50
+ };
51
+ return this.profile;
52
+ }
53
+ /**
54
+ * Get the current profile.
55
+ */
56
+ getProfile() {
57
+ return this.profile;
58
+ }
59
+ /**
60
+ * Get SHA-256 hash of the profile for metadata announcements.
61
+ */
62
+ getProfileHash() {
63
+ if (!this.profile)
64
+ return '';
65
+ const json = JSON.stringify(this.profile);
66
+ return createHash('sha256').update(json).digest('hex');
67
+ }
68
+ /**
69
+ * Sign the profile hash with the identity's private key.
70
+ */
71
+ async getProfileSignature() {
72
+ if (!this.identity || !this.profile) {
73
+ throw new Error('Identity and profile required for signing');
74
+ }
75
+ const hash = this.getProfileHash();
76
+ const hashBytes = new TextEncoder().encode(hash);
77
+ const signature = await signData(this.identity.privateKey, hashBytes);
78
+ return bytesToHex(signature);
79
+ }
80
+ /**
81
+ * Save profile to disk.
82
+ */
83
+ async save() {
84
+ if (!this.profile)
85
+ return;
86
+ await mkdir(this.configDir, { recursive: true });
87
+ const filePath = join(this.configDir, 'profile.json');
88
+ await writeFile(filePath, JSON.stringify(this.profile, null, 2), 'utf-8');
89
+ }
90
+ /**
91
+ * Load profile from disk.
92
+ */
93
+ async load() {
94
+ const filePath = join(this.configDir, 'profile.json');
95
+ try {
96
+ const raw = await readFile(filePath, 'utf-8');
97
+ this.profile = JSON.parse(raw);
98
+ }
99
+ catch {
100
+ // File doesn't exist — no profile yet
101
+ this.profile = null;
102
+ }
103
+ }
104
+ }
105
+ //# sourceMappingURL=profile-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-manager.js","sourceRoot":"","sources":["../../src/discovery/profile-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { PeerProfile, ProfileCapability } from '../types/peer-profile.js';
2
+ export interface ProfileSearchQuery {
3
+ capability?: ProfileCapability;
4
+ tags?: string[];
5
+ region?: string;
6
+ text?: string;
7
+ }
8
+ export interface ProfileSearchResult {
9
+ profile: PeerProfile;
10
+ relevanceScore: number;
11
+ }
12
+ /**
13
+ * In-memory search index for cached peer profiles.
14
+ */
15
+ export declare class ProfileSearchIndex {
16
+ private profiles;
17
+ addProfile(profile: PeerProfile): void;
18
+ removeProfile(peerId: string): void;
19
+ getProfile(peerId: string): PeerProfile | null;
20
+ getAllProfiles(): PeerProfile[];
21
+ /**
22
+ * Search profiles with relevance scoring.
23
+ */
24
+ search(query: ProfileSearchQuery): ProfileSearchResult[];
25
+ get size(): number;
26
+ }
27
+ //# sourceMappingURL=profile-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-search.d.ts","sourceRoot":"","sources":["../../src/discovery/profile-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,WAAW,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAuC;IAEvD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAItC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAInC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAI9C,cAAc,IAAI,WAAW,EAAE;IAI/B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,EAAE;IAyDxD,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * In-memory search index for cached peer profiles.
3
+ */
4
+ export class ProfileSearchIndex {
5
+ profiles = new Map();
6
+ addProfile(profile) {
7
+ this.profiles.set(profile.peerId, profile);
8
+ }
9
+ removeProfile(peerId) {
10
+ this.profiles.delete(peerId);
11
+ }
12
+ getProfile(peerId) {
13
+ return this.profiles.get(peerId) ?? null;
14
+ }
15
+ getAllProfiles() {
16
+ return Array.from(this.profiles.values());
17
+ }
18
+ /**
19
+ * Search profiles with relevance scoring.
20
+ */
21
+ search(query) {
22
+ const results = [];
23
+ for (const profile of this.profiles.values()) {
24
+ let score = 0;
25
+ // Filter by capability (hard filter)
26
+ if (query.capability) {
27
+ if (!profile.capabilities.includes(query.capability))
28
+ continue;
29
+ score += 10;
30
+ }
31
+ // Filter by region (boost score)
32
+ if (query.region) {
33
+ if (profile.region.toLowerCase() === query.region.toLowerCase()) {
34
+ score += 5;
35
+ }
36
+ }
37
+ // Tag matching (boost score)
38
+ if (query.tags && query.tags.length > 0) {
39
+ const profileTags = new Set(profile.tags.map(t => t.toLowerCase()));
40
+ let tagMatches = 0;
41
+ for (const tag of query.tags) {
42
+ if (profileTags.has(tag.toLowerCase())) {
43
+ tagMatches++;
44
+ }
45
+ }
46
+ if (tagMatches > 0) {
47
+ score += tagMatches * 3;
48
+ }
49
+ }
50
+ // Text search in name and description
51
+ if (query.text) {
52
+ const text = query.text.toLowerCase();
53
+ if (profile.displayName.toLowerCase().includes(text)) {
54
+ score += 8;
55
+ }
56
+ if (profile.description.toLowerCase().includes(text)) {
57
+ score += 4;
58
+ }
59
+ if (profile.tags.some(t => t.toLowerCase().includes(text))) {
60
+ score += 2;
61
+ }
62
+ }
63
+ if (score > 0) {
64
+ results.push({ profile, relevanceScore: score });
65
+ }
66
+ }
67
+ // Sort by relevance (descending)
68
+ results.sort((a, b) => b.relevanceScore - a.relevanceScore);
69
+ return results;
70
+ }
71
+ get size() {
72
+ return this.profiles.size;
73
+ }
74
+ }
75
+ //# sourceMappingURL=profile-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-search.js","sourceRoot":"","sources":["../../src/discovery/profile-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type AbstractSigner } from 'ethers';
2
+ import type { Identity } from '../p2p/identity.js';
3
+ import type { PaymentMux } from '../p2p/payment-mux.js';
4
+ import type { SpendingAuthPayload } from '../types/protocol.js';
5
+ import { EscrowClient } from './evm/escrow-client.js';
6
+ export interface SellerPaymentConfig {
7
+ chainId: number;
8
+ rpcUrl: string;
9
+ contractAddress: string;
10
+ usdcAddress: string;
11
+ }
12
+ export interface BuyerSession {
13
+ sessionId: string;
14
+ buyerPeerId: string;
15
+ buyerEvmAddr: string;
16
+ nonce: number;
17
+ authMax: bigint;
18
+ deadline: number;
19
+ buyerSig: string;
20
+ previousConsumption: bigint;
21
+ previousSessionId: string;
22
+ tokensDelivered: bigint;
23
+ reservedAt: number;
24
+ settled: boolean;
25
+ }
26
+ export declare class SellerPaymentManager {
27
+ private _signer;
28
+ private readonly _escrow;
29
+ private readonly _config;
30
+ private readonly _sessions;
31
+ constructor(identity: Identity, config: SellerPaymentConfig);
32
+ get signer(): AbstractSigner;
33
+ get escrowClient(): EscrowClient;
34
+ hasSession(buyerPeerId: string): boolean;
35
+ setBuyerEvmAddress(buyerPeerId: string, evmAddress: string): void;
36
+ handleSpendingAuthV2(buyerPeerId: string, buyerEvmAddr: string, payload: SpendingAuthPayload, paymentMux: PaymentMux): Promise<void>;
37
+ addTokensDelivered(buyerPeerId: string, tokens: bigint): void;
38
+ onBuyerDisconnect(buyerPeerId: string): Promise<void>;
39
+ settleSession(buyerPeerId: string, chargeAmount: bigint): Promise<void>;
40
+ claimEarnings(): Promise<string>;
41
+ stake(amount: bigint): Promise<string>;
42
+ unstake(amount: bigint): Promise<string>;
43
+ getPendingEarnings(): Promise<bigint>;
44
+ private _computeChargeAmount;
45
+ }
46
+ //# sourceMappingURL=seller-payment-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-payment-manager.d.ts","sourceRoot":"","sources":["../../src/payments/seller-payment-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAKtD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;gBAEjD,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB;IAW3D,IAAI,MAAM,IAAI,cAAc,CAAyB;IACrD,IAAI,YAAY,IAAI,YAAY,CAAyB;IAEzD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKxC,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAK3D,oBAAoB,CACxB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC;IA0FhB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAOvD,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBrD,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAItC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAK3C,OAAO,CAAC,oBAAoB;CAG7B"}
@@ -0,0 +1,161 @@
1
+ import { verifyTypedData } from 'ethers';
2
+ import { EscrowClient } from './evm/escrow-client.js';
3
+ import { identityToEvmWallet } from './evm/keypair.js';
4
+ import { makeEscrowDomain, SPENDING_AUTH_V2_TYPES } from './evm/signatures.js';
5
+ import { debugLog, debugWarn } from '../utils/debug.js';
6
+ export class SellerPaymentManager {
7
+ _signer;
8
+ _escrow;
9
+ _config;
10
+ _sessions = new Map();
11
+ constructor(identity, config) {
12
+ this._config = config;
13
+ this._signer = identityToEvmWallet(identity);
14
+ this._escrow = new EscrowClient({
15
+ rpcUrl: config.rpcUrl,
16
+ contractAddress: config.contractAddress,
17
+ usdcAddress: config.usdcAddress,
18
+ chainId: config.chainId,
19
+ });
20
+ }
21
+ get signer() { return this._signer; }
22
+ get escrowClient() { return this._escrow; }
23
+ hasSession(buyerPeerId) {
24
+ const s = this._sessions.get(buyerPeerId);
25
+ return !!s && !s.settled;
26
+ }
27
+ setBuyerEvmAddress(buyerPeerId, evmAddress) {
28
+ const session = this._sessions.get(buyerPeerId);
29
+ if (session)
30
+ session.buyerEvmAddr = evmAddress;
31
+ }
32
+ async handleSpendingAuthV2(buyerPeerId, buyerEvmAddr, payload, paymentMux) {
33
+ const now = Math.floor(Date.now() / 1000);
34
+ if (!payload.deadline || payload.deadline <= now) {
35
+ debugWarn(`[SellerPayment] Expired SpendingAuthV2 from ${buyerPeerId.slice(0, 12)}... deadline=${payload.deadline}`);
36
+ return;
37
+ }
38
+ let maxAmount;
39
+ let previousConsumption;
40
+ try {
41
+ maxAmount = BigInt(payload.maxAmountUsdc);
42
+ previousConsumption = BigInt(payload.previousConsumption ?? '0');
43
+ }
44
+ catch {
45
+ debugWarn(`[SellerPayment] Invalid amounts in SpendingAuthV2 from ${buyerPeerId.slice(0, 12)}...`);
46
+ return;
47
+ }
48
+ const previousSessionId = payload.previousSessionId ?? ('0x' + '00'.repeat(32));
49
+ const sellerAddr = await this._signer.getAddress();
50
+ const domain = makeEscrowDomain(this._config.chainId, this._config.contractAddress);
51
+ const recovered = verifyTypedData(domain, SPENDING_AUTH_V2_TYPES, {
52
+ seller: sellerAddr,
53
+ sessionId: payload.sessionId,
54
+ maxAmount,
55
+ nonce: payload.nonce,
56
+ deadline: payload.deadline,
57
+ previousConsumption,
58
+ previousSessionId,
59
+ }, payload.buyerSig);
60
+ if (recovered.toLowerCase() !== buyerEvmAddr.toLowerCase()) {
61
+ debugWarn(`[SellerPayment] Invalid V2 sig from ${buyerPeerId.slice(0, 12)}... recovered=${recovered.slice(0, 10)}... expected=${buyerEvmAddr.slice(0, 10)}...`);
62
+ return;
63
+ }
64
+ const prevSession = this._sessions.get(buyerPeerId);
65
+ if (prevSession && !prevSession.settled) {
66
+ debugLog(`[SellerPayment] Settling previous session ${prevSession.sessionId.slice(0, 18)}... before reserve()`);
67
+ try {
68
+ const chargeAmount = this._computeChargeAmount(prevSession);
69
+ await this._escrow.settle(this._signer, prevSession.sessionId, chargeAmount);
70
+ prevSession.settled = true;
71
+ }
72
+ catch (err) {
73
+ debugWarn(`[SellerPayment] Failed to settle previous session: ${err}`);
74
+ }
75
+ }
76
+ try {
77
+ await this._escrow.reserve(this._signer, payload.sessionId, buyerEvmAddr, maxAmount, payload.nonce, payload.deadline, previousConsumption, previousSessionId, payload.buyerSig);
78
+ }
79
+ catch (err) {
80
+ debugWarn(`[SellerPayment] reserve() failed for ${buyerPeerId.slice(0, 12)}...: ${err}`);
81
+ return;
82
+ }
83
+ this._sessions.set(buyerPeerId, {
84
+ sessionId: payload.sessionId,
85
+ buyerPeerId,
86
+ buyerEvmAddr,
87
+ nonce: payload.nonce,
88
+ authMax: maxAmount,
89
+ deadline: payload.deadline,
90
+ buyerSig: payload.buyerSig,
91
+ previousConsumption,
92
+ previousSessionId,
93
+ tokensDelivered: 0n,
94
+ reservedAt: Date.now(),
95
+ settled: false,
96
+ });
97
+ paymentMux.sendAuthAck({ sessionId: payload.sessionId, nonce: payload.nonce });
98
+ debugLog(`[SellerPayment] AuthAck sent for session=${payload.sessionId.slice(0, 18)}...`);
99
+ }
100
+ addTokensDelivered(buyerPeerId, tokens) {
101
+ const session = this._sessions.get(buyerPeerId);
102
+ if (!session || session.settled)
103
+ return;
104
+ session.tokensDelivered += tokens;
105
+ debugLog(`[SellerPayment] Tokens accrued for ${buyerPeerId.slice(0, 12)}...: ${session.tokensDelivered}`);
106
+ }
107
+ async onBuyerDisconnect(buyerPeerId) {
108
+ const session = this._sessions.get(buyerPeerId);
109
+ if (!session || session.settled) {
110
+ this._sessions.delete(buyerPeerId);
111
+ return;
112
+ }
113
+ const settleTimeoutMs = 24 * 60 * 60 * 1000;
114
+ const elapsed = Date.now() - session.reservedAt;
115
+ if (elapsed >= settleTimeoutMs) {
116
+ debugLog(`[SellerPayment] settleTimeout() for ghost session ${session.sessionId.slice(0, 18)}...`);
117
+ try {
118
+ await this._escrow.settleTimeout(this._signer, session.sessionId);
119
+ session.settled = true;
120
+ }
121
+ catch (err) {
122
+ debugWarn(`[SellerPayment] settleTimeout() failed: ${err}`);
123
+ }
124
+ }
125
+ else {
126
+ debugLog('[SellerPayment] Buyer disconnected, session not yet timeout-eligible. Will settle on next SpendingAuthV2.');
127
+ }
128
+ this._sessions.delete(buyerPeerId);
129
+ }
130
+ async settleSession(buyerPeerId, chargeAmount) {
131
+ const session = this._sessions.get(buyerPeerId);
132
+ if (!session || session.settled)
133
+ return;
134
+ try {
135
+ await this._escrow.settle(this._signer, session.sessionId, chargeAmount);
136
+ session.settled = true;
137
+ debugLog(`[SellerPayment] Settled session ${session.sessionId.slice(0, 18)}... charged=${chargeAmount}`);
138
+ }
139
+ catch (err) {
140
+ debugWarn(`[SellerPayment] settle() failed: ${err}`);
141
+ throw err;
142
+ }
143
+ }
144
+ async claimEarnings() {
145
+ return this._escrow.claimEarnings(this._signer);
146
+ }
147
+ async stake(amount) {
148
+ return this._escrow.stake(this._signer, amount);
149
+ }
150
+ async unstake(amount) {
151
+ return this._escrow.unstake(this._signer, amount);
152
+ }
153
+ async getPendingEarnings() {
154
+ const addr = await this._signer.getAddress();
155
+ return this._escrow.getSellerPendingEarnings(addr);
156
+ }
157
+ _computeChargeAmount(session) {
158
+ return session.authMax;
159
+ }
160
+ }
161
+ //# sourceMappingURL=seller-payment-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-payment-manager.js","sourceRoot":"","sources":["../../src/payments/seller-payment-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { SerializedHttpRequest, SerializedHttpResponse } from '../types/http.js';
2
+ import type { ModelApiProtocol } from '../types/model-api.js';
3
+ export interface TargetProtocolSelection {
4
+ targetProtocol: ModelApiProtocol;
5
+ requiresTransform: boolean;
6
+ }
7
+ export interface AnthropicToOpenAIRequestTransformResult {
8
+ request: SerializedHttpRequest;
9
+ streamRequested: boolean;
10
+ requestedModel: string | null;
11
+ }
12
+ export declare function detectRequestModelApiProtocol(request: Pick<SerializedHttpRequest, 'path' | 'headers'>): ModelApiProtocol | null;
13
+ export declare function inferProviderDefaultModelApiProtocols(providerName: string): ModelApiProtocol[];
14
+ export declare function selectTargetProtocolForRequest(requestProtocol: ModelApiProtocol | null, supportedProtocols: ModelApiProtocol[]): TargetProtocolSelection | null;
15
+ export declare function transformAnthropicMessagesRequestToOpenAIChat(request: SerializedHttpRequest): AnthropicToOpenAIRequestTransformResult | null;
16
+ export declare function transformOpenAIChatResponseToAnthropicMessage(response: SerializedHttpResponse, options: {
17
+ streamRequested: boolean;
18
+ fallbackModel?: string | null;
19
+ }): SerializedHttpResponse;
20
+ export interface ResponsesToOpenAIRequestTransformResult {
21
+ request: SerializedHttpRequest;
22
+ streamRequested: boolean;
23
+ requestedModel: string | null;
24
+ }
25
+ export declare function transformOpenAIResponsesRequestToOpenAIChat(request: SerializedHttpRequest): ResponsesToOpenAIRequestTransformResult | null;
26
+ export declare function transformOpenAIChatResponseToOpenAIResponses(response: SerializedHttpResponse, options: {
27
+ fallbackModel?: string | null;
28
+ streamRequested?: boolean;
29
+ }): SerializedHttpResponse;
30
+ //# sourceMappingURL=model-api-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-api-adapter.d.ts","sourceRoot":"","sources":["../../src/proxy/model-api-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9D,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,gBAAgB,CAAC;IACjC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,qBAAqB,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AA+VD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAsB/H;AAED,wBAAgB,qCAAqC,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAY9F;AAED,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,gBAAgB,GAAG,IAAI,EACxC,kBAAkB,EAAE,gBAAgB,EAAE,GACrC,uBAAuB,GAAG,IAAI,CAchC;AAED,wBAAgB,6CAA6C,CAC3D,OAAO,EAAE,qBAAqB,GAC7B,uCAAuC,GAAG,IAAI,CAmEhD;AAED,wBAAgB,6CAA6C,CAC3D,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE;IAAE,eAAe,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACnE,sBAAsB,CAoIxB;AAMD,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,qBAAqB,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAgID,wBAAgB,2CAA2C,CACzD,OAAO,EAAE,qBAAqB,GAC7B,uCAAuC,GAAG,IAAI,CAgEhD;AAqLD,wBAAgB,4CAA4C,CAC1D,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GACpE,sBAAsB,CA4CxB"}