@hivemind-os/collective-core 0.2.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/.test-data/05a845c4-1682-41b9-97e5-65a5263156c0/spending.sqlite +0 -0
- package/.test-data/10e18ba5-98f0-42e0-8899-06a09459ae85/agents.sqlite +0 -0
- package/.test-data/20464456-23cb-4ff7-8df5-3c129fb95a90/agents.sqlite +0 -0
- package/.test-data/2e2ec66c-e8b4-43eb-945f-cca84ed0a0f6/agents.sqlite +0 -0
- package/.test-data/2f5ef9b7-01da-4ba0-a6fa-af8063a2567c/agents.sqlite +0 -0
- package/.test-data/3ac13cd5-84c9-4e71-8b89-6d3ef4dd819c/agents.sqlite +0 -0
- package/.test-data/40b7dd4a-fae0-4a5d-a6a0-64c9048af35e/agents.sqlite +0 -0
- package/.test-data/59511a04-42f8-4286-bb1e-733795e08749/agents.sqlite +0 -0
- package/.test-data/6778e8c5-6eb5-416d-8aca-9d559cdf83e4/agents.sqlite +0 -0
- package/.test-data/7648dc86-df90-4460-8f9c-55cdb481324b/agents.sqlite +0 -0
- package/.test-data/77162d98-6b22-41b1-a50f-536fab739f8a/agents.sqlite +0 -0
- package/.test-data/798dbdab-cbe7-4edd-8a5b-ae99c285fe17/agents.sqlite +0 -0
- package/.test-data/8033d6ac-8b85-454d-b708-00ac695b22f8/agents.sqlite +0 -0
- package/.test-data/9155a4f4-cda3-487c-9eed-921c82d7550f/agents.sqlite +0 -0
- package/.test-data/9bfeee53-c231-46c3-8c93-2180933f5d50/agents.sqlite +0 -0
- package/.test-data/a4c64287-79f6-46e9-847d-2803c63a74fd/agents.sqlite +0 -0
- package/.test-data/b8f58952-1ed8-46ff-abd7-21fb86e9457f/agents.sqlite +0 -0
- package/.test-data/c3060504-3187-41ed-8532-82332be48b0b/spending.sqlite +0 -0
- package/.test-data/cc471629-8006-4fc1-b8a1-399d2df2cc4e/agents.sqlite +0 -0
- package/.test-data/dbca3bef-397d-4bbc-bd4c-4f7b14103e04/spending.sqlite +0 -0
- package/.test-data/f1283dd1-6602-4de7-a050-16aac7abc288/agents.sqlite +0 -0
- package/.turbo/turbo-build.log +14 -0
- package/dist/index.d.ts +1675 -0
- package/dist/index.js +8006 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
- package/src/auth/device-flow.ts +108 -0
- package/src/auth/ed25519-provider.ts +43 -0
- package/src/auth/errors.ts +82 -0
- package/src/auth/evm-key.ts +55 -0
- package/src/auth/index.ts +8 -0
- package/src/auth/session-state.ts +25 -0
- package/src/auth/session-store.ts +510 -0
- package/src/auth/types.ts +81 -0
- package/src/auth/zklogin-provider.ts +902 -0
- package/src/blobstore/WALRUS_FINDINGS.md +284 -0
- package/src/blobstore/encrypted-store.ts +56 -0
- package/src/blobstore/fs-store.ts +91 -0
- package/src/blobstore/hybrid-store.ts +144 -0
- package/src/blobstore/index.ts +5 -0
- package/src/blobstore/interface.ts +33 -0
- package/src/blobstore/walrus-spike.ts +345 -0
- package/src/blobstore/walrus-store.ts +551 -0
- package/src/cache/agent-cache.ts +403 -0
- package/src/cache/index.ts +1 -0
- package/src/crypto/encryption.ts +152 -0
- package/src/crypto/index.ts +2 -0
- package/src/crypto/x25519.ts +41 -0
- package/src/dispute/client.ts +191 -0
- package/src/dispute/index.ts +1 -0
- package/src/events/index.ts +2 -0
- package/src/events/parser.ts +291 -0
- package/src/events/subscription.ts +131 -0
- package/src/evm/constants.ts +6 -0
- package/src/evm/index.ts +2 -0
- package/src/evm/wallet.ts +136 -0
- package/src/identity/did.ts +36 -0
- package/src/identity/index.ts +4 -0
- package/src/identity/keypair.ts +199 -0
- package/src/identity/signing.ts +28 -0
- package/src/index.ts +22 -0
- package/src/internal/parsing.ts +416 -0
- package/src/marketplace/client.ts +349 -0
- package/src/marketplace/index.ts +1 -0
- package/src/metering/hash-chain.ts +94 -0
- package/src/metering/index.ts +4 -0
- package/src/metering/meter.ts +80 -0
- package/src/metering/streaming.ts +196 -0
- package/src/metering/verification.ts +104 -0
- package/src/payment/index.ts +1 -0
- package/src/payment/rail-selector.ts +41 -0
- package/src/registry/client.ts +328 -0
- package/src/registry/index.ts +1 -0
- package/src/relay/consumer-client.ts +497 -0
- package/src/relay/index.ts +1 -0
- package/src/relay-registry/client.ts +295 -0
- package/src/relay-registry/discovery.ts +109 -0
- package/src/relay-registry/index.ts +2 -0
- package/src/reputation/anchor-client.ts +126 -0
- package/src/reputation/event-publisher.ts +67 -0
- package/src/reputation/index.ts +5 -0
- package/src/reputation/merkle.ts +79 -0
- package/src/reputation/score-calculator.ts +133 -0
- package/src/reputation/serialization.ts +37 -0
- package/src/reputation/store.ts +165 -0
- package/src/reputation/validation.ts +135 -0
- package/src/routing/circuit-breaker.ts +111 -0
- package/src/routing/fan-out.ts +266 -0
- package/src/routing/index.ts +4 -0
- package/src/routing/performance.ts +244 -0
- package/src/routing/selector.ts +225 -0
- package/src/spending/index.ts +1 -0
- package/src/spending/policy.ts +271 -0
- package/src/staking/client.ts +319 -0
- package/src/staking/index.ts +1 -0
- package/src/sui/client.ts +214 -0
- package/src/sui/index.ts +2 -0
- package/src/sui/tx-helpers.ts +1070 -0
- package/src/task/client.ts +215 -0
- package/src/task/index.ts +1 -0
- package/src/x402/client.ts +295 -0
- package/src/x402/index.ts +1 -0
- package/tests/auth/device-flow.test.ts +62 -0
- package/tests/auth/ed25519-provider.test.ts +24 -0
- package/tests/auth/evm-key.test.ts +31 -0
- package/tests/auth/session-store.test.ts +201 -0
- package/tests/auth/zklogin-provider.test.ts +366 -0
- package/tests/blobstore/encrypted-store.test.ts +78 -0
- package/tests/blobstore.test.ts +91 -0
- package/tests/cache.test.ts +124 -0
- package/tests/crypto/encryption.test.ts +70 -0
- package/tests/crypto/x25519.test.ts +47 -0
- package/tests/dispute/client.test.ts +238 -0
- package/tests/events.test.ts +202 -0
- package/tests/evm/wallet.test.ts +101 -0
- package/tests/hybrid-store.test.ts +121 -0
- package/tests/identity.test.ts +161 -0
- package/tests/marketplace.test.ts +308 -0
- package/tests/metering/hash-chain.test.ts +32 -0
- package/tests/metering/meter.test.ts +23 -0
- package/tests/metering/streaming.test.ts +52 -0
- package/tests/metering/verification.test.ts +27 -0
- package/tests/payment/rail-selector.test.ts +95 -0
- package/tests/registry.test.ts +183 -0
- package/tests/relay-consumer-client.test.ts +119 -0
- package/tests/relay-registry/client.test.ts +261 -0
- package/tests/reputation/event-publisher.test.ts +70 -0
- package/tests/reputation/merkle.test.ts +44 -0
- package/tests/reputation/score-calculator.test.ts +104 -0
- package/tests/reputation/store.test.ts +94 -0
- package/tests/routing/circuit-breaker.test.ts +45 -0
- package/tests/routing/fan-out.test.ts +123 -0
- package/tests/routing/performance.test.ts +49 -0
- package/tests/routing/selector.test.ts +114 -0
- package/tests/spending.test.ts +133 -0
- package/tests/staking/client.test.ts +286 -0
- package/tests/sui-client.test.ts +85 -0
- package/tests/task.test.ts +249 -0
- package/tests/tx-helpers.test.ts +70 -0
- package/tests/walrus-spike.test.ts +100 -0
- package/tests/walrus-store.test.ts +196 -0
- package/tests/x402/client.test.ts +116 -0
- package/tsconfig.json +9 -0
- package/tsup.config.ts +11 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/identity/keypair.ts","../src/identity/did.ts","../src/identity/signing.ts","../src/crypto/x25519.ts","../src/crypto/encryption.ts","../src/auth/session-state.ts","../src/auth/errors.ts","../src/auth/ed25519-provider.ts","../src/auth/zklogin-provider.ts","../src/auth/session-store.ts","../src/auth/device-flow.ts","../src/auth/evm-key.ts","../src/sui/client.ts","../src/internal/parsing.ts","../src/sui/tx-helpers.ts","../src/registry/client.ts","../src/events/parser.ts","../src/reputation/score-calculator.ts","../src/staking/client.ts","../src/task/client.ts","../src/marketplace/client.ts","../src/dispute/client.ts","../src/events/subscription.ts","../src/cache/agent-cache.ts","../src/blobstore/interface.ts","../src/blobstore/fs-store.ts","../src/blobstore/hybrid-store.ts","../src/blobstore/walrus-store.ts","../src/blobstore/encrypted-store.ts","../src/evm/constants.ts","../src/evm/wallet.ts","../src/payment/rail-selector.ts","../src/relay/consumer-client.ts","../src/relay-registry/client.ts","../src/relay-registry/discovery.ts","../src/spending/policy.ts","../src/x402/client.ts","../src/reputation/merkle.ts","../src/reputation/serialization.ts","../src/reputation/anchor-client.ts","../src/reputation/event-publisher.ts","../src/reputation/validation.ts","../src/reputation/store.ts","../src/metering/hash-chain.ts","../src/metering/meter.ts","../src/metering/streaming.ts","../src/metering/verification.ts","../src/routing/circuit-breaker.ts","../src/routing/fan-out.ts","../src/routing/performance.ts","../src/routing/selector.ts"],"sourcesContent":["export * from '@hivemind-os/collective-types';\nexport * from './identity/index.js';\nexport * from './crypto/index.js';\nexport * from './auth/index.js';\nexport * from './sui/index.js';\nexport * from './registry/index.js';\nexport * from './task/index.js';\nexport * from './marketplace/index.js';\nexport * from './dispute/index.js';\nexport * from './events/index.js';\nexport * from './cache/index.js';\nexport * from './blobstore/index.js';\nexport * from './evm/index.js';\nexport * from './payment/index.js';\nexport * from './relay/index.js';\nexport * from './relay-registry/index.js';\nexport * from './spending/index.js';\nexport * from './x402/index.js';\nexport * from './reputation/index.js';\nexport * from './staking/index.js';\nexport * from './metering/index.js';\nexport * from './routing/index.js';\n","import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { etc, getPublicKey, utils } from '@noble/ed25519';\nimport { sha512 } from '@noble/hashes/sha512';\nimport pino from 'pino';\n\nconst logger = pino({ name: '@hivemind-os/collective-core:identity' });\nconst IDENTITY_KEY_FILENAME = 'identity.key';\nconst KEYCHAIN_SERVICE = 'hivemind-collective';\nconst KEYCHAIN_ACCOUNT = 'identity-key';\n\ninterface KeytarModule {\n getPassword(service: string, account: string): Promise<string | null>;\n setPassword(service: string, account: string, password: string): Promise<void>;\n}\n\nlet keytarModulePromise: Promise<KeytarModule | null> | undefined;\nlet hasLoggedKeychainFallback = false;\n\nfunction configureEd25519(): void {\n if (!etc.sha512Sync) {\n etc.sha512Sync = (...messages) => sha512(etc.concatBytes(...messages));\n }\n}\n\nfunction enforcePrivateFilePermissions(path: string): void {\n chmodSync(path, 0o600);\n}\n\nfunction getIdentityKeyPath(dataDir: string): string {\n return join(dataDir, IDENTITY_KEY_FILENAME);\n}\n\nfunction logKeychainFallback(error: unknown): void {\n if (!hasLoggedKeychainFallback) {\n logger.warn({ err: error }, 'OS keychain unavailable; falling back to file-based identity storage.');\n hasLoggedKeychainFallback = true;\n }\n}\n\nasync function importKeytar(): Promise<KeytarModule | null> {\n try {\n const imported = await import('keytar');\n const keytar = ('default' in imported && imported.default ? imported.default : imported) as Partial<KeytarModule>;\n if (typeof keytar.getPassword !== 'function' || typeof keytar.setPassword !== 'function') {\n throw new Error('keytar module is missing required methods.');\n }\n\n return {\n getPassword: keytar.getPassword.bind(keytar),\n setPassword: keytar.setPassword.bind(keytar),\n };\n } catch (error) {\n logKeychainFallback(error);\n return null;\n }\n}\n\nasync function getKeytarModule(): Promise<KeytarModule | null> {\n keytarModulePromise ??= importKeytar();\n return await keytarModulePromise;\n}\n\nasync function loadOrCreateStoredKeypair(store: KeyStore): Promise<SimpleKeypair> {\n if (await store.exists()) {\n return keypairFromSecretKey(await store.load());\n }\n\n const keypair = generateKeypair();\n await store.save(keypair.secretKey);\n return keypair;\n}\n\nexport interface SimpleKeypair {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n}\n\nexport interface KeyStore {\n load(): Promise<Uint8Array>;\n save(secretKey: Uint8Array): Promise<void>;\n exists(): Promise<boolean>;\n}\n\nexport class FileKeyStore implements KeyStore {\n constructor(private readonly keyPath: string) {}\n\n async load(): Promise<Uint8Array> {\n enforcePrivateFilePermissions(this.keyPath);\n return etc.hexToBytes(readFileSync(this.keyPath, 'utf8').trim());\n }\n\n async save(secretKey: Uint8Array): Promise<void> {\n writeFileSync(this.keyPath, etc.bytesToHex(secretKey), { mode: 0o600 });\n enforcePrivateFilePermissions(this.keyPath);\n }\n\n async exists(): Promise<boolean> {\n return existsSync(this.keyPath);\n }\n\n delete(): void {\n unlinkSync(this.keyPath);\n }\n}\n\nexport class KeychainStore implements KeyStore {\n constructor(\n private readonly keytar: KeytarModule,\n private readonly service = KEYCHAIN_SERVICE,\n private readonly account = KEYCHAIN_ACCOUNT,\n ) {}\n\n async load(): Promise<Uint8Array> {\n const secretKey = await this.keytar.getPassword(this.service, this.account);\n if (!secretKey) {\n throw new Error('Identity key not found in OS keychain.');\n }\n\n return etc.hexToBytes(secretKey);\n }\n\n async save(secretKey: Uint8Array): Promise<void> {\n await this.keytar.setPassword(this.service, this.account, etc.bytesToHex(secretKey));\n }\n\n async exists(): Promise<boolean> {\n return (await this.keytar.getPassword(this.service, this.account)) !== null;\n }\n}\n\nexport function generateKeypair(): SimpleKeypair {\n configureEd25519();\n const secretKey = utils.randomPrivateKey();\n const publicKey = getPublicKey(secretKey);\n\n return { publicKey, secretKey };\n}\n\nexport function keypairFromSecretKey(secretKey: Uint8Array): SimpleKeypair {\n configureEd25519();\n const normalizedSecretKey = new Uint8Array(secretKey);\n const publicKey = getPublicKey(normalizedSecretKey);\n\n return {\n publicKey,\n secretKey: normalizedSecretKey,\n };\n}\n\nexport async function createKeyStore(dataDir: string): Promise<KeyStore> {\n const keytar = await getKeytarModule();\n return keytar ? new KeychainStore(keytar) : new FileKeyStore(getIdentityKeyPath(dataDir));\n}\n\nexport async function identityKeyExists(dataDir: string): Promise<boolean> {\n const fileStore = new FileKeyStore(getIdentityKeyPath(dataDir));\n if (await fileStore.exists()) {\n return true;\n }\n\n const keyStore = await createKeyStore(dataDir);\n if (keyStore instanceof KeychainStore) {\n try {\n return await keyStore.exists();\n } catch (error) {\n logKeychainFallback(error);\n return await fileStore.exists();\n }\n }\n\n return await keyStore.exists();\n}\n\nexport async function loadOrCreateKeypair(dataDir: string): Promise<SimpleKeypair> {\n configureEd25519();\n mkdirSync(dataDir, { recursive: true, mode: 0o700 });\n\n const fileStore = new FileKeyStore(getIdentityKeyPath(dataDir));\n const keyStore = await createKeyStore(dataDir);\n\n if (keyStore instanceof KeychainStore) {\n try {\n if (await fileStore.exists()) {\n const secretKey = await fileStore.load();\n await keyStore.save(secretKey);\n fileStore.delete();\n return keypairFromSecretKey(secretKey);\n }\n\n return await loadOrCreateStoredKeypair(keyStore);\n } catch (error) {\n logKeychainFallback(error);\n }\n }\n\n return await loadOrCreateStoredKeypair(fileStore);\n}\n","import bs58 from 'bs58';\n\nimport type { DID } from '@hivemind-os/collective-types';\n\nconst DID_PREFIX = 'did:mesh:';\n\nexport function createDID(publicKey: Uint8Array): DID {\n return `${DID_PREFIX}${bs58.encode(publicKey)}` as DID;\n}\n\nexport function parseDID(did: string): { publicKey: Uint8Array } {\n if (!did.startsWith(DID_PREFIX)) {\n throw new Error(`Invalid DID prefix: ${did}`);\n }\n\n const encodedKey = did.slice(DID_PREFIX.length);\n if (!encodedKey) {\n throw new Error('DID is missing a public key component.');\n }\n\n const publicKey = bs58.decode(encodedKey);\n if (publicKey.length !== 32) {\n throw new Error('DID public key must decode to 32 bytes.');\n }\n\n return { publicKey };\n}\n\nexport function isValidDID(did: string): boolean {\n try {\n parseDID(did);\n return true;\n } catch {\n return false;\n }\n}\n","import { etc, sign as nobleSign, verify as nobleVerify } from '@noble/ed25519';\nimport { sha512 } from '@noble/hashes/sha512';\n\nconst encoder = new TextEncoder();\n\nfunction configureEd25519(): void {\n if (!etc.sha512Sync) {\n etc.sha512Sync = (...messages) => sha512(etc.concatBytes(...messages));\n }\n}\n\nexport function sign(message: Uint8Array, secretKey: Uint8Array): Uint8Array {\n configureEd25519();\n return nobleSign(message, secretKey);\n}\n\nexport function verify(\n message: Uint8Array,\n signature: Uint8Array,\n publicKey: Uint8Array,\n): boolean {\n configureEd25519();\n return nobleVerify(signature, message, publicKey);\n}\n\nexport function signString(message: string, secretKey: Uint8Array): string {\n return etc.bytesToHex(sign(encoder.encode(message), secretKey));\n}\n","import { ed25519, x25519 } from '@noble/curves/ed25519.js';\n\nexport interface X25519KeyPair {\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n}\n\nconst X25519_KEY_SIZE = 32;\n\nexport function generateX25519KeyPair(): X25519KeyPair {\n const privateKey = x25519.utils.randomSecretKey();\n return {\n privateKey,\n publicKey: x25519.getPublicKey(privateKey),\n };\n}\n\nexport function ed25519ToX25519(ed25519PrivateKey: Uint8Array): X25519KeyPair {\n assertKeyLength(ed25519PrivateKey, 'ed25519PrivateKey');\n\n const privateKey = ed25519.utils.toMontgomerySecret(new Uint8Array(ed25519PrivateKey));\n return {\n privateKey,\n publicKey: x25519.getPublicKey(privateKey),\n };\n}\n\nexport function computeSharedSecret(\n myPrivateKey: Uint8Array,\n theirPublicKey: Uint8Array,\n): Uint8Array {\n assertKeyLength(myPrivateKey, 'myPrivateKey');\n assertKeyLength(theirPublicKey, 'theirPublicKey');\n return x25519.getSharedSecret(myPrivateKey, theirPublicKey);\n}\n\nfunction assertKeyLength(key: Uint8Array, field: string): void {\n if (key.length !== X25519_KEY_SIZE) {\n throw new Error(`${field} must be ${X25519_KEY_SIZE} bytes, received ${key.length}.`);\n }\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nimport { x25519 } from '@noble/curves/ed25519.js';\nimport { xchacha20poly1305 } from '@noble/ciphers/chacha.js';\nimport { hkdf } from '@noble/hashes/hkdf';\nimport { sha256 } from '@noble/hashes/sha256';\n\nimport { computeSharedSecret } from './x25519.js';\n\nexport interface EncryptedPayload {\n version: 1;\n senderPublicKey: string;\n nonce: string;\n ciphertext: string;\n tag: string;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst ENCRYPTION_CONTEXT = 'agentic-mesh:encrypt:v1';\nconst NONCE_BYTES = 24;\nconst PUBLIC_KEY_BYTES = 32;\nconst TAG_BYTES = 16;\n\nexport async function encryptForRecipient(\n plaintext: Uint8Array,\n senderPrivateKey: Uint8Array,\n recipientPublicKey: Uint8Array,\n): Promise<EncryptedPayload> {\n assertByteLength(senderPrivateKey, PUBLIC_KEY_BYTES, 'senderPrivateKey');\n assertByteLength(recipientPublicKey, PUBLIC_KEY_BYTES, 'recipientPublicKey');\n\n const nonce = randomBytes(NONCE_BYTES);\n const senderPublicKey = x25519.getPublicKey(senderPrivateKey);\n const sharedSecret = computeSharedSecret(senderPrivateKey, recipientPublicKey);\n const encryptionKey = deriveEncryptionKey(sharedSecret, nonce, senderPublicKey, recipientPublicKey);\n const ciphertext = xchacha20poly1305(encryptionKey, nonce).encrypt(plaintext);\n\n return {\n version: 1,\n senderPublicKey: toHex(senderPublicKey),\n nonce: toHex(nonce),\n ciphertext: toHex(ciphertext),\n tag: toHex(ciphertext.slice(-TAG_BYTES)),\n };\n}\n\nexport async function decryptFromSender(\n payload: EncryptedPayload,\n recipientPrivateKey: Uint8Array,\n): Promise<Uint8Array> {\n assertEncryptedPayload(payload);\n assertByteLength(recipientPrivateKey, PUBLIC_KEY_BYTES, 'recipientPrivateKey');\n\n const senderPublicKey = fromHexExact(payload.senderPublicKey, PUBLIC_KEY_BYTES, 'senderPublicKey');\n const nonce = fromHexExact(payload.nonce, NONCE_BYTES, 'nonce');\n const ciphertext = fromHexAtLeast(payload.ciphertext, TAG_BYTES, 'ciphertext');\n const tag = fromHexExact(payload.tag, TAG_BYTES, 'tag');\n\n const actualTag = ciphertext.slice(-TAG_BYTES);\n if (!timingSafeEqual(Buffer.from(actualTag), Buffer.from(tag))) {\n throw new Error('Encrypted payload tag does not match ciphertext.');\n }\n\n const recipientPublicKey = x25519.getPublicKey(recipientPrivateKey);\n const sharedSecret = computeSharedSecret(recipientPrivateKey, senderPublicKey);\n const encryptionKey = deriveEncryptionKey(sharedSecret, nonce, senderPublicKey, recipientPublicKey);\n return xchacha20poly1305(encryptionKey, nonce).decrypt(ciphertext);\n}\n\nexport function serializeEncryptedPayload(payload: EncryptedPayload): Uint8Array {\n assertEncryptedPayload(payload);\n return encoder.encode(JSON.stringify(payload));\n}\n\nexport function parseEncryptedPayload(data: Uint8Array): EncryptedPayload | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(decoder.decode(data)) as unknown;\n } catch {\n return null;\n }\n\n if (!isEncryptedPayload(parsed)) {\n return null;\n }\n\n return parsed;\n}\n\nexport function isEncryptedPayload(value: unknown): value is EncryptedPayload {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n return candidate.version === 1\n && isExactHexString(candidate.senderPublicKey, PUBLIC_KEY_BYTES)\n && isExactHexString(candidate.nonce, NONCE_BYTES)\n && isHexStringAtLeast(candidate.ciphertext, TAG_BYTES)\n && isExactHexString(candidate.tag, TAG_BYTES);\n}\n\nfunction deriveEncryptionKey(\n sharedSecret: Uint8Array,\n nonce: Uint8Array,\n senderPublicKey: Uint8Array,\n recipientPublicKey: Uint8Array,\n): Uint8Array {\n const info = encoder.encode(`${ENCRYPTION_CONTEXT}:sender:${toHex(senderPublicKey)}:recipient:${toHex(recipientPublicKey)}`);\n return hkdf(sha256, sharedSecret, nonce, info, 32);\n}\n\nfunction assertEncryptedPayload(payload: EncryptedPayload): void {\n if (!isEncryptedPayload(payload)) {\n throw new Error('Invalid encrypted payload.');\n }\n}\n\nfunction assertByteLength(value: Uint8Array, expectedLength: number, field: string): void {\n if (value.length !== expectedLength) {\n throw new Error(`${field} must be ${expectedLength} bytes, received ${value.length}.`);\n }\n}\n\nfunction fromHexExact(value: string, exactBytes: number, field: string): Uint8Array {\n if (!isExactHexString(value, exactBytes)) {\n throw new Error(`${field} must be exactly ${exactBytes} bytes of hex.`);\n }\n\n return new Uint8Array(Buffer.from(value, 'hex'));\n}\n\nfunction fromHexAtLeast(value: string, minimumBytes: number, field: string): Uint8Array {\n if (!isHexStringAtLeast(value, minimumBytes)) {\n throw new Error(`${field} must be at least ${minimumBytes} bytes of hex.`);\n }\n\n return new Uint8Array(Buffer.from(value, 'hex'));\n}\n\nfunction isExactHexString(value: unknown, exactBytes: number): value is string {\n return typeof value === 'string' && value.length === exactBytes * 2 && /^[a-f0-9]+$/i.test(value);\n}\n\nfunction isHexStringAtLeast(value: unknown, minimumBytes: number): value is string {\n return typeof value === 'string' && value.length % 2 === 0 && value.length >= minimumBytes * 2 && /^[a-f0-9]+$/i.test(value);\n}\n\nfunction toHex(value: Uint8Array): string {\n return Buffer.from(value).toString('hex');\n}\n","import type { StoredZkLoginSession } from './types.js';\n\nexport enum SessionState {\n VALID = 'valid',\n REFRESHING = 'refreshing',\n NEEDS_REAUTH = 'needs_reauth',\n EXPIRED = 'expired',\n}\n\nexport interface SessionRefreshPolicy {\n maxAttempts?: number;\n backoffMs?: readonly number[];\n maxConsecutiveFailures?: number;\n}\n\nexport interface SessionStateChangeEvent {\n previousState: SessionState;\n currentState: SessionState;\n session: StoredZkLoginSession | null;\n reason?: string;\n refreshFailureCount: number;\n error?: unknown;\n}\n\nexport type SessionStateChangeCallback = (event: SessionStateChangeEvent) => void;\n","import { SessionState } from './session-state.js';\nimport type { StoredZkLoginSession } from './types.js';\n\ninterface SessionContext {\n address: string;\n iss: string;\n maxEpoch: number;\n updatedAt: number;\n}\n\nfunction toSessionContext(session?: StoredZkLoginSession | null): SessionContext | undefined {\n if (!session) {\n return undefined;\n }\n\n return {\n address: session.address,\n iss: session.iss,\n maxEpoch: session.maxEpoch,\n updatedAt: session.updatedAt,\n };\n}\n\nexport interface SessionRefreshErrorOptions {\n attempts: number;\n maxAttempts: number;\n retryDelaysMs: readonly number[];\n consecutiveFailures: number;\n sessionState: SessionState;\n session?: StoredZkLoginSession | null;\n cause?: unknown;\n}\n\nexport class SessionRefreshError extends Error {\n readonly attempts: number;\n readonly maxAttempts: number;\n readonly retryDelaysMs: readonly number[];\n readonly consecutiveFailures: number;\n readonly sessionState: SessionState;\n readonly session?: SessionContext;\n\n constructor(message: string, options: SessionRefreshErrorOptions) {\n super(message, { cause: options.cause });\n this.name = 'SessionRefreshError';\n this.attempts = options.attempts;\n this.maxAttempts = options.maxAttempts;\n this.retryDelaysMs = options.retryDelaysMs;\n this.consecutiveFailures = options.consecutiveFailures;\n this.sessionState = options.sessionState;\n this.session = toSessionContext(options.session);\n }\n}\n\nexport interface SessionExpiredErrorOptions {\n attempts?: number;\n maxAttempts?: number;\n retryDelaysMs?: readonly number[];\n consecutiveFailures?: number;\n sessionState?: SessionState;\n session?: StoredZkLoginSession | null;\n cause?: unknown;\n}\n\nexport class SessionExpiredError extends Error {\n readonly attempts?: number;\n readonly maxAttempts?: number;\n readonly retryDelaysMs?: readonly number[];\n readonly consecutiveFailures?: number;\n readonly sessionState: SessionState;\n readonly session?: SessionContext;\n\n constructor(message: string, options: SessionExpiredErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = 'SessionExpiredError';\n this.attempts = options.attempts;\n this.maxAttempts = options.maxAttempts;\n this.retryDelaysMs = options.retryDelaysMs;\n this.consecutiveFailures = options.consecutiveFailures;\n this.sessionState = options.sessionState ?? SessionState.NEEDS_REAUTH;\n this.session = toSessionContext(options.session);\n }\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nimport { createDID } from '../identity/did.js';\n\nimport type { AuthProvider } from './types.js';\n\nconst encoder = new TextEncoder();\n\nexport class Ed25519AuthProvider implements AuthProvider {\n readonly mode = 'ed25519' as const;\n\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n async getAddress(): Promise<string> {\n return this.keypair.toSuiAddress();\n }\n\n getDID(): string {\n return createDID(this.keypair.getPublicKey().toRawBytes());\n }\n\n async signTransaction(tx: Uint8Array): Promise<Uint8Array> {\n const { signature } = await this.keypair.signTransaction(tx);\n return encoder.encode(signature);\n }\n\n async signPersonalMessage(message: Uint8Array): Promise<{ signature: Uint8Array }> {\n const { signature } = await this.keypair.signPersonalMessage(message);\n return { signature: encoder.encode(signature) };\n }\n\n isAuthenticated(): boolean {\n return true;\n }\n\n getPublicKey(): Uint8Array {\n return this.keypair.getPublicKey().toRawBytes();\n }\n\n toSuiSigner(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import { createHash, randomBytes } from 'node:crypto';\n\nimport { type PublicKey, Signer, type SignatureScheme } from '@mysten/sui/cryptography';\nimport type { SuiClient } from '@mysten/sui/client';\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport {\n decodeJwt,\n genAddressSeed,\n generateNonce,\n generateRandomness,\n getExtendedEphemeralPublicKey,\n getZkLoginSignature,\n jwtToAddress,\n toZkLoginPublicIdentifier,\n type ZkLoginPublicIdentifier,\n} from '@mysten/sui/zklogin';\n\nimport { SessionExpiredError, SessionRefreshError } from './errors.js';\nimport { ZkLoginSessionStore } from './session-store.js';\nimport { SessionState, type SessionStateChangeCallback } from './session-state.js';\nimport type {\n AuthProvider,\n OAuthConfig,\n OAuthProvider,\n OAuthTokenResponse,\n StoredZkLoginSession,\n ZkLoginProof,\n} from './types.js';\n\nconst encoder = new TextEncoder();\nconst DEFAULT_SCOPES: Record<OAuthProvider, string[]> = {\n google: ['openid', 'email'],\n apple: ['name', 'email'],\n};\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\nconst TOKEN_EXPIRY_WARNING_MS = 5 * 60 * 1000;\nconst DEFAULT_ENDPOINTS = {\n google: {\n authorizationEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenEndpoint: 'https://oauth2.googleapis.com/token',\n saltEndpoint: 'https://salt.api.mystenlabs.com/get_salt',\n proverEndpoint: 'https://prover.mystenlabs.com/v1',\n issuer: 'https://accounts.google.com',\n },\n apple: {\n authorizationEndpoint: 'https://appleid.apple.com/auth/authorize',\n tokenEndpoint: 'https://appleid.apple.com/auth/token',\n saltEndpoint: 'https://salt.api.mystenlabs.com/get_salt',\n proverEndpoint: 'https://prover.mystenlabs.com/v1',\n issuer: 'https://appleid.apple.com',\n },\n} as const;\n\nexport interface ZkLoginPendingSession {\n epoch: number;\n maxEpoch: number;\n randomness: string;\n nonce: string;\n ephemeralKeypair: Ed25519Keypair;\n}\n\nexport interface ZkLoginAuthorizationRequest {\n authorizationUrl: string;\n pendingSession: ZkLoginPendingSession;\n}\n\nexport interface ZkLoginProviderOptions {\n client: Pick<SuiClient, 'getCurrentEpoch'>;\n oauth: OAuthConfig;\n sessionStore?: ZkLoginSessionStore;\n fetchFn?: typeof fetch;\n}\n\nexport interface RefreshSessionOptions {\n force?: boolean;\n invalidateOnFailure?: boolean;\n throwOnFailure?: boolean;\n now?: number;\n}\n\nexport class ZkLoginProvider implements AuthProvider {\n readonly mode = 'zklogin' as const;\n\n private session: StoredZkLoginSession | null = null;\n private sessionState = SessionState.EXPIRED;\n private readonly signer = new ZkLoginSuiSigner(() => this.requireSession(), () => this.getPublicIdentifier());\n private readonly fetchFn: typeof fetch;\n private readonly sessionStateListeners = new Set<SessionStateChangeCallback>();\n private oauth: OAuthConfig;\n\n constructor(private readonly options: ZkLoginProviderOptions) {\n this.fetchFn = options.fetchFn ?? fetch;\n this.oauth = options.oauth;\n this.options.sessionStore?.onSessionStateChange((event) => {\n this.updateSessionState(event.currentState, event.session, event.reason, event.error);\n });\n }\n\n getOAuthConfig(): OAuthConfig {\n return { ...this.oauth };\n }\n\n setOAuthConfig(oauth: OAuthConfig): void {\n this.oauth = oauth;\n }\n\n async restoreSession(): Promise<boolean> {\n const currentEpoch = await this.getCurrentEpoch();\n await this.options.sessionStore?.deleteExpired(currentEpoch);\n\n try {\n const refreshed = await this.refreshSessionIfNeeded(currentEpoch);\n if (refreshed) {\n this.session = refreshed;\n this.updateSessionState(SessionState.VALID, refreshed, 'session_restored');\n return true;\n }\n } catch (error) {\n this.session = null;\n if (error instanceof SessionExpiredError) {\n this.updateSessionState(error.sessionState, null, 'session_restore_failed', error);\n }\n throw error;\n }\n\n const loadedSession = (await this.options.sessionStore?.loadLatestValid(currentEpoch)) ?? null;\n if (loadedSession && isSessionTokenExpired(loadedSession, Date.now())) {\n await this.clearSession(loadedSession);\n return false;\n }\n\n this.session = loadedSession;\n this.updateSessionState(loadedSession ? SessionState.VALID : SessionState.EXPIRED, loadedSession, 'session_restored');\n return this.session !== null;\n }\n\n async createAuthorizationRequest(params: {\n redirectUri: string;\n state: string;\n codeChallenge: string;\n scopes?: string[];\n }): Promise<ZkLoginAuthorizationRequest> {\n const pendingSession = await this.createPendingSession();\n const authorizationUrl = this.buildAuthorizationUrl({\n redirectUri: params.redirectUri,\n state: params.state,\n codeChallenge: params.codeChallenge,\n nonce: pendingSession.nonce,\n scopes: params.scopes,\n });\n\n return {\n authorizationUrl,\n pendingSession,\n };\n }\n\n async exchangeAuthorizationCode(\n code: string,\n codeVerifier: string,\n redirectUri: string,\n ): Promise<OAuthTokenResponse> {\n const response = await this.fetchJson(\n this.getTokenEndpoint(),\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n code,\n client_id: this.oauth.clientId,\n code_verifier: codeVerifier,\n grant_type: 'authorization_code',\n redirect_uri: redirectUri,\n }).toString(),\n },\n 'token',\n );\n\n return normalizeTokenResponse(response);\n }\n\n async refreshSessionIfNeeded(\n currentEpoch?: number,\n options: RefreshSessionOptions = {},\n ): Promise<StoredZkLoginSession | null> {\n const epoch = currentEpoch ?? (await this.getCurrentEpoch());\n const current = await this.loadCurrentSession(epoch);\n if (!current) {\n this.session = null;\n this.updateSessionState(this.options.sessionStore?.getSessionState() ?? SessionState.EXPIRED, null, 'session_missing');\n return null;\n }\n\n const now = options.now ?? Date.now();\n const tokenExpired = isSessionTokenExpired(current, now);\n const tokenExpiring = isSessionTokenExpiring(current, now);\n const requiresRefresh = options.force || tokenExpired || tokenExpiring || this.options.sessionStore?.isNearExpiry(current, epoch) === true;\n\n if (!requiresRefresh) {\n this.session = current;\n this.updateSessionState(SessionState.VALID, current, 'session_available');\n return current;\n }\n\n if (!current.refreshToken) {\n return await this.handleRefreshFailure(current, options, undefined, tokenExpired);\n }\n\n if (!this.options.sessionStore) {\n try {\n const pendingSession = await this.createPendingSession();\n const tokens = await this.refreshTokens(current.refreshToken, pendingSession.nonce);\n return await this.authenticateWithJwt(tokens.jwt, {\n pendingSession,\n refreshToken: tokens.refreshToken ?? current.refreshToken,\n validateNonce: false,\n });\n } catch (error) {\n return await this.handleRefreshFailure(current, options, error, tokenExpired);\n }\n }\n\n try {\n const refreshed = await this.options.sessionStore.refreshIfNeeded(\n epoch,\n async (storedSession) => {\n const pendingSession = await this.createPendingSession();\n const tokens = await this.refreshTokens(storedSession.refreshToken ?? current.refreshToken ?? '', pendingSession.nonce);\n return await this.authenticateWithJwt(tokens.jwt, {\n pendingSession,\n refreshToken: tokens.refreshToken ?? storedSession.refreshToken,\n validateNonce: false,\n });\n },\n { force: true },\n );\n this.session = refreshed;\n this.updateSessionState(refreshed ? SessionState.VALID : SessionState.EXPIRED, refreshed, 'session_refreshed');\n return refreshed;\n } catch (error) {\n if (error instanceof SessionExpiredError) {\n this.session = null;\n this.updateSessionState(error.sessionState, null, 'session_refresh_failed', error);\n throw error;\n }\n\n if (error instanceof SessionRefreshError && (options.throwOnFailure || tokenExpired || options.force)) {\n this.session = null;\n this.updateSessionState(SessionState.NEEDS_REAUTH, null, 'session_refresh_failed', error);\n throw new SessionExpiredError('zkLogin session refresh failed. Re-authentication is required.', {\n attempts: error.attempts,\n maxAttempts: error.maxAttempts,\n retryDelaysMs: error.retryDelaysMs,\n consecutiveFailures: error.consecutiveFailures,\n sessionState: SessionState.NEEDS_REAUTH,\n session: current,\n cause: error,\n });\n }\n\n throw error;\n }\n }\n\n async authenticateWithJwt(\n jwt: string,\n params: {\n pendingSession: ZkLoginPendingSession;\n refreshToken?: string;\n validateNonce?: boolean;\n },\n ): Promise<StoredZkLoginSession> {\n const decoded = validateJwtClaims(decodeJwt(jwt), {\n expectedIssuer: this.getIssuer(),\n expectedClientId: this.oauth.clientId,\n expectedNonce: params.validateNonce === false ? undefined : params.pendingSession.nonce,\n });\n const salt = await this.fetchSalt(jwt);\n const proof = await this.fetchProof(jwt, salt, params.pendingSession);\n const addressSeed = genAddressSeed(salt, 'sub', decoded.sub, decoded.aud).toString();\n const timestamp = Date.now();\n\n const session: StoredZkLoginSession = {\n provider: this.oauth.provider,\n jwt,\n salt,\n epoch: params.pendingSession.epoch,\n ephemeralKeypair: params.pendingSession.ephemeralKeypair,\n proof: {\n ...proof,\n addressSeed,\n },\n maxEpoch: params.pendingSession.maxEpoch,\n address: jwtToAddress(jwt, salt),\n sub: decoded.sub,\n iss: decoded.iss,\n aud: decoded.aud,\n randomness: params.pendingSession.randomness,\n refreshToken: params.refreshToken,\n createdAt: timestamp,\n updatedAt: timestamp,\n sessionState: SessionState.VALID,\n refreshFailureCount: 0,\n };\n\n this.session = session;\n await this.options.sessionStore?.save(session);\n this.updateSessionState(SessionState.VALID, session, 'session_authenticated');\n return session;\n }\n\n async getAddress(): Promise<string> {\n return this.requireSession().address;\n }\n\n getDID(): string {\n const session = this.requireSession();\n return `did:mesh:zklogin:${session.address}`;\n }\n\n async signTransaction(tx: Uint8Array): Promise<Uint8Array> {\n const { signature } = await this.signer.signTransaction(tx);\n return encoder.encode(signature);\n }\n\n async signPersonalMessage(message: Uint8Array): Promise<{ signature: Uint8Array }> {\n const { signature } = await this.signer.signPersonalMessage(message);\n return { signature: encoder.encode(signature) };\n }\n\n isAuthenticated(): boolean {\n const session = this.session;\n if (!session) {\n return false;\n }\n\n if (this.sessionState === SessionState.NEEDS_REAUTH || this.sessionState === SessionState.EXPIRED) {\n return false;\n }\n\n if (isSessionTokenExpired(session, Date.now())) {\n this.dropSession(session);\n return false;\n }\n\n return true;\n }\n\n getPublicKey(): Uint8Array {\n return this.getPublicIdentifier().toRawBytes();\n }\n\n toSuiSigner(): Signer {\n return this.signer;\n }\n\n getSession(): StoredZkLoginSession | null {\n return this.session;\n }\n\n getSessionState(): SessionState {\n return this.options.sessionStore?.getSessionState() ?? this.sessionState;\n }\n\n onSessionStateChange(callback: SessionStateChangeCallback): () => void {\n this.sessionStateListeners.add(callback);\n return () => {\n this.sessionStateListeners.delete(callback);\n };\n }\n\n async isSessionValid(currentEpoch?: number): Promise<boolean> {\n const session = this.session;\n if (!session) {\n return false;\n }\n\n if (this.getSessionState() === SessionState.NEEDS_REAUTH || this.getSessionState() === SessionState.EXPIRED) {\n return false;\n }\n\n const epoch = currentEpoch ?? (await this.getCurrentEpoch());\n if ((this.options.sessionStore?.isExpired(session, epoch) ?? epoch >= session.maxEpoch) || isSessionTokenExpiring(session, Date.now())) {\n return false;\n }\n\n return !isSessionTokenExpired(session, Date.now());\n }\n\n getSessionExpiryMs(session = this.session): number | null {\n return getSessionExpiryMs(session);\n }\n\n async clearSession(session = this.session): Promise<void> {\n if (!session) {\n this.session = null;\n this.updateSessionState(SessionState.EXPIRED, null, 'session_cleared');\n return;\n }\n\n this.session = null;\n await this.options.sessionStore?.delete(session);\n this.updateSessionState(SessionState.EXPIRED, null, 'session_cleared');\n }\n\n private async refreshTokens(refreshToken: string, nonce: string): Promise<OAuthTokenResponse> {\n const response = await this.fetchJson(\n this.getTokenEndpoint(),\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_id: this.oauth.clientId,\n grant_type: 'refresh_token',\n nonce,\n refresh_token: refreshToken,\n }).toString(),\n },\n 'token',\n );\n\n return normalizeTokenResponse(response);\n }\n\n private async createPendingSession(): Promise<ZkLoginPendingSession> {\n const epoch = await this.getCurrentEpoch();\n const maxEpoch = epoch + 2;\n const ephemeralKeypair = Ed25519Keypair.generate();\n const randomness = generateRandomness();\n const nonce = generateNonce(ephemeralKeypair.getPublicKey(), maxEpoch, randomness);\n\n return {\n epoch,\n maxEpoch,\n randomness,\n nonce,\n ephemeralKeypair,\n };\n }\n\n private buildAuthorizationUrl(params: {\n redirectUri: string;\n state: string;\n codeChallenge: string;\n nonce: string;\n scopes?: string[];\n }): string {\n const url = new URL(this.getAuthorizationEndpoint());\n url.searchParams.set('client_id', this.oauth.clientId);\n url.searchParams.set('code_challenge', params.codeChallenge);\n url.searchParams.set('code_challenge_method', 'S256');\n url.searchParams.set('nonce', params.nonce);\n url.searchParams.set('redirect_uri', params.redirectUri);\n url.searchParams.set('scope', (params.scopes ?? this.oauth.scopes ?? DEFAULT_SCOPES[this.oauth.provider]).join(' '));\n url.searchParams.set('state', params.state);\n\n if (this.oauth.provider === 'apple') {\n url.searchParams.set('response_mode', 'form_post');\n url.searchParams.set('response_type', 'code id_token');\n return url.toString();\n }\n\n url.searchParams.set('include_granted_scopes', 'true');\n url.searchParams.set('prompt', 'consent');\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('access_type', 'offline');\n return url.toString();\n }\n\n private async fetchSalt(jwt: string): Promise<string> {\n const response = await this.fetchJson(\n this.getSaltEndpoint(),\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ token: jwt }),\n },\n 'salt',\n );\n\n const nestedData = isRecord(response.data) ? response.data : undefined;\n const salt = readStringValue(response.salt) ?? readStringValue(nestedData?.salt);\n if (!salt) {\n throw new Error('zkLogin salt response did not contain a salt value.');\n }\n\n return salt;\n }\n\n private async fetchProof(\n jwt: string,\n salt: string,\n pendingSession: ZkLoginPendingSession,\n ): Promise<Omit<ZkLoginProof, 'addressSeed'>> {\n const response = await this.fetchJson(\n this.getProverEndpoint(),\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n jwt,\n extendedEphemeralPublicKey: getExtendedEphemeralPublicKey(pendingSession.ephemeralKeypair.getPublicKey()),\n maxEpoch: pendingSession.maxEpoch,\n jwtRandomness: pendingSession.randomness,\n salt,\n keyClaimName: 'sub',\n }),\n },\n 'prover',\n );\n\n const payload = isRecord(response.data) ? response.data : response;\n if (!isZkLoginProofPayload(payload)) {\n throw new Error('zkLogin prover response was missing proof fields.');\n }\n\n return {\n proofPoints: payload.proofPoints,\n issBase64Details: payload.issBase64Details,\n headerBase64: payload.headerBase64,\n };\n }\n\n private async fetchJson(url: string, init: RequestInit, operation: 'token' | 'salt' | 'prover'): Promise<Record<string, unknown>> {\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, DEFAULT_REQUEST_TIMEOUT_MS);\n\n try {\n const response = await this.fetchFn(url, {\n ...init,\n signal: controller.signal,\n });\n const text = await response.text();\n const body = text ? parseJsonObject(text, `OAuth ${operation} response`) : {};\n\n if (!response.ok) {\n const detail = readStringValue(body.error_description) ?? readStringValue(body.error) ?? response.statusText;\n throw new Error(`OAuth ${operation} request failed (${response.status}): ${detail}`);\n }\n\n return body;\n } catch (error) {\n if (controller.signal.aborted || isAbortError(error)) {\n throw new Error(`OAuth ${operation} request timed out after ${DEFAULT_REQUEST_TIMEOUT_MS}ms.`);\n }\n\n if (error instanceof Error && error.message.startsWith('OAuth ')) {\n throw error;\n }\n\n if (error instanceof Error) {\n throw new Error(`OAuth ${operation} request failed: ${error.message}`, { cause: error });\n }\n\n throw new Error(`OAuth ${operation} request failed.`);\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private getPublicIdentifier(): ZkLoginPublicIdentifier {\n const session = this.requireSession();\n return toZkLoginPublicIdentifier(BigInt(session.proof.addressSeed), session.iss);\n }\n\n private requireSession(): StoredZkLoginSession {\n const session = this.session;\n if (!session) {\n throw new SessionExpiredError('Authentication expired. Please re-authenticate via the daemon portal.', {\n consecutiveFailures: this.options.sessionStore?.getRefreshFailureCount(),\n sessionState: this.getSessionState(),\n });\n }\n\n if (isSessionTokenExpired(session, Date.now())) {\n this.dropSession(session);\n throw new SessionExpiredError('Authentication expired. Please re-authenticate via the daemon portal.', {\n consecutiveFailures: this.options.sessionStore?.getRefreshFailureCount(),\n session,\n sessionState: SessionState.EXPIRED,\n });\n }\n\n return session;\n }\n\n private async loadCurrentSession(epoch: number): Promise<StoredZkLoginSession | null> {\n const inMemory = this.session;\n if (inMemory && (!this.options.sessionStore || !this.options.sessionStore.isExpired(inMemory, epoch))) {\n return inMemory;\n }\n\n if (!this.options.sessionStore) {\n return inMemory ?? null;\n }\n\n const session = await this.options.sessionStore.loadLatestValid(epoch);\n this.session = session;\n if (!session && this.options.sessionStore.getSessionState() === SessionState.NEEDS_REAUTH) {\n throw new SessionExpiredError('Authentication expired. Please re-authenticate via the daemon portal.', {\n consecutiveFailures: this.options.sessionStore.getRefreshFailureCount(),\n sessionState: SessionState.NEEDS_REAUTH,\n });\n }\n\n return session;\n }\n\n private async handleRefreshFailure(\n session: StoredZkLoginSession,\n options: RefreshSessionOptions,\n error?: unknown,\n tokenExpired = false,\n ): Promise<StoredZkLoginSession | null> {\n if (tokenExpired || options.invalidateOnFailure || options.throwOnFailure || options.force) {\n const nextState = tokenExpired ? SessionState.EXPIRED : SessionState.NEEDS_REAUTH;\n this.session = null;\n this.updateSessionState(nextState, null, 'session_refresh_failed', error);\n throw new SessionExpiredError('Authentication expired. Please re-authenticate via the daemon portal.', {\n consecutiveFailures: this.options.sessionStore?.getRefreshFailureCount(),\n session,\n sessionState: nextState,\n cause: error,\n });\n }\n\n this.session = session;\n this.updateSessionState(SessionState.VALID, session, 'session_available');\n return session;\n }\n\n private dropSession(session: StoredZkLoginSession): void {\n this.session = null;\n this.updateSessionState(SessionState.EXPIRED, null, 'session_expired');\n void this.options.sessionStore?.delete(session).catch(() => undefined);\n }\n\n private updateSessionState(\n nextState: SessionState,\n session: StoredZkLoginSession | null,\n reason?: string,\n error?: unknown,\n ): void {\n const previousState = this.sessionState;\n this.sessionState = nextState;\n if (previousState === nextState) {\n return;\n }\n\n for (const listener of this.sessionStateListeners) {\n listener({\n previousState,\n currentState: nextState,\n session,\n reason,\n refreshFailureCount: session?.refreshFailureCount ?? this.options.sessionStore?.getRefreshFailureCount() ?? 0,\n error,\n });\n }\n }\n\n private async getCurrentEpoch(): Promise<number> {\n const currentEpoch = await this.options.client.getCurrentEpoch();\n return Number.parseInt(currentEpoch.epoch, 10);\n }\n\n private getAuthorizationEndpoint(): string {\n return this.oauth.authorizationEndpoint ?? DEFAULT_ENDPOINTS[this.oauth.provider].authorizationEndpoint;\n }\n\n private getTokenEndpoint(): string {\n return this.oauth.tokenEndpoint ?? DEFAULT_ENDPOINTS[this.oauth.provider].tokenEndpoint;\n }\n\n private getSaltEndpoint(): string {\n return this.oauth.saltEndpoint ?? DEFAULT_ENDPOINTS[this.oauth.provider].saltEndpoint;\n }\n\n private getProverEndpoint(): string {\n return this.oauth.proverEndpoint ?? DEFAULT_ENDPOINTS[this.oauth.provider].proverEndpoint;\n }\n\n private getIssuer(): string {\n return this.oauth.issuer ?? DEFAULT_ENDPOINTS[this.oauth.provider].issuer;\n }\n}\n\nclass ZkLoginSuiSigner extends Signer {\n constructor(\n private readonly getSession: () => StoredZkLoginSession,\n private readonly getPublicIdentifier: () => ZkLoginPublicIdentifier,\n ) {\n super();\n }\n\n async sign(bytes: Uint8Array): Promise<Uint8Array<ArrayBuffer>> {\n return this.getSession().ephemeralKeypair.sign(bytes);\n }\n\n override async signTransaction(bytes: Uint8Array): Promise<{ bytes: string; signature: string }> {\n const session = this.getSession();\n const { bytes: signedBytes, signature: userSignature } = await session.ephemeralKeypair.signTransaction(bytes);\n return {\n bytes: signedBytes,\n signature: getZkLoginSignature({\n inputs: {\n ...session.proof,\n },\n maxEpoch: session.maxEpoch,\n userSignature,\n }),\n };\n }\n\n override async signPersonalMessage(bytes: Uint8Array): Promise<{ bytes: string; signature: string }> {\n const session = this.getSession();\n const { bytes: signedBytes, signature: userSignature } = await session.ephemeralKeypair.signPersonalMessage(bytes);\n return {\n bytes: signedBytes,\n signature: getZkLoginSignature({\n inputs: {\n ...session.proof,\n },\n maxEpoch: session.maxEpoch,\n userSignature,\n }),\n };\n }\n\n getKeyScheme(): SignatureScheme {\n return 'ZkLogin';\n }\n\n getPublicKey(): PublicKey {\n return this.getPublicIdentifier();\n }\n}\n\nexport function createPkcePair(): { verifier: string; challenge: string } {\n const verifier = base64UrlEncode(randomBytes(64));\n return {\n verifier,\n challenge: base64UrlEncode(createHash('sha256').update(verifier).digest()),\n };\n}\n\nfunction normalizeTokenResponse(value: Record<string, unknown>): OAuthTokenResponse {\n const jwt = readStringValue(value.id_token) ?? readStringValue(value.jwt);\n if (!jwt) {\n throw new Error('OAuth token response did not contain an id_token.');\n }\n\n return {\n jwt,\n refreshToken: readStringValue(value.refresh_token),\n accessToken: readStringValue(value.access_token),\n expiresIn:\n typeof value.expires_in === 'number'\n ? value.expires_in\n : typeof value.expires_in === 'string' && /^\\d+$/.test(value.expires_in)\n ? Number(value.expires_in)\n : undefined,\n tokenType: readStringValue(value.token_type),\n scope: readStringValue(value.scope),\n };\n}\n\nfunction getSessionExpiryMs(session: Pick<StoredZkLoginSession, 'jwt'> | null | undefined): number | null {\n if (!session) {\n return null;\n }\n\n const exp = decodeJwt(session.jwt).exp;\n const expSeconds = typeof exp === 'number' ? exp : typeof exp === 'string' && /^\\d+$/.test(exp) ? Number(exp) : null;\n return expSeconds === null ? null : expSeconds * 1_000;\n}\n\nfunction isSessionTokenExpired(session: Pick<StoredZkLoginSession, 'jwt'>, now: number): boolean {\n const expiresAt = getSessionExpiryMs(session);\n return expiresAt !== null && expiresAt <= now;\n}\n\nfunction isSessionTokenExpiring(\n session: Pick<StoredZkLoginSession, 'jwt'>,\n now: number,\n warningMs = TOKEN_EXPIRY_WARNING_MS,\n): boolean {\n const expiresAt = getSessionExpiryMs(session);\n return expiresAt !== null && expiresAt - now <= warningMs;\n}\n\nfunction base64UrlEncode(value: Uint8Array): string {\n return Buffer.from(value)\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/g, '');\n}\n\nfunction readStringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction readRequiredStringValue(value: unknown, field: string): string {\n const parsed = readStringValue(value);\n if (!parsed) {\n throw new Error(`OAuth token did not contain a valid ${field} claim.`);\n }\n\n return parsed;\n}\n\nfunction validateJwtClaims(\n claims: Record<string, unknown>,\n params: { expectedIssuer: string; expectedClientId: string; expectedNonce?: string },\n): { iss: string; sub: string; aud: string } {\n const iss = readRequiredStringValue(claims.iss, 'iss');\n if (iss !== params.expectedIssuer) {\n throw new Error(`OAuth token issuer mismatch. Expected ${params.expectedIssuer}.`);\n }\n\n const sub = readRequiredStringValue(claims.sub, 'sub');\n const audiences = normalizeAudiences(claims.aud);\n if (!audiences.includes(params.expectedClientId)) {\n throw new Error('OAuth token audience mismatch.');\n }\n\n if (params.expectedNonce !== undefined) {\n const nonce = readRequiredStringValue(claims.nonce, 'nonce');\n if (nonce !== params.expectedNonce) {\n throw new Error('OAuth token nonce mismatch.');\n }\n }\n\n return {\n iss,\n sub,\n aud: typeof claims.aud === 'string' ? claims.aud : params.expectedClientId,\n };\n}\n\nfunction normalizeAudiences(value: unknown): string[] {\n if (typeof value === 'string' && value.length > 0) {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string' && entry.length > 0);\n }\n\n throw new Error('OAuth token did not contain a valid aud claim.');\n}\n\nfunction parseJsonObject(text: string, context: string): Record<string, unknown> {\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch (error) {\n throw new Error(`${context} was not valid JSON.`, { cause: error as Error });\n }\n\n if (!isRecord(value)) {\n throw new Error(`${context} was not a JSON object.`);\n }\n\n return value;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isZkLoginProofPayload(value: Record<string, unknown>): value is {\n proofPoints: ZkLoginProof['proofPoints'];\n issBase64Details: ZkLoginProof['issBase64Details'];\n headerBase64: string;\n} {\n return (\n isRecord(value.proofPoints) &&\n isRecord(value.issBase64Details) &&\n typeof value.headerBase64 === 'string' &&\n Array.isArray((value.proofPoints as Record<string, unknown>).a) &&\n Array.isArray((value.proofPoints as Record<string, unknown>).b) &&\n Array.isArray((value.proofPoints as Record<string, unknown>).c) &&\n typeof (value.issBase64Details as Record<string, unknown>).value === 'string' &&\n typeof (value.issBase64Details as Record<string, unknown>).indexMod4 === 'number'\n );\n}\n","import { createCipheriv, createDecipheriv, createHash, hkdfSync, randomBytes } from 'node:crypto';\nimport { chmod, mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport pino from 'pino';\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nimport { SessionExpiredError, SessionRefreshError } from './errors.js';\nimport {\n SessionState,\n type SessionRefreshPolicy,\n type SessionStateChangeCallback,\n} from './session-state.js';\nimport type { OAuthProvider, StoredZkLoginSession } from './types.js';\n\ninterface SessionEnvelopeV1 {\n version: 1;\n metadata: {\n address: string;\n iss: string;\n sub: string;\n maxEpoch: number;\n updatedAt: number;\n };\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\ninterface SessionEnvelopeV2 {\n version: 2;\n metadata: {\n maxEpoch: number;\n updatedAt: number;\n };\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\ntype SessionEnvelope = SessionEnvelopeV1 | SessionEnvelopeV2;\n\ntype SessionStoreLogger = Pick<ReturnType<typeof pino>, 'info' | 'warn' | 'error'>;\n\ntype SerializedSession = Omit<StoredZkLoginSession, 'ephemeralKeypair' | 'provider'> & {\n provider?: OAuthProvider;\n ephemeralSecretKey: string;\n};\n\nexport interface ZkLoginSessionStoreOptions {\n refresh?: SessionRefreshPolicy;\n logger?: SessionStoreLogger;\n onSessionStateChange?: SessionStateChangeCallback;\n sleep?: (ms: number) => Promise<void>;\n}\n\nconst SESSION_ENCRYPTION_INFO = Buffer.from('agentic-mesh:zklogin-session-store:v2', 'utf8');\nconst SESSION_ENCRYPTION_SALT = Buffer.from('aes-256-gcm', 'utf8');\nconst DEFAULT_REFRESH_POLICY: Required<SessionRefreshPolicy> = {\n maxAttempts: 3,\n backoffMs: [1_000, 2_000, 4_000],\n maxConsecutiveFailures: 3,\n};\nconst logger = pino({ name: '@hivemind-os/collective-core:auth:session-store' });\n\nexport class ZkLoginSessionStore {\n private readonly encryptionKey: Buffer;\n private readonly legacyEncryptionKey: Buffer;\n private readonly refreshPolicy: Required<SessionRefreshPolicy>;\n private readonly logger: SessionStoreLogger;\n private readonly sleep: (ms: number) => Promise<void>;\n private readonly stateChangeListeners = new Set<SessionStateChangeCallback>();\n\n private sessionState = SessionState.EXPIRED;\n private refreshFailureCount = 0;\n\n constructor(\n private readonly baseDir: string,\n encryptionKey: Uint8Array,\n options: ZkLoginSessionStoreOptions = {},\n ) {\n const keyMaterial = Buffer.from(encryptionKey);\n this.legacyEncryptionKey = Buffer.from(createHash('sha256').update(keyMaterial).digest());\n this.encryptionKey = Buffer.from(hkdfSync('sha256', keyMaterial, SESSION_ENCRYPTION_SALT, SESSION_ENCRYPTION_INFO, 32));\n this.refreshPolicy = {\n maxAttempts: options.refresh?.maxAttempts ?? DEFAULT_REFRESH_POLICY.maxAttempts,\n backoffMs: [...(options.refresh?.backoffMs ?? DEFAULT_REFRESH_POLICY.backoffMs)],\n maxConsecutiveFailures: options.refresh?.maxConsecutiveFailures ?? DEFAULT_REFRESH_POLICY.maxConsecutiveFailures,\n };\n this.logger = options.logger ?? logger;\n this.sleep = options.sleep ?? wait;\n if (options.onSessionStateChange) {\n this.stateChangeListeners.add(options.onSessionStateChange);\n }\n }\n\n getSessionState(): SessionState {\n return this.sessionState;\n }\n\n getRefreshFailureCount(): number {\n return this.refreshFailureCount;\n }\n\n onSessionStateChange(callback: SessionStateChangeCallback): () => void {\n this.stateChangeListeners.add(callback);\n return () => {\n this.stateChangeListeners.delete(callback);\n };\n }\n\n async save(session: StoredZkLoginSession): Promise<void> {\n await this.ensureBaseDir();\n\n const normalizedSession = this.normalizeSession(session);\n const payload = this.serializeSession(normalizedSession);\n const envelope = this.encrypt(payload);\n const path = join(this.baseDir, getSessionFilename(normalizedSession));\n\n await writeFile(path, JSON.stringify(envelope, null, 2), { encoding: 'utf8', mode: 0o600 });\n await chmod(path, 0o600);\n this.updateSessionState(this.resolveSessionState(normalizedSession), normalizedSession, 'session_saved');\n }\n\n async loadLatest(): Promise<StoredZkLoginSession | null> {\n const sessions = await this.loadAll();\n sessions.sort((left, right) => right.updatedAt - left.updatedAt);\n return sessions[0] ?? null;\n }\n\n async loadAll(): Promise<StoredZkLoginSession[]> {\n try {\n const entries = await readdir(this.baseDir, { withFileTypes: true });\n const sessions = await Promise.all(\n entries\n .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))\n .map(async (entry) => {\n try {\n const contents = await readFile(join(this.baseDir, entry.name), 'utf8');\n return this.decrypt(JSON.parse(contents) as SessionEnvelope);\n } catch {\n return null;\n }\n }),\n );\n\n return sessions.filter((session): session is StoredZkLoginSession => session !== null);\n } catch (error) {\n if (isErrnoException(error, 'ENOENT')) {\n return [];\n }\n\n throw error;\n }\n }\n\n async loadLatestValid(currentEpoch: number): Promise<StoredZkLoginSession | null> {\n const latest = await this.loadLatest();\n if (!latest) {\n this.updateSessionState(SessionState.EXPIRED, null, 'session_missing');\n return null;\n }\n\n const sessionState = this.resolveSessionState(latest, currentEpoch);\n if (sessionState !== SessionState.VALID) {\n this.updateSessionState(sessionState, sessionState === SessionState.EXPIRED ? null : latest, 'session_invalid');\n return null;\n }\n\n this.updateSessionState(SessionState.VALID, latest, 'session_loaded');\n return latest;\n }\n\n async hasValidSession(currentEpoch: number): Promise<boolean> {\n return (await this.loadLatestValid(currentEpoch)) !== null;\n }\n\n isExpired(session: Pick<StoredZkLoginSession, 'maxEpoch'>, currentEpoch: number): boolean {\n return currentEpoch >= session.maxEpoch;\n }\n\n isNearExpiry(\n session: Pick<StoredZkLoginSession, 'maxEpoch'>,\n currentEpoch: number,\n remainingEpochs = 1,\n ): boolean {\n return currentEpoch + remainingEpochs >= session.maxEpoch;\n }\n\n async refreshIfNeeded(\n currentEpoch: number,\n refresher: (session: StoredZkLoginSession) => Promise<StoredZkLoginSession | null>,\n options: { force?: boolean } = {},\n ): Promise<StoredZkLoginSession | null> {\n const session = await this.loadLatest();\n if (!session) {\n this.updateSessionState(SessionState.EXPIRED, null, 'session_missing');\n return null;\n }\n\n const currentState = this.resolveSessionState(session, currentEpoch);\n if (currentState === SessionState.EXPIRED) {\n this.updateSessionState(SessionState.EXPIRED, null, 'session_expired');\n return null;\n }\n\n if (currentState === SessionState.NEEDS_REAUTH) {\n this.updateSessionState(SessionState.NEEDS_REAUTH, session, 'session_needs_reauth');\n throw new SessionExpiredError('Stored zkLogin session requires re-authentication.', {\n consecutiveFailures: session.refreshFailureCount ?? 0,\n session,\n sessionState: SessionState.NEEDS_REAUTH,\n });\n }\n\n this.updateSessionState(SessionState.VALID, session, 'session_available');\n if ((!options.force && !this.isNearExpiry(session, currentEpoch)) || !session.refreshToken) {\n return session;\n }\n\n this.updateSessionState(SessionState.REFRESHING, session, 'refresh_started');\n\n let lastError: SessionRefreshError | null = null;\n for (let attempt = 1; attempt <= this.refreshPolicy.maxAttempts; attempt += 1) {\n this.logger.info(\n {\n address: session.address,\n attempt,\n currentEpoch,\n maxAttempts: this.refreshPolicy.maxAttempts,\n maxEpoch: session.maxEpoch,\n refreshFailureCount: session.refreshFailureCount ?? 0,\n },\n 'Refreshing zkLogin session.',\n );\n\n try {\n const refreshed = await refresher(session);\n if (!refreshed) {\n throw new Error('zkLogin refresher returned no session.');\n }\n\n const normalizedSession = this.normalizeSession({\n ...refreshed,\n refreshFailureCount: 0,\n sessionState: SessionState.VALID,\n });\n await this.save(normalizedSession);\n this.logger.info(\n {\n address: normalizedSession.address,\n currentEpoch,\n maxEpoch: normalizedSession.maxEpoch,\n },\n 'Refreshed zkLogin session.',\n );\n return normalizedSession;\n } catch (error) {\n const consecutiveFailures = (session.refreshFailureCount ?? 0) + attempt;\n lastError = new SessionRefreshError('Failed to refresh zkLogin session.', {\n attempts: attempt,\n maxAttempts: this.refreshPolicy.maxAttempts,\n retryDelaysMs: this.refreshPolicy.backoffMs,\n consecutiveFailures,\n sessionState: SessionState.REFRESHING,\n session,\n cause: error,\n });\n\n this.logger.warn(\n {\n address: session.address,\n attempt,\n currentEpoch,\n err: error,\n maxAttempts: this.refreshPolicy.maxAttempts,\n maxEpoch: session.maxEpoch,\n consecutiveFailures,\n },\n 'zkLogin session refresh attempt failed.',\n );\n\n if (attempt < this.refreshPolicy.maxAttempts) {\n await this.sleep(this.refreshPolicy.backoffMs[Math.min(attempt - 1, this.refreshPolicy.backoffMs.length - 1)]);\n }\n }\n }\n\n const consecutiveFailures = (session.refreshFailureCount ?? 0) + this.refreshPolicy.maxAttempts;\n const nextState =\n consecutiveFailures >= this.refreshPolicy.maxConsecutiveFailures ? SessionState.NEEDS_REAUTH : SessionState.VALID;\n const failedSession = this.normalizeSession({\n ...session,\n refreshFailureCount: consecutiveFailures,\n sessionState: nextState,\n updatedAt: Date.now(),\n });\n await this.save(failedSession);\n\n if (nextState === SessionState.NEEDS_REAUTH) {\n this.logger.error(\n {\n address: failedSession.address,\n currentEpoch,\n maxConsecutiveFailures: this.refreshPolicy.maxConsecutiveFailures,\n maxEpoch: failedSession.maxEpoch,\n refreshFailureCount: consecutiveFailures,\n },\n 'zkLogin session refresh failed and re-authentication is required.',\n );\n throw new SessionExpiredError('zkLogin session refresh failed. Re-authentication is required.', {\n attempts: this.refreshPolicy.maxAttempts,\n maxAttempts: this.refreshPolicy.maxAttempts,\n retryDelaysMs: this.refreshPolicy.backoffMs,\n consecutiveFailures,\n session: failedSession,\n sessionState: nextState,\n cause: lastError,\n });\n }\n\n throw new SessionRefreshError('zkLogin session refresh failed after retries.', {\n attempts: this.refreshPolicy.maxAttempts,\n maxAttempts: this.refreshPolicy.maxAttempts,\n retryDelaysMs: this.refreshPolicy.backoffMs,\n consecutiveFailures,\n sessionState: nextState,\n session: failedSession,\n cause: lastError,\n });\n }\n\n async delete(session: Pick<StoredZkLoginSession, 'iss' | 'sub'>): Promise<void> {\n await rm(join(this.baseDir, getSessionFilename(session)), { force: true });\n }\n\n async deleteExpired(currentEpoch: number): Promise<void> {\n try {\n const entries = await readdir(this.baseDir, { withFileTypes: true });\n await Promise.all(\n entries\n .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))\n .map(async (entry) => {\n const path = join(this.baseDir, entry.name);\n try {\n const contents = await readFile(path, 'utf8');\n const session = this.decrypt(JSON.parse(contents) as SessionEnvelope);\n if (this.isExpired(session, currentEpoch)) {\n await rm(path, { force: true });\n }\n } catch {\n await rm(path, { force: true });\n }\n }),\n );\n } catch (error) {\n if (!isErrnoException(error, 'ENOENT')) {\n throw error;\n }\n }\n }\n\n private serializeSession(session: StoredZkLoginSession): SerializedSession {\n const normalizedSession = this.normalizeSession(session);\n return {\n ...normalizedSession,\n ephemeralSecretKey: normalizedSession.ephemeralKeypair.getSecretKey(),\n };\n }\n\n private deserializeSession(session: SerializedSession): StoredZkLoginSession {\n return this.normalizeSession({\n ...session,\n provider: session.provider ?? inferOAuthProvider(session.iss),\n ephemeralKeypair: Ed25519Keypair.fromSecretKey(session.ephemeralSecretKey),\n });\n }\n\n private normalizeSession(session: StoredZkLoginSession): StoredZkLoginSession {\n return {\n ...session,\n refreshFailureCount: session.refreshFailureCount ?? 0,\n sessionState: normalizePersistedSessionState(session.sessionState),\n };\n }\n\n private resolveSessionState(session: StoredZkLoginSession, currentEpoch?: number): SessionState {\n if (typeof currentEpoch === 'number' && this.isExpired(session, currentEpoch)) {\n return SessionState.EXPIRED;\n }\n\n return session.sessionState === SessionState.NEEDS_REAUTH ? SessionState.NEEDS_REAUTH : SessionState.VALID;\n }\n\n private updateSessionState(\n nextState: SessionState,\n session: StoredZkLoginSession | null,\n reason?: string,\n error?: unknown,\n ): void {\n const previousState = this.sessionState;\n this.sessionState = nextState;\n this.refreshFailureCount = session?.refreshFailureCount ?? (nextState === SessionState.EXPIRED ? 0 : this.refreshFailureCount);\n if (previousState === nextState) {\n return;\n }\n\n for (const listener of this.stateChangeListeners) {\n listener({\n previousState,\n currentState: nextState,\n session,\n reason,\n refreshFailureCount: this.refreshFailureCount,\n error,\n });\n }\n }\n\n private encrypt(session: SerializedSession): SessionEnvelope {\n const metadata: SessionEnvelopeV2['metadata'] = {\n maxEpoch: session.maxEpoch,\n updatedAt: session.updatedAt,\n };\n const iv = randomBytes(12);\n const cipher = createCipheriv('aes-256-gcm', this.encryptionKey, iv);\n cipher.setAAD(Buffer.from(JSON.stringify(metadata), 'utf8'));\n const plaintext = Buffer.from(JSON.stringify(session), 'utf8');\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n version: 2,\n metadata,\n iv: iv.toString('base64'),\n tag: tag.toString('base64'),\n ciphertext: ciphertext.toString('base64'),\n };\n }\n\n private decrypt(envelope: SessionEnvelope): StoredZkLoginSession {\n const version = (envelope as { version: number }).version;\n if (version === 1) {\n return this.decryptEnvelope(envelope, this.legacyEncryptionKey);\n }\n\n if (version !== 2) {\n throw new Error(`Unsupported zkLogin session version: ${String(version)}`);\n }\n\n return this.decryptEnvelope(envelope, this.encryptionKey, envelope.metadata);\n }\n\n private decryptEnvelope(\n envelope: SessionEnvelope,\n encryptionKey: Buffer,\n metadata?: SessionEnvelopeV2['metadata'],\n ): StoredZkLoginSession {\n const decipher = createDecipheriv('aes-256-gcm', encryptionKey, Buffer.from(envelope.iv, 'base64'));\n if (metadata) {\n decipher.setAAD(Buffer.from(JSON.stringify(metadata), 'utf8'));\n }\n decipher.setAuthTag(Buffer.from(envelope.tag, 'base64'));\n\n const plaintext = Buffer.concat([\n decipher.update(Buffer.from(envelope.ciphertext, 'base64')),\n decipher.final(),\n ]).toString('utf8');\n\n return this.deserializeSession(JSON.parse(plaintext) as SerializedSession);\n }\n\n private async ensureBaseDir(): Promise<void> {\n await mkdir(this.baseDir, { recursive: true, mode: 0o700 });\n await chmod(this.baseDir, 0o700);\n }\n}\n\nfunction getSessionFilename(session: Pick<StoredZkLoginSession, 'iss' | 'sub'>): string {\n const digest = createHash('sha256')\n .update(`${session.iss}:${session.sub}`)\n .digest('hex');\n return `${digest}.json`;\n}\n\nfunction inferOAuthProvider(issuer: string): OAuthProvider {\n if (issuer === 'https://accounts.google.com') {\n return 'google';\n }\n\n if (issuer === 'https://appleid.apple.com') {\n return 'apple';\n }\n\n throw new Error(`Unsupported zkLogin issuer: ${issuer}`);\n}\n\nfunction normalizePersistedSessionState(sessionState?: SessionState): SessionState {\n return sessionState === SessionState.NEEDS_REAUTH ? SessionState.NEEDS_REAUTH : SessionState.VALID;\n}\n\nfunction isErrnoException(error: unknown, code: string): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error && error.code === code;\n}\n\nasync function wait(ms: number): Promise<void> {\n await new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n","import type { DeviceFlowStatus, OAuthConfig } from './types.js';\n\nconst DEFAULT_ENDPOINTS = {\n google: {\n deviceCodeEndpoint: 'https://oauth2.googleapis.com/device/code',\n tokenEndpoint: 'https://oauth2.googleapis.com/token',\n },\n apple: {\n deviceCodeEndpoint: '',\n tokenEndpoint: 'https://appleid.apple.com/auth/token',\n },\n} as const;\n\nexport async function startDeviceFlow(config: OAuthConfig): Promise<DeviceFlowStatus> {\n const endpoint = config.deviceCodeEndpoint ?? DEFAULT_ENDPOINTS[config.provider].deviceCodeEndpoint;\n if (!endpoint) {\n throw new Error(`Device authorization is not configured for provider ${config.provider}.`);\n }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_id: config.clientId,\n scope: (config.scopes ?? ['openid', 'email']).join(' '),\n }).toString(),\n });\n\n const payload = (await response.json()) as Record<string, unknown>;\n if (!response.ok) {\n throw new Error(readOAuthError(payload, response.status));\n }\n\n const userCode = readRequiredString(payload.user_code, 'user_code');\n const verificationUri =\n readOptionalString(payload.verification_uri) ?? readRequiredString(payload.verification_url, 'verification_url');\n\n return {\n userCode,\n verificationUri,\n deviceCode: readRequiredString(payload.device_code, 'device_code'),\n pollInterval: readOptionalNumber(payload.interval) ?? 5,\n expiresIn: readOptionalNumber(payload.expires_in) ?? 600,\n };\n}\n\nexport async function pollDeviceFlow(\n deviceCode: string,\n config: OAuthConfig,\n): Promise<{\n jwt: string;\n refreshToken?: string;\n} | null> {\n const endpoint = config.tokenEndpoint ?? DEFAULT_ENDPOINTS[config.provider].tokenEndpoint;\n if (!endpoint) {\n throw new Error(`Token polling is not configured for provider ${config.provider}.`);\n }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_id: config.clientId,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }).toString(),\n });\n\n const payload = (await response.json()) as Record<string, unknown>;\n if (!response.ok) {\n const code = readOptionalString(payload.error);\n if (code === 'authorization_pending' || code === 'slow_down') {\n return null;\n }\n\n throw new Error(readOAuthError(payload, response.status));\n }\n\n return {\n jwt: readRequiredString(payload.id_token, 'id_token'),\n refreshToken: readOptionalString(payload.refresh_token),\n };\n}\n\nfunction readRequiredString(value: unknown, field: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`OAuth response is missing ${field}.`);\n }\n\n return value;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction readOptionalNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readOAuthError(payload: Record<string, unknown>, status: number): string {\n const message = readOptionalString(payload.error_description) ?? readOptionalString(payload.error) ?? 'OAuth request failed';\n return `${message} (${status})`;\n}\n","import { hkdf } from '@noble/hashes/hkdf';\nimport { sha256 } from '@noble/hashes/sha256';\n\nconst DERIVED_KEY_LENGTH = 32;\nconst encoder = new TextEncoder();\n\nexport function deriveEvmKey(identityPrivateKey: Uint8Array, userSalt: string, oauthSub: string): Uint8Array {\n if (identityPrivateKey.byteLength === 0) {\n throw new Error('identityPrivateKey must not be empty.');\n }\n\n const normalizedUserSalt = normalizeRequiredString(userSalt, 'userSalt');\n const normalizedOauthSub = normalizeRequiredString(oauthSub, 'oauthSub');\n\n return hkdf(\n sha256,\n identityPrivateKey,\n buildDerivationSalt(normalizedUserSalt, normalizedOauthSub),\n encoder.encode('agentic-mesh:evm:v1'),\n DERIVED_KEY_LENGTH,\n );\n}\n\nfunction normalizeRequiredString(value: string, field: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new Error(`${field} must not be empty.`);\n }\n\n return normalized;\n}\n\nfunction buildDerivationSalt(userSalt: string, oauthSub: string): Uint8Array {\n return sha256(concatBytes(encodeLengthPrefixed(userSalt), encodeLengthPrefixed(oauthSub)));\n}\n\nfunction encodeLengthPrefixed(value: string): Uint8Array {\n const encodedValue = encoder.encode(value);\n const lengthPrefix = new Uint8Array(4);\n new DataView(lengthPrefix.buffer).setUint32(0, encodedValue.length, false);\n return concatBytes(lengthPrefix, encodedValue);\n}\n\nfunction concatBytes(...parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.byteLength, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const part of parts) {\n result.set(part, offset);\n offset += part.byteLength;\n }\n\n return result;\n}\n","import pino from 'pino';\n\nimport type { NetworkConfig } from '@hivemind-os/collective-types';\nimport {\n SuiClient,\n type EventId as EventID,\n type SuiEvent,\n type SuiTransactionBlockResponse,\n type SuiTransactionBlockResponseOptions,\n} from '@mysten/sui/client';\nimport type { Signer } from '@mysten/sui/cryptography';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { isRecord, normalizeMoveValue, normalizeObjectOwner } from '../internal/parsing.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-core:sui' });\nconst MAX_TRANSACTION_ATTEMPTS = 3;\n\nexport interface ExecuteTransactionOptions {\n requestType?: 'WaitForEffectsCert' | 'WaitForLocalExecution';\n responseOptions?: SuiTransactionBlockResponseOptions;\n timeout?: number;\n pollInterval?: number;\n}\n\nexport class SuiTransactionExecutionError extends Error {\n readonly digest?: string;\n readonly retryable: boolean;\n\n constructor(message: string, options: { cause?: unknown; digest?: string; retryable?: boolean } = {}) {\n super(message, { cause: options.cause });\n this.name = 'SuiTransactionExecutionError';\n this.digest = options.digest;\n this.retryable = options.retryable ?? false;\n }\n}\n\nexport function createSuiClient(config: NetworkConfig): SuiClient {\n return new SuiClient({ url: config.rpcUrl });\n}\n\nexport class MeshSuiClient {\n private readonly suiClient: SuiClient;\n\n constructor(private readonly networkConfig: NetworkConfig) {\n this.suiClient = createSuiClient(networkConfig);\n }\n\n async executeTransaction(\n tx: Transaction,\n keypair: Signer,\n options: ExecuteTransactionOptions = {},\n ): Promise<SuiTransactionBlockResponse> {\n const responseOptions: SuiTransactionBlockResponseOptions = {\n showEffects: true,\n showEvents: true,\n showObjectChanges: true,\n ...options.responseOptions,\n };\n\n tx.setSenderIfNotSet(keypair.getPublicKey().toSuiAddress());\n\n let lastError: SuiTransactionExecutionError | undefined;\n for (let attempt = 1; attempt <= MAX_TRANSACTION_ATTEMPTS; attempt += 1) {\n try {\n const executed = await this.suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n requestType: options.requestType ?? 'WaitForLocalExecution',\n options: responseOptions,\n });\n const response = await this.suiClient.waitForTransaction({\n digest: executed.digest,\n options: responseOptions,\n timeout: options.timeout,\n pollInterval: options.pollInterval,\n });\n const failure = getExecutionFailure(response);\n if (failure) {\n throw failure;\n }\n\n return response;\n } catch (error) {\n const executionError = normalizeExecutionError(error);\n lastError = executionError;\n if (attempt >= MAX_TRANSACTION_ATTEMPTS || !executionError.retryable) {\n throw executionError;\n }\n\n logger.warn(\n { err: executionError, attempt, digest: executionError.digest },\n 'Retrying Sui transaction after retryable failure.',\n );\n await delay(getRetryDelayMs(attempt));\n }\n }\n\n throw lastError ?? new SuiTransactionExecutionError('Transaction execution failed.');\n }\n\n async getBalance(address: string): Promise<bigint> {\n const balance = await this.suiClient.getBalance({ owner: address });\n return BigInt(balance.totalBalance);\n }\n\n async queryEvents(\n eventType: string,\n cursor?: EventID | null,\n limit?: number,\n ): Promise<{ events: SuiEvent[]; nextCursor: EventID | null; hasMore: boolean }> {\n const result = await this.suiClient.queryEvents({\n query: { MoveEventType: eventType },\n cursor: cursor ?? undefined,\n limit,\n order: 'ascending',\n });\n\n return {\n events: result.data,\n nextCursor: result.nextCursor ?? null,\n hasMore: result.hasNextPage,\n };\n }\n\n async getObject<T>(objectId: string): Promise<T> {\n const response = await this.suiClient.getObject({\n id: objectId,\n options: {\n showContent: true,\n showOwner: true,\n showType: true,\n },\n });\n\n if (!response.data?.content || response.data.content.dataType !== 'moveObject') {\n throw new Error(`Object ${objectId} was not found or does not contain Move object data.`);\n }\n\n const normalized = normalizeMoveValue(response.data.content.fields);\n if (!isRecord(normalized)) {\n throw new Error(`Object ${objectId} did not resolve to a field record.`);\n }\n\n return {\n objectId: response.data.objectId,\n objectType: response.data.type ?? undefined,\n objectOwner: normalizeObjectOwner(response.data.owner),\n ...normalized,\n } as T;\n }\n\n get client(): SuiClient {\n return this.suiClient;\n }\n\n get config(): NetworkConfig {\n return this.networkConfig;\n }\n}\n\nfunction getExecutionFailure(response: SuiTransactionBlockResponse): SuiTransactionExecutionError | null {\n const status = response.effects?.status;\n if (!status || status.status !== 'failure') {\n return null;\n }\n\n const rawMessage = typeof status.error === 'string' && status.error.trim() ? status.error.trim() : 'unknown error';\n return new SuiTransactionExecutionError(formatFailureMessage(rawMessage, response.digest), {\n digest: response.digest,\n retryable: isRetryableErrorMessage(rawMessage),\n });\n}\n\nfunction normalizeExecutionError(error: unknown): SuiTransactionExecutionError {\n if (error instanceof SuiTransactionExecutionError) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return new SuiTransactionExecutionError(formatFailureMessage(message), {\n cause: error,\n retryable: isRetryableErrorMessage(message),\n });\n}\n\nfunction formatFailureMessage(message: string, digest?: string): string {\n const prefix = digest ? `Sui transaction ${digest}` : 'Sui transaction';\n if (/insufficient gas|no valid gas|gas balance|gas coin/i.test(message)) {\n return `${prefix} failed due to insufficient gas: ${message}`;\n }\n\n if (/object.*(lock|conflict)|equivocat|shared object.*busy/i.test(message)) {\n return `${prefix} failed due to an object lock or conflict: ${message}`;\n }\n\n return `${prefix} failed: ${message}`;\n}\n\nfunction isRetryableErrorMessage(message: string): boolean {\n return /(timeout|temporar|429|5\\d\\d|fetch failed|network|connection reset|ECONNRESET|ETIMEDOUT|object.*(lock|conflict)|equivocat|busy)/i.test(\n message,\n );\n}\n\nfunction getRetryDelayMs(attempt: number): number {\n return 500 * 2 ** (attempt - 1);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n","import { BidStatus, PaymentRail, PaymentScheme, RelayNodeStatus, TaskStatus, type AgentCard, type Bid, type Capability, type Dispute, type RelayNode, type StakePosition, type Task } from '@hivemind-os/collective-types';\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function stringToBytes(value: string): Uint8Array {\n return encoder.encode(value);\n}\n\nexport function bytesToString(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value instanceof Uint8Array) {\n return decoder.decode(value);\n }\n\n if (Array.isArray(value) && value.every((entry) => typeof entry === 'number')) {\n return decoder.decode(new Uint8Array(value));\n }\n\n return '';\n}\n\nexport function bytesToHex(value: Uint8Array | number[]): string {\n return Buffer.from(value).toString('hex');\n}\n\nexport function normalizeMoveValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeMoveValue(entry));\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n if (typeof value.id === 'string' && Object.keys(value).length === 1) {\n return value.id;\n }\n\n if (isRecord(value.fields)) {\n return normalizeMoveValue(value.fields);\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, normalizeMoveValue(entry)]),\n );\n}\n\nexport function normalizeObjectOwner(owner: unknown): string | undefined {\n if (!isRecord(owner)) {\n return undefined;\n }\n\n if (typeof owner.AddressOwner === 'string') {\n return owner.AddressOwner;\n }\n\n if (typeof owner.ObjectOwner === 'string') {\n return owner.ObjectOwner;\n }\n\n return undefined;\n}\n\nfunction getValue(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nfunction asString(value: unknown, fallback = ''): string {\n return typeof value === 'string' ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'bigint') {\n return Number(value);\n }\n\n if (typeof value === 'string' && value.length > 0) {\n return Number(value);\n }\n\n return fallback;\n}\n\nfunction asBigInt(value: unknown, fallback = 0n): bigint {\n if (typeof value === 'bigint') {\n return value;\n }\n\n if (typeof value === 'number') {\n return BigInt(value);\n }\n\n if (typeof value === 'string' && value.length > 0) {\n return BigInt(value);\n }\n\n return fallback;\n}\n\nfunction asBoolean(value: unknown, fallback = false): boolean {\n return typeof value === 'boolean' ? value : fallback;\n}\n\nfunction normalizeCapability(raw: unknown): Capability {\n const record = isRecord(raw) ? (normalizeMoveValue(raw) as Record<string, unknown>) : {};\n const amount = asBigInt(getValue(record, 'price_mist', 'priceMist', 'amount'));\n const railsValue = getValue(record, 'paymentRails', 'payment_rails');\n const paymentRails = Array.isArray(railsValue)\n ? railsValue.filter((entry): entry is PaymentRail => typeof entry === 'string' && Object.values(PaymentRail).includes(entry as PaymentRail))\n : undefined;\n\n return {\n name: asString(getValue(record, 'name')),\n description: asString(getValue(record, 'description')),\n version: asString(getValue(record, 'version')),\n pricing: {\n rail: PaymentRail.SUI_ESCROW,\n amount,\n currency: asString(getValue(record, 'currency'), 'MIST'),\n },\n executionMode: asExecutionMode(getValue(record, 'executionMode', 'execution_mode')),\n paymentRails,\n };\n}\n\nexport function parseAgentCardFields(raw: unknown, fallbackId?: string): AgentCard {\n const record = isRecord(raw) ? (normalizeMoveValue(raw) as Record<string, unknown>) : {};\n const capabilitiesValue = getValue(record, 'capabilities');\n const capabilities = Array.isArray(capabilitiesValue)\n ? capabilitiesValue.map((entry) => normalizeCapability(entry))\n : [];\n\n return {\n id: asString(getValue(record, 'id', 'card_id', 'cardId', 'objectId'), fallbackId ?? ''),\n owner: asString(getValue(record, 'owner', 'agent', 'objectOwner')),\n did: asString(getValue(record, 'did')) as AgentCard['did'],\n name: asString(getValue(record, 'name')),\n description: asString(getValue(record, 'description')),\n capabilities,\n endpoint: asString(getValue(record, 'endpoint')) || undefined,\n relayEndpoints: normalizeRelayEndpoints(getValue(record, 'relayEndpoints', 'relay_endpoints')),\n encryptionPublicKey: normalizeOptionalHex(getValue(record, 'encryption_public_key', 'encryptionPublicKey')),\n active: asBoolean(getValue(record, 'active'), true),\n version: asNumber(getValue(record, 'version'), 1),\n registeredAt: asNumber(getValue(record, 'registered_at', 'registeredAt')),\n updatedAt: asNumber(getValue(record, 'updated_at', 'updatedAt')),\n totalTasksCompleted: normalizeOptionalNumber(getValue(record, 'total_tasks_completed', 'totalTasksCompleted')),\n totalTasksFailed: normalizeOptionalNumber(getValue(record, 'total_tasks_failed', 'totalTasksFailed')),\n totalTasksDisputed: normalizeOptionalNumber(getValue(record, 'total_tasks_disputed', 'totalTasksDisputed')),\n totalEarningsMist: normalizeOptionalBigInt(getValue(record, 'total_earnings_mist', 'totalEarningsMist')),\n hasStake: normalizeOptionalBoolean(getValue(record, 'has_stake', 'hasStake')),\n stakeMist: normalizeOptionalBigInt(getValue(record, 'stake_mist', 'stakeMist')),\n stakeType: normalizeStakeType(getValue(record, 'stake_type', 'stakeType')),\n };\n}\n\nfunction normalizeOptionalAddress(value: unknown): string | undefined {\n const address = asString(value);\n return address.length === 0 || /^0x0+$/i.test(address) ? undefined : address;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n const normalized = bytesToString(value);\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeOptionalNumber(value: unknown): number | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n return asNumber(value);\n}\n\nfunction normalizeOptionalBigInt(value: unknown): bigint | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n return asBigInt(value);\n}\n\nfunction normalizeOptionalHex(value: unknown): string | undefined {\n const normalized = bytesToOptionalHex(value);\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction normalizePaymentScheme(value: unknown): PaymentScheme | undefined {\n if (value === 0 || value === '0' || value === PaymentScheme.EXACT) {\n return PaymentScheme.EXACT;\n }\n if (value === 1 || value === '1' || value === PaymentScheme.UPTO) {\n return PaymentScheme.UPTO;\n }\n if (value === 2 || value === '2' || value === PaymentScheme.STREAM) {\n return PaymentScheme.STREAM;\n }\n return undefined;\n}\n\nfunction normalizeRelayEndpoints(value: unknown): AgentCard['relayEndpoints'] {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n const relayEndpoints = value\n .map((entry) => {\n const record = isRecord(entry) ? (normalizeMoveValue(entry) as Record<string, unknown>) : null;\n const endpoint = record ? asString(getValue(record, 'endpoint', 'url', 'serviceEndpoint')) : '';\n if (!endpoint) {\n return null;\n }\n\n return {\n relayDid: asString(getValue(record, 'relayDid', 'relay_did')) as AgentCard['did'] | undefined,\n endpoint,\n modes: Array.isArray(record?.modes)\n ? record.modes.filter(\n (mode): mode is NonNullable<NonNullable<AgentCard['relayEndpoints']>[number]['modes']>[number] =>\n typeof mode === 'string',\n )\n : undefined,\n };\n })\n .filter((entry): entry is NonNullable<AgentCard['relayEndpoints']>[number] => Boolean(entry));\n\n return relayEndpoints.length > 0 ? relayEndpoints : undefined;\n}\n\nfunction bytesToOptionalHex(value: unknown): string {\n if (typeof value === 'string' && /^[a-f0-9]+$/i.test(value) && value.length % 2 === 0) {\n return value;\n }\n\n if (value instanceof Uint8Array) {\n return bytesToHex(value);\n }\n\n if (Array.isArray(value) && value.every((entry) => typeof entry === 'number')) {\n return bytesToHex(value);\n }\n\n return '';\n}\n\nfunction asExecutionMode(value: unknown): Capability['executionMode'] {\n return value === 'sync' || value === 'async' ? value : undefined;\n}\n\nfunction normalizeStakeType(value: unknown): StakePosition['stakeType'] | AgentCard['stakeType'] | undefined {\n if (value === 0 || value === '0' || value === 'agent') {\n return 'agent';\n }\n if (value === 1 || value === '1' || value === 'relay') {\n return 'relay';\n }\n return undefined;\n}\n\nfunction normalizeRelayStatus(value: unknown): RelayNodeStatus {\n if (value === RelayNodeStatus.ACTIVE || value === '0' || value === 0 || value === 'ACTIVE') {\n return RelayNodeStatus.ACTIVE;\n }\n if (value === RelayNodeStatus.INACTIVE || value === '1' || value === 1 || value === 'INACTIVE') {\n return RelayNodeStatus.INACTIVE;\n }\n if (value === RelayNodeStatus.SLASHED || value === '2' || value === 2 || value === 'SLASHED') {\n return RelayNodeStatus.SLASHED;\n }\n return RelayNodeStatus.ACTIVE;\n}\n\nfunction normalizeBalanceValue(value: unknown): bigint {\n if (isRecord(value)) {\n return asBigInt(getValue(value, 'value'));\n }\n return asBigInt(value);\n}\n\nexport function parseStakePositionFields(raw: unknown, fallbackId?: string): StakePosition {\n const record = isRecord(raw) ? (normalizeMoveValue(raw) as Record<string, unknown>) : {};\n const balanceValue = getValue(record, 'balance', 'balanceMist', 'balance_mist');\n const deactivatedAt = asNumber(getValue(record, 'deactivated_at', 'deactivatedAt'));\n const balanceMist = normalizeBalanceValue(balanceValue);\n const stakeType = normalizeStakeType(getValue(record, 'stake_type', 'stakeType')) ?? 'agent';\n const meetsMinimum = stakeType === 'relay' ? balanceMist >= 100_000_000_000n : balanceMist >= 10_000_000_000n;\n const isActive = deactivatedAt === 0 && meetsMinimum;\n\n return {\n id: asString(getValue(record, 'id', 'stake_id', 'stakeId', 'objectId'), fallbackId ?? ''),\n owner: asString(getValue(record, 'owner', 'objectOwner')),\n stakeType,\n balanceMist,\n stakedAt: asNumber(getValue(record, 'staked_at', 'stakedAt')),\n deactivatedAt,\n slashedAmount: asBigInt(getValue(record, 'slashed_amount', 'slashedAmount')),\n isActive,\n meetsMinium: meetsMinimum,\n meetsMinimum,\n };\n}\n\nexport function parseRelayNodeFields(raw: unknown, fallbackId?: string): RelayNode {\n const record = isRecord(raw) ? (normalizeMoveValue(raw) as Record<string, unknown>) : {};\n const capabilitiesValue = getValue(record, 'capabilities');\n const capabilities = Array.isArray(capabilitiesValue)\n ? capabilitiesValue.map((entry) => bytesToString(entry)).filter(Boolean)\n : [];\n\n return {\n id: asString(getValue(record, 'id', 'relay_id', 'relayId', 'objectId'), fallbackId ?? ''),\n operator: asString(getValue(record, 'operator', 'owner', 'objectOwner')),\n endpoint: asString(getValue(record, 'endpoint')),\n stakePositionId: asString(getValue(record, 'stake_position_id', 'stakePositionId')),\n capabilities,\n region: asString(getValue(record, 'region')),\n status: normalizeRelayStatus(getValue(record, 'status')),\n registeredAt: asNumber(getValue(record, 'registered_at', 'registeredAt')),\n lastHeartbeat: asNumber(getValue(record, 'last_heartbeat', 'lastHeartbeat')),\n routingFeeBps: asNumber(getValue(record, 'routing_fee_bps', 'routingFeeBps')),\n totalRouted: asNumber(getValue(record, 'total_routed', 'totalRouted')),\n totalFeesEarnedMist: asBigInt(getValue(record, 'total_fees_earned', 'totalFeesEarnedMist')),\n };\n}\n\nexport function parseTaskFields(raw: unknown, fallbackId?: string): Task {\n const record = isRecord(raw) ? (normalizeMoveValue(raw) as Record<string, unknown>) : {};\n const status = asNumber(getValue(record, 'status'), TaskStatus.OPEN) as TaskStatus;\n const acceptedAt = asNumber(getValue(record, 'accepted_at', 'acceptedAt'));\n const completedAt = asNumber(getValue(record, 'completed_at', 'completedAt'));\n const paymentScheme = normalizePaymentScheme(getValue(record, 'payment_scheme', 'paymentScheme'));\n\n return {\n id: asString(getValue(record, 'id', 'task_id', 'taskId', 'objectId'), fallbackId ?? ''),\n requester: asString(getValue(record, 'requester')),\n provider: normalizeOptionalAddress(getValue(record, 'provider')),\n capability: asString(getValue(record, 'capability')),\n category: asString(getValue(record, 'category'), 'general'),\n inputBlobId: bytesToString(getValue(record, 'input_blob_id', 'inputBlobId')),\n resultBlobId: normalizeOptionalString(getValue(record, 'result_blob_id', 'resultBlobId')),\n price: asBigInt(getValue(record, 'price')),\n paymentScheme,\n maxPrice: normalizeOptionalBigInt(getValue(record, 'max_price', 'maxPrice')),\n meteredUnits: normalizeOptionalNumber(getValue(record, 'metered_units', 'meteredUnits')),\n unitPrice: normalizeOptionalBigInt(getValue(record, 'unit_price', 'unitPrice')),\n verificationHash: normalizeOptionalHex(getValue(record, 'verification_hash', 'verificationHash')),\n status,\n disputeWindowMs: asNumber(getValue(record, 'dispute_window_ms', 'disputeWindowMs')),\n createdAt: asNumber(getValue(record, 'created_at', 'createdAt')),\n acceptedAt: acceptedAt > 0 ? acceptedAt : undefined,\n completedAt: completedAt > 0 ? completedAt : undefined,\n expiresAt: asNumber(getValue(record, 'expires_at', 'expiresAt')),\n agreementHash: normalizeOptionalString(getValue(record, 'agreement_hash', 'agreementHash')),\n };\n}\n\nexport function parseBidFields(raw: unknown, fallbackId?: string): Bid {\n const record = isRecord(raw) ? (normalizeMoveValue(raw) as Record<string, unknown>) : {};\n const evidenceBlob = normalizeOptionalString(getValue(record, 'evidence_blob', 'evidenceBlob'));\n\n return {\n id: asString(getValue(record, 'id', 'bid_id', 'bidId', 'objectId'), fallbackId ?? ''),\n taskId: asString(getValue(record, 'task_id', 'taskId')),\n bidder: asString(getValue(record, 'bidder')),\n bidPrice: asBigInt(getValue(record, 'bid_price', 'bidPrice')),\n reputationScore: asBigInt(getValue(record, 'reputation_score', 'reputationScore')),\n evidenceBlob,\n createdAt: asNumber(getValue(record, 'created_at', 'createdAt')),\n status: asNumber(getValue(record, 'status'), BidStatus.ACTIVE) as BidStatus,\n };\n}\n\nexport function parseDisputeFields(raw: unknown, fallbackId?: string): Dispute {\n const record = isRecord(raw) ? (normalizeMoveValue(raw) as Record<string, unknown>) : {};\n const respondedAt = asNumber(getValue(record, 'responded_at', 'respondedAt'));\n const resolvedAt = asNumber(getValue(record, 'resolved_at', 'resolvedAt'));\n\n return {\n id: asString(getValue(record, 'id', 'dispute_id', 'disputeId', 'objectId'), fallbackId ?? ''),\n taskId: asString(getValue(record, 'task_id', 'taskId')),\n requester: asString(getValue(record, 'requester')),\n provider: asString(getValue(record, 'provider')),\n escrowAmount: asBigInt(getValue(record, 'escrow_amount', 'escrowAmount')),\n status: asNumber(getValue(record, 'status')) as Dispute['status'],\n requesterEvidenceBlob: bytesToString(getValue(record, 'requester_evidence_blob', 'requesterEvidenceBlob')),\n providerEvidenceBlob: normalizeOptionalString(getValue(record, 'provider_evidence_blob', 'providerEvidenceBlob')),\n requesterProposedSplit: asBigInt(getValue(record, 'requester_proposed_split', 'requesterProposedSplit')),\n providerProposedSplit: asBigInt(getValue(record, 'provider_proposed_split', 'providerProposedSplit')),\n arbitrator: normalizeOptionalAddress(getValue(record, 'arbitrator')),\n rulingSplit: asBigInt(getValue(record, 'ruling_split', 'rulingSplit')),\n openedAt: asNumber(getValue(record, 'opened_at', 'openedAt')),\n respondedAt: respondedAt > 0 ? respondedAt : undefined,\n resolvedAt: resolvedAt > 0 ? resolvedAt : undefined,\n resolutionDeadline: asNumber(getValue(record, 'resolution_deadline', 'resolutionDeadline')),\n };\n}\n","import type { Capability } from '@hivemind-os/collective-types';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { stringToBytes } from '../internal/parsing.js';\n\nexport const CLOCK_OBJECT_ID = '0x6';\nconst OBJECT_ID_PATTERN = /^0x([0-9a-f]+)$/i;\nconst MAX_OBJECT_ID_HEX_LENGTH = 64;\nconst MAX_U64 = (1n << 64n) - 1n;\n\nexport interface RegisterAgentParams {\n packageId: string;\n registryId: string;\n name: string;\n did: string;\n description: string;\n capabilities: Capability[];\n endpoint: string;\n}\n\nexport interface UpdateAgentParams {\n packageId: string;\n registryId: string;\n cardId: string;\n name: string;\n description: string;\n endpoint: string;\n}\n\nexport interface SetEncryptionKeyParams {\n packageId: string;\n cardId: string;\n encryptionPublicKey: Uint8Array;\n}\n\nexport interface UpdateCapabilitiesParams {\n packageId: string;\n registryId: string;\n cardId: string;\n capabilities: Capability[];\n}\n\nexport interface DeactivateAgentParams {\n packageId: string;\n registryId: string;\n cardId: string;\n}\n\nexport interface ReactivateAgentParams {\n packageId: string;\n registryId: string;\n cardId: string;\n}\n\nexport interface PostTaskParams {\n packageId: string;\n capability: string;\n category: string;\n inputBlobId: string;\n agreementHash?: string;\n priceMist: bigint;\n disputeWindowMs: number;\n expiryHours: number;\n}\n\nexport interface PostMeteredTaskParams {\n packageId: string;\n capability: string;\n category: string;\n inputBlobId: string;\n agreementHash?: string;\n maxPriceMist: bigint;\n unitPriceMist: bigint;\n disputeWindowMs: number;\n expiryHours: number;\n}\n\nexport interface AcceptTaskParams {\n packageId: string;\n taskId: string;\n}\n\nexport interface CompleteTaskParams {\n packageId: string;\n taskId: string;\n resultBlobId: string;\n providerCardId?: string;\n}\n\nexport interface CompleteMeteredTaskParams {\n packageId: string;\n taskId: string;\n resultBlobId: string;\n meteredUnits: number;\n verificationHash: string;\n providerCardId?: string;\n}\n\nexport interface ReleasePaymentParams {\n packageId: string;\n taskId: string;\n}\n\nexport interface ReleaseMeteredPaymentParams {\n packageId: string;\n taskId: string;\n}\n\nexport interface ClaimPaymentParams {\n packageId: string;\n taskId: string;\n providerCardId?: string;\n}\n\nexport interface CancelTaskParams {\n packageId: string;\n taskId: string;\n}\n\nexport interface RefundExpiredTaskParams {\n packageId: string;\n taskId: string;\n}\n\nexport interface PlaceBidParams {\n packageId: string;\n taskId: string;\n bidPriceMist: bigint;\n reputationScore: bigint;\n evidenceBlob?: string;\n}\n\nexport interface AcceptBidParams {\n packageId: string;\n taskId: string;\n bidId: string;\n otherBidIds?: string[];\n}\n\nexport interface WithdrawBidParams {\n packageId: string;\n bidId: string;\n}\n\nexport interface RejectBidParams {\n packageId: string;\n taskId: string;\n bidId: string;\n}\n\nexport interface OpenDisputeParams {\n packageId: string;\n taskId: string;\n evidenceBlobId: string;\n proposedSplitMist: bigint;\n arbitratorAddress?: string;\n}\n\nexport interface RespondToDisputeParams {\n packageId: string;\n disputeId: string;\n evidenceBlobId: string;\n proposedSplitMist: bigint;\n}\n\nexport interface AcceptResolutionParams {\n packageId: string;\n disputeId: string;\n taskId: string;\n}\n\nexport interface ArbitrateDisputeParams {\n packageId: string;\n disputeId: string;\n taskId: string;\n rulingSplitMist: bigint;\n}\n\nexport interface PublishReputationAnchorParams {\n packageId: string;\n merkleRoot: number[];\n eventCount: number;\n blobId: string;\n fromTimestamp: number;\n toTimestamp: number;\n}\n\nexport interface DepositStakeParams {\n packageId: string;\n amountMist: bigint;\n stakeType: 'agent' | 'relay';\n}\n\nexport interface AddStakeParams {\n packageId: string;\n stakeId: string;\n amountMist: bigint;\n}\n\nexport interface StartDeactivationParams {\n packageId: string;\n stakeId: string;\n}\n\nexport interface WithdrawStakeParams {\n packageId: string;\n stakeId: string;\n}\n\nexport interface SlashStakeParams {\n packageId: string;\n stakeId: string;\n taskId: string;\n}\n\nexport interface RegisterRelayParams {\n packageId: string;\n endpoint: string;\n stakeId: string;\n capabilities: string[];\n region: string;\n routingFeeBps: number;\n}\n\nexport interface RelayMutationParams {\n packageId: string;\n relayId: string;\n}\n\nexport interface RecordRelayRoutingParams extends RelayMutationParams {\n feeAmountMist: bigint;\n}\n\nexport function buildRegisterAgentTx(params: RegisterAgentParams): Transaction {\n validateRegisterAgentParams(params);\n\n const tx = new Transaction();\n const capabilityVectors = toCapabilityVectors(params.capabilities);\n\n tx.moveCall({\n target: `${params.packageId}::registry::register_agent`,\n arguments: [\n tx.object(params.registryId),\n tx.pure.string(params.name),\n tx.pure.string(params.did),\n tx.pure.string(params.description),\n tx.pure.vector('string', capabilityVectors.names),\n tx.pure.vector('string', capabilityVectors.descriptions),\n tx.pure.vector('string', capabilityVectors.versions),\n tx.pure.vector('u64', capabilityVectors.prices),\n tx.pure.vector('string', capabilityVectors.currencies),\n tx.pure.string(params.endpoint),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildUpdateAgentTx(params: UpdateAgentParams): Transaction {\n validateUpdateAgentParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::registry::update_agent`,\n arguments: [\n tx.object(params.registryId),\n tx.object(params.cardId),\n tx.pure.string(params.name),\n tx.pure.string(params.description),\n tx.pure.string(params.endpoint),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildUpdateCapabilitiesTx(params: UpdateCapabilitiesParams): Transaction {\n validateUpdateCapabilitiesParams(params);\n\n const tx = new Transaction();\n const capabilityVectors = toCapabilityVectors(params.capabilities);\n\n tx.moveCall({\n target: `${params.packageId}::registry::update_capabilities`,\n arguments: [\n tx.object(params.registryId),\n tx.object(params.cardId),\n tx.pure.vector('string', capabilityVectors.names),\n tx.pure.vector('string', capabilityVectors.descriptions),\n tx.pure.vector('string', capabilityVectors.versions),\n tx.pure.vector('u64', capabilityVectors.prices),\n tx.pure.vector('string', capabilityVectors.currencies),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildSetEncryptionKeyTx(params: SetEncryptionKeyParams): Transaction {\n validateSetEncryptionKeyParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::registry::set_encryption_key`,\n arguments: [\n tx.object(params.cardId),\n tx.pure.vector('u8', [...params.encryptionPublicKey]),\n ],\n });\n\n return tx;\n}\n\nexport function buildDeactivateAgentTx(params: DeactivateAgentParams): Transaction {\n validateAgentCardMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::registry::deactivate_agent`,\n arguments: [tx.object(params.registryId), tx.object(params.cardId)],\n });\n\n return tx;\n}\n\nexport function buildReactivateAgentTx(params: ReactivateAgentParams): Transaction {\n validateAgentCardMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::registry::reactivate_agent`,\n arguments: [tx.object(params.registryId), tx.object(params.cardId), tx.object(CLOCK_OBJECT_ID)],\n });\n\n return tx;\n}\n\nexport function buildPostTaskTx(params: PostTaskParams): Transaction {\n validatePostTaskParams(params);\n\n const tx = new Transaction();\n const [paymentCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(params.priceMist)]);\n\n tx.moveCall({\n target: `${params.packageId}::task::post_open_task`,\n arguments: [\n tx.pure.string(params.capability),\n tx.pure.string(params.category),\n tx.pure.vector('u8', [...stringToBytes(params.inputBlobId)]),\n tx.pure.vector('u8', [...stringToBytes(params.agreementHash ?? '')]),\n paymentCoin,\n tx.pure.u64(params.disputeWindowMs),\n tx.pure.u64(params.expiryHours),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildPostMeteredTaskTx(params: PostMeteredTaskParams): Transaction {\n validatePostMeteredTaskParams(params);\n\n const tx = new Transaction();\n const [paymentCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(params.maxPriceMist)]);\n\n tx.moveCall({\n target: `${params.packageId}::task::post_metered_task`,\n arguments: [\n tx.pure.string(params.capability),\n tx.pure.vector('u8', [...stringToBytes(params.inputBlobId)]),\n tx.pure.vector('u8', [...stringToBytes(params.agreementHash ?? '')]),\n paymentCoin,\n tx.pure.u64(params.unitPriceMist),\n tx.pure.u64(params.disputeWindowMs),\n tx.pure.u64(params.expiryHours),\n tx.pure.string(params.category),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildAcceptTaskTx(params: AcceptTaskParams): Transaction {\n validateTaskMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::task::accept_task`,\n arguments: [tx.object(params.taskId), tx.object(CLOCK_OBJECT_ID)],\n });\n\n return tx;\n}\n\nexport function buildCompleteTaskTx(params: CompleteTaskParams): Transaction {\n validateTaskCompletionParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::task::${params.providerCardId ? 'complete_task_with_card' : 'complete_task'}`,\n arguments: params.providerCardId\n ? [\n tx.object(params.taskId),\n tx.object(params.providerCardId),\n tx.pure.vector('u8', [...stringToBytes(params.resultBlobId)]),\n tx.object(CLOCK_OBJECT_ID),\n ]\n : [\n tx.object(params.taskId),\n tx.pure.vector('u8', [...stringToBytes(params.resultBlobId)]),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildCompleteMeteredTaskTx(params: CompleteMeteredTaskParams): Transaction {\n validateMeteredTaskCompletionParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::task::${params.providerCardId ? 'complete_metered_task_with_card' : 'complete_metered_task'}`,\n arguments: params.providerCardId\n ? [\n tx.object(params.taskId),\n tx.object(params.providerCardId),\n tx.pure.u64(params.meteredUnits),\n tx.pure.vector('u8', [...stringToBytes(params.resultBlobId)]),\n tx.pure.vector('u8', [...hexToBytes(params.verificationHash)]),\n tx.object(CLOCK_OBJECT_ID),\n ]\n : [\n tx.object(params.taskId),\n tx.pure.u64(params.meteredUnits),\n tx.pure.vector('u8', [...stringToBytes(params.resultBlobId)]),\n tx.pure.vector('u8', [...hexToBytes(params.verificationHash)]),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildReleasePaymentTx(params: ReleasePaymentParams): Transaction {\n validateTaskMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::task::release_payment`,\n arguments: [tx.object(params.taskId)],\n });\n\n return tx;\n}\n\nexport function buildReleaseMeteredPaymentTx(params: ReleaseMeteredPaymentParams): Transaction {\n validateTaskMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::task::release_metered_payment`,\n arguments: [tx.object(params.taskId)],\n });\n\n return tx;\n}\n\nexport function buildClaimPaymentTx(params: ClaimPaymentParams): Transaction {\n validateClaimPaymentParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::task::${params.providerCardId ? 'claim_payment_with_card' : 'claim_payment'}`,\n arguments: params.providerCardId\n ? [tx.object(params.taskId), tx.object(params.providerCardId), tx.object(CLOCK_OBJECT_ID)]\n : [tx.object(params.taskId), tx.object(CLOCK_OBJECT_ID)],\n });\n\n return tx;\n}\n\nexport function buildCancelTaskTx(params: CancelTaskParams): Transaction {\n validateTaskMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::task::cancel_task`,\n arguments: [tx.object(params.taskId)],\n });\n\n return tx;\n}\n\nexport function buildRefundExpiredTaskTx(params: RefundExpiredTaskParams): Transaction {\n validateTaskMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::task::refund_expired_task`,\n arguments: [tx.object(params.taskId), tx.object(CLOCK_OBJECT_ID)],\n });\n\n return tx;\n}\n\nexport function buildPlaceBidTx(params: PlaceBidParams): Transaction {\n validatePlaceBidParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::marketplace::place_bid`,\n arguments: [\n tx.object(params.taskId),\n tx.pure.u64(params.reputationScore),\n tx.pure.u64(params.bidPriceMist),\n tx.pure.vector('u8', [...stringToBytes(params.evidenceBlob ?? '')]),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildAcceptBidTx(params: AcceptBidParams): Transaction {\n validateAcceptBidParams(params);\n\n const tx = new Transaction();\n for (const bidId of params.otherBidIds ?? []) {\n tx.moveCall({\n target: `${params.packageId}::marketplace::reject_bid`,\n arguments: [tx.object(bidId), tx.object(params.taskId)],\n });\n }\n\n tx.moveCall({\n target: `${params.packageId}::marketplace::accept_bid`,\n arguments: [tx.object(params.taskId), tx.object(params.bidId), tx.object(CLOCK_OBJECT_ID)],\n });\n\n return tx;\n}\n\nexport function buildWithdrawBidTx(params: WithdrawBidParams): Transaction {\n validateWithdrawBidParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::marketplace::withdraw_bid`,\n arguments: [tx.object(params.bidId)],\n });\n\n return tx;\n}\n\nexport function buildRejectBidTx(params: RejectBidParams): Transaction {\n validateRejectBidParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::marketplace::reject_bid`,\n arguments: [tx.object(params.bidId), tx.object(params.taskId)],\n });\n\n return tx;\n}\n\nexport function buildOpenDisputeTx(params: OpenDisputeParams): Transaction {\n validateOpenDisputeParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::dispute::open_dispute`,\n arguments: [\n tx.object(params.taskId),\n tx.pure.vector('u8', [...stringToBytes(params.evidenceBlobId)]),\n tx.pure.u64(params.proposedSplitMist),\n tx.pure.address(params.arbitratorAddress ?? '0x0'),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildRespondToDisputeTx(params: RespondToDisputeParams): Transaction {\n validateRespondToDisputeParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::dispute::respond_to_dispute`,\n arguments: [\n tx.object(params.disputeId),\n tx.pure.vector('u8', [...stringToBytes(params.evidenceBlobId)]),\n tx.pure.u64(params.proposedSplitMist),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildAcceptResolutionTx(params: AcceptResolutionParams): Transaction {\n validateAcceptResolutionParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::dispute::accept_resolution`,\n arguments: [tx.object(params.disputeId), tx.object(params.taskId), tx.object(CLOCK_OBJECT_ID)],\n });\n\n return tx;\n}\n\nexport function buildArbitrateDisputeTx(params: ArbitrateDisputeParams): Transaction {\n validateArbitrateDisputeParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::dispute::arbitrate`,\n arguments: [\n tx.object(params.disputeId),\n tx.object(params.taskId),\n tx.pure.u64(params.rulingSplitMist),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildPublishReputationAnchorTx(params: PublishReputationAnchorParams): Transaction {\n validatePublishReputationAnchorParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::reputation::publish_anchor`,\n arguments: [\n tx.pure.vector('u8', params.merkleRoot),\n tx.pure.u64(params.eventCount),\n tx.pure.vector('u8', [...stringToBytes(params.blobId)]),\n tx.pure.u64(params.fromTimestamp),\n tx.pure.u64(params.toTimestamp),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n\n return tx;\n}\n\nexport function buildDepositStakeTx(params: DepositStakeParams): Transaction {\n validateDepositStakeParams(params);\n\n const tx = new Transaction();\n const [paymentCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(params.amountMist)]);\n tx.moveCall({\n target: `${params.packageId}::staking::deposit_stake`,\n arguments: [paymentCoin, tx.pure.u8(stakeTypeToMoveValue(params.stakeType)), tx.object(CLOCK_OBJECT_ID)],\n });\n return tx;\n}\n\nexport function buildAddStakeTx(params: AddStakeParams): Transaction {\n validateAddStakeParams(params);\n\n const tx = new Transaction();\n const [paymentCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(params.amountMist)]);\n tx.moveCall({\n target: `${params.packageId}::staking::add_stake`,\n arguments: [tx.object(params.stakeId), paymentCoin],\n });\n return tx;\n}\n\nexport function buildStartDeactivationTx(params: StartDeactivationParams): Transaction {\n validateStakeMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::staking::start_deactivation`,\n arguments: [tx.object(params.stakeId), tx.object(CLOCK_OBJECT_ID)],\n });\n return tx;\n}\n\nexport function buildWithdrawStakeTx(params: WithdrawStakeParams): Transaction {\n validateStakeMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::staking::withdraw_stake`,\n arguments: [tx.object(params.stakeId), tx.object(CLOCK_OBJECT_ID)],\n });\n return tx;\n}\n\nexport function buildSlashExpiredEscrowTx(params: SlashStakeParams): Transaction {\n validateSlashStakeParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::staking::slash_expired_escrow`,\n arguments: [tx.object(params.stakeId), tx.object(params.taskId), tx.object(CLOCK_OBJECT_ID)],\n });\n return tx;\n}\n\nexport function buildSlashNonDeliveryTx(params: SlashStakeParams): Transaction {\n validateSlashStakeParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::staking::slash_non_delivery`,\n arguments: [tx.object(params.stakeId), tx.object(params.taskId), tx.object(CLOCK_OBJECT_ID)],\n });\n return tx;\n}\n\nexport function buildRegisterRelayTx(params: RegisterRelayParams): Transaction {\n validateRegisterRelayParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::relay_registry::register_relay`,\n arguments: [\n tx.pure.string(params.endpoint),\n tx.object(params.stakeId),\n tx.pure.vector('string', params.capabilities),\n tx.pure.string(params.region),\n tx.pure.u64(params.routingFeeBps),\n tx.object(CLOCK_OBJECT_ID),\n ],\n });\n return tx;\n}\n\nexport function buildHeartbeatRelayTx(params: RelayMutationParams): Transaction {\n validateRelayMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::relay_registry::heartbeat`,\n arguments: [tx.object(params.relayId), tx.object(CLOCK_OBJECT_ID)],\n });\n return tx;\n}\n\nexport function buildDeactivateRelayTx(params: RelayMutationParams): Transaction {\n validateRelayMutationParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::relay_registry::deactivate_relay`,\n arguments: [tx.object(params.relayId)],\n });\n return tx;\n}\n\nexport function buildRecordRelayRoutingTx(params: RecordRelayRoutingParams): Transaction {\n validateRecordRelayRoutingParams(params);\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${params.packageId}::relay_registry::record_routing`,\n arguments: [tx.object(params.relayId), tx.pure.u64(params.feeAmountMist)],\n });\n return tx;\n}\n\nfunction validateRegisterAgentParams(params: RegisterAgentParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.registryId, 'registryId');\n assertNonEmptyString(params.name, 'name');\n assertNonEmptyString(params.description, 'description');\n assertNonEmptyString(params.endpoint, 'endpoint');\n assertDid(params.did, 'did');\n assertCapabilities(params.capabilities);\n}\n\nfunction validateUpdateAgentParams(params: UpdateAgentParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.registryId, 'registryId');\n assertObjectId(params.cardId, 'cardId');\n assertNonEmptyString(params.name, 'name');\n assertNonEmptyString(params.description, 'description');\n assertNonEmptyString(params.endpoint, 'endpoint');\n}\n\nfunction validateUpdateCapabilitiesParams(params: UpdateCapabilitiesParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.registryId, 'registryId');\n assertObjectId(params.cardId, 'cardId');\n assertCapabilities(params.capabilities);\n}\n\nfunction validateSetEncryptionKeyParams(params: SetEncryptionKeyParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.cardId, 'cardId');\n assertEncryptionPublicKey(params.encryptionPublicKey, 'encryptionPublicKey');\n}\n\nfunction validateAgentCardMutationParams(params: {\n packageId: string;\n registryId: string;\n cardId: string;\n}): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.registryId, 'registryId');\n assertObjectId(params.cardId, 'cardId');\n}\n\nfunction validatePostTaskParams(params: PostTaskParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertNonEmptyString(params.capability, 'capability');\n assertNonEmptyString(params.category, 'category');\n assertNonEmptyString(params.inputBlobId, 'inputBlobId');\n assertOptionalString(params.agreementHash, 'agreementHash');\n assertU64(params.priceMist, 'priceMist');\n assertSafeNonNegativeInteger(params.disputeWindowMs, 'disputeWindowMs');\n assertSafeNonNegativeInteger(params.expiryHours, 'expiryHours');\n}\n\nfunction validatePostMeteredTaskParams(params: PostMeteredTaskParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertNonEmptyString(params.capability, 'capability');\n assertNonEmptyString(params.category, 'category');\n assertNonEmptyString(params.inputBlobId, 'inputBlobId');\n assertOptionalString(params.agreementHash, 'agreementHash');\n assertU64(params.maxPriceMist, 'maxPriceMist');\n assertU64(params.unitPriceMist, 'unitPriceMist');\n assertSafeNonNegativeInteger(params.disputeWindowMs, 'disputeWindowMs');\n assertSafeNonNegativeInteger(params.expiryHours, 'expiryHours');\n}\n\nfunction validateTaskMutationParams(params: { packageId: string; taskId: string }): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.taskId, 'taskId');\n}\n\nfunction validatePlaceBidParams(params: PlaceBidParams): void {\n validateTaskMutationParams(params);\n assertU64(params.bidPriceMist, 'bidPriceMist');\n assertU64(params.reputationScore, 'reputationScore');\n assertOptionalString(params.evidenceBlob, 'evidenceBlob');\n}\n\nfunction validateAcceptBidParams(params: AcceptBidParams): void {\n validateTaskMutationParams(params);\n assertObjectId(params.bidId, 'bidId');\n params.otherBidIds?.forEach((bidId, index) => assertObjectId(bidId, `otherBidIds[${index}]`));\n}\n\nfunction validateWithdrawBidParams(params: WithdrawBidParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.bidId, 'bidId');\n}\n\nfunction validateRejectBidParams(params: RejectBidParams): void {\n validateTaskMutationParams(params);\n assertObjectId(params.bidId, 'bidId');\n}\n\nfunction validateTaskCompletionParams(params: CompleteTaskParams): void {\n validateTaskMutationParams(params);\n assertOptionalObjectId(params.providerCardId, 'providerCardId');\n assertNonEmptyString(params.resultBlobId, 'resultBlobId');\n}\n\nfunction validateMeteredTaskCompletionParams(params: CompleteMeteredTaskParams): void {\n validateTaskMutationParams(params);\n assertOptionalObjectId(params.providerCardId, 'providerCardId');\n assertNonEmptyString(params.resultBlobId, 'resultBlobId');\n assertSafeNonNegativeInteger(params.meteredUnits, 'meteredUnits');\n assertHexString(params.verificationHash, 'verificationHash');\n}\n\nfunction validateClaimPaymentParams(params: ClaimPaymentParams): void {\n validateTaskMutationParams(params);\n assertOptionalObjectId(params.providerCardId, 'providerCardId');\n}\n\nfunction validateOpenDisputeParams(params: OpenDisputeParams): void {\n validateTaskMutationParams(params);\n assertNonEmptyString(params.evidenceBlobId, 'evidenceBlobId');\n assertU64(params.proposedSplitMist, 'proposedSplitMist');\n assertOptionalObjectId(params.arbitratorAddress, 'arbitratorAddress');\n}\n\nfunction validateRespondToDisputeParams(params: RespondToDisputeParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.disputeId, 'disputeId');\n assertNonEmptyString(params.evidenceBlobId, 'evidenceBlobId');\n assertU64(params.proposedSplitMist, 'proposedSplitMist');\n}\n\nfunction validateAcceptResolutionParams(params: AcceptResolutionParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.disputeId, 'disputeId');\n assertObjectId(params.taskId, 'taskId');\n}\n\nfunction validateArbitrateDisputeParams(params: ArbitrateDisputeParams): void {\n validateAcceptResolutionParams(params);\n assertU64(params.rulingSplitMist, 'rulingSplitMist');\n}\n\nfunction validatePublishReputationAnchorParams(params: PublishReputationAnchorParams): void {\n assertObjectId(params.packageId, 'packageId');\n if (params.merkleRoot.length === 0) {\n throw new Error('merkleRoot must not be empty.');\n }\n assertSafeNonNegativeInteger(params.eventCount, 'eventCount');\n assertNonEmptyString(params.blobId, 'blobId');\n assertSafeNonNegativeInteger(params.fromTimestamp, 'fromTimestamp');\n assertSafeNonNegativeInteger(params.toTimestamp, 'toTimestamp');\n}\n\nfunction validateDepositStakeParams(params: DepositStakeParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertU64(params.amountMist, 'amountMist');\n assertStakeType(params.stakeType, 'stakeType');\n}\n\nfunction validateAddStakeParams(params: AddStakeParams): void {\n validateStakeMutationParams(params);\n assertU64(params.amountMist, 'amountMist');\n}\n\nfunction validateStakeMutationParams(params: { packageId: string; stakeId: string }): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.stakeId, 'stakeId');\n}\n\nfunction validateSlashStakeParams(params: SlashStakeParams): void {\n validateStakeMutationParams(params);\n assertObjectId(params.taskId, 'taskId');\n}\n\nfunction validateRegisterRelayParams(params: RegisterRelayParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.stakeId, 'stakeId');\n assertNonEmptyString(params.endpoint, 'endpoint');\n assertNonEmptyString(params.region, 'region');\n params.capabilities.forEach((capability, index) => assertNonEmptyString(capability, `capabilities[${index}]`));\n assertSafeNonNegativeInteger(params.routingFeeBps, 'routingFeeBps');\n if (params.routingFeeBps > 10_000) {\n throw new Error('routingFeeBps must be less than or equal to 10000.');\n }\n}\n\nfunction validateRelayMutationParams(params: RelayMutationParams): void {\n assertObjectId(params.packageId, 'packageId');\n assertObjectId(params.relayId, 'relayId');\n}\n\nfunction validateRecordRelayRoutingParams(params: RecordRelayRoutingParams): void {\n validateRelayMutationParams(params);\n assertU64(params.feeAmountMist, 'feeAmountMist');\n}\n\nfunction toCapabilityVectors(capabilities: Capability[]): {\n names: string[];\n descriptions: string[];\n versions: string[];\n prices: bigint[];\n currencies: string[];\n} {\n return {\n names: capabilities.map((capability) => capability.name),\n descriptions: capabilities.map((capability) => capability.description),\n versions: capabilities.map((capability) => capability.version),\n prices: capabilities.map((capability) => capability.pricing.amount),\n currencies: capabilities.map((capability) => capability.pricing.currency),\n };\n}\n\nfunction assertCapabilities(capabilities: Capability[]): void {\n capabilities.forEach((capability, index) => {\n assertNonEmptyString(capability.name, `capabilities[${index}].name`);\n assertNonEmptyString(capability.description, `capabilities[${index}].description`);\n assertNonEmptyString(capability.version, `capabilities[${index}].version`);\n assertNonEmptyString(capability.pricing.currency, `capabilities[${index}].pricing.currency`);\n assertU64(capability.pricing.amount, `capabilities[${index}].pricing.amount`);\n });\n}\n\nfunction assertEncryptionPublicKey(value: Uint8Array, field: string): void {\n if (value.length !== 0 && value.length !== 32) {\n throw new Error(`${field} must be either empty or 32 bytes.`);\n }\n}\n\nfunction assertObjectId(value: string, field: string): void {\n const trimmed = value.trim();\n const match = OBJECT_ID_PATTERN.exec(trimmed);\n const hex = match?.[1];\n\n if (hex === undefined || hex.length > MAX_OBJECT_ID_HEX_LENGTH || /^0+$/i.test(hex)) {\n throw new Error(`${field} must be a 0x-prefixed hex object id.`);\n }\n}\n\nfunction assertOptionalObjectId(value: string | undefined, field: string): void {\n if (value !== undefined) {\n assertObjectId(value, field);\n }\n}\n\nfunction assertNonEmptyString(value: string, field: string): void {\n if (value.trim().length === 0) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n}\n\nfunction assertOptionalString(value: string | undefined, field: string): void {\n if (value !== undefined) {\n assertNonEmptyString(value, field);\n }\n}\n\nfunction assertHexString(value: string, field: string): void {\n if (!/^[a-f0-9]+$/i.test(value) || value.length % 2 !== 0) {\n throw new Error(`${field} must be an even-length hex string.`);\n }\n}\n\nfunction hexToBytes(value: string): Uint8Array {\n return new Uint8Array(Buffer.from(value, 'hex'));\n}\n\nfunction assertDid(value: string, field: string): void {\n if (!value.startsWith('did:mesh:') || value.trim().length <= 'did:mesh:'.length) {\n throw new Error(`${field} must be a did:mesh identifier.`);\n }\n}\n\nfunction assertSafeNonNegativeInteger(value: number, field: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${field} must be a non-negative safe integer.`);\n }\n}\n\nfunction assertU64(value: bigint | number, field: string): void {\n if (typeof value === 'number') {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${field} must be a non-negative safe integer.`);\n }\n\n value = BigInt(value);\n }\n\n if (value < 0n || value > MAX_U64) {\n throw new Error(`${field} must fit in an unsigned 64-bit integer.`);\n }\n}\n\nfunction assertStakeType(value: string, field: string): void {\n if (value !== 'agent' && value !== 'relay') {\n throw new Error(`${field} must be either \"agent\" or \"relay\".`);\n }\n}\n\nfunction stakeTypeToMoveValue(value: 'agent' | 'relay'): 0 | 1 {\n return value === 'relay' ? 1 : 0;\n}\n","import pino from 'pino';\n\nimport type { AgentCard, Capability, NetworkConfig, ReputationScore } from '@hivemind-os/collective-types';\nimport type { Signer } from '@mysten/sui/cryptography';\n\nimport { parseAgentCardFields } from '../internal/parsing.js';\nimport { parseRawEvent } from '../events/parser.js';\nimport { ReputationScoreCalculator } from '../reputation/score-calculator.js';\nimport { MeshSuiClient } from '../sui/client.js';\nimport { StakingClient } from '../staking/client.js';\nimport {\n buildDeactivateAgentTx,\n buildReactivateAgentTx,\n buildRegisterAgentTx,\n buildSetEncryptionKeyTx,\n buildUpdateAgentTx,\n buildUpdateCapabilitiesTx,\n} from '../sui/tx-helpers.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-core:registry' });\n\nexport class RegistryClient {\n private readonly scoreCalculator = new ReputationScoreCalculator();\n private readonly stakingClient: StakingClient;\n\n constructor(\n private readonly suiClient: MeshSuiClient,\n private readonly config: NetworkConfig,\n ) {\n this.stakingClient = new StakingClient(suiClient, config);\n }\n\n async registerAgent(params: {\n name: string;\n did: string;\n description: string;\n capabilities: Capability[];\n endpoint: string;\n encryptionPublicKey?: Uint8Array;\n keypair: Signer;\n }): Promise<{ txDigest: string; agentCardId: string }> {\n const tx = buildRegisterAgentTx({\n packageId: this.config.packageId,\n registryId: this.config.registryId,\n name: params.name,\n did: params.did,\n description: params.description,\n capabilities: params.capabilities,\n endpoint: params.endpoint,\n });\n\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n const agentCardId = extractObjectId(response.objectChanges, /::registry::AgentCard$/);\n\n if (!agentCardId) {\n logger.warn({ response }, 'Agent registration succeeded without an AgentCard object change.');\n throw new Error('Unable to determine AgentCard object id from transaction response.');\n }\n\n if (params.encryptionPublicKey !== undefined) {\n await this.setEncryptionKey({\n cardId: agentCardId,\n encryptionPublicKey: params.encryptionPublicKey,\n keypair: params.keypair,\n });\n }\n\n return { txDigest: response.digest, agentCardId };\n }\n\n async updateAgent(params: {\n cardId: string;\n name: string;\n description: string;\n endpoint: string;\n encryptionPublicKey?: Uint8Array;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildUpdateAgentTx({\n packageId: this.config.packageId,\n registryId: this.config.registryId,\n cardId: params.cardId,\n name: params.name,\n description: params.description,\n endpoint: params.endpoint,\n });\n\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n if (params.encryptionPublicKey !== undefined) {\n await this.setEncryptionKey({\n cardId: params.cardId,\n encryptionPublicKey: params.encryptionPublicKey,\n keypair: params.keypair,\n });\n }\n return { txDigest: response.digest };\n }\n\n async setEncryptionKey(params: {\n cardId: string;\n encryptionPublicKey: Uint8Array;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildSetEncryptionKeyTx({\n packageId: this.config.packageId,\n cardId: params.cardId,\n encryptionPublicKey: params.encryptionPublicKey,\n });\n\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async updateCapabilities(params: {\n cardId: string;\n capabilities: Capability[];\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildUpdateCapabilitiesTx({\n packageId: this.config.packageId,\n registryId: this.config.registryId,\n cardId: params.cardId,\n capabilities: params.capabilities,\n });\n\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async deactivateAgent(params: {\n cardId: string;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildDeactivateAgentTx({\n packageId: this.config.packageId,\n registryId: this.config.registryId,\n cardId: params.cardId,\n });\n\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async reactivateAgent(params: {\n cardId: string;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildReactivateAgentTx({\n packageId: this.config.packageId,\n registryId: this.config.registryId,\n cardId: params.cardId,\n });\n\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async getAgentCard(cardId: string): Promise<AgentCard | null> {\n try {\n const object = await this.suiClient.getObject<Record<string, unknown>>(cardId);\n return await this.enrichAgentStake(parseAgentCardFields(object, cardId));\n } catch (error) {\n if (isObjectMissingError(error)) {\n return null;\n }\n\n throw error;\n }\n }\n\n async getAgentCardByOwner(owner: string): Promise<AgentCard | null> {\n const page = await this.suiClient.client.getOwnedObjects({\n owner,\n filter: { StructType: `${this.config.packageId}::registry::AgentCard` },\n limit: 20,\n });\n\n const cards = await Promise.all(\n page.data\n .map((entry) => entry.data?.objectId)\n .filter((objectId): objectId is string => typeof objectId === 'string')\n .map(async (objectId) => await this.getAgentCard(objectId)),\n );\n\n return cards\n .filter((card): card is AgentCard => Boolean(card))\n .sort((left, right) => right.updatedAt - left.updatedAt)\n .find((card) => card.active) ?? null;\n }\n\n async findAgentByDid(did: string): Promise<AgentCard | null> {\n const eventType = `${this.config.packageId}::registry::AgentRegistered`;\n let cursor = null;\n\n do {\n const page = await this.suiClient.queryEvents(eventType, cursor, 100);\n for (const event of page.events) {\n const parsed = parseRawEvent(event, this.config.packageId);\n if (parsed?.type !== 'agent.registered' || parsed.agent.did !== did) {\n continue;\n }\n\n return await this.getAgentCard(parsed.agent.id);\n }\n\n cursor = page.nextCursor;\n if (!page.hasMore) {\n break;\n }\n } while (cursor);\n\n return null;\n }\n\n async discoverByCapability(\n capability: string,\n limit = 20,\n options: { sortByReputation?: boolean; scores?: Map<string, ReputationScore> } = {},\n ): Promise<AgentCard[]> {\n const eventType = `${this.config.packageId}::registry::AgentRegistered`;\n const matches: AgentCard[] = [];\n const seen = new Set<string>();\n let cursor = null;\n\n do {\n const page = await this.suiClient.queryEvents(eventType, cursor, Math.max(limit * 2, 20));\n for (const event of page.events) {\n const parsed = parseRawEvent(event, this.config.packageId);\n if (parsed?.type !== 'agent.registered') {\n continue;\n }\n\n const hasMatch = parsed.agent.capabilities.some(\n (entry) => entry.name.toLowerCase() === capability.toLowerCase(),\n );\n if (!hasMatch) {\n continue;\n }\n\n const current = await this.getAgentCard(parsed.agent.id);\n if (current?.active && !seen.has(current.id)) {\n matches.push(current);\n seen.add(current.id);\n }\n\n if (!options.sortByReputation && matches.length >= limit) {\n return matches;\n }\n }\n\n cursor = page.nextCursor;\n if (!page.hasMore) {\n break;\n }\n } while (cursor);\n\n if (!options.sortByReputation) {\n return [...matches].sort(compareStakePreference).slice(0, limit);\n }\n\n const scores = options.scores ?? new Map(matches.map((agent) => [agent.did, this.scoreCalculator.computeScore(agent, [])]));\n return this.scoreCalculator.rankByReputation(matches, scores).slice(0, limit);\n }\n\n private async enrichAgentStake(agent: AgentCard): Promise<AgentCard> {\n try {\n const stake = await this.stakingClient.getStakeByOwner(agent.owner);\n if (!stake) {\n return { ...agent, hasStake: false, stakeMist: undefined, stakeType: undefined };\n }\n\n return {\n ...agent,\n hasStake: Boolean(stake.isActive && stake.meetsMinium),\n stakeMist: stake.balanceMist,\n stakeType: stake.stakeType,\n };\n } catch {\n return { ...agent, hasStake: false, stakeMist: undefined, stakeType: undefined };\n }\n }\n}\n\nfunction extractObjectId(\n objectChanges: Array<Record<string, unknown>> | null | undefined,\n objectTypePattern: RegExp,\n): string | undefined {\n return objectChanges?.find(\n (change) =>\n (change.type === 'created' || change.type === 'transferred' || change.type === 'mutated') &&\n typeof change.objectType === 'string' &&\n objectTypePattern.test(change.objectType) &&\n typeof change.objectId === 'string',\n )?.objectId as string | undefined;\n}\n\nfunction isObjectMissingError(error: unknown): boolean {\n return error instanceof Error && /not found|does not contain move object data/i.test(error.message);\n}\n\nfunction compareStakePreference(left: AgentCard, right: AgentCard): number {\n return (\n compareBoolean(left.hasStake ?? false, right.hasStake ?? false) ||\n compareBigInt(left.stakeMist ?? 0n, right.stakeMist ?? 0n) ||\n compareNumber(left.updatedAt, right.updatedAt)\n );\n}\n\nfunction compareBoolean(left: boolean, right: boolean): number {\n if (left === right) {\n return 0;\n }\n return left ? -1 : 1;\n}\n\nfunction compareBigInt(left: bigint, right: bigint): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}\n\nfunction compareNumber(left: number, right: number): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}","import { BidStatus, PaymentScheme, RelayNodeStatus, TaskStatus, type MeshEvent } from '@hivemind-os/collective-types';\nimport type { SuiEvent } from '@mysten/sui/client';\n\nimport { isRecord, parseAgentCardFields, parseBidFields, parseRelayNodeFields, parseTaskFields } from '../internal/parsing.js';\n\nexport function parseRawEvent(rawEvent: SuiEvent, packageId: string): MeshEvent | null {\n if (!rawEvent.type.startsWith(`${packageId}::`)) {\n return null;\n }\n\n if (!isRecord(rawEvent.parsedJson)) {\n return null;\n }\n\n const payload = rawEvent.parsedJson;\n const timestampMs = Number(rawEvent.timestampMs ?? 0);\n const base = {\n packageId,\n txDigest: rawEvent.id.txDigest,\n timestampMs,\n };\n\n switch (rawEvent.type) {\n case `${packageId}::registry::AgentRegistered`: {\n const agent = parseAgentCardFields(payload);\n return {\n ...base,\n type: 'agent.registered',\n registryId: '',\n agent,\n };\n }\n case `${packageId}::registry::AgentUpdated`: {\n const agent = parseAgentCardFields(payload);\n return {\n ...base,\n type: 'agent.updated',\n agent,\n previousVersion: Math.max(agent.version - 1, 0),\n };\n }\n case `${packageId}::registry::AgentDeactivated`: {\n const agent = parseAgentCardFields(payload);\n return {\n ...base,\n type: 'agent.deactivated',\n agentId: agent.id,\n owner: agent.owner,\n deactivatedAt: timestampMs,\n };\n }\n case `${packageId}::task::TaskPosted`: {\n return {\n ...base,\n type: 'task.posted',\n task: parseTaskFields(payload),\n };\n }\n case `${packageId}::task::TaskAccepted`: {\n return {\n ...base,\n type: 'task.accepted',\n taskId: asString(payload.task_id, payload.taskId),\n requester: asString(payload.requester),\n provider: asString(payload.provider),\n price: asBigInt(payload.price),\n acceptedAt: asNumber(payload.accepted_at, timestampMs),\n status: TaskStatus.ACCEPTED,\n };\n }\n case `${packageId}::task::TaskCompleted`: {\n return {\n ...base,\n type: 'task.completed',\n taskId: asString(payload.task_id, payload.taskId),\n provider: asString(payload.provider),\n resultBlobId: bytesToString(payload.result_blob_id ?? payload.resultBlobId),\n price: asBigInt(payload.price),\n paymentScheme: asOptionalPaymentScheme(payload.payment_scheme ?? payload.paymentScheme),\n meteredUnits: asOptionalNumber(payload.metered_units ?? payload.meteredUnits),\n verificationHash: bytesToHex(payload.verification_hash ?? payload.verificationHash),\n completedAt: asNumber(payload.completed_at, timestampMs),\n status: TaskStatus.COMPLETED,\n };\n }\n case `${packageId}::task::TaskPaymentReleased`: {\n return {\n ...base,\n type: 'task.released',\n taskId: asString(payload.task_id, payload.taskId),\n requester: asString(payload.requester),\n provider: asString(payload.provider),\n price: asBigInt(payload.price),\n refundAmount: asOptionalBigInt(payload.refund_amount ?? payload.refundAmount),\n releasedAt: timestampMs,\n status: TaskStatus.RELEASED,\n };\n }\n case `${packageId}::task::TaskDisputed`: {\n return {\n ...base,\n type: 'task.disputed',\n taskId: asString(payload.task_id, payload.taskId),\n requester: asString(payload.requester),\n provider: asOptionalString(payload.provider),\n disputedAt: asNumber(payload.disputed_at, timestampMs),\n status: TaskStatus.DISPUTED,\n };\n }\n case `${packageId}::task::TaskCancelled`:\n case `${packageId}::task::TaskExpiredRefunded`: {\n return {\n ...base,\n type: 'task.cancelled',\n taskId: asString(payload.task_id, payload.taskId),\n requester: asString(payload.requester),\n cancelledAt: timestampMs,\n status: TaskStatus.CANCELLED,\n };\n }\n case `${packageId}::marketplace::BidPlaced`: {\n return {\n ...base,\n type: 'bid.placed',\n bid: parseBidFields(payload),\n };\n }\n case `${packageId}::marketplace::BidAccepted`: {\n return {\n ...base,\n type: 'bid.accepted',\n bidId: asString(payload.bid_id, payload.bidId),\n taskId: asString(payload.task_id, payload.taskId),\n requester: asString(payload.requester),\n bidder: asString(payload.bidder),\n bidPrice: asBigInt(payload.bid_price ?? payload.bidPrice),\n refundedAmount: asBigInt(payload.refunded_amount ?? payload.refundedAmount),\n acceptedAt: asNumber(payload.accepted_at, timestampMs),\n status: BidStatus.ACCEPTED,\n };\n }\n case `${packageId}::marketplace::BidWithdrawn`: {\n return {\n ...base,\n type: 'bid.withdrawn',\n bidId: asString(payload.bid_id, payload.bidId),\n taskId: asString(payload.task_id, payload.taskId),\n bidder: asString(payload.bidder),\n withdrawnAt: timestampMs,\n status: BidStatus.WITHDRAWN,\n };\n }\n case `${packageId}::marketplace::BidRejected`: {\n return {\n ...base,\n type: 'bid.rejected',\n bidId: asString(payload.bid_id, payload.bidId),\n taskId: asString(payload.task_id, payload.taskId),\n requester: asString(payload.requester),\n bidder: asString(payload.bidder),\n rejectedAt: timestampMs,\n status: BidStatus.REJECTED,\n };\n }\n case `${packageId}::relay_registry::RelayRegistered`: {\n return {\n ...base,\n type: 'relay.registered',\n relay: parseRelayNodeFields(payload),\n };\n }\n case `${packageId}::relay_registry::RelayHeartbeat`: {\n return {\n ...base,\n type: 'relay.heartbeat',\n relayId: asString(payload.relay_id, payload.relayId),\n operator: asString(payload.operator),\n lastHeartbeat: asNumber(payload.last_heartbeat ?? payload.lastHeartbeat, timestampMs),\n };\n }\n case `${packageId}::relay_registry::RelayDeactivated`: {\n return {\n ...base,\n type: 'relay.deactivated',\n relayId: asString(payload.relay_id, payload.relayId),\n operator: asString(payload.operator),\n status: RelayNodeStatus.INACTIVE,\n };\n }\n case `${packageId}::relay_registry::RelaySlashed`: {\n return {\n ...base,\n type: 'relay.slashed',\n relayId: asString(payload.relay_id, payload.relayId),\n operator: asString(payload.operator),\n status: RelayNodeStatus.SLASHED,\n };\n }\n default:\n return null;\n }\n}\n\nfunction asString(...values: unknown[]): string {\n const match = values.find((value) => typeof value === 'string');\n return typeof match === 'string' ? match : '';\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n const normalized = asString(value);\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'string' && value.length > 0) {\n return Number(value);\n }\n\n if (typeof value === 'bigint') {\n return Number(value);\n }\n\n return fallback;\n}\n\nfunction asOptionalNumber(value: unknown): number | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n return asNumber(value);\n}\n\nfunction asBigInt(value: unknown): bigint {\n if (typeof value === 'bigint') {\n return value;\n }\n if (typeof value === 'number') {\n return BigInt(value);\n }\n if (typeof value === 'string' && value.length > 0) {\n return BigInt(value);\n }\n return 0n;\n}\n\nfunction asOptionalBigInt(value: unknown): bigint | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n return asBigInt(value);\n}\n\nfunction asOptionalPaymentScheme(value: unknown): PaymentScheme | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n const parsed = asNumber(value);\n switch (parsed) {\n case 0:\n return PaymentScheme.EXACT;\n case 1:\n return PaymentScheme.UPTO;\n case 2:\n return PaymentScheme.STREAM;\n default:\n return undefined;\n }\n}\n\nfunction bytesToString(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value) && value.every((entry) => typeof entry === 'number')) {\n return new TextDecoder().decode(new Uint8Array(value));\n }\n\n return '';\n}\n\nfunction bytesToHex(value: unknown): string | undefined {\n if (!Array.isArray(value) || !value.every((entry) => typeof entry === 'number')) {\n return undefined;\n }\n return Buffer.from(value).toString('hex');\n}\n","import type { AgentCard, ReputationEvent, ReputationScore } from '@hivemind-os/collective-types';\n\ninterface CapabilityAccumulator {\n successes: number;\n failures: number;\n totalLatency: number;\n latencyCount: number;\n}\n\nexport class ReputationScoreCalculator {\n computeScore(agentCard: AgentCard, events: ReputationEvent[]): ReputationScore {\n const relatedEvents = events.filter((event) => event.subject === agentCard.did);\n const eventSuccesses = relatedEvents.filter((event) => event.outcome === 'success').length;\n const eventFailures = relatedEvents.filter((event) => event.outcome === 'failure' || event.outcome === 'timeout' || event.outcome === 'cancelled').length;\n const eventDisputes = relatedEvents.filter((event) => event.type === 'dispute_opened' || event.outcome === 'disputed').length;\n const completed = Math.max(agentCard.totalTasksCompleted ?? 0, eventSuccesses);\n const failed = Math.max(agentCard.totalTasksFailed ?? 0, eventFailures);\n const disputed = Math.max(agentCard.totalTasksDisputed ?? 0, eventDisputes);\n const totalTasks = completed + failed;\n const successRate = totalTasks === 0 ? 0 : completed / totalTasks;\n const latencyEvents = relatedEvents.filter((event): event is ReputationEvent & { latencyMs: number } => typeof event.latencyMs === 'number');\n const averageLatencyMs = latencyEvents.length === 0\n ? 0\n : Math.round(latencyEvents.reduce((sum, event) => sum + event.latencyMs, 0) / latencyEvents.length);\n const totalEarningsMist = maxBigInt(\n agentCard.totalEarningsMist ?? 0n,\n relatedEvents.reduce((sum, event) => sum + paymentAmountToMist(event), 0n),\n );\n\n const capabilityAccumulators: Record<string, CapabilityAccumulator> = {};\n for (const event of relatedEvents) {\n const current = capabilityAccumulators[event.capability] ?? { successes: 0, failures: 0, totalLatency: 0, latencyCount: 0 };\n if (event.outcome === 'success') {\n current.successes += 1;\n }\n if (event.outcome === 'failure' || event.outcome === 'timeout' || event.outcome === 'cancelled') {\n current.failures += 1;\n }\n if (typeof event.latencyMs === 'number') {\n current.totalLatency += event.latencyMs;\n current.latencyCount += 1;\n }\n capabilityAccumulators[event.capability] = current;\n }\n\n const capabilityScores = Object.fromEntries(\n Object.entries(capabilityAccumulators).map(([capability, value]) => {\n const taskCount = value.successes + value.failures;\n return [\n capability,\n {\n successRate: taskCount === 0 ? 0 : value.successes / taskCount,\n taskCount,\n averageLatencyMs: value.latencyCount === 0 ? 0 : Math.round(value.totalLatency / value.latencyCount),\n },\n ];\n }),\n ) as ReputationScore['capabilityScores'];\n\n return {\n did: agentCard.did,\n successRate,\n totalTasks,\n totalDisputes: disputed,\n averageLatencyMs,\n totalEarningsMist,\n stakeAmount: agentCard.stakeMist ?? 0n,\n registeredAt: agentCard.registeredAt,\n lastActiveAt: Math.max(\n agentCard.updatedAt,\n ...relatedEvents.map((event) => Date.parse(event.timestamp)).filter(Number.isFinite),\n 0,\n ),\n capabilityScores,\n };\n }\n\n rankByReputation(agents: AgentCard[], scores: Map<string, ReputationScore>): AgentCard[] {\n return [...agents].sort((left, right) => compareScores(scores.get(right.did), scores.get(left.did)));\n }\n}\n\nfunction compareScores(left?: ReputationScore, right?: ReputationScore): number {\n if (!left && !right) {\n return 0;\n }\n if (!left) {\n return -1;\n }\n if (!right) {\n return 1;\n }\n return (\n compareNumber(left.successRate, right.successRate) ||\n compareNumber(left.totalTasks, right.totalTasks) ||\n compareNumber(right.totalDisputes, left.totalDisputes) ||\n compareBigInt(left.stakeAmount, right.stakeAmount) ||\n compareBigInt(left.totalEarningsMist, right.totalEarningsMist) ||\n compareNumber(right.registeredAt, left.registeredAt)\n );\n}\n\nfunction paymentAmountToMist(event: ReputationEvent): bigint {\n if (!event.paymentAmount) {\n return 0n;\n }\n if (event.paymentAmount.currency.toUpperCase() !== 'MIST') {\n return 0n;\n }\n try {\n return BigInt(event.paymentAmount.amount);\n } catch {\n return 0n;\n }\n}\n\nfunction compareNumber(left: number, right: number): number {\n if (left === right) {\n return 0;\n }\n return left > right ? 1 : -1;\n}\n\nfunction compareBigInt(left: bigint, right: bigint): number {\n if (left === right) {\n return 0;\n }\n return left > right ? 1 : -1;\n}\n\nfunction maxBigInt(left: bigint, right: bigint): bigint {\n return left > right ? left : right;\n}\n","import type { StakePosition } from '@hivemind-os/collective-types';\nimport type { SuiEvent, SuiTransactionBlockResponse } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nimport { isRecord, normalizeMoveValue, parseStakePositionFields } from '../internal/parsing.js';\nimport { MeshSuiClient } from '../sui/client.js';\nimport {\n buildAddStakeTx,\n buildDepositStakeTx,\n buildSlashExpiredEscrowTx,\n buildSlashNonDeliveryTx,\n buildStartDeactivationTx,\n buildWithdrawStakeTx,\n} from '../sui/tx-helpers.js';\n\nexport interface StakingContractConfig {\n packageId: string;\n}\n\nexport const STAKING_COOLDOWN_MS = 604_800_000;\n\nexport class StakingClient {\n constructor(\n private readonly suiClient: MeshSuiClient,\n private readonly config: StakingContractConfig,\n ) {}\n\n async depositStake(params: {\n amountMist: bigint;\n stakeType: 'agent' | 'relay';\n signer: Ed25519Keypair;\n }): Promise<{ stakeId: string; txDigest: string }> {\n const tx = buildDepositStakeTx({\n packageId: this.config.packageId,\n amountMist: params.amountMist,\n stakeType: params.stakeType,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const stakeId = readStakeId(response, `${this.config.packageId}::staking::StakeDeposited`);\n if (!stakeId) {\n throw new Error('Unable to determine stake id from transaction response.');\n }\n return { stakeId, txDigest: response.digest };\n }\n\n async addStake(params: {\n stakeId: string;\n amountMist: bigint;\n signer: Ed25519Keypair;\n }): Promise<{ txDigest: string }> {\n const tx = buildAddStakeTx({\n packageId: this.config.packageId,\n stakeId: params.stakeId,\n amountMist: params.amountMist,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n return { txDigest: response.digest };\n }\n\n async startDeactivation(params: {\n stakeId: string;\n signer: Ed25519Keypair;\n }): Promise<{ cooldownEndsAt: number; txDigest: string }> {\n const tx = buildStartDeactivationTx({\n packageId: this.config.packageId,\n stakeId: params.stakeId,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const event = findEvent(response.events, `${this.config.packageId}::staking::DeactivationStarted`);\n return {\n cooldownEndsAt: requireEventNumber(event, 'DeactivationStarted', 'cooldown_ends_at', 'cooldownEndsAt'),\n txDigest: response.digest,\n };\n }\n\n async withdrawStake(params: {\n stakeId: string;\n signer: Ed25519Keypair;\n }): Promise<{ amountReturned: bigint; txDigest: string }> {\n const tx = buildWithdrawStakeTx({\n packageId: this.config.packageId,\n stakeId: params.stakeId,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const event = findEvent(response.events, `${this.config.packageId}::staking::StakeWithdrawn`);\n return {\n amountReturned: requireEventBigInt(event, 'StakeWithdrawn', 'amount'),\n txDigest: response.digest,\n };\n }\n\n async slashExpiredEscrow(params: {\n stakeId: string;\n taskId: string;\n signer: Ed25519Keypair;\n }): Promise<{ slashedAmount: bigint; txDigest: string }> {\n const tx = buildSlashExpiredEscrowTx({\n packageId: this.config.packageId,\n stakeId: params.stakeId,\n taskId: params.taskId,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const event = findEvent(response.events, `${this.config.packageId}::staking::StakeSlashed`);\n return {\n slashedAmount: requireEventBigInt(event, 'StakeSlashed', 'amount'),\n txDigest: response.digest,\n };\n }\n\n async slashNonDelivery(params: {\n stakeId: string;\n taskId: string;\n signer: Ed25519Keypair;\n }): Promise<{ slashedAmount: bigint; txDigest: string }> {\n const tx = buildSlashNonDeliveryTx({\n packageId: this.config.packageId,\n stakeId: params.stakeId,\n taskId: params.taskId,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const event = findEvent(response.events, `${this.config.packageId}::staking::StakeSlashed`);\n return {\n slashedAmount: requireEventBigInt(event, 'StakeSlashed', 'amount'),\n txDigest: response.digest,\n };\n }\n\n async getStakePosition(stakeId: string): Promise<StakePosition | null> {\n try {\n const object = await this.suiClient.getObject<Record<string, unknown>>(stakeId);\n return parseStakePositionFields(object, stakeId);\n } catch (error) {\n if (isObjectMissingError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getStakeByOwner(owner: string): Promise<StakePosition | null> {\n const positions = await this.getStakeByOwners([owner]);\n return positions.get(owner) ?? null;\n }\n\n async getStakeByOwners(owners: string[]): Promise<Map<string, StakePosition>> {\n const ownerFilter = new Set(owners.map((owner) => owner.toLowerCase()));\n if (ownerFilter.size === 0) {\n return new Map();\n }\n\n const stakeEventType = `${this.config.packageId}::staking::StakeDeposited`;\n const stakeIdsByOwner = new Map<string, Set<string>>();\n let cursor = null;\n\n do {\n const page = await this.suiClient.queryEvents(stakeEventType, cursor, 100);\n for (const event of page.events) {\n const payload = normalizeEvent(event);\n const eventOwner = asString(readEventField(payload, 'owner')).toLowerCase();\n if (!ownerFilter.has(eventOwner)) {\n continue;\n }\n const stakeId = asString(readEventField(payload, 'stake_id', 'stakeId'));\n if (!stakeId) {\n continue;\n }\n const existing = stakeIdsByOwner.get(eventOwner) ?? new Set<string>();\n existing.add(stakeId);\n stakeIdsByOwner.set(eventOwner, existing);\n }\n cursor = page.nextCursor;\n if (!page.hasMore) {\n break;\n }\n } while (cursor);\n\n const normalizedResults = new Map<string, StakePosition>();\n await Promise.all(\n [...stakeIdsByOwner.entries()].map(async ([normalizedOwner, ids]) => {\n const positions = await Promise.all([...ids].map(async (stakeId) => await this.getStakePosition(stakeId)));\n const best = positions.filter((position): position is StakePosition => Boolean(position)).sort(compareStakePositions)[0];\n if (best) {\n normalizedResults.set(normalizedOwner, best);\n }\n }),\n );\n\n return new Map(\n owners\n .map((owner) => [owner, normalizedResults.get(owner.toLowerCase())] as const)\n .filter((entry): entry is readonly [string, StakePosition] => Boolean(entry[1])),\n );\n }\n}\n\nfunction compareStakePositions(left: StakePosition, right: StakePosition): number {\n return (\n compareBoolean(left.isActive ?? false, right.isActive ?? false) ||\n compareBoolean(left.meetsMinium ?? false, right.meetsMinium ?? false) ||\n compareBigInt(left.balanceMist, right.balanceMist) ||\n compareNumber(left.stakedAt, right.stakedAt)\n );\n}\n\nfunction readStakeId(response: SuiTransactionBlockResponse, eventType: string): string | undefined {\n const event = findEvent(response.events, eventType);\n return asString(readEventField(event, 'stake_id', 'stakeId')) || extractObjectId(response, /::staking::StakePosition$/);\n}\n\nfunction extractObjectId(response: SuiTransactionBlockResponse, objectTypePattern: RegExp): string | undefined {\n const change = (response.objectChanges as Array<Record<string, unknown>> | null | undefined)?.find(\n (entry) =>\n (entry.type === 'created' || entry.type === 'transferred' || entry.type === 'mutated') &&\n typeof entry.objectType === 'string' &&\n objectTypePattern.test(entry.objectType) &&\n typeof entry.objectId === 'string',\n );\n return change?.objectId as string | undefined;\n}\n\nfunction findEvent(events: SuiTransactionBlockResponse['events'], eventType: string): Record<string, unknown> {\n const payload = events\n ?.map((event) => ({ type: event.type, payload: normalizeEvent(event) }))\n .find((event) => event.type === eventType)?.payload;\n return payload ?? {};\n}\n\nfunction normalizeEvent(event: SuiEvent): Record<string, unknown> {\n const normalized = normalizeMoveValue(event.parsedJson);\n return isRecord(normalized) ? normalized : {};\n}\n\nfunction readEventField(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n}\n\nfunction asString(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction asNumber(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.length > 0) {\n return Number(value);\n }\n return 0;\n}\n\nfunction requireEventNumber(record: Record<string, unknown>, eventName: string, ...keys: string[]): number {\n const raw = readEventField(record, ...keys);\n if (raw == null || raw === '') {\n throw new Error(`${eventName} event did not include a valid ${keys[0]}.`);\n }\n const value = asNumber(raw);\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${eventName} event did not include a valid ${keys[0]}.`);\n }\n return value;\n}\n\nfunction asBigInt(value: unknown): bigint {\n if (typeof value === 'bigint') {\n return value;\n }\n if (typeof value === 'number') {\n return BigInt(value);\n }\n if (typeof value === 'string' && value.length > 0) {\n return BigInt(value);\n }\n return 0n;\n}\n\nfunction requireEventBigInt(record: Record<string, unknown>, eventName: string, ...keys: string[]): bigint {\n const raw = readEventField(record, ...keys);\n if (raw == null || raw === '') {\n throw new Error(`${eventName} event did not include ${keys[0]}.`);\n }\n try {\n return asBigInt(raw);\n } catch {\n throw new Error(`${eventName} event did not include a valid ${keys[0]}.`);\n }\n}\n\nfunction compareBoolean(left: boolean, right: boolean): number {\n if (left === right) {\n return 0;\n }\n return left ? -1 : 1;\n}\n\nfunction compareBigInt(left: bigint, right: bigint): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}\n\nfunction compareNumber(left: number, right: number): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}\n\nfunction isObjectMissingError(error: unknown): boolean {\n return error instanceof Error && /not found|does not contain move object data/i.test(error.message);\n}\n","import pino from 'pino';\n\nimport type { NetworkConfig, Task } from '@hivemind-os/collective-types';\nimport type { Signer } from '@mysten/sui/cryptography';\n\nimport { parseTaskFields } from '../internal/parsing.js';\nimport { MeshSuiClient } from '../sui/client.js';\nimport {\n buildAcceptTaskTx,\n buildCancelTaskTx,\n buildClaimPaymentTx,\n buildCompleteMeteredTaskTx,\n buildCompleteTaskTx,\n buildPostMeteredTaskTx,\n buildPostTaskTx,\n buildRefundExpiredTaskTx,\n buildReleaseMeteredPaymentTx,\n buildReleasePaymentTx,\n} from '../sui/tx-helpers.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-core:task' });\n\nexport class TaskClient {\n constructor(\n private readonly suiClient: MeshSuiClient,\n private readonly config: NetworkConfig,\n ) {}\n\n async postTask(params: {\n capability: string;\n category: string;\n inputBlobId: string;\n agreementHash?: string;\n priceMist: bigint;\n disputeWindowMs: number;\n expiryHours: number;\n keypair: Signer;\n }): Promise<{ txDigest: string; taskId: string }> {\n const tx = buildPostTaskTx({\n packageId: this.config.packageId,\n capability: params.capability,\n category: params.category,\n inputBlobId: params.inputBlobId,\n agreementHash: params.agreementHash,\n priceMist: params.priceMist,\n disputeWindowMs: params.disputeWindowMs,\n expiryHours: params.expiryHours,\n });\n\n return await this.submitTaskCreation(tx, params.keypair);\n }\n\n async postMeteredTask(params: {\n capability: string;\n category: string;\n inputBlobId: string;\n agreementHash?: string;\n maxPriceMist: bigint;\n unitPriceMist: bigint;\n disputeWindowMs: number;\n expiryHours: number;\n keypair: Signer;\n }): Promise<{ txDigest: string; taskId: string }> {\n const tx = buildPostMeteredTaskTx({\n packageId: this.config.packageId,\n capability: params.capability,\n category: params.category,\n inputBlobId: params.inputBlobId,\n agreementHash: params.agreementHash,\n maxPriceMist: params.maxPriceMist,\n unitPriceMist: params.unitPriceMist,\n disputeWindowMs: params.disputeWindowMs,\n expiryHours: params.expiryHours,\n });\n\n return await this.submitTaskCreation(tx, params.keypair);\n }\n\n async acceptTask(params: {\n taskId: string;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildAcceptTaskTx({ packageId: this.config.packageId, taskId: params.taskId });\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async completeTask(params: {\n taskId: string;\n resultBlobId: string;\n keypair: Signer;\n providerCardId?: string;\n }): Promise<{ txDigest: string }> {\n const tx = buildCompleteTaskTx({\n packageId: this.config.packageId,\n taskId: params.taskId,\n resultBlobId: params.resultBlobId,\n providerCardId: params.providerCardId,\n });\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async completeMeteredTask(params: {\n taskId: string;\n resultBlobId: string;\n meteredUnits: number;\n verificationHash: string;\n keypair: Signer;\n providerCardId?: string;\n }): Promise<{ txDigest: string }> {\n const tx = buildCompleteMeteredTaskTx({\n packageId: this.config.packageId,\n taskId: params.taskId,\n resultBlobId: params.resultBlobId,\n meteredUnits: params.meteredUnits,\n verificationHash: params.verificationHash,\n providerCardId: params.providerCardId,\n });\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async releasePayment(params: {\n taskId: string;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildReleasePaymentTx({ packageId: this.config.packageId, taskId: params.taskId });\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async releaseMeteredPayment(params: {\n taskId: string;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildReleaseMeteredPaymentTx({ packageId: this.config.packageId, taskId: params.taskId });\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async claimPayment(params: {\n taskId: string;\n keypair: Signer;\n providerCardId?: string;\n }): Promise<{ txDigest: string }> {\n const tx = buildClaimPaymentTx({\n packageId: this.config.packageId,\n taskId: params.taskId,\n providerCardId: params.providerCardId,\n });\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async cancelTask(params: {\n taskId: string;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildCancelTaskTx({ packageId: this.config.packageId, taskId: params.taskId });\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async refundExpiredTask(params: {\n taskId: string;\n keypair: Signer;\n }): Promise<{ txDigest: string }> {\n const tx = buildRefundExpiredTaskTx({ packageId: this.config.packageId, taskId: params.taskId });\n const response = await this.suiClient.executeTransaction(tx, params.keypair);\n return { txDigest: response.digest };\n }\n\n async getTask(taskId: string): Promise<Task | null> {\n try {\n const object = await this.suiClient.getObject<Record<string, unknown>>(taskId);\n return parseTaskFields(object, taskId);\n } catch (error) {\n if (isObjectMissingError(error)) {\n return null;\n }\n\n throw error;\n }\n }\n\n private async submitTaskCreation(tx: ReturnType<typeof buildPostTaskTx>, keypair: Signer): Promise<{ txDigest: string; taskId: string }> {\n const response = await this.suiClient.executeTransaction(tx, keypair);\n const taskId = extractObjectId(response.objectChanges, /::task::Task$/);\n\n if (!taskId) {\n logger.warn({ response }, 'Task posting succeeded without a Task object change.');\n throw new Error('Unable to determine task id from transaction response.');\n }\n\n return { txDigest: response.digest, taskId };\n }\n}\n\nfunction extractObjectId(\n objectChanges: Array<Record<string, unknown>> | null | undefined,\n objectTypePattern: RegExp,\n): string | undefined {\n return objectChanges?.find(\n (change) =>\n (change.type === 'created' || change.type === 'mutated') &&\n typeof change.objectType === 'string' &&\n objectTypePattern.test(change.objectType) &&\n typeof change.objectId === 'string',\n )?.objectId as string | undefined;\n}\n\nfunction isObjectMissingError(error: unknown): boolean {\n return error instanceof Error && /not found|does not contain move object data/i.test(error.message);\n}\n","import pino from 'pino';\n\nimport type { Bid, BidRecommendation, NetworkConfig, Task } from '@hivemind-os/collective-types';\nimport { BidStatus, TaskStatus } from '@hivemind-os/collective-types';\nimport type { SuiEvent, SuiTransactionBlockResponse } from '@mysten/sui/client';\nimport type { Signer } from '@mysten/sui/cryptography';\n\nimport { isRecord, normalizeMoveValue, parseBidFields, parseTaskFields } from '../internal/parsing.js';\nimport { ReputationScoreCalculator } from '../reputation/score-calculator.js';\nimport { RegistryClient } from '../registry/client.js';\nimport { MeshSuiClient } from '../sui/client.js';\nimport { buildAcceptBidTx, buildPlaceBidTx, buildRejectBidTx, buildWithdrawBidTx } from '../sui/tx-helpers.js';\nimport { TaskClient } from '../task/client.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-core:marketplace' });\nconst DEFAULT_REPUTATION_WEIGHT = 1_000_000n;\nconst DEFAULT_PRICE_WEIGHT = 1n;\nconst DEFAULT_BROWSE_LIMIT = 20;\nconst SCORE_SCALE = 1_000_000n;\n\nexport interface BrowseOpenTasksFilters {\n category?: string;\n minPriceMist?: bigint;\n maxPriceMist?: bigint;\n limit?: number;\n}\n\nexport class MarketplaceClient {\n private readonly taskClient: TaskClient;\n private readonly registryClient: RegistryClient;\n private readonly scoreCalculator = new ReputationScoreCalculator();\n\n constructor(\n private readonly suiClient: MeshSuiClient,\n private readonly config: NetworkConfig,\n ) {\n this.taskClient = new TaskClient(suiClient, config);\n this.registryClient = new RegistryClient(suiClient, config);\n }\n\n async postOpenTask(params: {\n capability: string;\n category: string;\n inputBlobId: string;\n agreementHash?: string;\n priceMist: bigint;\n disputeWindowMs: number;\n expiryHours: number;\n signer: Signer;\n }): Promise<{ txDigest: string; taskId: string }> {\n return await this.taskClient.postTask({\n capability: params.capability,\n category: params.category,\n inputBlobId: params.inputBlobId,\n agreementHash: params.agreementHash,\n priceMist: params.priceMist,\n disputeWindowMs: params.disputeWindowMs,\n expiryHours: params.expiryHours,\n keypair: params.signer,\n });\n }\n\n async placeBid(params: {\n taskId: string;\n bidPriceMist: bigint;\n signer: Signer;\n reputationScore?: bigint | number;\n evidenceBlob?: string;\n }): Promise<{ bidId: string; txDigest: string; reputationScore: bigint }> {\n const reputationScore = params.reputationScore == null\n ? await this.deriveReputationScore(params.signer.getPublicKey().toSuiAddress())\n : toNonNegativeBigInt(params.reputationScore, 'params.reputationScore');\n\n const tx = buildPlaceBidTx({\n packageId: this.config.packageId,\n taskId: params.taskId,\n bidPriceMist: params.bidPriceMist,\n reputationScore,\n evidenceBlob: params.evidenceBlob,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const bidId = extractObjectId(response, /::marketplace::Bid$/);\n if (!bidId) {\n logger.warn({ response }, 'Bid placement succeeded without a Bid object change.');\n throw new Error('Unable to determine bid id from transaction response.');\n }\n\n return { bidId, txDigest: response.digest, reputationScore };\n }\n\n async acceptBid(params: {\n taskId: string;\n bidId: string;\n signer: Signer;\n rejectCompeting?: boolean;\n }): Promise<{ txDigest: string; rejectedBidIds: string[] }> {\n const rejectedBidIds = params.rejectCompeting === false\n ? []\n : (await this.getBidsForTask(params.taskId))\n .filter((bid) => bid.id !== params.bidId && bid.status === BidStatus.ACTIVE)\n .map((bid) => bid.id);\n\n const tx = buildAcceptBidTx({\n packageId: this.config.packageId,\n taskId: params.taskId,\n bidId: params.bidId,\n otherBidIds: rejectedBidIds,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n return { txDigest: response.digest, rejectedBidIds };\n }\n\n async withdrawBid(params: { bidId: string; signer: Signer }): Promise<{ txDigest: string }> {\n const tx = buildWithdrawBidTx({ packageId: this.config.packageId, bidId: params.bidId });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n return { txDigest: response.digest };\n }\n\n async rejectBid(params: { taskId: string; bidId: string; signer: Signer }): Promise<{ txDigest: string }> {\n const tx = buildRejectBidTx({ packageId: this.config.packageId, taskId: params.taskId, bidId: params.bidId });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n return { txDigest: response.digest };\n }\n\n async getBid(bidId: string): Promise<Bid | null> {\n try {\n const object = await this.suiClient.getObject<Record<string, unknown>>(bidId);\n return parseBidFields(object, bidId);\n } catch (error) {\n if (isObjectMissingError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getBidsForTask(taskId: string): Promise<Bid[]> {\n const eventType = `${this.config.packageId}::marketplace::BidPlaced`;\n const bidIds = new Set<string>();\n let cursor = null;\n\n do {\n const page = await this.suiClient.queryEvents(eventType, cursor, 100);\n for (const event of page.events) {\n const payload = normalizeEvent(event);\n if (asString(readField(payload, 'task_id', 'taskId')) !== taskId) {\n continue;\n }\n const bidId = asString(readField(payload, 'bid_id', 'bidId'));\n if (bidId) {\n bidIds.add(bidId);\n }\n }\n\n cursor = page.nextCursor;\n if (!page.hasMore) {\n break;\n }\n } while (cursor);\n\n const bids = await Promise.all([...bidIds].map(async (bidId) => await this.getBid(bidId)));\n return bids\n .filter((bid): bid is Bid => Boolean(bid))\n .sort((left, right) => left.createdAt - right.createdAt || compareBigInt(left.bidPrice, right.bidPrice));\n }\n\n async browseOpenTasks(filters: BrowseOpenTasksFilters = {}): Promise<Task[]> {\n const eventType = `${this.config.packageId}::task::TaskPosted`;\n const limit = normalizeLimit(filters.limit, DEFAULT_BROWSE_LIMIT, 'filters.limit');\n const category = normalizeOptionalCategory(filters.category);\n if (filters.minPriceMist != null && filters.maxPriceMist != null && filters.minPriceMist > filters.maxPriceMist) {\n throw new Error('filters.minPriceMist must be less than or equal to filters.maxPriceMist.');\n }\n const taskIds = new Set<string>();\n const tasks: Task[] = [];\n let cursor = null;\n\n do {\n const page = await this.suiClient.queryEvents(eventType, cursor, Math.max(limit * 3, 20));\n for (const event of page.events) {\n const postedTask = parseTaskFields(normalizeEvent(event));\n if (!postedTask.id || taskIds.has(postedTask.id)) {\n continue;\n }\n if (category && postedTask.category.toLowerCase() !== category.toLowerCase()) {\n continue;\n }\n\n const current = await this.taskClient.getTask(postedTask.id);\n if (!current || current.status !== TaskStatus.OPEN || Date.now() >= current.expiresAt) {\n continue;\n }\n if (category && current.category.toLowerCase() !== category.toLowerCase()) {\n continue;\n }\n if (filters.minPriceMist != null && current.price < filters.minPriceMist) {\n continue;\n }\n if (filters.maxPriceMist != null && current.price > filters.maxPriceMist) {\n continue;\n }\n\n taskIds.add(current.id);\n tasks.push(current);\n if (tasks.length >= limit) {\n return tasks.sort((left, right) => right.createdAt - left.createdAt);\n }\n }\n\n cursor = page.nextCursor;\n if (!page.hasMore) {\n break;\n }\n } while (cursor);\n\n return tasks.sort((left, right) => right.createdAt - left.createdAt);\n }\n\n async getRecommendedBid(\n taskId: string,\n options: { reputationWeight?: bigint | number; priceWeight?: bigint | number } = {},\n ): Promise<BidRecommendation | null> {\n const bids = (await this.getBidsForTask(taskId)).filter((bid) => bid.status === BidStatus.ACTIVE);\n if (bids.length === 0) {\n return null;\n }\n\n const reputationWeight = options.reputationWeight == null\n ? DEFAULT_REPUTATION_WEIGHT\n : toNonNegativeBigInt(options.reputationWeight, 'options.reputationWeight');\n const priceWeight = options.priceWeight == null\n ? DEFAULT_PRICE_WEIGHT\n : toNonNegativeBigInt(options.priceWeight, 'options.priceWeight');\n const ranked = bids\n .map((bid) => ({\n bid,\n score: calculateBidSelectionScore(bid.reputationScore, bid.bidPrice, reputationWeight, priceWeight),\n reputationWeight,\n priceWeight,\n }))\n .sort((left, right) => {\n if (left.score !== right.score) {\n return left.score > right.score ? -1 : 1;\n }\n return compareBigInt(left.bid.bidPrice, right.bid.bidPrice) || left.bid.createdAt - right.bid.createdAt;\n });\n\n return ranked[0] ?? null;\n }\n\n private async deriveReputationScore(owner: string): Promise<bigint> {\n const card = await this.registryClient.getAgentCardByOwner(owner);\n if (!card) {\n return 0n;\n }\n\n const score = this.scoreCalculator.computeScore(card, []);\n const stakeBonus = score.stakeAmount / 1_000_000_000n;\n const boundedStakeBonus = stakeBonus > 10_000n ? 10_000n : stakeBonus;\n const reputationScore = Math.max(\n Math.round(score.successRate * 1_000) + (score.totalTasks * 10) - (score.totalDisputes * 25),\n 0,\n );\n return BigInt(reputationScore) + boundedStakeBonus;\n }\n}\n\nfunction calculateBidSelectionScore(\n reputationScore: bigint,\n bidPrice: bigint,\n reputationWeight: bigint,\n priceWeight: bigint,\n): bigint {\n return (reputationScore * reputationWeight * SCORE_SCALE) / ((bidPrice * priceWeight) + 1n);\n}\n\nfunction extractObjectId(response: SuiTransactionBlockResponse, objectTypePattern: RegExp): string | undefined {\n const change = (response.objectChanges as Array<Record<string, unknown>> | null | undefined)?.find(\n (entry) =>\n (entry.type === 'created' || entry.type === 'transferred' || entry.type === 'mutated')\n && typeof entry.objectType === 'string'\n && objectTypePattern.test(entry.objectType)\n && typeof entry.objectId === 'string',\n );\n return change?.objectId as string | undefined;\n}\n\nfunction normalizeEvent(event: SuiEvent): Record<string, unknown> {\n const normalized = normalizeMoveValue(event.parsedJson);\n return isRecord(normalized) ? normalized : {};\n}\n\nfunction readField(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n}\n\nfunction asString(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction compareBigInt(left: bigint, right: bigint): number {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n}\n\nfunction toNonNegativeBigInt(value: bigint | number, field: string): bigint {\n if (typeof value === 'bigint') {\n if (value < 0n) {\n throw new Error(`${field} must be non-negative.`);\n }\n return value;\n }\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${field} must be a non-negative safe integer.`);\n }\n return BigInt(value);\n}\n\nfunction normalizeLimit(value: number | undefined, fallback: number, field: string): number {\n if (value == null) {\n return fallback;\n }\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`${field} must be a positive safe integer.`);\n }\n return value;\n}\n\nfunction normalizeOptionalCategory(value: string | undefined): string | undefined {\n if (value == null) {\n return undefined;\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new Error('filters.category must be a non-empty string when provided.');\n }\n return trimmed;\n}\n\nfunction isObjectMissingError(error: unknown): boolean {\n return error instanceof Error && /not found|does not contain move object data/i.test(error.message);\n}\n","import type { Dispute, NetworkConfig } from '@hivemind-os/collective-types';\nimport type { SuiEvent, SuiTransactionBlockResponse } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nimport { isRecord, normalizeMoveValue, parseDisputeFields } from '../internal/parsing.js';\nimport { MeshSuiClient } from '../sui/client.js';\nimport {\n buildAcceptResolutionTx,\n buildArbitrateDisputeTx,\n buildOpenDisputeTx,\n buildRespondToDisputeTx,\n} from '../sui/tx-helpers.js';\n\nexport class DisputeClient {\n constructor(\n private readonly suiClient: MeshSuiClient,\n private readonly config: Pick<NetworkConfig, 'packageId'>,\n ) {}\n\n async openDispute(params: {\n taskId: string;\n evidenceBlobId: string;\n proposedSplitMist: bigint;\n arbitratorAddress?: string;\n signer: Ed25519Keypair;\n }): Promise<{ disputeId: string; txDigest: string }> {\n const tx = buildOpenDisputeTx({\n packageId: this.config.packageId,\n taskId: params.taskId,\n evidenceBlobId: params.evidenceBlobId,\n proposedSplitMist: params.proposedSplitMist,\n arbitratorAddress: params.arbitratorAddress,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const disputeId =\n extractObjectId(response, /::dispute::Dispute$/)\n ?? asString(readEventField(findEvent(response.events, `${this.config.packageId}::dispute::DisputeOpened`), 'dispute_id', 'disputeId'));\n if (!disputeId) {\n throw new Error('Unable to determine dispute id from transaction response.');\n }\n return { disputeId, txDigest: response.digest };\n }\n\n async respondToDispute(params: {\n disputeId: string;\n evidenceBlobId: string;\n proposedSplitMist: bigint;\n signer: Ed25519Keypair;\n }): Promise<{ txDigest: string }> {\n const tx = buildRespondToDisputeTx({\n packageId: this.config.packageId,\n disputeId: params.disputeId,\n evidenceBlobId: params.evidenceBlobId,\n proposedSplitMist: params.proposedSplitMist,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n return { txDigest: response.digest };\n }\n\n async acceptResolution(params: {\n disputeId: string;\n taskId: string;\n signer: Ed25519Keypair;\n }): Promise<{ requesterAmount: bigint; providerAmount: bigint; txDigest: string }> {\n const tx = buildAcceptResolutionTx({\n packageId: this.config.packageId,\n disputeId: params.disputeId,\n taskId: params.taskId,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const event = findEvent(response.events, `${this.config.packageId}::dispute::DisputeMutuallyResolved`);\n return {\n requesterAmount: requireEventBigInt(event, 'DisputeMutuallyResolved', 'requester_amount', 'requesterAmount'),\n providerAmount: requireEventBigInt(event, 'DisputeMutuallyResolved', 'provider_amount', 'providerAmount'),\n txDigest: response.digest,\n };\n }\n\n async arbitrate(params: {\n disputeId: string;\n taskId: string;\n rulingSplitMist: bigint;\n signer: Ed25519Keypair;\n }): Promise<{ txDigest: string }> {\n const tx = buildArbitrateDisputeTx({\n packageId: this.config.packageId,\n disputeId: params.disputeId,\n taskId: params.taskId,\n rulingSplitMist: params.rulingSplitMist,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n return { txDigest: response.digest };\n }\n\n async getDispute(disputeId: string): Promise<Dispute | null> {\n try {\n const object = await this.suiClient.getObject<Record<string, unknown>>(disputeId);\n return parseDisputeFields(object, disputeId);\n } catch (error) {\n if (isObjectMissingError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getDisputeByTask(taskId: string): Promise<Dispute | null> {\n const eventType = `${this.config.packageId}::dispute::DisputeOpened`;\n let cursor = null;\n\n do {\n const page = await this.suiClient.queryEvents(eventType, cursor, 100);\n const matchedEvent = page.events.find((event) => asString(readEventField(normalizeEvent(event), 'task_id', 'taskId')) === taskId);\n if (matchedEvent) {\n const disputeId = asString(readEventField(normalizeEvent(matchedEvent), 'dispute_id', 'disputeId'));\n return disputeId ? await this.getDispute(disputeId) : null;\n }\n cursor = page.nextCursor;\n if (!page.hasMore) {\n break;\n }\n } while (cursor);\n\n return null;\n }\n}\n\nfunction extractObjectId(response: SuiTransactionBlockResponse, objectTypePattern: RegExp): string | undefined {\n const change = (response.objectChanges as Array<Record<string, unknown>> | null | undefined)?.find(\n (entry) =>\n (entry.type === 'created' || entry.type === 'transferred' || entry.type === 'mutated')\n && typeof entry.objectType === 'string'\n && objectTypePattern.test(entry.objectType)\n && typeof entry.objectId === 'string',\n );\n return change?.objectId as string | undefined;\n}\n\nfunction findEvent(events: SuiTransactionBlockResponse['events'], eventType: string): Record<string, unknown> {\n const payload = events\n ?.map((event) => ({ type: event.type, payload: normalizeEvent(event) }))\n .find((event) => event.type === eventType)?.payload;\n return payload ?? {};\n}\n\nfunction normalizeEvent(event: SuiEvent): Record<string, unknown> {\n const normalized = normalizeMoveValue(event.parsedJson);\n return isRecord(normalized) ? normalized : {};\n}\n\nfunction readEventField(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n}\n\nfunction asString(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction asBigInt(value: unknown): bigint {\n if (typeof value === 'bigint') {\n return value;\n }\n if (typeof value === 'number') {\n return BigInt(value);\n }\n if (typeof value === 'string' && value.length > 0) {\n return BigInt(value);\n }\n return 0n;\n}\n\nfunction requireEventBigInt(record: Record<string, unknown>, eventName: string, ...keys: string[]): bigint {\n const raw = readEventField(record, ...keys);\n if (raw == null || raw === '') {\n throw new Error(`${eventName} event did not include ${keys[0]}.`);\n }\n try {\n return asBigInt(raw);\n } catch {\n throw new Error(`${eventName} event did not include a valid ${keys[0]}.`);\n }\n}\n\nfunction isObjectMissingError(error: unknown): boolean {\n return error instanceof Error && /not found|does not contain move object data/i.test(error.message);\n}\n","import Database from 'better-sqlite3';\nimport pino from 'pino';\n\nimport type { EventId as EventID, SuiEvent } from '@mysten/sui/client';\n\nimport { MeshSuiClient } from '../sui/client.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-core:events' });\n\nexport interface CursorStore {\n getCursor(eventType: string): Promise<EventID | null>;\n setCursor(eventType: string, cursor: EventID): Promise<void>;\n}\n\nexport class EventSubscription {\n private running = false;\n private timer?: NodeJS.Timeout;\n private cursor: EventID | null = null;\n private polling = false;\n\n constructor(\n private readonly params: {\n suiClient: MeshSuiClient;\n eventType: string;\n pollIntervalMs?: number;\n onEvent: (event: SuiEvent) => Promise<void>;\n onError?: (error: unknown) => void;\n cursorStore: CursorStore;\n },\n ) {}\n\n start(): void {\n if (this.running) {\n return;\n }\n\n this.running = true;\n void this.poll();\n }\n\n stop(): void {\n this.running = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n private async poll(): Promise<void> {\n if (!this.running || this.polling) {\n return;\n }\n\n this.polling = true;\n let nextDelay = this.params.pollIntervalMs ?? 5_000;\n\n try {\n if (!this.cursor) {\n this.cursor = await this.params.cursorStore.getCursor(this.params.eventType);\n }\n\n const page = await this.params.suiClient.queryEvents(\n this.params.eventType,\n this.cursor,\n 100,\n );\n\n for (const event of page.events) {\n await this.params.onEvent(event);\n this.cursor = event.id;\n await this.params.cursorStore.setCursor(this.params.eventType, event.id);\n }\n\n if (page.hasMore) {\n nextDelay = 0;\n }\n } catch (error) {\n logger.error({ err: error, eventType: this.params.eventType }, 'Event polling failed.');\n this.params.onError?.(error);\n } finally {\n this.polling = false;\n if (this.running) {\n this.timer = setTimeout(() => {\n void this.poll();\n }, nextDelay);\n }\n }\n }\n}\n\nexport class SqliteCursorStore implements CursorStore {\n private readonly db: Database.Database;\n\n constructor(dbPath: string) {\n this.db = new Database(dbPath);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS event_cursors (\n event_type TEXT PRIMARY KEY,\n cursor_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n );\n `);\n }\n\n async getCursor(eventType: string): Promise<EventID | null> {\n const row = this.db\n .prepare('SELECT cursor_json FROM event_cursors WHERE event_type = ?')\n .get(eventType) as { cursor_json: string } | undefined;\n\n return row ? (JSON.parse(row.cursor_json) as EventID) : null;\n }\n\n async setCursor(eventType: string, cursor: EventID): Promise<void> {\n this.db\n .prepare(\n `INSERT INTO event_cursors (event_type, cursor_json, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(event_type)\n DO UPDATE SET cursor_json = excluded.cursor_json, updated_at = excluded.updated_at`,\n )\n .run(eventType, JSON.stringify(cursor), Date.now());\n }\n\n close(): void {\n this.db.close();\n }\n}\n","import Database from 'better-sqlite3';\n\nimport type { AgentCard, Capability, ReputationScore } from '@hivemind-os/collective-types';\n\nimport { ReputationScoreCalculator } from '../reputation/score-calculator.js';\n\nexport interface AdvancedAgentQueryFilters {\n capability?: string;\n minReputation?: number;\n category?: string;\n search?: string;\n limit?: number;\n offset?: number;\n sortBy?: 'stake' | 'reputation';\n}\n\nexport type AdvancedAgentQueryDelegate = (filters: AdvancedAgentQueryFilters) => Promise<AgentCard[]>;\n\ninterface AgentRow {\n rowid: number;\n id: string;\n owner: string;\n did: string;\n name: string;\n description: string | null;\n capabilities_json: string | null;\n capabilities_text: string | null;\n endpoint: string | null;\n encryption_public_key: string | null;\n active: number | bigint;\n version: number | bigint;\n registered_at: number | bigint | null;\n updated_at: number | bigint | null;\n total_tasks_completed: number | bigint | null;\n total_tasks_failed: number | bigint | null;\n total_tasks_disputed: number | bigint | null;\n total_earnings_mist: number | bigint | string | null;\n has_stake: number | bigint | null;\n stake_mist: number | bigint | string | null;\n stake_type: string | null;\n}\n\nexport class AgentCache {\n private readonly db: Database.Database;\n private readonly scoreCalculator = new ReputationScoreCalculator();\n private readonly queryDelegate?: AdvancedAgentQueryDelegate;\n\n constructor(dbPath: string, options: { queryDelegate?: AdvancedAgentQueryDelegate } = {}) {\n this.queryDelegate = options.queryDelegate;\n this.db = new Database(dbPath);\n this.db.defaultSafeIntegers(true);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n owner TEXT NOT NULL,\n did TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n capabilities_json TEXT,\n capabilities_text TEXT,\n endpoint TEXT,\n encryption_public_key TEXT,\n active INTEGER DEFAULT 1,\n version INTEGER DEFAULT 1,\n registered_at INTEGER,\n updated_at INTEGER,\n total_tasks_completed INTEGER,\n total_tasks_failed INTEGER,\n total_tasks_disputed INTEGER,\n total_earnings_mist TEXT,\n has_stake INTEGER,\n stake_mist TEXT,\n stake_type TEXT\n );\n CREATE VIRTUAL TABLE IF NOT EXISTS agents_fts USING fts5(\n agent_id UNINDEXED, name, description, capabilities_text\n );\n `);\n ensureAgentsColumn(this.db, 'encryption_public_key', 'TEXT');\n ensureAgentsColumn(this.db, 'total_tasks_completed', 'INTEGER');\n ensureAgentsColumn(this.db, 'total_tasks_failed', 'INTEGER');\n ensureAgentsColumn(this.db, 'total_tasks_disputed', 'INTEGER');\n ensureAgentsColumn(this.db, 'total_earnings_mist', 'TEXT');\n ensureAgentsColumn(this.db, 'has_stake', 'INTEGER');\n ensureAgentsColumn(this.db, 'stake_mist', 'TEXT');\n ensureAgentsColumn(this.db, 'stake_type', 'TEXT');\n }\n\n upsertAgent(agent: AgentCard): void {\n const capabilitiesJson = JSON.stringify(agent.capabilities, bigintReplacer);\n const capabilitiesText = agent.capabilities\n .map((entry) => `${entry.name} ${entry.description} ${entry.version}`)\n .join(' ');\n this.db\n .prepare(\n `INSERT INTO agents (\n id, owner, did, name, description, capabilities_json, capabilities_text, endpoint,\n encryption_public_key, active, version, registered_at, updated_at,\n total_tasks_completed, total_tasks_failed, total_tasks_disputed, total_earnings_mist,\n has_stake, stake_mist, stake_type\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n owner = excluded.owner,\n did = excluded.did,\n name = excluded.name,\n description = excluded.description,\n capabilities_json = excluded.capabilities_json,\n capabilities_text = excluded.capabilities_text,\n endpoint = excluded.endpoint,\n encryption_public_key = excluded.encryption_public_key,\n active = excluded.active,\n version = excluded.version,\n registered_at = excluded.registered_at,\n updated_at = excluded.updated_at,\n total_tasks_completed = excluded.total_tasks_completed,\n total_tasks_failed = excluded.total_tasks_failed,\n total_tasks_disputed = excluded.total_tasks_disputed,\n total_earnings_mist = excluded.total_earnings_mist,\n has_stake = excluded.has_stake,\n stake_mist = excluded.stake_mist,\n stake_type = excluded.stake_type`,\n )\n .run(\n agent.id,\n agent.owner,\n agent.did,\n agent.name,\n agent.description,\n capabilitiesJson,\n capabilitiesText,\n agent.endpoint ?? null,\n agent.encryptionPublicKey ?? null,\n agent.active ? 1 : 0,\n agent.version,\n agent.registeredAt,\n agent.updatedAt,\n agent.totalTasksCompleted ?? null,\n agent.totalTasksFailed ?? null,\n agent.totalTasksDisputed ?? null,\n agent.totalEarningsMist?.toString() ?? null,\n agent.hasStake == null ? null : agent.hasStake ? 1 : 0,\n agent.stakeMist?.toString() ?? null,\n agent.stakeType ?? null,\n );\n\n this.db.prepare('DELETE FROM agents_fts WHERE agent_id = ?').run(agent.id);\n this.db\n .prepare(\n 'INSERT INTO agents_fts (agent_id, name, description, capabilities_text) VALUES (?, ?, ?, ?)',\n )\n .run(agent.id, agent.name, agent.description, capabilitiesText);\n }\n\n removeAgent(agentId: string): void {\n this.db.prepare('DELETE FROM agents_fts WHERE agent_id = ?').run(agentId);\n this.db.prepare('DELETE FROM agents WHERE id = ?').run(agentId);\n }\n\n getAgent(agentId: string): AgentCard | null {\n const row = this.db.prepare('SELECT rowid, * FROM agents WHERE id = ?').get(agentId) as\n | AgentRow\n | undefined;\n return row ? mapAgentRow(row) : null;\n }\n\n getAgentByDID(did: string): AgentCard | null {\n const row = this.db.prepare('SELECT rowid, * FROM agents WHERE did = ?').get(did) as\n | AgentRow\n | undefined;\n return row ? mapAgentRow(row) : null;\n }\n\n searchByCapability(\n query: string,\n limit = 20,\n options: { sortByReputation?: boolean; scores?: Map<string, ReputationScore> } = {},\n ): AgentCard[] {\n const ftsQuery = buildFtsQuery(query);\n if (!ftsQuery) {\n return [];\n }\n\n try {\n const rows = this.db\n .prepare(\n `SELECT a.rowid, a.*\n FROM agents_fts\n JOIN agents a ON a.id = agents_fts.agent_id\n WHERE agents_fts MATCH ? AND a.active = 1\n LIMIT ?`,\n )\n .all(ftsQuery, limit) as AgentRow[];\n return rankAgents(rows.map(mapAgentRow), options, this.scoreCalculator).slice(0, limit);\n } catch {\n const like = `%${query}%`;\n const rows = this.db\n .prepare(\n `SELECT rowid, * FROM agents\n WHERE active = 1\n AND (name LIKE ? OR description LIKE ? OR capabilities_json LIKE ? OR capabilities_text LIKE ?)\n LIMIT ?`,\n )\n .all(like, like, like, like, limit) as AgentRow[];\n return rankAgents(rows.map(mapAgentRow), options, this.scoreCalculator).slice(0, limit);\n }\n }\n\n getAllActive(limit = 100): AgentCard[] {\n const rows = this.db\n .prepare('SELECT rowid, * FROM agents WHERE active = 1 ORDER BY updated_at DESC LIMIT ?')\n .all(limit) as AgentRow[];\n return rows.map(mapAgentRow);\n }\n\n async queryAgentsAdvanced(filters: AdvancedAgentQueryFilters = {}): Promise<AgentCard[]> {\n if (this.queryDelegate) {\n try {\n return await this.queryDelegate(filters);\n } catch {\n // Fall through to the local cache query.\n }\n }\n\n const limit = normalizeLimit(filters.limit, 20);\n const offset = normalizeOffset(filters.offset);\n const search = filters.search?.trim();\n const capability = filters.capability?.trim();\n\n let agents = search || capability\n ? this.searchByCapability(search ?? capability ?? '', Math.max(limit + offset, limit), {\n sortByReputation: filters.sortBy === 'reputation',\n })\n : this.getAllActive(Math.max(limit + offset, 100));\n\n if (capability) {\n agents = agents.filter((agent) => agent.capabilities.some((entry) => equalsIgnoreCase(entry.name, capability)));\n }\n if (search) {\n const searchLower = search.toLowerCase();\n agents = agents.filter((agent) => matchesSearch(agent, searchLower));\n }\n if (filters.category) {\n const categoryLower = filters.category.toLowerCase();\n agents = agents.filter((agent) =>\n agent.capabilities.some(\n (entry) =>\n entry.name.toLowerCase().includes(categoryLower) ||\n entry.description.toLowerCase().includes(categoryLower),\n ) || agent.description.toLowerCase().includes(categoryLower),\n );\n }\n\n const scores = new Map(agents.map((agent) => [agent.did, this.scoreCalculator.computeScore(agent, [])]));\n const minReputation = typeof filters.minReputation === 'number' ? filters.minReputation : undefined;\n if (minReputation !== undefined) {\n agents = agents.filter((agent) => (scores.get(agent.did)?.successRate ?? 0) >= minReputation);\n }\n\n const ranked = rankAgents(\n agents,\n { sortByReputation: filters.sortBy === 'reputation', scores },\n this.scoreCalculator,\n );\n return ranked.slice(offset, offset + limit);\n }\n\n close(): void {\n this.db.close();\n }\n}\n\nfunction mapAgentRow(row: AgentRow): AgentCard {\n return {\n id: row.id,\n owner: row.owner,\n did: row.did as AgentCard['did'],\n name: row.name,\n description: row.description ?? '',\n capabilities: parseCapabilities(row.capabilities_json),\n endpoint: row.endpoint ?? undefined,\n encryptionPublicKey: row.encryption_public_key ?? undefined,\n active: Number(row.active) === 1,\n version: Number(row.version),\n registeredAt: Number(row.registered_at ?? 0),\n updatedAt: Number(row.updated_at ?? 0),\n totalTasksCompleted: row.total_tasks_completed == null ? undefined : Number(row.total_tasks_completed),\n totalTasksFailed: row.total_tasks_failed == null ? undefined : Number(row.total_tasks_failed),\n totalTasksDisputed: row.total_tasks_disputed == null ? undefined : Number(row.total_tasks_disputed),\n totalEarningsMist: row.total_earnings_mist == null ? undefined : BigInt(row.total_earnings_mist),\n hasStake: row.has_stake == null ? undefined : Number(row.has_stake) === 1,\n stakeMist: row.stake_mist == null ? undefined : BigInt(row.stake_mist),\n stakeType: row.stake_type === 'agent' || row.stake_type === 'relay' ? row.stake_type : undefined,\n };\n}\n\nfunction parseCapabilities(value: string | null): Capability[] {\n if (!value) {\n return [];\n }\n\n const parsed = JSON.parse(value) as Array<Capability & { pricing: Capability['pricing'] & { amount: string } }>;\n return parsed.map((entry) => ({\n ...entry,\n pricing: {\n ...entry.pricing,\n amount: BigInt(entry.pricing.amount),\n },\n }));\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n return typeof value === 'bigint' ? value.toString() : value;\n}\n\nfunction ensureAgentsColumn(db: Database.Database, column: string, type: string): void {\n const columns = db.prepare('PRAGMA table_info(agents)').all() as Array<{ name: string }>;\n if (!columns.some((entry) => entry.name === column)) {\n db.exec(`ALTER TABLE agents ADD COLUMN ${column} ${type}`);\n }\n}\n\nfunction matchesSearch(agent: AgentCard, searchLower: string): boolean {\n return (\n agent.name.toLowerCase().includes(searchLower) ||\n agent.description.toLowerCase().includes(searchLower) ||\n agent.capabilities.some(\n (entry) =>\n entry.name.toLowerCase().includes(searchLower) ||\n entry.description.toLowerCase().includes(searchLower) ||\n entry.version.toLowerCase().includes(searchLower),\n )\n );\n}\n\nfunction equalsIgnoreCase(left: string, right: string): boolean {\n return left.toLowerCase() === right.toLowerCase();\n}\n\nfunction normalizeLimit(limit: number | undefined, fallback: number): number {\n if (typeof limit !== 'number' || Number.isNaN(limit)) {\n return fallback;\n }\n return Math.max(1, Math.floor(limit));\n}\n\nfunction normalizeOffset(offset: number | undefined): number {\n if (typeof offset !== 'number' || Number.isNaN(offset)) {\n return 0;\n }\n return Math.max(0, Math.floor(offset));\n}\n\nfunction buildFtsQuery(query: string): string {\n const terms = query\n .trim()\n .split(/\\s+/)\n .map((term) => term.replace(/[^\\p{L}\\p{N}_-]/gu, ''))\n .filter(Boolean);\n\n return terms.map((term) => `\"${term}\"*`).join(' OR ');\n}\n\nfunction rankAgents(\n agents: AgentCard[],\n options: { sortByReputation?: boolean; scores?: Map<string, ReputationScore> },\n calculator: ReputationScoreCalculator,\n): AgentCard[] {\n if (!options.sortByReputation) {\n return [...agents].sort(compareStakePreference);\n }\n\n const scores = options.scores ?? new Map(agents.map((agent) => [agent.did, calculator.computeScore(agent, [])]));\n return calculator.rankByReputation(agents, scores);\n}\n\nfunction compareStakePreference(left: AgentCard, right: AgentCard): number {\n return (\n compareBoolean(left.hasStake ?? false, right.hasStake ?? false) ||\n compareBigInt(left.stakeMist ?? 0n, right.stakeMist ?? 0n) ||\n compareNumber(left.updatedAt, right.updatedAt)\n );\n}\n\nfunction compareBoolean(left: boolean, right: boolean): number {\n if (left === right) {\n return 0;\n }\n return left ? -1 : 1;\n}\n\nfunction compareBigInt(left: bigint, right: bigint): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}\n\nfunction compareNumber(left: number, right: number): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}","export interface ContentAddressedBlob {\n blobId: string;\n contentHash: string;\n size: number;\n storedAt: number;\n}\n\nexport interface StoredBlob extends ContentAddressedBlob {\n hash: string;\n checksum: string;\n}\n\nexport type BlobMetadata = ContentAddressedBlob;\n\nexport class BlobIntegrityError extends Error {\n constructor(\n message: string,\n readonly blobId: string,\n readonly expectedHash: string,\n readonly actualHash: string,\n ) {\n super(message);\n this.name = 'BlobIntegrityError';\n }\n}\n\nexport interface BlobStore {\n store(data: Uint8Array): Promise<StoredBlob>;\n fetch(blobId: string): Promise<Uint8Array | null>;\n exists(blobId: string): Promise<boolean>;\n delete(blobId: string): Promise<void>;\n getMetadata?(blobId: string): Promise<BlobMetadata | null>;\n}\n","import { createHash } from 'node:crypto';\nimport { access, mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { BlobIntegrityError, type BlobMetadata, type BlobStore, type StoredBlob } from './interface.js';\n\nexport class FilesystemBlobStore implements BlobStore {\n constructor(private readonly baseDir: string) {}\n\n async store(data: Uint8Array): Promise<StoredBlob> {\n await mkdir(this.baseDir, { recursive: true });\n const checksum = computeChecksum(data);\n const blobPath = join(this.baseDir, checksum);\n const storedAt = Date.now();\n\n try {\n await writeFile(blobPath, data, { flag: 'wx' });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw error;\n }\n }\n\n return {\n blobId: checksum,\n hash: checksum,\n checksum,\n contentHash: checksum,\n size: data.byteLength,\n storedAt,\n };\n }\n\n async fetch(blobId: string): Promise<Uint8Array | null> {\n try {\n const data = new Uint8Array(await readFile(join(this.baseDir, blobId)));\n const actualHash = computeChecksum(data);\n if (actualHash !== blobId) {\n throw new BlobIntegrityError(\n `Filesystem blob ${blobId} failed SHA-256 verification.`,\n blobId,\n blobId,\n actualHash,\n );\n }\n\n return data;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n\n throw error;\n }\n }\n\n async exists(blobId: string): Promise<boolean> {\n try {\n await access(join(this.baseDir, blobId));\n return true;\n } catch {\n return false;\n }\n }\n\n async getMetadata(blobId: string): Promise<BlobMetadata | null> {\n try {\n const blobStat = await stat(join(this.baseDir, blobId));\n return {\n blobId,\n contentHash: blobId,\n size: blobStat.size,\n storedAt: Math.round(blobStat.birthtimeMs || blobStat.mtimeMs),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n\n throw error;\n }\n }\n\n async delete(blobId: string): Promise<void> {\n await rm(join(this.baseDir, blobId), { force: true });\n }\n}\n\nfunction computeChecksum(data: Uint8Array): string {\n return createHash('sha256').update(data).digest('hex');\n}\n","import pino from 'pino';\n\nimport type { BlobMetadata, BlobStore, StoredBlob } from './interface.js';\nimport { FilesystemBlobStore } from './fs-store.js';\nimport { parseWalrusBlobReference, type WalrusBlobStore } from './walrus-store.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-core:blobstore:hybrid' });\n\nexport interface HybridBlobStoreOptions {\n preferWalrus?: boolean;\n cacheLocally?: boolean;\n}\n\nexport class HybridBlobStore implements BlobStore {\n constructor(\n private readonly walrus: WalrusBlobStore,\n private readonly local: FilesystemBlobStore,\n private readonly options: HybridBlobStoreOptions = {},\n ) {}\n\n async store(data: Uint8Array): Promise<StoredBlob> {\n if (this.preferWalrus) {\n try {\n const stored = await this.walrus.store(data);\n if (this.cacheLocally) {\n await this.local.store(data);\n }\n return stored;\n } catch (error) {\n logger.warn({ err: error, size: data.byteLength }, 'Walrus store failed, falling back to filesystem');\n return await this.local.store(data);\n }\n }\n\n try {\n return await this.local.store(data);\n } catch (error) {\n logger.warn({ err: error, size: data.byteLength }, 'Filesystem store failed, falling back to Walrus');\n const stored = await this.walrus.store(data);\n if (this.cacheLocally) {\n await this.local.store(data);\n }\n return stored;\n }\n }\n\n async fetch(blobId: string): Promise<Uint8Array | null> {\n for (const localBlobId of getLocalBlobCandidates(blobId)) {\n const cached = await this.local.fetch(localBlobId);\n if (cached) {\n return cached;\n }\n }\n\n if (!isWalrusBlobId(blobId)) {\n return null;\n }\n\n const remote = await this.walrus.fetch(blobId);\n if (remote && this.cacheLocally) {\n await this.local.store(remote);\n }\n\n return remote;\n }\n\n async exists(blobId: string): Promise<boolean> {\n for (const localBlobId of getLocalBlobCandidates(blobId)) {\n if (await this.local.exists(localBlobId)) {\n return true;\n }\n }\n\n return isWalrusBlobId(blobId) ? await this.walrus.exists(blobId) : false;\n }\n\n async getMetadata(blobId: string): Promise<BlobMetadata | null> {\n if (isWalrusBlobId(blobId)) {\n const walrusMetadata = await this.walrus.getMetadata(blobId);\n if (walrusMetadata) {\n return walrusMetadata;\n }\n }\n\n for (const localBlobId of getLocalBlobCandidates(blobId)) {\n const localMetadata = await this.local.getMetadata(localBlobId);\n if (localMetadata) {\n return localMetadata;\n }\n }\n\n return null;\n }\n\n async delete(blobId: string): Promise<void> {\n const localBlobIds = getLocalBlobCandidates(blobId);\n await Promise.all(localBlobIds.map(async (localBlobId) => {\n if (await this.local.exists(localBlobId)) {\n await this.local.delete(localBlobId);\n }\n }));\n\n const walrusLikeBlobId = isWalrusBlobId(blobId);\n if (walrusLikeBlobId) {\n await this.walrus.delete(blobId);\n }\n }\n\n private get preferWalrus(): boolean {\n return this.options.preferWalrus ?? true;\n }\n\n private get cacheLocally(): boolean {\n return this.options.cacheLocally ?? true;\n }\n}\n\nfunction getLocalBlobCandidates(blobId: string): string[] {\n const candidates = new Set<string>();\n\n if (/^[a-f0-9]{64}$/.test(blobId)) {\n candidates.add(blobId);\n }\n\n try {\n const reference = parseWalrusBlobReference(blobId);\n if (reference.contentHash) {\n candidates.add(reference.contentHash);\n }\n } catch {\n // Non-Walrus blob ids are handled by the direct hash case above.\n }\n\n return [...candidates];\n}\n\nfunction isWalrusBlobId(blobId: string): boolean {\n try {\n parseWalrusBlobReference(blobId);\n return true;\n } catch {\n return false;\n }\n}\n","import { createHash } from 'node:crypto';\nimport { performance } from 'node:perf_hooks';\n\nimport pino from 'pino';\n\nimport { BlobIntegrityError, type BlobMetadata, type BlobStore, type StoredBlob } from './interface.js';\n\nexport const DEFAULT_WALRUS_PUBLISHER_URL = 'https://publisher.walrus-testnet.walrus.space';\nexport const DEFAULT_WALRUS_AGGREGATOR_URL = 'https://aggregator.walrus-testnet.walrus.space';\nexport const DEFAULT_WALRUS_EPOCHS = 5;\nexport const DEFAULT_WALRUS_MAX_BLOB_SIZE = 10 * 1024 * 1024;\nexport const DEFAULT_WALRUS_RETRY_ATTEMPTS = 3;\nexport const DEFAULT_WALRUS_RETRY_DELAY_MS = 1_000;\nexport const DEFAULT_WALRUS_TIMEOUT_MS = 30_000;\n\nconst WALRUS_STORAGE_ID_PATTERN = /^[A-Za-z0-9_-]{43}$/;\nconst WALRUS_REFERENCE_PATTERN = /^walrus:([A-Za-z0-9_-]{43}):([a-f0-9]{64})$/;\nconst WALRUS_STORAGE_ID_BYTES = 32;\nconst logger = pino({ name: '@hivemind-os/collective-core:blobstore:walrus' });\n\nexport interface WalrusLogger {\n debug(bindings: Record<string, unknown>, message?: string): void;\n info(bindings: Record<string, unknown>, message?: string): void;\n warn(bindings: Record<string, unknown>, message?: string): void;\n error(bindings: Record<string, unknown>, message?: string): void;\n}\n\nexport interface WalrusBlobStoreConfig {\n publisherUrl: string;\n aggregatorUrl: string;\n epochs?: number;\n maxBlobSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n timeoutMs?: number;\n fetchImpl?: typeof fetch;\n logger?: WalrusLogger;\n}\n\nexport interface WalrusBlobMetadata extends BlobMetadata {\n storageBlobId: string;\n objectId?: string;\n deletable?: boolean;\n endEpoch?: number;\n}\n\nexport interface WalrusBlobReference {\n blobId: string;\n storageBlobId: string;\n contentHash?: string;\n}\n\ninterface WalrusBlobObject {\n id: string;\n blobId: string;\n size: number;\n deletable: boolean;\n storage?: {\n endEpoch?: number;\n };\n}\n\ninterface WalrusNewlyCreatedResponse {\n newlyCreated: {\n blobObject: WalrusBlobObject;\n };\n}\n\ninterface WalrusAlreadyCertifiedResponse {\n alreadyCertified: {\n blobId: string;\n endEpoch?: number;\n };\n}\n\ntype WalrusStoreApiResponse = WalrusNewlyCreatedResponse | WalrusAlreadyCertifiedResponse;\n\nexport class WalrusRequestError extends Error {\n constructor(\n message: string,\n readonly url: string,\n readonly transient: boolean,\n readonly status?: number,\n readonly body?: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = 'WalrusRequestError';\n }\n}\n\nexport class WalrusNetworkError extends WalrusRequestError {\n constructor(message: string, url: string, options?: ErrorOptions) {\n super(message, url, true, undefined, undefined, options);\n this.name = 'WalrusNetworkError';\n }\n}\n\nexport class WalrusTimeoutError extends WalrusRequestError {\n constructor(message: string, url: string, readonly timeoutMs: number, options?: ErrorOptions) {\n super(message, url, true, undefined, undefined, options);\n this.name = 'WalrusTimeoutError';\n }\n}\n\nexport class WalrusHttpError extends WalrusRequestError {\n constructor(message: string, url: string, status: number, body: string) {\n super(message, url, status >= 500 || status === 408 || status === 429, status, body);\n this.name = 'WalrusHttpError';\n }\n}\n\nexport class WalrusResponseError extends WalrusRequestError {\n constructor(message: string, url: string, body: string, options?: ErrorOptions) {\n super(message, url, false, undefined, body, options);\n this.name = 'WalrusResponseError';\n }\n}\n\nexport class WalrusBlobTooLargeError extends Error {\n constructor(readonly size: number, readonly maxBlobSize: number) {\n super(`Walrus blob size ${size} exceeds the configured maximum of ${maxBlobSize} bytes.`);\n this.name = 'WalrusBlobTooLargeError';\n }\n}\n\nexport class WalrusBlobStore implements BlobStore {\n private readonly config: Required<Omit<WalrusBlobStoreConfig, 'logger' | 'fetchImpl'>> & Pick<WalrusBlobStoreConfig, 'logger' | 'fetchImpl'>;\n private readonly metadata = new Map<string, WalrusBlobMetadata>();\n\n constructor(config: WalrusBlobStoreConfig) {\n this.config = {\n publisherUrl: normalizeWalrusUrl(config.publisherUrl || DEFAULT_WALRUS_PUBLISHER_URL),\n aggregatorUrl: normalizeWalrusUrl(config.aggregatorUrl || DEFAULT_WALRUS_AGGREGATOR_URL),\n epochs: config.epochs ?? DEFAULT_WALRUS_EPOCHS,\n maxBlobSize: config.maxBlobSize ?? DEFAULT_WALRUS_MAX_BLOB_SIZE,\n retryAttempts: Math.max(1, config.retryAttempts ?? DEFAULT_WALRUS_RETRY_ATTEMPTS),\n retryDelayMs: Math.max(1, config.retryDelayMs ?? DEFAULT_WALRUS_RETRY_DELAY_MS),\n timeoutMs: Math.max(1, config.timeoutMs ?? DEFAULT_WALRUS_TIMEOUT_MS),\n fetchImpl: config.fetchImpl,\n logger: config.logger,\n };\n\n validatePositiveInteger(this.config.epochs, 'epochs');\n validatePositiveInteger(this.config.maxBlobSize, 'maxBlobSize');\n validatePositiveInteger(this.config.timeoutMs, 'timeoutMs');\n }\n\n async store(data: Uint8Array): Promise<StoredBlob> {\n if (data.byteLength > this.config.maxBlobSize) {\n throw new WalrusBlobTooLargeError(data.byteLength, this.config.maxBlobSize);\n }\n\n const contentHash = computeSha256(data);\n const startedAt = Date.now();\n const started = performance.now();\n const storeUrl = new URL(`${this.config.publisherUrl}/v1/blobs`);\n storeUrl.searchParams.set('epochs', String(this.config.epochs));\n storeUrl.searchParams.set('permanent', 'true');\n\n const response = await this.executeWithRetry('store', storeUrl.toString(), async () => {\n const walrusResponse = await this.fetchWithTimeout(storeUrl.toString(), {\n method: 'PUT',\n headers: {\n 'content-type': 'application/octet-stream',\n },\n body: data,\n });\n const body = await walrusResponse.text();\n\n if (!walrusResponse.ok) {\n throw new WalrusHttpError(\n `Walrus store failed with status ${walrusResponse.status}: ${body}`,\n storeUrl.toString(),\n walrusResponse.status,\n body,\n );\n }\n\n return parseWalrusStorePayload(body, storeUrl.toString());\n }, { size: data.byteLength });\n\n const blobId = createWalrusBlobReference(response.storageBlobId, contentHash);\n const stored: WalrusBlobMetadata & StoredBlob = {\n blobId,\n hash: contentHash,\n checksum: contentHash,\n contentHash,\n size: response.size ?? data.byteLength,\n storedAt: startedAt,\n storageBlobId: response.storageBlobId,\n objectId: response.objectId,\n deletable: response.deletable,\n endEpoch: response.endEpoch,\n };\n\n this.rememberMetadata(stored);\n this.log('info', {\n operation: 'store',\n blobId,\n storageBlobId: response.storageBlobId,\n size: data.byteLength,\n durationMs: Math.round(performance.now() - started),\n }, 'Stored Walrus blob');\n\n return stored;\n }\n\n async fetch(blobId: string): Promise<Uint8Array | null> {\n const reference = parseWalrusBlobReference(blobId);\n const started = performance.now();\n const url = `${this.config.aggregatorUrl}/v1/blobs/${reference.storageBlobId}`;\n\n const data = await this.executeWithRetry('fetch', url, async () => {\n const response = await this.fetchWithTimeout(url, { method: 'GET' });\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new WalrusHttpError(\n `Walrus fetch failed with status ${response.status}: ${body}`,\n url,\n response.status,\n body,\n );\n }\n\n return new Uint8Array(await response.arrayBuffer());\n }, { blobId: reference.storageBlobId });\n\n if (!data) {\n return null;\n }\n\n const actualHash = computeSha256(data);\n const expectedHash = reference.contentHash ?? this.metadata.get(blobId)?.contentHash ?? this.metadata.get(reference.storageBlobId)?.contentHash;\n if (expectedHash && actualHash !== expectedHash) {\n this.log('error', {\n operation: 'fetch',\n blobId,\n storageBlobId: reference.storageBlobId,\n expectedHash,\n actualHash,\n }, 'Walrus blob failed integrity verification');\n throw new BlobIntegrityError(\n `Walrus blob ${blobId} failed SHA-256 verification.`,\n blobId,\n expectedHash,\n actualHash,\n );\n }\n\n const metadata = this.metadata.get(blobId) ?? this.metadata.get(reference.storageBlobId);\n if (!metadata) {\n this.rememberMetadata({\n blobId: reference.contentHash ? blobId : createWalrusBlobReference(reference.storageBlobId, actualHash),\n contentHash: actualHash,\n size: data.byteLength,\n storedAt: Date.now(),\n storageBlobId: reference.storageBlobId,\n });\n }\n\n this.log('info', {\n operation: 'fetch',\n blobId,\n storageBlobId: reference.storageBlobId,\n size: data.byteLength,\n durationMs: Math.round(performance.now() - started),\n }, 'Fetched Walrus blob');\n\n return data;\n }\n\n async exists(blobId: string): Promise<boolean> {\n const reference = parseWalrusBlobReference(blobId);\n const url = `${this.config.aggregatorUrl}/v1/blobs/${reference.storageBlobId}`;\n\n return await this.executeWithRetry('exists', url, async () => {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: {\n Range: 'bytes=0-0',\n },\n });\n\n if (response.status === 404) {\n return false;\n }\n\n if (response.status === 200 || response.status === 206) {\n return true;\n }\n\n const body = await response.text();\n throw new WalrusHttpError(\n `Walrus exists check failed with status ${response.status}: ${body}`,\n url,\n response.status,\n body,\n );\n }, { blobId: reference.storageBlobId });\n }\n\n async getMetadata(blobId: string): Promise<BlobMetadata | null> {\n const directMatch = this.metadata.get(blobId);\n if (directMatch) {\n return directMatch;\n }\n\n try {\n return this.metadata.get(parseWalrusBlobReference(blobId).storageBlobId) ?? null;\n } catch {\n return null;\n }\n }\n\n async delete(blobId: string): Promise<void> {\n void blobId;\n throw new Error(\n 'Walrus deletion is not available through the public HTTP API. Deleting or extending blobs requires owning the Walrus Blob object and using the CLI or on-chain APIs.',\n );\n }\n\n private async executeWithRetry<T>(\n operation: 'store' | 'fetch' | 'exists',\n url: string,\n action: () => Promise<T>,\n context: Record<string, unknown> = {},\n ): Promise<T> {\n let attempt = 0;\n while (attempt < this.config.retryAttempts) {\n attempt += 1;\n try {\n return await action();\n } catch (error) {\n const walrusError = classifyWalrusError(error, url, this.config.timeoutMs);\n if (!walrusError.transient || attempt >= this.config.retryAttempts) {\n this.log('error', {\n operation,\n attempt,\n retryAttempts: this.config.retryAttempts,\n transient: walrusError.transient,\n url,\n err: walrusError,\n ...context,\n }, 'Walrus request failed');\n throw walrusError;\n }\n\n const delayMs = this.config.retryDelayMs * (2 ** (attempt - 1));\n this.log('warn', {\n operation,\n attempt,\n retryAttempts: this.config.retryAttempts,\n delayMs,\n url,\n err: walrusError,\n ...context,\n }, 'Retrying Walrus request');\n await sleep(delayMs);\n }\n }\n\n throw new Error(`Walrus ${operation} exhausted retries for ${url}.`);\n }\n\n private async fetchWithTimeout(url: string, init: RequestInit): Promise<Response> {\n const walrusFetch = this.config.fetchImpl ?? globalThis.fetch;\n if (!walrusFetch) {\n throw new Error('Global fetch is not available in this runtime.');\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, this.config.timeoutMs);\n\n try {\n return await walrusFetch(url, {\n ...init,\n signal: controller.signal,\n });\n } catch (error) {\n if (controller.signal.aborted) {\n throw new WalrusTimeoutError(\n `Walrus request timed out after ${this.config.timeoutMs}ms for ${url}.`,\n url,\n this.config.timeoutMs,\n { cause: error as Error },\n );\n }\n\n throw new WalrusNetworkError(\n `Walrus request failed for ${url}: ${(error as Error).message}`,\n url,\n { cause: error as Error },\n );\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private rememberMetadata(metadata: WalrusBlobMetadata): void {\n this.metadata.set(metadata.blobId, metadata);\n this.metadata.set(metadata.storageBlobId, metadata);\n }\n\n private log(level: keyof WalrusLogger, bindings: Record<string, unknown>, message: string): void {\n const targetLogger = this.config.logger ?? logger;\n targetLogger[level](bindings, message);\n }\n}\n\nexport function createWalrusBlobReference(storageBlobId: string, contentHash: string): string {\n assertWalrusStorageBlobId(storageBlobId);\n if (!/^[a-f0-9]{64}$/.test(contentHash)) {\n throw new Error(`Invalid SHA-256 content hash: ${contentHash}`);\n }\n\n return `walrus:${storageBlobId}:${contentHash}`;\n}\n\nexport function parseWalrusBlobReference(blobId: string): WalrusBlobReference {\n const encodedMatch = WALRUS_REFERENCE_PATTERN.exec(blobId);\n if (encodedMatch) {\n assertWalrusStorageBlobId(encodedMatch[1]);\n return {\n blobId,\n storageBlobId: encodedMatch[1],\n contentHash: encodedMatch[2],\n };\n }\n\n assertWalrusStorageBlobId(blobId);\n return {\n blobId,\n storageBlobId: blobId,\n };\n}\n\nfunction parseWalrusStorePayload(\n body: string,\n url: string,\n): Omit<WalrusBlobMetadata, 'blobId' | 'contentHash' | 'storedAt' | 'size'> & { size?: number } {\n let response: unknown;\n try {\n response = JSON.parse(body);\n } catch (error) {\n throw new WalrusResponseError(`Walrus store returned invalid JSON from ${url}.`, url, body, {\n cause: error as Error,\n });\n }\n\n try {\n return parseWalrusStoreResponse(response as WalrusStoreApiResponse);\n } catch (error) {\n throw new WalrusResponseError(\n error instanceof Error ? error.message : 'Unexpected Walrus store response payload.',\n url,\n body,\n error instanceof Error ? { cause: error } : undefined,\n );\n }\n}\n\nfunction parseWalrusStoreResponse(\n response: WalrusStoreApiResponse,\n): Omit<WalrusBlobMetadata, 'blobId' | 'contentHash' | 'storedAt' | 'size'> & { size?: number } {\n if ('newlyCreated' in response) {\n const { blobObject } = response.newlyCreated;\n assertWalrusStorageBlobId(blobObject.blobId);\n return {\n storageBlobId: blobObject.blobId,\n objectId: blobObject.id,\n size: blobObject.size,\n deletable: blobObject.deletable,\n endEpoch: blobObject.storage?.endEpoch,\n };\n }\n\n if ('alreadyCertified' in response) {\n assertWalrusStorageBlobId(response.alreadyCertified.blobId);\n return {\n storageBlobId: response.alreadyCertified.blobId,\n endEpoch: response.alreadyCertified.endEpoch,\n };\n }\n\n throw new Error('Unexpected Walrus store response payload.');\n}\n\nfunction assertWalrusStorageBlobId(blobId: string): void {\n if (!WALRUS_STORAGE_ID_PATTERN.test(blobId)) {\n throw new Error(`Invalid Walrus blob ID: ${blobId}`);\n }\n\n const bytes = Buffer.from(blobId, 'base64url');\n if (bytes.length !== WALRUS_STORAGE_ID_BYTES) {\n throw new Error(\n `Expected Walrus blob IDs to decode to ${WALRUS_STORAGE_ID_BYTES} bytes, got ${bytes.length}`,\n );\n }\n}\n\nfunction normalizeWalrusUrl(url: string): string {\n return url.replace(/\\/+$/, '');\n}\n\nfunction validatePositiveInteger(value: number, field: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${field} must be a positive integer, received ${value}.`);\n }\n}\n\nfunction computeSha256(data: Uint8Array): string {\n return createHash('sha256').update(data).digest('hex');\n}\n\nfunction classifyWalrusError(error: unknown, url: string, timeoutMs: number): WalrusRequestError {\n if (error instanceof WalrusRequestError) {\n return error;\n }\n\n if (error instanceof BlobIntegrityError) {\n return new WalrusRequestError(error.message, url, false, undefined, undefined, { cause: error });\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n return new WalrusTimeoutError(\n `Walrus request timed out after ${timeoutMs}ms for ${url}.`,\n url,\n timeoutMs,\n { cause: error },\n );\n }\n\n if (error instanceof Error) {\n return new WalrusNetworkError(error.message, url, { cause: error });\n }\n\n return new WalrusNetworkError(`Unknown Walrus request failure for ${url}.`, url);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n","import type { BlobMetadata, BlobStore, StoredBlob } from './interface.js';\nimport { decryptFromSender, encryptForRecipient, parseEncryptedPayload, serializeEncryptedPayload } from '../crypto/encryption.js';\nimport type { X25519KeyPair } from '../crypto/x25519.js';\n\nexport class EncryptedBlobStore implements BlobStore {\n constructor(\n private readonly inner: BlobStore,\n private readonly myKeyPair: X25519KeyPair,\n ) {}\n\n async storeEncrypted(\n data: Uint8Array,\n recipientPublicKey: Uint8Array,\n ): Promise<{ blobId: string; hash: string }> {\n const payload = await encryptForRecipient(data, this.myKeyPair.privateKey, recipientPublicKey);\n const stored = await this.inner.store(serializeEncryptedPayload(payload));\n return {\n blobId: stored.blobId,\n hash: stored.hash,\n };\n }\n\n async fetchDecrypted(blobId: string): Promise<Uint8Array | null> {\n const data = await this.inner.fetch(blobId);\n if (!data) {\n return null;\n }\n\n const payload = parseEncryptedPayload(data);\n if (!payload) {\n return data;\n }\n\n return await decryptFromSender(payload, this.myKeyPair.privateKey);\n }\n\n async store(data: Uint8Array): Promise<StoredBlob> {\n return await this.inner.store(data);\n }\n\n async fetch(blobId: string): Promise<Uint8Array | null> {\n return await this.inner.fetch(blobId);\n }\n\n async exists(blobId: string): Promise<boolean> {\n return await this.inner.exists(blobId);\n }\n\n async delete(blobId: string): Promise<void> {\n await this.inner.delete(blobId);\n }\n\n async getMetadata(blobId: string): Promise<BlobMetadata | null> {\n return await this.inner.getMetadata?.(blobId) ?? null;\n }\n}\n","export const USDC_ADDRESS = {\n base: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n 'base-sepolia': '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n} as const;\n\nexport const PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';\n","import type { Chain, PublicClient, WalletClient } from 'viem';\nimport { createPublicClient, createWalletClient, defineChain, getAddress, http, toHex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { base, baseSepolia } from 'viem/chains';\n\nconst LOCALHOST_RPC_URL = 'http://127.0.0.1:8545';\nconst erc20BalanceOfAbi = [\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: 'balance', type: 'uint256' }],\n },\n] as const;\n\nexport interface EvmWalletConfig {\n network: 'base' | 'base-sepolia' | 'localhost';\n rpcUrl?: string;\n}\n\nexport class EvmWallet {\n private readonly account;\n private readonly chainConfig: Chain;\n private readonly walletClient: WalletClient;\n private readonly publicClient: PublicClient;\n\n constructor(privateKey: Uint8Array, private readonly config: EvmWalletConfig) {\n if (privateKey.byteLength !== 32) {\n throw new Error('EVM private key must be 32 bytes.');\n }\n\n this.account = privateKeyToAccount(toHex(privateKey));\n this.chainConfig = resolveChain(config);\n\n const transport = http(resolveRpcUrl(config));\n this.walletClient = createWalletClient({\n account: this.account,\n chain: this.chainConfig,\n transport,\n });\n this.publicClient = createPublicClient({\n chain: this.chainConfig,\n transport,\n });\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get chain(): Chain {\n return this.chainConfig;\n }\n\n async getBalance(): Promise<bigint> {\n return this.publicClient.getBalance({ address: this.account.address });\n }\n\n async getTokenBalance(tokenAddress: string): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: getAddress(tokenAddress),\n abi: erc20BalanceOfAbi,\n functionName: 'balanceOf',\n args: [this.account.address],\n })) as bigint;\n }\n\n async signMessage(message: string | Uint8Array): Promise<string> {\n return this.walletClient.signMessage({\n account: this.account,\n message: typeof message === 'string' ? message : { raw: toHex(message) },\n });\n }\n\n async signTypedData(typedData: Omit<Parameters<WalletClient['signTypedData']>[0], 'account'>): Promise<string> {\n return this.walletClient.signTypedData({\n ...typedData,\n account: this.account,\n });\n }\n\n async sendTransaction(to: string, value: bigint): Promise<string> {\n return this.walletClient.sendTransaction({\n account: this.account,\n chain: this.chainConfig,\n to: getAddress(to),\n value,\n });\n }\n\n getWalletClient(): WalletClient {\n return this.walletClient;\n }\n\n getPublicClient(): PublicClient {\n return this.publicClient;\n }\n}\n\nfunction resolveChain(config: EvmWalletConfig): Chain {\n switch (config.network) {\n case 'base':\n return base;\n case 'base-sepolia':\n return baseSepolia;\n case 'localhost':\n return defineChain({\n id: 31_337,\n name: 'Localhost',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [config.rpcUrl ?? LOCALHOST_RPC_URL],\n },\n },\n testnet: true,\n });\n }\n}\n\nfunction resolveRpcUrl(config: EvmWalletConfig): string | undefined {\n if (config.rpcUrl) {\n return config.rpcUrl;\n }\n\n if (config.network === 'localhost') {\n return LOCALHOST_RPC_URL;\n }\n\n return undefined;\n}\n","export type SelectedPaymentRail = 'sui-escrow' | 'sui-transfer' | 'x402-base';\n\nexport interface RailSelectionContext {\n executionMode: 'sync' | 'async';\n consumerHasSuiWallet: boolean;\n consumerHasEvmWallet: boolean;\n providerAcceptsSui: boolean;\n providerAcceptsX402: boolean;\n amount: bigint;\n currency: string;\n}\n\nexport class PaymentRailSelector {\n selectRail(context: RailSelectionContext): SelectedPaymentRail {\n const available = this.getAvailableRails(context);\n const selected = available[0];\n if (!selected) {\n throw new Error('No compatible payment rail is available for this task.');\n }\n\n return selected;\n }\n\n getAvailableRails(context: RailSelectionContext): SelectedPaymentRail[] {\n if (context.executionMode === 'async') {\n return context.consumerHasSuiWallet && context.providerAcceptsSui ? ['sui-escrow'] : [];\n }\n\n const rails: SelectedPaymentRail[] = [];\n\n if (context.consumerHasSuiWallet && context.providerAcceptsSui) {\n rails.push('sui-transfer');\n }\n\n if (context.consumerHasEvmWallet && context.providerAcceptsX402) {\n rails.push('x402-base');\n }\n\n return rails;\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { PaymentRail, type DID } from '@hivemind-os/collective-types';\n\nimport type { AuthProvider } from '../auth/types.js';\nimport { parseDID, verify } from '../identity/index.js';\nimport type { X402Client } from '../x402/client.js';\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\ninterface RelayChallenge {\n rail?: PaymentRail;\n paymentAddress?: string;\n amount?: string;\n currency?: string;\n network?: string;\n relayFee?: string;\n expiresAt?: number;\n nonce?: string;\n asset?: string;\n extra?: Record<string, string>;\n}\n\ninterface RelayErrorPayload {\n error?: {\n code?: string;\n message?: string;\n retryable?: boolean;\n };\n}\n\ninterface RelaySuiPaymentProof {\n rail: PaymentRail.SUI_TRANSFER;\n payerDid: DID;\n payerAddress: string;\n paymentAddress: string;\n amount: string;\n currency: string;\n network: string;\n nonce: string;\n expiresAt: number;\n signature: string;\n}\n\nexport class RelayConsumerClient {\n private readonly sessionId = randomUUID();\n private sequence = 0;\n\n constructor(\n private readonly x402Client: X402Client | null,\n private readonly identity: AuthProvider,\n private readonly config: { relayUrl: string },\n ) {}\n\n async executeSync(request: {\n providerDid: string;\n capability: string;\n input: unknown;\n paymentRail: PaymentRail;\n timeoutMs?: number;\n }): Promise<{\n result: unknown;\n paymentReceipt?: string;\n latencyMs: number;\n taskId?: string;\n providerDid?: string;\n }> {\n const startedAt = Date.now();\n const response = await this.executeWithPayment(request, request.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n\n return {\n result: response.result,\n paymentReceipt: response.paymentReceipt,\n latencyMs: Date.now() - startedAt,\n taskId: response.taskId,\n providerDid: response.providerDid,\n };\n }\n\n async executeSyncStreaming(request: {\n providerDid: string;\n capability: string;\n input: unknown;\n paymentRail: PaymentRail;\n onChunk: (chunk: string) => void;\n onProgress: (progress: number, message?: string) => void;\n timeoutMs?: number;\n }): Promise<{ result: unknown; paymentReceipt?: string }> {\n const timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const initialResponse = await this.sendExecuteRequest({\n providerDid: request.providerDid,\n capability: request.capability,\n input: request.input,\n paymentRail: request.paymentRail,\n stream: true,\n timeoutMs,\n });\n\n const challenge = this.requirePaymentChallenge(initialResponse, request.paymentRail);\n const paymentHeader = await this.createPaymentHeader(challenge, request.paymentRail);\n const paidResponse = await this.sendExecuteRequest({\n providerDid: request.providerDid,\n capability: request.capability,\n input: request.input,\n paymentRail: request.paymentRail,\n paymentSignature: paymentHeader,\n paymentNonce: challenge.nonce,\n stream: true,\n timeoutMs,\n });\n\n if (!paidResponse.response.ok) {\n throw await toRelayError(paidResponse.response);\n }\n\n const stream = paidResponse.response.body;\n if (!stream) {\n throw new Error('Relay streaming response did not include a body.');\n }\n\n const reader = stream.getReader();\n let buffer = '';\n let result: unknown;\n let paymentReceipt = paidResponse.response.headers.get('payment-response') ?? undefined;\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n while (buffer.includes('\\n\\n')) {\n const separator = buffer.indexOf('\\n\\n');\n const rawEvent = buffer.slice(0, separator);\n buffer = buffer.slice(separator + 2);\n const parsed = parseSseEvent(rawEvent);\n if (!parsed) {\n continue;\n }\n\n const eventData = isRecord(parsed.data) ? parsed.data : {};\n switch (parsed.event) {\n case 'progress':\n request.onProgress(Number(eventData.progress ?? 0), asOptionalString(eventData.message));\n break;\n case 'chunk':\n request.onChunk(String(eventData.data ?? ''));\n break;\n case 'result':\n result = eventData.result;\n paymentReceipt = asOptionalString(eventData.paymentReceipt) ?? paymentReceipt;\n break;\n case 'error':\n throw new Error(String(eventData.message ?? 'Relay streaming task failed.'));\n }\n }\n }\n\n if (result === undefined) {\n throw new Error('Relay streaming task completed without a final result event.');\n }\n\n return { result, paymentReceipt };\n }\n\n private async executeWithPayment(\n request: {\n providerDid: string;\n capability: string;\n input: unknown;\n paymentRail: PaymentRail;\n },\n timeoutMs: number,\n ): Promise<{ result: unknown; paymentReceipt?: string; taskId?: string; providerDid?: string }> {\n const initialResponse = await this.sendExecuteRequest({\n providerDid: request.providerDid,\n capability: request.capability,\n input: request.input,\n paymentRail: request.paymentRail,\n timeoutMs,\n });\n\n if (initialResponse.response.ok) {\n return {\n result: initialResponse.body,\n paymentReceipt: initialResponse.response.headers.get('payment-response') ?? undefined,\n taskId: initialResponse.response.headers.get('x-mesh-response-id') ?? undefined,\n providerDid: initialResponse.response.headers.get('x-mesh-provider') ?? undefined,\n };\n }\n\n if (initialResponse.response.status !== 402) {\n throw await toRelayError(initialResponse.response);\n }\n\n const challenge = this.requirePaymentChallenge(initialResponse, request.paymentRail);\n const signedPayment = await this.createPaymentHeader(challenge, request.paymentRail);\n const paidResponse = await this.sendExecuteRequest({\n providerDid: request.providerDid,\n capability: request.capability,\n input: request.input,\n paymentRail: request.paymentRail,\n paymentSignature: signedPayment,\n paymentNonce: challenge.nonce,\n timeoutMs,\n });\n\n if (!paidResponse.response.ok) {\n throw await toRelayError(paidResponse.response);\n }\n\n return {\n result: paidResponse.body,\n paymentReceipt: paidResponse.response.headers.get('payment-response') ?? undefined,\n taskId: paidResponse.response.headers.get('x-mesh-response-id') ?? undefined,\n providerDid: paidResponse.response.headers.get('x-mesh-provider') ?? undefined,\n };\n }\n\n private async sendExecuteRequest(params: {\n providerDid: string;\n capability: string;\n input: unknown;\n paymentRail: PaymentRail;\n paymentSignature?: string;\n paymentNonce?: string;\n stream?: boolean;\n timeoutMs: number;\n }): Promise<{ response: Response; body: unknown }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), params.timeoutMs);\n\n try {\n const response = await fetch(buildExecuteUrl(this.config.relayUrl, params.providerDid, params.capability, params.stream), {\n method: 'POST',\n headers: {\n accept: params.stream ? 'text/event-stream' : 'application/json',\n 'content-type': 'application/json',\n 'x-mesh-request-id': randomUUID(),\n 'x-mesh-requester': this.identity.getDID(),\n 'x-mesh-target-provider': params.providerDid,\n 'x-mesh-session-id': this.sessionId,\n 'x-mesh-sequence': String(this.nextSequence()),\n 'x-mesh-payment-rail': params.paymentRail,\n ...(params.paymentSignature ? { 'payment-signature': params.paymentSignature } : {}),\n ...(params.paymentNonce ? { 'x-mesh-payment-nonce': params.paymentNonce } : {}),\n },\n body: JSON.stringify(params.input),\n signal: controller.signal,\n });\n\n const body = params.stream && response.ok\n ? undefined\n : await parseResponseBody(response.clone());\n return { response, body };\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error('Relay request timed out.');\n }\n\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private requirePaymentChallenge(\n response: { response: Response; body: unknown },\n paymentRail: PaymentRail,\n ): Required<RelayChallenge> {\n const payload = isRecord(response.body) && isRecord(response.body.payment)\n ? (response.body.payment as RelayChallenge)\n : isRecord(response.body) && isRecord(response.body.paymentRequest)\n ? (response.body.paymentRequest as RelayChallenge)\n : ({} as RelayChallenge);\n\n const challenge: RelayChallenge = {\n rail: (payload.rail as PaymentRail | undefined) ?? paymentRail,\n paymentAddress: asOptionalString(payload.paymentAddress),\n amount: asOptionalString(payload.amount),\n currency: asOptionalString(payload.currency),\n network: asOptionalString(payload.network),\n relayFee: asOptionalString(payload.relayFee),\n expiresAt: typeof payload.expiresAt === 'number' ? payload.expiresAt : Number(payload.expiresAt),\n nonce: asOptionalString(payload.nonce),\n asset: asOptionalString(payload.asset),\n extra: isRecord(payload.extra)\n ? Object.fromEntries(Object.entries(payload.extra).filter((entry): entry is [string, string] => typeof entry[1] === 'string'))\n : {},\n };\n\n if (\n !challenge.rail ||\n !challenge.paymentAddress ||\n !challenge.amount ||\n !challenge.currency ||\n !challenge.network ||\n !challenge.nonce ||\n !Number.isFinite(challenge.expiresAt)\n ) {\n throw new Error('Relay 402 response did not include a supported payment challenge.');\n }\n\n return challenge as Required<RelayChallenge>;\n }\n\n private async createPaymentHeader(challenge: Required<RelayChallenge>, rail: PaymentRail): Promise<string> {\n switch (rail) {\n case PaymentRail.X402_BASE: {\n if (!this.x402Client) {\n throw new Error('x402 payment was requested but no x402 client is configured.');\n }\n\n const paymentRequest = this.x402Client.parse402Response(\n challenge.extra['payment-required'] ? { 'payment-required': challenge.extra['payment-required'] } : {},\n { payment: challenge },\n );\n return this.x402Client.createPaymentHeader(paymentRequest);\n }\n case PaymentRail.SUI_TRANSFER:\n case PaymentRail.SUI_ESCROW:\n return encodeRelaySuiPaymentProof(\n await createRelaySuiPaymentProof(this.identity, {\n paymentAddress: challenge.paymentAddress,\n amount: challenge.amount,\n currency: challenge.currency,\n network: challenge.network,\n nonce: challenge.nonce,\n expiresAt: challenge.expiresAt,\n }),\n );\n default:\n throw new Error(`Unsupported relay payment rail: ${rail}`);\n }\n }\n\n private nextSequence(): number {\n this.sequence += 1;\n return this.sequence;\n }\n}\n\nexport async function createRelaySuiPaymentProof(\n identity: AuthProvider,\n request: {\n paymentAddress: string;\n amount: string;\n currency: string;\n network: string;\n nonce: string;\n expiresAt: number;\n },\n): Promise<RelaySuiPaymentProof> {\n const signer = identity.toSuiSigner();\n const payerDid = identity.getDID() as DID;\n const payerAddress = await identity.getAddress();\n const payload = createRelaySuiPayload({\n payerDid,\n payerAddress,\n paymentAddress: request.paymentAddress,\n amount: request.amount,\n currency: request.currency,\n network: request.network,\n nonce: request.nonce,\n expiresAt: request.expiresAt,\n });\n const signature = Buffer.from(await signer.sign(encoder.encode(payload))).toString('hex');\n\n return {\n rail: PaymentRail.SUI_TRANSFER,\n payerDid,\n payerAddress,\n paymentAddress: request.paymentAddress,\n amount: request.amount,\n currency: request.currency,\n network: request.network,\n nonce: request.nonce,\n expiresAt: request.expiresAt,\n signature,\n };\n}\n\nexport function encodeRelaySuiPaymentProof(proof: RelaySuiPaymentProof): string {\n return Buffer.from(JSON.stringify(proof), 'utf8').toString('base64');\n}\n\nexport function decodeRelaySuiPaymentProof(header: string): RelaySuiPaymentProof {\n return JSON.parse(Buffer.from(header, 'base64').toString('utf8')) as RelaySuiPaymentProof;\n}\n\nexport function verifyRelaySuiPaymentProof(proof: RelaySuiPaymentProof): boolean {\n const signature = Buffer.from(proof.signature, 'hex');\n const publicKey = parseDID(proof.payerDid).publicKey;\n\n return verify(\n encoder.encode(\n createRelaySuiPayload({\n payerDid: proof.payerDid,\n payerAddress: proof.payerAddress,\n paymentAddress: proof.paymentAddress,\n amount: proof.amount,\n currency: proof.currency,\n network: proof.network,\n nonce: proof.nonce,\n expiresAt: proof.expiresAt,\n }),\n ),\n signature,\n publicKey,\n );\n}\n\nfunction createRelaySuiPayload(params: {\n payerDid: DID;\n payerAddress: string;\n paymentAddress: string;\n amount: string;\n currency: string;\n network: string;\n nonce: string;\n expiresAt: number;\n}): string {\n return [\n 'mesh-sui-payment',\n params.payerDid,\n params.payerAddress,\n params.paymentAddress,\n params.amount,\n params.currency,\n params.network,\n params.nonce,\n String(params.expiresAt),\n ].join('|');\n}\n\nfunction buildExecuteUrl(relayUrl: string, providerDid: string, capability: string, stream?: boolean): string {\n const normalized = relayUrl.replace(/^wss:/i, 'https:').replace(/^ws:/i, 'http:').replace(/\\/v1\\/ws$/i, '');\n const url = new URL(\n `/mesh/providers/${encodeURIComponent(providerDid)}/capabilities/${encodeURIComponent(capability)}/execute`,\n normalized.endsWith('/') ? normalized : `${normalized}/`,\n );\n if (stream) {\n url.searchParams.set('stream', '1');\n }\n return url.toString();\n}\n\nasync function parseResponseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n\n return response.text();\n}\n\nasync function toRelayError(response: Response): Promise<Error> {\n const body = (await parseResponseBody(response.clone())) as RelayErrorPayload | string;\n if (typeof body === 'string') {\n return new Error(body.trim().length > 0 ? body : `Relay request failed with status ${response.status}.`);\n }\n\n const message = body.error?.message ?? `Relay request failed with status ${response.status}.`;\n return new Error(message);\n}\n\nfunction parseSseEvent(rawEvent: string): { event: string; data: unknown } | null {\n const lines = rawEvent\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n const event = lines.find((line) => line.startsWith('event:'))?.slice('event:'.length).trim();\n const dataLine = lines.find((line) => line.startsWith('data:'))?.slice('data:'.length).trim();\n if (!event) {\n return null;\n }\n\n try {\n return {\n event,\n data: dataLine ? JSON.parse(dataLine) : undefined,\n };\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n","import pino from 'pino';\n\nimport { RelayNodeStatus, type RelayListFilters, type RelayNode } from '@hivemind-os/collective-types';\nimport type { SuiEvent, SuiTransactionBlockResponse } from '@mysten/sui/client';\nimport type { Signer } from '@mysten/sui/cryptography';\n\nimport { isRecord, normalizeMoveValue, parseRelayNodeFields } from '../internal/parsing.js';\nimport { MeshSuiClient } from '../sui/client.js';\nimport {\n buildDeactivateRelayTx,\n buildHeartbeatRelayTx,\n buildRegisterRelayTx,\n} from '../sui/tx-helpers.js';\nimport { StakingClient } from '../staking/client.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-core:relay-registry' });\n\nexport interface RelayRegistryContractConfig {\n packageId: string;\n heartbeatFreshnessMs?: number;\n}\n\nexport const DEFAULT_RELAY_HEARTBEAT_FRESHNESS_MS = 5 * 60_000;\n\nexport class RelayRegistryClient {\n private readonly stakingClient: StakingClient;\n private readonly heartbeatFreshnessMs: number;\n\n constructor(\n private readonly suiClient: MeshSuiClient,\n private readonly config: RelayRegistryContractConfig,\n ) {\n this.stakingClient = new StakingClient(suiClient, config);\n this.heartbeatFreshnessMs = config.heartbeatFreshnessMs ?? DEFAULT_RELAY_HEARTBEAT_FRESHNESS_MS;\n }\n\n async registerRelay(params: {\n endpoint: string;\n stakeId: string;\n capabilities: string[];\n region: string;\n routingFeeBps: number;\n signer: Signer;\n }): Promise<{ relayId: string; txDigest: string }> {\n const tx = buildRegisterRelayTx({\n packageId: this.config.packageId,\n endpoint: params.endpoint,\n stakeId: params.stakeId,\n capabilities: params.capabilities,\n region: params.region,\n routingFeeBps: params.routingFeeBps,\n });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const relayId = readRelayId(response, `${this.config.packageId}::relay_registry::RelayRegistered`);\n if (!relayId) {\n logger.warn({ response }, 'Relay registration succeeded without a RelayNode object change.');\n throw new Error('Unable to determine relay id from transaction response.');\n }\n return { relayId, txDigest: response.digest };\n }\n\n async heartbeat(params: { relayId: string; signer: Signer }): Promise<{ lastHeartbeat: number; txDigest: string }> {\n const tx = buildHeartbeatRelayTx({ packageId: this.config.packageId, relayId: params.relayId });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n const event = findEvent(response.events, `${this.config.packageId}::relay_registry::RelayHeartbeat`);\n return {\n lastHeartbeat: requireEventNumber(event, 'RelayHeartbeat', 'last_heartbeat', 'lastHeartbeat'),\n txDigest: response.digest,\n };\n }\n\n async recordRouting(params: { relayId: string; feeAmountMist: bigint; signer: Signer }): Promise<{ txDigest: string }> {\n void params;\n throw new Error('Relay routing metrics are package-internal and cannot be reported by external operators.');\n }\n\n async deactivateRelay(params: { relayId: string; signer: Signer }): Promise<{ txDigest: string }> {\n const tx = buildDeactivateRelayTx({ packageId: this.config.packageId, relayId: params.relayId });\n const response = await this.suiClient.executeTransaction(tx, params.signer);\n return { txDigest: response.digest };\n }\n\n async listRelays(filters: RelayListFilters = {}): Promise<RelayNode[]> {\n const relayIds = await this.collectRelayIds();\n const relays = await Promise.all([...relayIds].map(async (relayId) => await this.getRelay(relayId)));\n return relays\n .filter((relay): relay is RelayNode => Boolean(relay))\n .filter((relay) => matchesRelayFilters(relay, filters))\n .sort(compareRelays);\n }\n\n async getRelay(relayId: string): Promise<RelayNode | null> {\n try {\n const object = await this.suiClient.getObject<Record<string, unknown>>(relayId);\n return await this.enrichRelay(parseRelayNodeFields(object, relayId));\n } catch (error) {\n if (isObjectMissingError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getRelaysByRegion(region: string): Promise<RelayNode[]> {\n return await this.listRelays({ region });\n }\n\n private async collectRelayIds(): Promise<Set<string>> {\n const relayIds = new Set<string>();\n const eventType = `${this.config.packageId}::relay_registry::RelayRegistered`;\n let cursor = null;\n\n do {\n const page = await this.suiClient.queryEvents(eventType, cursor, 100);\n for (const event of page.events) {\n const payload = normalizeEvent(event);\n const relayId = asString(readEventField(payload, 'relay_id', 'relayId'));\n if (relayId) {\n relayIds.add(relayId);\n }\n }\n cursor = page.nextCursor;\n if (!page.hasMore) {\n break;\n }\n } while (cursor);\n\n return relayIds;\n }\n\n private async enrichRelay(relay: RelayNode): Promise<RelayNode> {\n const heartbeatAgeMs = Math.max(Date.now() - relay.lastHeartbeat, 0);\n try {\n const stake = await this.stakingClient.getStakePosition(relay.stakePositionId);\n return {\n ...relay,\n stakeAmountMist: stake?.balanceMist,\n heartbeatAgeMs,\n isHeartbeatFresh: heartbeatAgeMs <= this.heartbeatFreshnessMs,\n };\n } catch {\n return {\n ...relay,\n heartbeatAgeMs,\n isHeartbeatFresh: heartbeatAgeMs <= this.heartbeatFreshnessMs,\n };\n }\n }\n}\n\nfunction readRelayId(response: SuiTransactionBlockResponse, eventType: string): string | undefined {\n const event = findEvent(response.events, eventType);\n return asString(readEventField(event, 'relay_id', 'relayId')) || extractObjectId(response, /::relay_registry::RelayNode$/);\n}\n\nfunction extractObjectId(response: SuiTransactionBlockResponse, objectTypePattern: RegExp): string | undefined {\n const change = (response.objectChanges as Array<Record<string, unknown>> | null | undefined)?.find(\n (entry) =>\n (entry.type === 'created' || entry.type === 'transferred' || entry.type === 'mutated') &&\n typeof entry.objectType === 'string' &&\n objectTypePattern.test(entry.objectType) &&\n typeof entry.objectId === 'string',\n );\n return change?.objectId as string | undefined;\n}\n\nfunction findEvent(events: SuiTransactionBlockResponse['events'], eventType: string): Record<string, unknown> {\n const payload = events\n ?.map((event) => ({ type: event.type, payload: normalizeEvent(event) }))\n .find((event) => event.type === eventType)?.payload;\n return payload ?? {};\n}\n\nfunction normalizeEvent(event: SuiEvent): Record<string, unknown> {\n const normalized = normalizeMoveValue(event.parsedJson);\n return isRecord(normalized) ? normalized : {};\n}\n\nfunction readEventField(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n}\n\nfunction asString(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction asNumber(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.length > 0) {\n return Number(value);\n }\n return 0;\n}\n\nfunction requireEventNumber(record: Record<string, unknown>, eventName: string, ...keys: string[]): number {\n const raw = readEventField(record, ...keys);\n if (raw == null || raw === '') {\n throw new Error(`${eventName} event did not include a valid ${keys[0]}.`);\n }\n const value = asNumber(raw);\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${eventName} event did not include a valid ${keys[0]}.`);\n }\n return value;\n}\n\nfunction matchesRelayFilters(relay: RelayNode, filters: RelayListFilters): boolean {\n const activeOnly = filters.status === undefined && filters.activeOnly === undefined ? true : (filters.activeOnly ?? false);\n const statuses = normalizeStatuses(filters.status, activeOnly);\n if (!statuses.includes(relay.status)) {\n return false;\n }\n if (filters.operator && relay.operator.toLowerCase() !== filters.operator.toLowerCase()) {\n return false;\n }\n if (filters.region && relay.region.toLowerCase() !== filters.region.toLowerCase()) {\n return false;\n }\n if (filters.stakePositionId && relay.stakePositionId.toLowerCase() !== filters.stakePositionId.toLowerCase()) {\n return false;\n }\n if (filters.endpoint && relay.endpoint.toLowerCase() !== filters.endpoint.toLowerCase()) {\n return false;\n }\n if (filters.capability) {\n const capability = filters.capability.toLowerCase();\n if (!relay.capabilities.some((entry) => entry.toLowerCase() === capability)) {\n return false;\n }\n }\n if (filters.heartbeatWithinMs !== undefined && (relay.heartbeatAgeMs ?? Number.POSITIVE_INFINITY) > filters.heartbeatWithinMs) {\n return false;\n }\n return true;\n}\n\nfunction normalizeStatuses(status: RelayListFilters['status'], activeOnly: boolean): RelayNodeStatus[] {\n if (Array.isArray(status)) {\n return status;\n }\n if (status !== undefined) {\n return [status];\n }\n return activeOnly\n ? [RelayNodeStatus.ACTIVE]\n : [RelayNodeStatus.ACTIVE, RelayNodeStatus.INACTIVE, RelayNodeStatus.SLASHED];\n}\n\nfunction compareRelays(left: RelayNode, right: RelayNode): number {\n return (\n compareBoolean(left.status === RelayNodeStatus.ACTIVE, right.status === RelayNodeStatus.ACTIVE) ||\n compareBoolean(left.isHeartbeatFresh ?? false, right.isHeartbeatFresh ?? false) ||\n compareNumber(left.routingFeeBps, right.routingFeeBps, true) ||\n compareBigInt(left.stakeAmountMist ?? 0n, right.stakeAmountMist ?? 0n) ||\n compareNumber(left.lastHeartbeat, right.lastHeartbeat)\n );\n}\n\nfunction compareBoolean(left: boolean, right: boolean): number {\n if (left === right) {\n return 0;\n }\n return left ? -1 : 1;\n}\n\nfunction compareBigInt(left: bigint, right: bigint): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}\n\nfunction compareNumber(left: number, right: number, ascending = false): number {\n if (left === right) {\n return 0;\n }\n if (ascending) {\n return left < right ? -1 : 1;\n }\n return left > right ? -1 : 1;\n}\n\nfunction isObjectMissingError(error: unknown): boolean {\n return error instanceof Error && /not found|does not contain move object data/i.test(error.message);\n}\n","import { RelayNodeStatus, type RelayNode } from '@hivemind-os/collective-types';\n\nimport { DEFAULT_RELAY_HEARTBEAT_FRESHNESS_MS, type RelayRegistryClient } from './client.js';\n\nexport interface RelayDiscoveryOptions {\n cacheTtlMs?: number;\n heartbeatFreshnessMs?: number;\n now?: () => number;\n}\n\ninterface RelayCacheEntry {\n relays: RelayNode[];\n expiresAt: number;\n}\n\nexport class RelayDiscovery {\n private readonly cacheTtlMs: number;\n private readonly heartbeatFreshnessMs: number;\n private readonly now: () => number;\n private cache?: RelayCacheEntry;\n\n constructor(\n private readonly registryClient: Pick<RelayRegistryClient, 'listRelays'>,\n options: RelayDiscoveryOptions = {},\n ) {\n this.cacheTtlMs = options.cacheTtlMs ?? 30_000;\n this.heartbeatFreshnessMs = options.heartbeatFreshnessMs ?? DEFAULT_RELAY_HEARTBEAT_FRESHNESS_MS;\n this.now = options.now ?? (() => Date.now());\n }\n\n async findBestRelay(capability: string, region?: string): Promise<RelayNode | null> {\n const normalizedCapability = capability.trim().toLowerCase();\n if (!normalizedCapability) {\n throw new Error('capability must be a non-empty string.');\n }\n\n const normalizedRegion = region?.trim() || undefined;\n const relays = (await this.getRelayList())\n .filter((relay) => relay.status === RelayNodeStatus.ACTIVE)\n .filter((relay) => relay.capabilities.some((entry) => entry.toLowerCase() === normalizedCapability));\n\n if (relays.length === 0) {\n return null;\n }\n\n return [...relays].sort(\n (left, right) => scoreRelay(right, normalizedRegion, this.heartbeatFreshnessMs, this.now())\n - scoreRelay(left, normalizedRegion, this.heartbeatFreshnessMs, this.now()),\n )[0] ?? null;\n }\n\n invalidateCache(): void {\n this.cache = undefined;\n }\n\n private async getRelayList(): Promise<RelayNode[]> {\n const now = this.now();\n if (this.cache && this.cache.expiresAt > now) {\n return this.cache.relays.map((relay) => ({ ...relay }));\n }\n\n const relays = (await this.registryClient.listRelays({ activeOnly: true })).map((relay) => ({ ...relay }));\n this.cache = {\n relays,\n expiresAt: now + this.cacheTtlMs,\n };\n return relays.map((relay) => ({ ...relay }));\n }\n}\n\nfunction scoreRelay(relay: RelayNode, region: string | undefined, heartbeatFreshnessMs: number, now: number): number {\n const feeScore = Math.max(0, 1 - relay.routingFeeBps / 10_000);\n const regionScore = scoreRegion(relay.region, region);\n const stakeScore = scoreStake(relay.stakeAmountMist ?? 0n);\n const freshnessScore = scoreHeartbeat(relay.heartbeatAgeMs ?? Math.max(now - relay.lastHeartbeat, 0), heartbeatFreshnessMs);\n\n return feeScore * 0.35 + regionScore * 0.25 + stakeScore * 0.2 + freshnessScore * 0.2;\n}\n\nfunction scoreRegion(relayRegion: string, desiredRegion: string | undefined): number {\n if (!desiredRegion) {\n return 0.5;\n }\n\n const normalizedRelayRegion = relayRegion.trim().toLowerCase();\n const normalizedDesiredRegion = desiredRegion.trim().toLowerCase();\n if (normalizedRelayRegion === normalizedDesiredRegion) {\n return 1;\n }\n\n const relayPrefix = normalizedRelayRegion.split(/[-_\\s]/)[0];\n const desiredPrefix = normalizedDesiredRegion.split(/[-_\\s]/)[0];\n return relayPrefix && relayPrefix === desiredPrefix ? 0.65 : 0;\n}\n\nfunction scoreStake(stakeAmountMist: bigint): number {\n const capped = stakeAmountMist > 1_000_000_000_000n ? 1_000_000_000_000n : stakeAmountMist;\n return Number(capped) / Number(1_000_000_000_000n);\n}\n\nfunction scoreHeartbeat(heartbeatAgeMs: number, heartbeatFreshnessMs: number): number {\n if (heartbeatAgeMs <= heartbeatFreshnessMs) {\n return 1;\n }\n if (heartbeatAgeMs >= heartbeatFreshnessMs * 4) {\n return 0;\n }\n return 1 - (heartbeatAgeMs - heartbeatFreshnessMs) / (heartbeatFreshnessMs * 3);\n}\n","import Database from 'better-sqlite3';\n\nimport type { PaymentRail, SpendingPolicy } from '@hivemind-os/collective-types';\n\nexport interface SpendingPolicyDecision {\n approved: boolean;\n reason?: string;\n}\n\nexport interface SpendingPolicyConfig extends SpendingPolicy {\n perApp?: Record<string, { limits: SpendingPolicy['limits'] }>;\n}\n\ninterface SpendingLogRow {\n total: bigint | number | null;\n}\n\ninterface SpendingLogColumn {\n name: string;\n}\n\ninterface SpendingAmount {\n amount?: bigint;\n amountMist?: bigint;\n currency?: string;\n}\n\nexport interface SpendingLogEntry {\n id: number;\n amountBaseUnits: bigint;\n rail: PaymentRail;\n currency?: string;\n taskId?: string;\n appId?: string;\n timestamp: number;\n}\n\nexport class SpendingPolicyEngine {\n private readonly db: Database.Database;\n private policy: SpendingPolicyConfig;\n\n constructor(params: { policy: SpendingPolicyConfig; dbPath: string }) {\n this.policy = params.policy;\n this.db = new Database(params.dbPath);\n this.db.defaultSafeIntegers(true);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS spending_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n amount_base_units INTEGER NOT NULL,\n rail TEXT NOT NULL,\n currency TEXT,\n task_id TEXT,\n app_id TEXT,\n timestamp INTEGER NOT NULL\n );\n `);\n this.migrateSpendingLogSchema();\n }\n\n evaluate(request: SpendingAmount & { rail: PaymentRail; appId?: string; originAppName?: string }): SpendingPolicyDecision {\n const amount = resolveAmount(request);\n const normalizedCurrency = normalizeCurrency(request.currency);\n const originAppName = request.originAppName;\n const normalizedRequest = {\n amount,\n currency: normalizedCurrency,\n rail: request.rail,\n appId: request.appId,\n };\n const perAppPolicy = originAppName ? this.policy.perApp?.[originAppName] : undefined;\n if (perAppPolicy) {\n const perAppDecision = this.evaluateLimits(perAppPolicy.limits, normalizedRequest, originAppName);\n if (!perAppDecision.approved) {\n return perAppDecision;\n }\n }\n\n if (this.policy.denylist?.includes(request.appId ?? '')) {\n return { approved: false, reason: 'App is denylisted.' };\n }\n\n if (this.policy.allowlist && !this.policy.allowlist.includes(request.appId ?? '')) {\n return { approved: false, reason: 'App is not allowlisted.' };\n }\n\n if (this.policy.requireConfirmationAbove !== undefined && amount > this.policy.requireConfirmationAbove) {\n return { approved: false, reason: 'Amount requires confirmation.' };\n }\n\n return this.evaluateLimits(this.policy.limits, normalizedRequest);\n }\n\n record(entry: SpendingAmount & { rail: PaymentRail; taskId: string; appId?: string; originAppName?: string }): void {\n const amount = resolveAmount(entry);\n this.db\n .prepare(\n `INSERT INTO spending_log (amount_base_units, rail, currency, task_id, app_id, timestamp)\n VALUES (?, ?, ?, ?, ?, ?)`,\n )\n .run(\n amount,\n entry.rail,\n normalizeCurrency(entry.currency) ?? null,\n entry.taskId,\n entry.originAppName ?? entry.appId ?? null,\n Date.now(),\n );\n }\n\n getSpent(interval: 'hour' | 'day' | 'month', rail?: PaymentRail, appId?: string, currency?: string): bigint {\n return this.getSpentForLimit(interval, rail, appId, normalizeCurrency(currency));\n }\n\n /** Return the most recent spending log entries, newest first. */\n getRecentEntries(limit = 50): SpendingLogEntry[] {\n const rows = this.db\n .prepare(\n `SELECT id, amount_base_units, rail, currency, task_id, app_id, timestamp\n FROM spending_log ORDER BY timestamp DESC LIMIT ?`,\n )\n .all(limit) as Array<{\n id: number;\n amount_base_units: bigint;\n rail: string;\n currency: string | null;\n task_id: string | null;\n app_id: string | null;\n timestamp: bigint;\n }>;\n return rows.map((row) => ({\n id: row.id,\n amountBaseUnits: row.amount_base_units,\n rail: row.rail as PaymentRail,\n currency: row.currency ?? undefined,\n taskId: row.task_id ?? undefined,\n appId: row.app_id ?? undefined,\n timestamp: Number(row.timestamp),\n }));\n }\n\n updatePolicy(policy: SpendingPolicyConfig): void {\n this.policy = policy;\n }\n\n close(): void {\n this.db.close();\n }\n\n private evaluateLimits(\n limits: SpendingPolicy['limits'],\n request: {\n amount: bigint;\n currency?: string;\n rail: PaymentRail;\n appId?: string;\n },\n appScope?: string,\n ): SpendingPolicyDecision {\n for (const limit of limits) {\n if (limit.rail && limit.rail !== request.rail) {\n continue;\n }\n\n const limitCurrency = normalizeCurrency(limit.currency);\n if (limitCurrency && limitCurrency !== request.currency) {\n continue;\n }\n\n const scope = appScope ?? limit.scope;\n if (!appScope && limit.scope && limit.scope !== request.appId) {\n continue;\n }\n\n if (limit.interval === 'transaction' && request.amount > limit.amount) {\n return { approved: false, reason: `Transaction limit exceeded for ${limit.interval}.` };\n }\n\n if (limit.interval === 'transaction') {\n continue;\n }\n\n const spent = this.getSpentForLimit(limit.interval, limit.rail ?? request.rail, scope, limitCurrency ?? request.currency);\n if (spent + request.amount > limit.amount) {\n return { approved: false, reason: `Spending limit exceeded for ${limit.interval}.` };\n }\n }\n\n return { approved: true };\n }\n\n private getSpentForLimit(\n interval: 'hour' | 'day' | 'month' | 'lifetime',\n rail?: PaymentRail,\n scope?: string,\n currency?: string,\n ): bigint {\n const startTime = interval === 'lifetime' ? 0 : getIntervalStart(interval);\n let query = 'SELECT COALESCE(SUM(amount_base_units), 0) AS total FROM spending_log WHERE timestamp >= ?';\n const params: Array<bigint | number | string> = [startTime];\n\n if (rail) {\n query += ' AND rail = ?';\n params.push(rail);\n }\n\n if (scope) {\n query += ' AND app_id = ?';\n params.push(scope);\n }\n\n if (currency) {\n query += ' AND currency = ?';\n params.push(currency);\n }\n\n const row = this.db.prepare(query).get(...params) as SpendingLogRow | undefined;\n const total = row?.total ?? 0n;\n return typeof total === 'bigint' ? total : BigInt(total);\n }\n\n private migrateSpendingLogSchema(): void {\n const columns = this.db.prepare('PRAGMA table_info(spending_log)').all() as SpendingLogColumn[];\n const columnNames = new Set(columns.map((column) => column.name));\n\n if (columnNames.has('amount_mist') && !columnNames.has('amount_base_units')) {\n this.db.exec('ALTER TABLE spending_log RENAME COLUMN amount_mist TO amount_base_units');\n }\n\n if (!columnNames.has('currency')) {\n this.db.exec('ALTER TABLE spending_log ADD COLUMN currency TEXT');\n }\n }\n}\n\nfunction getIntervalStart(interval: 'hour' | 'day' | 'month'): number {\n const now = new Date(Date.now());\n\n if (interval === 'hour') {\n now.setMinutes(0, 0, 0);\n return now.getTime();\n }\n\n if (interval === 'day') {\n now.setHours(0, 0, 0, 0);\n return now.getTime();\n }\n\n now.setDate(1);\n now.setHours(0, 0, 0, 0);\n return now.getTime();\n}\n\nfunction resolveAmount(value: SpendingAmount): bigint {\n if (value.amount !== undefined && value.amountMist !== undefined && value.amount !== value.amountMist) {\n throw new Error('amount and amountMist must match when both are provided.');\n }\n\n if (value.amount !== undefined) {\n return value.amount;\n }\n\n if (value.amountMist !== undefined) {\n return value.amountMist;\n }\n\n throw new Error('A spending amount is required.');\n}\n\nfunction normalizeCurrency(value: string | undefined): string | undefined {\n return value?.trim() ? value.trim().toUpperCase() : undefined;\n}\n","import { encodePaymentSignatureHeader, decodePaymentRequiredHeader } from '@x402/core/http';\nimport type { PaymentRequirements } from '@x402/core/types';\nimport { ExactEvmScheme } from '@x402/evm/exact/client';\nimport { getAddress, verifyTypedData } from 'viem';\n\nimport { PERMIT2_ADDRESS, USDC_ADDRESS } from '../evm/constants.js';\nimport type { EvmWallet } from '../evm/wallet.js';\n\nconst X402_TYPED_DATA_TYPES = {\n PaymentAuthorization: [\n { name: 'payerAddress', type: 'address' },\n { name: 'paymentAddress', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'currency', type: 'string' },\n { name: 'nonce', type: 'string' },\n { name: 'expiresAt', type: 'uint256' },\n ],\n} as const;\n\ntype InternalX402PaymentRequest = X402PaymentRequest & {\n __x402?: {\n x402Version: number;\n requirements: PaymentRequirements;\n };\n};\n\nexport interface X402PaymentRequest {\n paymentAddress: string;\n amount: string;\n currency: string;\n network: string;\n nonce: string;\n expiresAt: number;\n}\n\nexport interface X402PaymentSignature {\n signature: string;\n payerAddress: string;\n network: string;\n nonce: string;\n}\n\nexport class X402Client {\n constructor(private readonly wallet: EvmWallet) {}\n\n parse402Response(headers: Record<string, string>, body?: unknown): X402PaymentRequest {\n const normalizedHeaders = normalizeHeaders(headers);\n const paymentRequiredHeader = normalizedHeaders['payment-required'];\n\n if (paymentRequiredHeader) {\n const paymentRequired = decodePaymentRequiredHeader(paymentRequiredHeader);\n const requirements = selectRequirement(paymentRequired.accepts, this.wallet.chain.id);\n const request: InternalX402PaymentRequest = {\n paymentAddress: requirements.payTo,\n amount: requirements.amount,\n currency: inferCurrency(requirements),\n network: normalizeNetwork(requirements.network),\n nonce: readString(requirements.extra?.nonce) ?? '',\n expiresAt: readPositiveNumber(requirements.extra?.expiresAt) ?? Date.now() + requirements.maxTimeoutSeconds * 1_000,\n __x402: {\n x402Version: paymentRequired.x402Version,\n requirements,\n },\n };\n\n return request;\n }\n\n const payload = extractBodyPayload(body);\n const paymentAddress = readString(payload.paymentAddress) ?? normalizedHeaders['payment-address'];\n const amount = readString(payload.amount) ?? normalizedHeaders['payment-amount'];\n const currency = readString(payload.currency) ?? normalizedHeaders['payment-currency'];\n const network = readString(payload.network) ?? normalizedHeaders['payment-network'];\n const nonce = readString(payload.nonce) ?? normalizedHeaders['payment-nonce'];\n const expiresAt = readPositiveNumber(payload.expiresAt ?? normalizedHeaders['payment-expires-at']);\n\n if (!paymentAddress || !amount || !currency || !network || !nonce || expiresAt === undefined) {\n throw new Error('402 response did not contain a supported payment challenge.');\n }\n\n return {\n paymentAddress,\n amount,\n currency,\n network: normalizeNetwork(network),\n nonce,\n expiresAt,\n };\n }\n\n async signPayment(request: X402PaymentRequest): Promise<X402PaymentSignature> {\n assertNotExpired(request);\n assertWalletMatchesNetwork(this.wallet.chain.id, request.network);\n\n const signature = await this.wallet.signTypedData(buildTypedData(request, this.wallet.address));\n\n return {\n signature,\n payerAddress: this.wallet.address,\n network: normalizeNetwork(request.network),\n nonce: request.nonce,\n };\n }\n\n async createPaymentHeader(request: X402PaymentRequest): Promise<string> {\n const internalRequest = request as InternalX402PaymentRequest;\n if (internalRequest.__x402) {\n const scheme = new ExactEvmScheme({\n address: this.wallet.address as `0x${string}`,\n signTypedData: (message) => this.wallet.signTypedData(message) as Promise<`0x${string}`>,\n readContract: (args) => this.wallet.getPublicClient().readContract(args),\n });\n const { x402Version, requirements } = internalRequest.__x402;\n const result = await scheme.createPaymentPayload(x402Version, requirements);\n\n return encodePaymentSignatureHeader({\n x402Version: result.x402Version,\n accepted: requirements,\n payload: result.payload,\n extensions: result.extensions,\n });\n }\n\n const signature = await this.signPayment(request);\n return Buffer.from(JSON.stringify(signature)).toString('base64');\n }\n\n async verifyPayment(signature: X402PaymentSignature, request: X402PaymentRequest): Promise<boolean> {\n if (Date.now() > request.expiresAt) {\n return false;\n }\n\n if (normalizeNetwork(signature.network) !== normalizeNetwork(request.network) || signature.nonce !== request.nonce) {\n return false;\n }\n\n try {\n return await verifyTypedData({\n address: normalizeAddress(signature.payerAddress),\n ...buildTypedData(request, signature.payerAddress),\n signature: signature.signature as `0x${string}`,\n });\n } catch {\n return false;\n }\n }\n}\n\nfunction buildTypedData(request: X402PaymentRequest, payerAddress: string) {\n return {\n domain: {\n name: 'AgenticMeshX402',\n version: '1',\n chainId: getChainId(request.network),\n verifyingContract: normalizeAddress(request.paymentAddress),\n },\n types: X402_TYPED_DATA_TYPES,\n primaryType: 'PaymentAuthorization' as const,\n message: {\n payerAddress: normalizeAddress(payerAddress),\n paymentAddress: normalizeAddress(request.paymentAddress),\n amount: BigInt(request.amount),\n currency: request.currency,\n nonce: request.nonce,\n expiresAt: BigInt(request.expiresAt),\n },\n };\n}\n\nfunction normalizeHeaders(headers: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value]));\n}\n\nfunction extractBodyPayload(body: unknown): Record<string, unknown> {\n if (!body || typeof body !== 'object') {\n return {};\n }\n\n const record = body as Record<string, unknown>;\n if (record.payment && typeof record.payment === 'object') {\n return record.payment as Record<string, unknown>;\n }\n\n if (record.paymentRequest && typeof record.paymentRequest === 'object') {\n return record.paymentRequest as Record<string, unknown>;\n }\n\n return record;\n}\n\nfunction selectRequirement(\n accepts: PaymentRequirements | PaymentRequirements[],\n chainId: number,\n): PaymentRequirements {\n const requirements = Array.isArray(accepts) ? accepts : [accepts];\n const preferredNetwork = chainIdToNetwork(chainId);\n return requirements.find((entry) => normalizeNetwork(entry.network) === preferredNetwork) ?? requirements[0]!;\n}\n\nfunction inferCurrency(requirements: PaymentRequirements): string {\n const explicit = readString(requirements.extra?.currency) ?? readString(requirements.extra?.symbol);\n if (explicit) {\n return explicit.toUpperCase();\n }\n\n const network = normalizeNetwork(requirements.network);\n const usdcAddress = network in USDC_ADDRESS ? USDC_ADDRESS[network as keyof typeof USDC_ADDRESS] : undefined;\n if (usdcAddress && normalizeAddress(requirements.asset) === normalizeAddress(usdcAddress)) {\n return 'USDC';\n }\n\n if (normalizeAddress(requirements.asset) === normalizeAddress(PERMIT2_ADDRESS)) {\n return 'ETH';\n }\n\n return requirements.asset;\n}\n\nfunction normalizeNetwork(network: string): string {\n const normalized = network.trim().toLowerCase();\n switch (normalized) {\n case 'base':\n case 'eip155:8453':\n return 'base';\n case 'base-sepolia':\n case 'eip155:84532':\n return 'base-sepolia';\n case 'localhost':\n case 'anvil':\n case 'eip155:31337':\n return 'localhost';\n default:\n return normalized;\n }\n}\n\nfunction chainIdToNetwork(chainId: number): string {\n switch (chainId) {\n case 8453:\n return 'base';\n case 84_532:\n return 'base-sepolia';\n case 31_337:\n return 'localhost';\n default:\n return `eip155:${chainId}`;\n }\n}\n\nfunction getChainId(network: string): number {\n switch (normalizeNetwork(network)) {\n case 'base':\n return 8453;\n case 'base-sepolia':\n return 84_532;\n case 'localhost':\n return 31_337;\n default:\n throw new Error(`Unsupported x402 network: ${network}`);\n }\n}\n\nfunction assertNotExpired(request: X402PaymentRequest): void {\n if (Date.now() > request.expiresAt) {\n throw new Error('Payment challenge has expired.');\n }\n}\n\nfunction assertWalletMatchesNetwork(chainId: number, network: string): void {\n const walletNetwork = chainIdToNetwork(chainId);\n const requestNetwork = normalizeNetwork(network);\n if (walletNetwork !== requestNetwork) {\n throw new Error(`Wallet network ${walletNetwork} does not match payment network ${requestNetwork}.`);\n }\n}\n\nfunction normalizeAddress(address: string): `0x${string}` {\n return getAddress(address);\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction readPositiveNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value >= 0) {\n return value;\n }\n\n if (typeof value === 'string' && /^\\d+$/.test(value.trim())) {\n return Number(value.trim());\n }\n\n return undefined;\n}\n","import { createHash } from 'node:crypto';\n\nimport type { ReputationEvent } from '@hivemind-os/collective-types';\n\nimport { serializeReputationEvent } from './serialization.js';\n\nexport function buildMerkleTree(events: ReputationEvent[]): {\n root: Uint8Array;\n proof: (index: number) => Uint8Array[];\n} {\n if (events.length === 0) {\n throw new Error('Cannot build a Merkle tree from an empty event set.');\n }\n\n const leaves = events.map((event) => hash(serializeReputationEvent(event)));\n const levels: Uint8Array[][] = [leaves];\n\n while (levels[levels.length - 1]!.length > 1) {\n const current = levels[levels.length - 1]!;\n const next: Uint8Array[] = [];\n for (let index = 0; index < current.length; index += 2) {\n const left = current[index]!;\n const right = current[index + 1] ?? left;\n next.push(hash(concat(left, right)));\n }\n levels.push(next);\n }\n\n return {\n root: levels[levels.length - 1]![0]!,\n proof: (index: number) => createProof(levels, index),\n };\n}\n\nexport function verifyMerkleProof(\n event: ReputationEvent,\n proof: Uint8Array[],\n root: Uint8Array,\n index: number,\n): boolean {\n let computed = hash(serializeReputationEvent(event));\n let offset = index;\n\n for (const sibling of proof) {\n computed = offset % 2 === 0 ? hash(concat(computed, sibling)) : hash(concat(sibling, computed));\n offset = Math.floor(offset / 2);\n }\n\n return Buffer.from(computed).equals(Buffer.from(root));\n}\n\nfunction createProof(levels: Uint8Array[][], index: number): Uint8Array[] {\n const leaves = levels[0] ?? [];\n if (!Number.isInteger(index) || index < 0 || index >= leaves.length) {\n throw new Error(`Merkle proof index ${index} is out of range.`);\n }\n\n const proof: Uint8Array[] = [];\n let offset = index;\n for (let level = 0; level < levels.length - 1; level += 1) {\n const nodes = levels[level]!;\n const siblingIndex = offset % 2 === 0 ? offset + 1 : offset - 1;\n proof.push(nodes[siblingIndex] ?? nodes[offset]!);\n offset = Math.floor(offset / 2);\n }\n\n return proof;\n}\n\nfunction hash(data: Uint8Array): Uint8Array {\n return createHash('sha256').update(data).digest();\n}\n\nfunction concat(left: Uint8Array, right: Uint8Array): Uint8Array {\n const combined = new Uint8Array(left.length + right.length);\n combined.set(left, 0);\n combined.set(right, left.length);\n return combined;\n}\n","import type { ReputationEvent } from '@hivemind-os/collective-types';\n\nconst encoder = new TextEncoder();\n\nexport type UnsignedReputationEvent = Omit<ReputationEvent, 'signature'>;\n\nexport function serializeReputationEventPayload(event: UnsignedReputationEvent): Uint8Array {\n return encoder.encode(JSON.stringify(toSerializableUnsignedEvent(event)));\n}\n\nexport function serializeReputationEvent(event: ReputationEvent): Uint8Array {\n return encoder.encode(JSON.stringify(toSerializableEvent(event)));\n}\n\nfunction toSerializableUnsignedEvent(event: UnsignedReputationEvent): Record<string, unknown> {\n return {\n eventId: event.eventId,\n type: event.type,\n subject: event.subject,\n author: event.author,\n taskId: event.taskId,\n outcome: event.outcome,\n rating: event.rating,\n capability: event.capability,\n paymentAmount: event.paymentAmount,\n latencyMs: event.latencyMs,\n timestamp: event.timestamp,\n nonce: event.nonce,\n };\n}\n\nfunction toSerializableEvent(event: ReputationEvent): Record<string, unknown> {\n return {\n ...toSerializableUnsignedEvent(event),\n signature: event.signature,\n };\n}\n","import type { ReputationAnchor, ReputationEvent } from '@hivemind-os/collective-types';\nimport type { Signer } from '@mysten/sui/cryptography';\n\nimport type { BlobStore } from '../blobstore/interface.js';\nimport { bytesToHex, bytesToString } from '../internal/parsing.js';\nimport { MeshSuiClient } from '../sui/client.js';\nimport { buildPublishReputationAnchorTx } from '../sui/tx-helpers.js';\n\nimport { buildMerkleTree } from './merkle.js';\n\nexport interface ContractConfig {\n packageId: string;\n}\n\nexport class ReputationAnchorClient {\n constructor(\n private readonly suiClient: MeshSuiClient,\n private readonly config: ContractConfig,\n ) {}\n\n async publishAnchor(\n events: ReputationEvent[],\n blobStore: BlobStore,\n signer: Signer,\n ): Promise<{ anchorId: string; merkleRoot: string; txDigest: string }> {\n if (events.length === 0) {\n throw new Error('At least one reputation event is required to publish an anchor.');\n }\n\n const { root } = buildMerkleTree(events);\n const stored = await blobStore.store(new TextEncoder().encode(JSON.stringify(events)));\n const timestamps = events.map((event) => Date.parse(event.timestamp)).filter(Number.isFinite);\n const tx = buildPublishReputationAnchorTx({\n packageId: this.config.packageId,\n merkleRoot: [...root],\n eventCount: events.length,\n blobId: stored.blobId,\n fromTimestamp: timestamps.length > 0 ? Math.min(...timestamps) : 0,\n toTimestamp: timestamps.length > 0 ? Math.max(...timestamps) : 0,\n });\n const response = await this.suiClient.executeTransaction(tx, signer);\n const anchorId = extractObjectId(response.objectChanges, /::reputation::ReputationAnchor$/);\n if (!anchorId) {\n throw new Error('Unable to determine reputation anchor id from transaction response.');\n }\n\n return {\n anchorId,\n merkleRoot: Buffer.from(root).toString('hex'),\n txDigest: response.digest,\n };\n }\n\n async getAnchors(author?: string, limit = 20): Promise<ReputationAnchor[]> {\n const eventType = `${this.config.packageId}::reputation::AnchorPublished`;\n const anchors: ReputationAnchor[] = [];\n let cursor = null;\n\n do {\n const page = await this.suiClient.queryEvents(eventType, cursor, Math.max(limit * 2, 20));\n const candidates = page.events.filter((event) => {\n const payload = event.parsedJson as { author?: string } | null | undefined;\n return !author || payload?.author === author;\n });\n const fetched = await Promise.all(candidates.map((event) => this.fetchAnchor(asString((event.parsedJson as { anchor_id?: string })?.anchor_id))));\n anchors.push(...fetched.filter((anchor): anchor is ReputationAnchor => Boolean(anchor)));\n if (anchors.length >= limit) {\n return anchors.slice(0, limit);\n }\n cursor = page.nextCursor;\n if (!page.hasMore) {\n break;\n }\n } while (cursor);\n\n return anchors.slice(0, limit);\n }\n\n private async fetchAnchor(anchorId: string): Promise<ReputationAnchor | null> {\n if (!anchorId) {\n return null;\n }\n\n try {\n const object = await this.suiClient.getObject<Record<string, unknown>>(anchorId);\n return {\n anchorId,\n author: asString(object.author),\n merkleRoot: bytesToHex(asBytes(object.merkle_root)),\n eventCount: Number(object.event_count ?? 0),\n blobId: bytesToString(object.blob_id),\n fromTimestamp: Number(object.from_timestamp ?? 0),\n toTimestamp: Number(object.to_timestamp ?? 0),\n };\n } catch {\n return null;\n }\n }\n}\n\nfunction extractObjectId(\n objectChanges: Array<Record<string, unknown>> | null | undefined,\n objectTypePattern: RegExp,\n): string | undefined {\n return objectChanges?.find(\n (change) =>\n (change.type === 'created' || change.type === 'transferred' || change.type === 'mutated') &&\n typeof change.objectType === 'string' &&\n objectTypePattern.test(change.objectType) &&\n typeof change.objectId === 'string',\n )?.objectId as string | undefined;\n}\n\nfunction asString(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction asBytes(value: unknown): Uint8Array {\n if (value instanceof Uint8Array) {\n return value;\n }\n if (Array.isArray(value) && value.every((entry) => typeof entry === 'number')) {\n return new Uint8Array(value);\n }\n return new Uint8Array();\n}\n","import { randomBytes, randomUUID } from 'node:crypto';\n\nimport type { ReputationEvent, ReputationEventType } from '@hivemind-os/collective-types';\n\nimport type { AuthProvider } from '../auth/types.js';\nimport type { BlobStore } from '../blobstore/interface.js';\n\nimport { serializeReputationEvent, serializeReputationEventPayload } from './serialization.js';\nimport { assertValidReputationEvent } from './validation.js';\n\nconst decoder = new TextDecoder();\n\nexport class ReputationEventPublisher {\n constructor(\n private readonly blobStore: BlobStore,\n private readonly identity: AuthProvider,\n ) {}\n\n async createEvent(params: {\n type: ReputationEventType;\n subject: string;\n taskId: string;\n outcome: string;\n capability: string;\n rating?: number;\n latencyMs?: number;\n paymentAmount?: { amount: string; currency: string };\n }): Promise<ReputationEvent> {\n const unsignedEvent = {\n eventId: `rep_evt_${randomUUID().replace(/-/g, '')}`,\n type: params.type,\n subject: params.subject,\n author: this.identity.getDID(),\n taskId: params.taskId,\n outcome: normalizeOutcome(params.outcome),\n rating: params.rating,\n capability: params.capability,\n paymentAmount: params.paymentAmount,\n latencyMs: params.latencyMs,\n timestamp: new Date().toISOString(),\n nonce: randomBytes(16).toString('hex'),\n } satisfies Omit<ReputationEvent, 'signature'>;\n\n const signed = await this.identity.signPersonalMessage(serializeReputationEventPayload(unsignedEvent));\n return assertValidReputationEvent({\n ...unsignedEvent,\n signature: decoder.decode(signed.signature),\n });\n }\n\n async publishEvent(event: ReputationEvent): Promise<void> {\n await this.blobStore.store(serializeReputationEvent(event));\n }\n}\n\nfunction normalizeOutcome(outcome: string): ReputationEvent['outcome'] {\n switch (outcome) {\n case 'success':\n case 'failure':\n case 'timeout':\n case 'cancelled':\n case 'disputed':\n return outcome;\n default:\n throw new Error(`Unsupported reputation outcome: ${outcome}`);\n }\n}\n","import type { ReputationEvent, ReputationEventType } from '@hivemind-os/collective-types';\n\nconst EVENT_TYPES = new Set<ReputationEventType>([\n 'task_completion',\n 'task_failure',\n 'task_timeout',\n 'task_cancellation',\n 'dispute_opened',\n 'dispute_resolved',\n 'payment_confirmed',\n]);\n\nconst OUTCOMES = new Set<ReputationEvent['outcome']>([\n 'success',\n 'failure',\n 'timeout',\n 'cancelled',\n 'disputed',\n]);\n\nexport function assertValidReputationEvent(event: ReputationEvent): ReputationEvent {\n return parseReputationEvent(event);\n}\n\nexport function parseReputationEvent(value: unknown): ReputationEvent {\n if (!isRecord(value)) {\n throw new Error('Reputation event must be an object.');\n }\n\n const event = {\n eventId: parseRequiredString(value.eventId, 'eventId'),\n type: parseEventType(value.type),\n subject: parseDid(value.subject, 'subject'),\n author: parseDid(value.author, 'author'),\n taskId: parseRequiredString(value.taskId, 'taskId'),\n outcome: parseOutcome(value.outcome),\n rating: parseOptionalRating(value.rating),\n capability: parseRequiredString(value.capability, 'capability'),\n paymentAmount: parseOptionalPaymentAmount(value.paymentAmount),\n latencyMs: parseOptionalLatencyMs(value.latencyMs),\n timestamp: parseTimestamp(value.timestamp),\n nonce: parseRequiredString(value.nonce, 'nonce'),\n signature: parseRequiredString(value.signature, 'signature'),\n } satisfies ReputationEvent;\n\n if (event.subject === event.author) {\n throw new Error('Reputation event subject must differ from author.');\n }\n\n return event;\n}\n\nfunction parseEventType(value: unknown): ReputationEventType {\n if (typeof value === 'string' && EVENT_TYPES.has(value as ReputationEventType)) {\n return value as ReputationEventType;\n }\n throw new Error(`Unsupported reputation event type: ${String(value)}`);\n}\n\nfunction parseOutcome(value: unknown): ReputationEvent['outcome'] {\n if (typeof value === 'string' && OUTCOMES.has(value as ReputationEvent['outcome'])) {\n return value as ReputationEvent['outcome'];\n }\n throw new Error(`Unsupported reputation outcome: ${String(value)}`);\n}\n\nfunction parseDid(value: unknown, field: string): string {\n const did = parseRequiredString(value, field);\n if (!did.startsWith('did:mesh:') || did.length <= 'did:mesh:'.length) {\n throw new Error(`${field} must be a valid did:mesh identifier.`);\n }\n return did;\n}\n\nfunction parseRequiredString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new Error(`${field} must be a string.`);\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n return trimmed;\n}\n\nfunction parseOptionalRating(value: unknown): number | undefined {\n if (value == null) {\n return undefined;\n }\n if (!Number.isSafeInteger(value) || (value as number) < 1 || (value as number) > 5) {\n throw new Error('rating must be an integer between 1 and 5.');\n }\n return value as number;\n}\n\nfunction parseOptionalLatencyMs(value: unknown): number | undefined {\n if (value == null) {\n return undefined;\n }\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n throw new Error('latencyMs must be a non-negative safe integer.');\n }\n return value as number;\n}\n\nfunction parseOptionalPaymentAmount(value: unknown): ReputationEvent['paymentAmount'] {\n if (value == null) {\n return undefined;\n }\n if (!isRecord(value)) {\n throw new Error('paymentAmount must be an object when provided.');\n }\n\n const amount = parseRequiredString(value.amount, 'paymentAmount.amount');\n if (!/^\\d+$/.test(amount)) {\n throw new Error('paymentAmount.amount must be a non-negative integer string.');\n }\n\n return {\n amount,\n currency: parseRequiredString(value.currency, 'paymentAmount.currency'),\n };\n}\n\nfunction parseTimestamp(value: unknown): string {\n const timestamp = parseRequiredString(value, 'timestamp');\n if (!Number.isFinite(Date.parse(timestamp))) {\n throw new Error('timestamp must be a valid ISO-8601 string.');\n }\n return timestamp;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n","import Database from 'better-sqlite3';\n\nimport type { ReputationEvent } from '@hivemind-os/collective-types';\n\nimport { assertValidReputationEvent, parseReputationEvent } from './validation.js';\n\ninterface ReputationEventRow {\n payload_json: string;\n}\n\nexport class ReputationStore {\n private readonly db: Database.Database;\n\n constructor(dbPath: string) {\n this.db = new Database(dbPath);\n this.db.defaultSafeIntegers(true);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS reputation_events (\n event_id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n subject TEXT NOT NULL,\n author TEXT NOT NULL,\n task_id TEXT NOT NULL,\n outcome TEXT NOT NULL,\n rating INTEGER,\n capability TEXT NOT NULL,\n payment_amount TEXT,\n payment_currency TEXT,\n latency_ms INTEGER,\n timestamp TEXT NOT NULL,\n timestamp_ms INTEGER NOT NULL,\n nonce TEXT NOT NULL,\n signature TEXT NOT NULL,\n payload_json TEXT NOT NULL,\n anchor_id TEXT,\n anchored_at INTEGER,\n created_at INTEGER NOT NULL\n );\n CREATE INDEX IF NOT EXISTS reputation_events_subject_idx ON reputation_events (subject, timestamp_ms DESC);\n CREATE INDEX IF NOT EXISTS reputation_events_author_idx ON reputation_events (author, timestamp_ms DESC);\n CREATE INDEX IF NOT EXISTS reputation_events_anchor_idx ON reputation_events (anchor_id);\n `);\n }\n\n async addEvent(event: ReputationEvent): Promise<void> {\n const validated = assertValidReputationEvent(event);\n this.db\n .prepare(\n `INSERT OR REPLACE INTO reputation_events (\n event_id, type, subject, author, task_id, outcome, rating, capability,\n payment_amount, payment_currency, latency_ms, timestamp, timestamp_ms,\n nonce, signature, payload_json, anchor_id, anchored_at, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, COALESCE((SELECT anchor_id FROM reputation_events WHERE event_id = ?), NULL), COALESCE((SELECT anchored_at FROM reputation_events WHERE event_id = ?), NULL), ?)`\n )\n .run(\n validated.eventId,\n validated.type,\n validated.subject,\n validated.author,\n validated.taskId,\n validated.outcome,\n validated.rating ?? null,\n validated.capability,\n validated.paymentAmount?.amount ?? null,\n validated.paymentAmount?.currency ?? null,\n validated.latencyMs ?? null,\n validated.timestamp,\n toTimestampMs(validated.timestamp),\n validated.nonce,\n validated.signature,\n JSON.stringify(validated),\n validated.eventId,\n validated.eventId,\n Date.now(),\n );\n }\n\n async getEvents(options: { subject?: string; author?: string; since?: number; limit?: number }): Promise<ReputationEvent[]> {\n const clauses: string[] = [];\n const values: Array<string | number> = [];\n if (options.subject) {\n clauses.push('subject = ?');\n values.push(options.subject);\n }\n if (options.author) {\n clauses.push('author = ?');\n values.push(options.author);\n }\n if (typeof options.since === 'number') {\n clauses.push('timestamp_ms >= ?');\n values.push(Math.max(0, Math.floor(options.since)));\n }\n\n const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';\n const rows = this.db\n .prepare(`SELECT payload_json FROM reputation_events ${where} ORDER BY timestamp_ms DESC LIMIT ?`)\n .all(...values, normalizeLimit(options.limit)) as ReputationEventRow[];\n return rows\n .map((row) => parseStoredEvent(row.payload_json))\n .filter((event): event is ReputationEvent => Boolean(event));\n }\n\n async getUnanchoredEvents(limit = 100): Promise<ReputationEvent[]> {\n const rows = this.db\n .prepare('SELECT payload_json FROM reputation_events WHERE anchor_id IS NULL ORDER BY timestamp_ms ASC LIMIT ?')\n .all(normalizeLimit(limit)) as ReputationEventRow[];\n return rows\n .map((row) => parseStoredEvent(row.payload_json))\n .filter((event): event is ReputationEvent => Boolean(event));\n }\n\n async markAnchored(eventIds: string[], anchorId: string): Promise<void> {\n if (eventIds.length === 0) {\n return;\n }\n\n const placeholders = eventIds.map(() => '?').join(', ');\n this.db\n .prepare(`UPDATE reputation_events SET anchor_id = ?, anchored_at = ? WHERE event_id IN (${placeholders})`)\n .run(anchorId, Date.now(), ...eventIds);\n }\n\n async getStats(subject: string): Promise<{ completed: number; failed: number; disputed: number }> {\n const row = this.db\n .prepare(\n `SELECT\n SUM(CASE WHEN outcome = 'success' THEN 1 ELSE 0 END) AS completed,\n SUM(CASE WHEN outcome IN ('failure', 'timeout', 'cancelled') THEN 1 ELSE 0 END) AS failed,\n SUM(CASE WHEN type = 'dispute_opened' OR outcome = 'disputed' THEN 1 ELSE 0 END) AS disputed\n FROM reputation_events\n WHERE subject = ?`,\n )\n .get(subject) as { completed?: number | bigint | null; failed?: number | bigint | null; disputed?: number | bigint | null } | undefined;\n\n return {\n completed: Number(row?.completed ?? 0),\n failed: Number(row?.failed ?? 0),\n disputed: Number(row?.disputed ?? 0),\n };\n }\n\n close(): void {\n this.db.close();\n }\n}\n\nfunction normalizeLimit(limit?: number): number {\n if (typeof limit !== 'number' || Number.isNaN(limit)) {\n return 100;\n }\n return Math.max(1, Math.floor(limit));\n}\n\nfunction toTimestampMs(timestamp: string): number {\n const value = Date.parse(timestamp);\n return Number.isFinite(value) ? value : 0;\n}\n\nfunction parseStoredEvent(payloadJson: string): ReputationEvent | null {\n try {\n return parseReputationEvent(JSON.parse(payloadJson) as unknown);\n } catch {\n return null;\n }\n}\n","import { sha256 } from '@noble/hashes/sha256';\n\nimport type { HashChainProof } from '@hivemind-os/collective-types';\n\nconst encoder = new TextEncoder();\nconst DEFAULT_SEED_PREFIX = 'agentic-mesh:metering:v1';\nconst HASH_HEX_PATTERN = /^[a-f0-9]{64}$/i;\n\nexport const DEFAULT_METERING_CHUNK_SIZE = 1024;\n\nexport class HashChain {\n private currentHash: Uint8Array;\n private readonly intermediateHashes: string[] = [];\n\n constructor(private readonly seed: Uint8Array = encoder.encode(DEFAULT_SEED_PREFIX)) {\n this.currentHash = hashBytes(this.seed);\n }\n\n addUnit(data: Uint8Array): string {\n this.currentHash = hashBytes(concatBytes(this.currentHash, data));\n const hash = bytesToHex(this.currentHash);\n this.intermediateHashes.push(hash);\n return hash;\n }\n\n getRoot(): string {\n return bytesToHex(this.currentHash);\n }\n\n getProof(): HashChainProof {\n return {\n root: this.getRoot(),\n intermediateHashes: [...this.intermediateHashes],\n unitCount: this.intermediateHashes.length,\n };\n }\n\n static verifyChain(proof: HashChainProof, unitData: Uint8Array[], seed: Uint8Array = encoder.encode(DEFAULT_SEED_PREFIX)): boolean {\n if (\n proof.unitCount !== unitData.length\n || proof.intermediateHashes.length !== unitData.length\n || !HASH_HEX_PATTERN.test(proof.root)\n || proof.intermediateHashes.some((entry) => !HASH_HEX_PATTERN.test(entry))\n ) {\n return false;\n }\n\n let currentHash = hashBytes(seed);\n for (const [index, unit] of unitData.entries()) {\n currentHash = hashBytes(concatBytes(currentHash, unit));\n if (bytesToHex(currentHash) !== proof.intermediateHashes[index]) {\n return false;\n }\n }\n\n return bytesToHex(currentHash) === proof.root;\n }\n}\n\nexport function createMeteringSeed(taskId: string): Uint8Array {\n return encoder.encode(`${DEFAULT_SEED_PREFIX}:${taskId}`);\n}\n\nexport function splitIntoMeteringUnits(data: Uint8Array, chunkSize = DEFAULT_METERING_CHUNK_SIZE): Uint8Array[] {\n if (!Number.isSafeInteger(chunkSize) || chunkSize <= 0) {\n throw new Error('chunkSize must be a positive safe integer.');\n }\n\n if (data.length === 0) {\n return [];\n }\n\n const units: Uint8Array[] = [];\n for (let offset = 0; offset < data.length; offset += chunkSize) {\n units.push(data.slice(offset, Math.min(offset + chunkSize, data.length)));\n }\n\n return units;\n}\n\nfunction hashBytes(data: Uint8Array): Uint8Array {\n return sha256(data);\n}\n\nfunction concatBytes(left: Uint8Array, right: Uint8Array): Uint8Array {\n const result = new Uint8Array(left.length + right.length);\n result.set(left, 0);\n result.set(right, left.length);\n return result;\n}\n\nfunction bytesToHex(value: Uint8Array): string {\n return Buffer.from(value).toString('hex');\n}\n","import type { HashChainProof, MeteringReport } from '@hivemind-os/collective-types';\n\nimport { HashChain, createMeteringSeed } from './hash-chain.js';\n\nconst MAX_U64 = (1n << 64n) - 1n;\nconst MAX_RECORDED_UNITS = Number.MAX_SAFE_INTEGER;\n\nexport interface UsageMeterOptions {\n taskId: string;\n maxPrice: bigint;\n unitPrice?: bigint;\n seed?: Uint8Array;\n}\n\nexport class UsageMeter {\n private readonly hashChain: HashChain;\n private actualUnits = 0;\n private readonly taskId: string;\n private readonly maxPrice: bigint;\n private readonly unitPrice: bigint;\n\n constructor(options: UsageMeterOptions) {\n const taskId = options.taskId.trim();\n const maxPrice = options.maxPrice;\n const unitPrice = options.unitPrice ?? 0n;\n if (!taskId) {\n throw new Error('taskId is required.');\n }\n if (maxPrice < 0n || unitPrice < 0n) {\n throw new Error('maxPrice and unitPrice must be non-negative.');\n }\n if (maxPrice > MAX_U64 || unitPrice > MAX_U64) {\n throw new Error('maxPrice and unitPrice must fit in an unsigned 64-bit integer.');\n }\n\n this.taskId = taskId;\n this.maxPrice = maxPrice;\n this.unitPrice = unitPrice;\n this.hashChain = new HashChain(options.seed ?? createMeteringSeed(taskId));\n }\n\n recordUnit(data: Uint8Array): number {\n if (this.actualUnits >= MAX_RECORDED_UNITS) {\n throw new Error('Too many metering units recorded.');\n }\n\n this.hashChain.addUnit(data);\n this.actualUnits += 1;\n return this.actualUnits;\n }\n\n getActualUnits(): number {\n return this.actualUnits;\n }\n\n getVerificationHash(): string {\n return this.hashChain.getRoot();\n }\n\n getProof(): HashChainProof {\n return this.hashChain.getProof();\n }\n\n getCost(unitPrice = this.unitPrice): bigint {\n const uncapped = BigInt(this.actualUnits) * unitPrice;\n return uncapped > this.maxPrice ? this.maxPrice : uncapped;\n }\n\n getReport(): MeteringReport {\n const actualCost = this.getCost();\n return {\n taskId: this.taskId,\n actualUnits: this.actualUnits,\n actualCost,\n maxPrice: this.maxPrice,\n refundAmount: this.maxPrice - actualCost,\n verificationHash: this.getVerificationHash(),\n };\n }\n}\n","import Database from 'better-sqlite3';\n\nimport type { StreamingPaymentState } from '@hivemind-os/collective-types';\n\ninterface StreamRow {\n task_id: string;\n total_paid: bigint | number | string;\n max_budget: bigint | number | string;\n unit_price: bigint | number | string;\n current_unit: number | bigint;\n last_payment_timestamp: number | bigint;\n}\n\ninterface PaymentRow {\n task_id: string;\n unit_index: number | bigint;\n amount: bigint | number | string;\n timestamp: number | bigint;\n}\n\nexport interface StreamingPaymentManagerOptions {\n dbPath: string;\n now?: () => number;\n paymentProcessor?: (entry: {\n taskId: string;\n amount: bigint;\n unitIndex: number;\n totalPaid: bigint;\n timestamp: number;\n }) => Promise<void> | void;\n}\n\nexport class StreamingPaymentManager {\n private readonly db: Database.Database;\n private readonly now: () => number;\n\n constructor(private readonly options: StreamingPaymentManagerOptions) {\n this.db = new Database(options.dbPath);\n this.db.defaultSafeIntegers(true);\n this.now = options.now ?? (() => Date.now());\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS streaming_payment_state (\n task_id TEXT PRIMARY KEY,\n total_paid TEXT NOT NULL,\n max_budget TEXT NOT NULL,\n unit_price TEXT NOT NULL,\n current_unit INTEGER NOT NULL,\n last_payment_timestamp INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS streaming_payment_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL,\n unit_index INTEGER NOT NULL,\n amount TEXT NOT NULL,\n timestamp INTEGER NOT NULL\n );\n `);\n }\n\n startStream(taskId: string, maxBudget: bigint, unitPrice: bigint): StreamingPaymentState {\n taskId = normalizeTaskId(taskId);\n if (maxBudget < 0n) {\n throw new Error('maxBudget must be non-negative.');\n }\n if (unitPrice <= 0n) {\n throw new Error('unitPrice must be positive.');\n }\n\n const timestamp = this.now();\n this.db\n .prepare(\n `INSERT OR REPLACE INTO streaming_payment_state (\n task_id, total_paid, max_budget, unit_price, current_unit, last_payment_timestamp\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n )\n .run(taskId, '0', maxBudget.toString(), unitPrice.toString(), 0, timestamp);\n\n return {\n taskId,\n totalPaid: 0n,\n maxBudget,\n currentUnit: 0,\n lastPaymentTimestamp: timestamp,\n };\n }\n\n getState(taskId: string): StreamingPaymentState | null {\n const row = this.db.prepare('SELECT * FROM streaming_payment_state WHERE task_id = ?').get(normalizeTaskId(taskId)) as StreamRow | undefined;\n return row ? mapStreamRow(row) : null;\n }\n\n async payUnit(taskId: string): Promise<StreamingPaymentState> {\n taskId = normalizeTaskId(taskId);\n const row = this.requireStreamRow(taskId);\n const state = mapStreamRow(row);\n const unitPrice = toBigInt(row.unit_price);\n const remainingBudget = state.maxBudget - state.totalPaid;\n const amount = remainingBudget < unitPrice ? remainingBudget : unitPrice;\n if (amount <= 0n) {\n return state;\n }\n\n const nextState: StreamingPaymentState = {\n taskId: state.taskId,\n totalPaid: state.totalPaid + amount,\n maxBudget: state.maxBudget,\n currentUnit: state.currentUnit + 1,\n lastPaymentTimestamp: this.now(),\n };\n\n // v1 streaming uses periodic on-chain transfers recorded locally; it is not a payment channel.\n await this.options.paymentProcessor?.({\n taskId,\n amount,\n unitIndex: nextState.currentUnit,\n totalPaid: nextState.totalPaid,\n timestamp: nextState.lastPaymentTimestamp,\n });\n\n this.db.transaction(() => {\n this.db\n .prepare(\n `UPDATE streaming_payment_state\n SET total_paid = ?, current_unit = ?, last_payment_timestamp = ?\n WHERE task_id = ?`,\n )\n .run(nextState.totalPaid.toString(), nextState.currentUnit, nextState.lastPaymentTimestamp, taskId);\n this.db\n .prepare(\n `INSERT INTO streaming_payment_log (task_id, unit_index, amount, timestamp)\n VALUES (?, ?, ?, ?)`,\n )\n .run(taskId, nextState.currentUnit, amount.toString(), nextState.lastPaymentTimestamp);\n })();\n\n return nextState;\n }\n\n finalizeStream(taskId: string): { state: StreamingPaymentState; refundAmount: bigint } {\n const state = this.getState(normalizeTaskId(taskId));\n if (!state) {\n throw new Error(`Unknown stream for task ${taskId}.`);\n }\n\n return {\n state,\n refundAmount: state.maxBudget - state.totalPaid,\n };\n }\n\n getAuditTrail(taskId: string): Array<{ taskId: string; unitIndex: number; amount: bigint; timestamp: number }> {\n const rows = this.db\n .prepare('SELECT task_id, unit_index, amount, timestamp FROM streaming_payment_log WHERE task_id = ? ORDER BY id ASC')\n .all(normalizeTaskId(taskId)) as PaymentRow[];\n return rows.map((row) => ({\n taskId: row.task_id,\n unitIndex: Number(row.unit_index),\n amount: toBigInt(row.amount),\n timestamp: Number(row.timestamp),\n }));\n }\n\n close(): void {\n this.db.close();\n }\n\n private requireStreamRow(taskId: string): StreamRow {\n const row = this.db.prepare('SELECT * FROM streaming_payment_state WHERE task_id = ?').get(normalizeTaskId(taskId)) as StreamRow | undefined;\n if (!row) {\n throw new Error(`Unknown stream for task ${taskId}.`);\n }\n return row;\n }\n}\n\nfunction normalizeTaskId(taskId: string): string {\n const normalized = taskId.trim();\n if (!normalized) {\n throw new Error('taskId is required.');\n }\n return normalized;\n}\n\nfunction mapStreamRow(row: StreamRow): StreamingPaymentState {\n return {\n taskId: row.task_id,\n totalPaid: toBigInt(row.total_paid),\n maxBudget: toBigInt(row.max_budget),\n currentUnit: Number(row.current_unit),\n lastPaymentTimestamp: Number(row.last_payment_timestamp),\n };\n}\n\nfunction toBigInt(value: bigint | number | string): bigint {\n return typeof value === 'bigint' ? value : BigInt(value);\n}\n","import type { HashChainProof, Task } from '@hivemind-os/collective-types';\n\nimport { DEFAULT_METERING_CHUNK_SIZE, HashChain, createMeteringSeed, splitIntoMeteringUnits } from './hash-chain.js';\n\nconst decoder = new TextDecoder();\nconst METERED_RESULT_SCHEMA = 'agentic-mesh-metered-result/v1';\nconst BASE64_RESULT_PATTERN = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\n\nexport interface MeteredResultEnvelope {\n schema: typeof METERED_RESULT_SCHEMA;\n resultEncoding: 'base64';\n result: string;\n proof: HashChainProof;\n unitChunkSize: number;\n}\n\nexport class ResultVerifier {\n verify(task: Pick<Task, 'id' | 'verificationHash'>, proof: HashChainProof, expectedData: Uint8Array[]): boolean {\n if (!task.verificationHash) {\n return false;\n }\n\n return HashChain.verifyChain(proof, expectedData, createMeteringSeed(task.id))\n && task.verificationHash.toLowerCase() === proof.root.toLowerCase();\n }\n}\n\nexport function createMeteredResultEnvelope(\n resultData: Uint8Array,\n proof: HashChainProof,\n unitChunkSize = DEFAULT_METERING_CHUNK_SIZE,\n): MeteredResultEnvelope {\n if (!Number.isSafeInteger(unitChunkSize) || unitChunkSize <= 0) {\n throw new Error('unitChunkSize must be a positive safe integer.');\n }\n\n return {\n schema: METERED_RESULT_SCHEMA,\n resultEncoding: 'base64',\n result: Buffer.from(resultData).toString('base64'),\n proof,\n unitChunkSize,\n };\n}\n\nexport function serializeMeteredResultEnvelope(envelope: MeteredResultEnvelope): Uint8Array {\n return new TextEncoder().encode(JSON.stringify(envelope));\n}\n\nexport function parseMeteredResultEnvelope(data: Uint8Array): MeteredResultEnvelope | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(decoder.decode(data)) as unknown;\n } catch {\n return null;\n }\n\n if (!isMeteredResultEnvelope(parsed)) {\n return null;\n }\n\n return parsed;\n}\n\nexport function decodeMeteredResult(envelope: MeteredResultEnvelope): Uint8Array {\n return new Uint8Array(Buffer.from(envelope.result, 'base64'));\n}\n\nexport function getMeteredResultUnits(envelope: MeteredResultEnvelope): Uint8Array[] {\n return splitIntoMeteringUnits(decodeMeteredResult(envelope), envelope.unitChunkSize);\n}\n\nfunction isMeteredResultEnvelope(value: unknown): value is MeteredResultEnvelope {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n const unitChunkSize = candidate.unitChunkSize;\n return candidate.schema === METERED_RESULT_SCHEMA\n && candidate.resultEncoding === 'base64'\n && typeof candidate.result === 'string'\n && BASE64_RESULT_PATTERN.test(candidate.result)\n && typeof unitChunkSize === 'number'\n && Number.isSafeInteger(unitChunkSize)\n && unitChunkSize > 0\n && isHashChainProof(candidate.proof);\n}\n\nfunction isHashChainProof(value: unknown): value is HashChainProof {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n const unitCount = candidate.unitCount;\n return typeof candidate.root === 'string'\n && /^[a-f0-9]{64}$/i.test(candidate.root)\n && Array.isArray(candidate.intermediateHashes)\n && candidate.intermediateHashes.every((entry) => typeof entry === 'string' && /^[a-f0-9]{64}$/i.test(entry))\n && typeof unitCount === 'number'\n && Number.isSafeInteger(unitCount)\n && unitCount >= 0;\n}\n","export enum CircuitBreakerState {\n CLOSED = 'closed',\n OPEN = 'open',\n HALF_OPEN = 'half_open',\n}\n\ninterface ProviderCircuitState {\n state: CircuitBreakerState;\n consecutiveFailures: number;\n openedAt?: number;\n halfOpenProbeInFlight?: boolean;\n}\n\nexport interface CircuitBreakerOptions {\n failureThreshold?: number;\n recoveryTimeoutMs?: number;\n now?: () => number;\n}\n\nexport class CircuitBreaker {\n private readonly failureThreshold: number;\n private readonly recoveryTimeoutMs: number;\n private readonly now: () => number;\n private readonly states = new Map<string, ProviderCircuitState>();\n\n constructor(options: CircuitBreakerOptions = {}) {\n this.failureThreshold = Math.max(1, Math.floor(options.failureThreshold ?? 3));\n this.recoveryTimeoutMs = Math.max(0, Math.floor(options.recoveryTimeoutMs ?? 60_000));\n this.now = options.now ?? (() => Date.now());\n }\n\n recordSuccess(providerId: string): void {\n this.states.set(providerId, {\n state: CircuitBreakerState.CLOSED,\n consecutiveFailures: 0,\n halfOpenProbeInFlight: false,\n });\n }\n\n recordFailure(providerId: string): void {\n const current = this.getStateRecord(providerId);\n const nextFailures = current.state === CircuitBreakerState.HALF_OPEN ? this.failureThreshold : current.consecutiveFailures + 1;\n if (nextFailures >= this.failureThreshold) {\n this.states.set(providerId, {\n state: CircuitBreakerState.OPEN,\n consecutiveFailures: nextFailures,\n openedAt: this.now(),\n halfOpenProbeInFlight: false,\n });\n return;\n }\n\n this.states.set(providerId, {\n state: CircuitBreakerState.CLOSED,\n consecutiveFailures: nextFailures,\n halfOpenProbeInFlight: false,\n });\n }\n\n allowRequest(providerId: string): boolean {\n const current = this.getStateRecord(providerId);\n if (current.state === CircuitBreakerState.OPEN) {\n return false;\n }\n if (current.state !== CircuitBreakerState.HALF_OPEN) {\n return true;\n }\n if (current.halfOpenProbeInFlight) {\n return false;\n }\n\n this.states.set(providerId, {\n ...current,\n halfOpenProbeInFlight: true,\n });\n return true;\n }\n\n isOpen(providerId: string): boolean {\n return this.getState(providerId) === CircuitBreakerState.OPEN;\n }\n\n getState(providerId: string): CircuitBreakerState {\n return this.getStateRecord(providerId).state;\n }\n\n private getStateRecord(providerId: string): ProviderCircuitState {\n const existing = this.states.get(providerId) ?? {\n state: CircuitBreakerState.CLOSED,\n consecutiveFailures: 0,\n };\n\n if (\n existing.state === CircuitBreakerState.OPEN\n && existing.openedAt !== undefined\n && this.now() - existing.openedAt >= this.recoveryTimeoutMs\n ) {\n const recovered: ProviderCircuitState = {\n state: CircuitBreakerState.HALF_OPEN,\n consecutiveFailures: existing.consecutiveFailures,\n openedAt: existing.openedAt,\n halfOpenProbeInFlight: false,\n };\n this.states.set(providerId, recovered);\n return recovered;\n }\n\n this.states.set(providerId, existing);\n return existing;\n }\n}\n","import { AggregationMode, type MultiProviderRequest, type MultiProviderResult, type ProviderScore } from '@hivemind-os/collective-types';\n\nimport type { CircuitBreaker } from './circuit-breaker.js';\nimport type { PerformanceTracker } from './performance.js';\n\nexport interface ProviderExecutionOutput {\n value: unknown;\n aggregateValue?: unknown;\n cost?: bigint;\n}\n\nexport interface FanOutExecutorOptions {\n executeProvider: (\n provider: ProviderScore,\n request: MultiProviderRequest,\n context: { signal: AbortSignal },\n ) => Promise<ProviderExecutionOutput>;\n circuitBreaker?: Pick<CircuitBreaker, 'allowRequest' | 'recordSuccess' | 'recordFailure'>;\n performanceTracker?: Pick<PerformanceTracker, 'recordCompletion'>;\n now?: () => number;\n}\n\ninterface ExecutionOutcome {\n provider: ProviderScore;\n status: 'success' | 'failure' | 'timeout';\n durationMs: number;\n result?: ProviderExecutionOutput;\n error?: string;\n}\n\nexport class FanOutExecutor {\n private readonly now: () => number;\n\n constructor(private readonly options: FanOutExecutorOptions) {\n this.now = options.now ?? (() => Date.now());\n }\n\n async execute(request: MultiProviderRequest, providers: ProviderScore[]): Promise<MultiProviderResult> {\n const selectedProviders = providers.slice(0, Math.max(1, Math.floor(request.fanOutCount)));\n if (selectedProviders.length === 0) {\n return {\n results: [],\n totalCost: 0n,\n };\n }\n\n const controllers = new Map<string, AbortController>();\n const runPromises = selectedProviders.map((provider) => {\n const controller = new AbortController();\n controllers.set(provider.did, controller);\n return this.runProvider(provider, request, controller.signal);\n });\n\n let aggregatedResult: unknown;\n\n switch (request.aggregation) {\n case AggregationMode.FIRST_SUCCESS: {\n const firstSuccess = await this.waitForFirstSuccess(runPromises);\n if (firstSuccess) {\n aggregatedResult = firstSuccess.result?.aggregateValue ?? firstSuccess.result?.value;\n abortRemaining(controllers, firstSuccess.provider.did);\n }\n break;\n }\n case AggregationMode.MAJORITY: {\n const majority = await this.waitForMajority(runPromises, selectedProviders.length);\n if (majority) {\n aggregatedResult = majority.result?.aggregateValue ?? majority.result?.value;\n abortRemaining(controllers, majority.provider.did);\n }\n break;\n }\n case AggregationMode.ALL:\n case AggregationMode.BEST:\n default:\n break;\n }\n\n const outcomes = await Promise.all(runPromises);\n const orderedOutcomes = selectedProviders.map(\n (provider) => outcomes.find((entry) => entry.provider.did === provider.did) ?? {\n provider,\n status: 'timeout' as const,\n durationMs: 0,\n error: 'Provider execution did not complete.',\n },\n );\n\n if (request.aggregation === AggregationMode.ALL) {\n aggregatedResult = orderedOutcomes\n .filter((entry) => entry.status === 'success')\n .map((entry) => entry.result?.aggregateValue ?? entry.result?.value);\n }\n\n if (request.aggregation === AggregationMode.BEST) {\n const fastest = orderedOutcomes\n .filter((entry): entry is ExecutionOutcome & { result: ProviderExecutionOutput } => entry.status === 'success' && entry.result !== undefined)\n .sort((left, right) => left.durationMs - right.durationMs)[0];\n aggregatedResult = fastest?.result.aggregateValue ?? fastest?.result.value;\n }\n\n const totalCost = orderedOutcomes.reduce((sum, entry) => sum + (entry.status === 'success' ? entry.result?.cost ?? 0n : 0n), 0n);\n\n return {\n results: orderedOutcomes.map((entry) => ({\n provider: entry.provider.did,\n status: entry.status,\n result: entry.result?.value,\n durationMs: entry.durationMs,\n error: entry.error,\n })),\n aggregatedResult,\n totalCost,\n };\n }\n\n private async runProvider(\n provider: ProviderScore,\n request: MultiProviderRequest,\n signal: AbortSignal,\n ): Promise<ExecutionOutcome> {\n const startedAt = this.now();\n if (this.options.circuitBreaker?.allowRequest && !this.options.circuitBreaker.allowRequest(provider.did)) {\n return {\n provider,\n status: 'timeout',\n durationMs: 0,\n error: 'Provider circuit breaker is not ready to accept a probe request.',\n };\n }\n\n try {\n const result = await executeWithControls(\n this.options.executeProvider(provider, request, { signal }),\n signal,\n request.timeout,\n );\n const durationMs = this.now() - startedAt;\n this.options.circuitBreaker?.recordSuccess(provider.did);\n this.options.performanceTracker?.recordCompletion(provider.did, request.capability, durationMs, true);\n return {\n provider,\n status: 'success',\n durationMs,\n result,\n };\n } catch (error) {\n const durationMs = this.now() - startedAt;\n const status = classifyFailure(error);\n const wasCancelled = signal.aborted && status === 'timeout';\n if (!wasCancelled) {\n this.options.circuitBreaker?.recordFailure(provider.did);\n this.options.performanceTracker?.recordCompletion(provider.did, request.capability, durationMs, false);\n }\n return {\n provider,\n status,\n durationMs,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private async waitForFirstSuccess(outcomes: Array<Promise<ExecutionOutcome>>): Promise<ExecutionOutcome | undefined> {\n const pending = [...outcomes];\n while (pending.length > 0) {\n const next = await Promise.race(pending.map(async (entry, index) => ({ index, value: await entry })));\n if (next.value.status === 'success') {\n return next.value;\n }\n pending.splice(next.index, 1);\n }\n\n return undefined;\n }\n\n private async waitForMajority(outcomes: Array<Promise<ExecutionOutcome>>, totalProviders: number): Promise<ExecutionOutcome | undefined> {\n const pending = [...outcomes];\n const buckets = new Map<string, { count: number; outcome: ExecutionOutcome }>();\n const threshold = Math.floor(totalProviders / 2) + 1;\n\n while (pending.length > 0) {\n const next = await Promise.race(pending.map(async (entry, index) => ({ index, value: await entry })));\n pending.splice(next.index, 1);\n if (next.value.status !== 'success' || !next.value.result) {\n continue;\n }\n\n const hash = stableStringify(next.value.result.aggregateValue ?? next.value.result.value);\n const current = buckets.get(hash) ?? { count: 0, outcome: next.value };\n current.count += 1;\n buckets.set(hash, current);\n if (current.count >= threshold) {\n return current.outcome;\n }\n }\n\n return undefined;\n }\n}\n\nfunction abortRemaining(controllers: Map<string, AbortController>, winningDid: string): void {\n for (const [providerDid, controller] of controllers.entries()) {\n if (providerDid !== winningDid) {\n controller.abort(new Error('Aborted after aggregate result was determined.'));\n }\n }\n}\n\nfunction classifyFailure(error: unknown): 'failure' | 'timeout' {\n if (error instanceof Error && /timed out|aborted/i.test(error.message)) {\n return 'timeout';\n }\n return 'failure';\n}\n\nasync function executeWithControls<T>(promise: Promise<T>, signal: AbortSignal, timeoutMs?: number): Promise<T> {\n if (signal.aborted) {\n throw signal.reason ?? new Error('Provider execution aborted.');\n }\n\n return await new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n cleanup();\n reject(signal.reason ?? new Error('Provider execution aborted.'));\n };\n const timer = typeof timeoutMs === 'number' && timeoutMs > 0\n ? setTimeout(() => {\n cleanup();\n reject(new Error(`Provider request timed out after ${timeoutMs}ms.`));\n }, timeoutMs)\n : undefined;\n const cleanup = () => {\n signal.removeEventListener('abort', onAbort);\n if (timer) {\n clearTimeout(timer);\n }\n };\n\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error) => {\n cleanup();\n reject(error);\n },\n );\n });\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return typeof value === 'bigint' ? value.toString() : JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableStringify(entry)).join(',')}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`);\n return `{${entries.join(',')}}`;\n}\n","import Database from 'better-sqlite3';\n\nexport interface PerformanceTrackerOptions {\n dbPath?: string;\n now?: () => number;\n maxSamplesPerCapability?: number;\n}\n\ninterface DurationRow {\n duration_ms: bigint | number;\n}\n\ninterface AggregateRow {\n success_count: bigint | number;\n failure_count: bigint | number;\n last_updated: bigint | number;\n}\n\ninterface MetricRow {\n provider_did: string;\n capability: string;\n avg_duration_ms: bigint | number;\n p50: bigint | number;\n p95: bigint | number;\n success_count: bigint | number;\n failure_count: bigint | number;\n last_updated: bigint | number;\n}\n\nexport interface ProviderCapabilityPerformance {\n capability: string;\n avgDurationMs: number;\n p50: number;\n p95: number;\n successCount: number;\n failureCount: number;\n lastUpdated: number;\n}\n\nexport interface ProviderPerformanceStats {\n providerDid: string;\n avgDurationMs: number;\n p50: number;\n p95: number;\n successCount: number;\n failureCount: number;\n lastUpdated?: number;\n capabilities: ProviderCapabilityPerformance[];\n}\n\nexport class PerformanceTracker {\n private readonly db: Database.Database;\n private readonly now: () => number;\n private readonly maxSamplesPerCapability: number;\n\n constructor(options: PerformanceTrackerOptions = {}) {\n this.db = new Database(options.dbPath ?? ':memory:');\n this.db.defaultSafeIntegers(true);\n this.now = options.now ?? (() => Date.now());\n this.maxSamplesPerCapability = Math.max(10, Math.floor(options.maxSamplesPerCapability ?? 500));\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS provider_metric_samples (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n provider_did TEXT NOT NULL,\n capability TEXT NOT NULL,\n duration_ms INTEGER NOT NULL,\n success INTEGER NOT NULL,\n recorded_at INTEGER NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_provider_metric_samples_lookup\n ON provider_metric_samples(provider_did, capability, recorded_at);\n CREATE TABLE IF NOT EXISTS provider_metrics (\n provider_did TEXT NOT NULL,\n capability TEXT NOT NULL,\n avg_duration_ms INTEGER NOT NULL,\n p50 INTEGER NOT NULL,\n p95 INTEGER NOT NULL,\n success_count INTEGER NOT NULL,\n failure_count INTEGER NOT NULL,\n last_updated INTEGER NOT NULL,\n PRIMARY KEY (provider_did, capability)\n );\n `);\n }\n\n recordCompletion(provider: string, capability: string, durationMs: number, success: boolean): void {\n if (!provider.trim()) {\n throw new Error('provider must be a non-empty string.');\n }\n if (!capability.trim()) {\n throw new Error('capability must be a non-empty string.');\n }\n if (!Number.isFinite(durationMs)) {\n throw new Error('durationMs must be finite.');\n }\n\n const normalizedDuration = Math.max(0, Math.round(durationMs));\n const recordedAt = this.now();\n const transaction = this.db.transaction(() => {\n this.db\n .prepare(\n `INSERT INTO provider_metric_samples (provider_did, capability, duration_ms, success, recorded_at)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(provider, capability, normalizedDuration, success ? 1 : 0, recordedAt);\n this.db\n .prepare(\n `DELETE FROM provider_metric_samples\n WHERE id IN (\n SELECT id\n FROM provider_metric_samples\n WHERE provider_did = ? AND capability = ?\n ORDER BY recorded_at DESC, id DESC\n LIMIT -1 OFFSET ?\n )`,\n )\n .run(provider, capability, this.maxSamplesPerCapability);\n\n const durations = this.db\n .prepare(\n `SELECT duration_ms\n FROM provider_metric_samples\n WHERE provider_did = ? AND capability = ?\n ORDER BY duration_ms ASC, recorded_at ASC`,\n )\n .all(provider, capability) as DurationRow[];\n const aggregate = this.db\n .prepare(\n `SELECT\n COALESCE(SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END), 0) AS success_count,\n COALESCE(SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END), 0) AS failure_count,\n COALESCE(MAX(recorded_at), 0) AS last_updated\n FROM provider_metric_samples\n WHERE provider_did = ? AND capability = ?`,\n )\n .get(provider, capability) as AggregateRow;\n\n const numericDurations = durations.map((entry) => Number(entry.duration_ms));\n const avgDurationMs = numericDurations.length === 0\n ? 0\n : Math.round(numericDurations.reduce((sum, entry) => sum + entry, 0) / numericDurations.length);\n const p50 = percentile(numericDurations, 0.5);\n const p95 = percentile(numericDurations, 0.95);\n\n this.db\n .prepare(\n `INSERT INTO provider_metrics (\n provider_did, capability, avg_duration_ms, p50, p95, success_count, failure_count, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_did, capability) DO UPDATE SET\n avg_duration_ms = excluded.avg_duration_ms,\n p50 = excluded.p50,\n p95 = excluded.p95,\n success_count = excluded.success_count,\n failure_count = excluded.failure_count,\n last_updated = excluded.last_updated`,\n )\n .run(\n provider,\n capability,\n avgDurationMs,\n p50,\n p95,\n Number(aggregate.success_count),\n Number(aggregate.failure_count),\n Number(aggregate.last_updated),\n );\n });\n\n transaction();\n }\n\n getEstimatedLatency(provider: string, capability: string): number | undefined {\n const row = this.db\n .prepare(\n `SELECT avg_duration_ms, p50, p95\n FROM provider_metrics\n WHERE provider_did = ? AND capability = ?`,\n )\n .get(provider, capability) as Pick<MetricRow, 'avg_duration_ms' | 'p50' | 'p95'> | undefined;\n if (!row) {\n return undefined;\n }\n\n return Number(row.p50 ?? row.avg_duration_ms ?? row.p95);\n }\n\n getProviderStats(provider: string): ProviderPerformanceStats {\n const rows = this.db\n .prepare(\n `SELECT provider_did, capability, avg_duration_ms, p50, p95, success_count, failure_count, last_updated\n FROM provider_metrics\n WHERE provider_did = ?\n ORDER BY capability ASC`,\n )\n .all(provider) as MetricRow[];\n\n const capabilities = rows.map((row) => ({\n capability: row.capability,\n avgDurationMs: Number(row.avg_duration_ms),\n p50: Number(row.p50),\n p95: Number(row.p95),\n successCount: Number(row.success_count),\n failureCount: Number(row.failure_count),\n lastUpdated: Number(row.last_updated),\n }));\n\n if (capabilities.length === 0) {\n return {\n providerDid: provider,\n avgDurationMs: 0,\n p50: 0,\n p95: 0,\n successCount: 0,\n failureCount: 0,\n capabilities: [],\n };\n }\n\n return {\n providerDid: provider,\n avgDurationMs: Math.round(capabilities.reduce((sum, entry) => sum + entry.avgDurationMs, 0) / capabilities.length),\n p50: Math.round(capabilities.reduce((sum, entry) => sum + entry.p50, 0) / capabilities.length),\n p95: Math.round(capabilities.reduce((sum, entry) => sum + entry.p95, 0) / capabilities.length),\n successCount: capabilities.reduce((sum, entry) => sum + entry.successCount, 0),\n failureCount: capabilities.reduce((sum, entry) => sum + entry.failureCount, 0),\n lastUpdated: Math.max(...capabilities.map((entry) => entry.lastUpdated)),\n capabilities,\n };\n }\n\n close(): void {\n this.db.close();\n }\n}\n\nfunction percentile(values: number[], percentileRank: number): number {\n if (values.length === 0) {\n return 0;\n }\n\n const index = Math.min(values.length - 1, Math.max(0, Math.ceil(values.length * percentileRank) - 1));\n return values[index] ?? 0;\n}\n","import { type AgentCard, type ProviderScore, ProviderSelectionStrategy, type ReputationScore } from '@hivemind-os/collective-types';\n\nimport { ReputationScoreCalculator } from '../reputation/score-calculator.js';\n\nimport type { CircuitBreaker } from './circuit-breaker.js';\nimport type { PerformanceTracker } from './performance.js';\n\nexport interface ProviderSelectionWeights {\n reputation: number;\n price: number;\n speed: number;\n}\n\nexport interface ProviderSelectorOptions {\n circuitBreaker?: Pick<CircuitBreaker, 'isOpen'>;\n performanceTracker?: Pick<PerformanceTracker, 'getEstimatedLatency'>;\n reputationCalculator?: ReputationScoreCalculator;\n}\n\nconst DEFAULT_WEIGHTS: ProviderSelectionWeights = {\n reputation: 0.45,\n price: 0.35,\n speed: 0.2,\n};\n\nexport class ProviderSelector {\n private readonly circuitBreaker?: Pick<CircuitBreaker, 'isOpen'>;\n private readonly performanceTracker?: Pick<PerformanceTracker, 'getEstimatedLatency'>;\n private readonly reputationCalculator: ReputationScoreCalculator;\n private roundRobinOffset = 0;\n\n constructor(options: ProviderSelectorOptions = {}) {\n this.circuitBreaker = options.circuitBreaker;\n this.performanceTracker = options.performanceTracker;\n this.reputationCalculator = options.reputationCalculator ?? new ReputationScoreCalculator();\n }\n\n rankProviders(agents: AgentCard[], capability: string, weights: Partial<ProviderSelectionWeights> = {}): ProviderScore[] {\n const normalizedCapability = capability.trim();\n if (!normalizedCapability) {\n return [];\n }\n\n const candidates = agents\n .map((agent) => this.toProviderScore(agent, normalizedCapability))\n .filter((entry): entry is ProviderScore => entry !== null);\n\n return this.applyCompositeScores(candidates, weights).sort((left, right) => right.compositeScore - left.compositeScore);\n }\n\n selectProviders(\n agents: AgentCard[],\n capability: string,\n strategy: ProviderSelectionStrategy,\n count: number,\n weights: Partial<ProviderSelectionWeights> = {},\n ): ProviderScore[] {\n const ranked = this.rankProviders(agents, capability, weights);\n const available = ranked.filter((entry) => !entry.circuitBreakerOpen);\n const selectedCount = Math.max(1, Math.floor(count));\n\n switch (strategy) {\n case ProviderSelectionStrategy.CHEAPEST:\n return this.selectCheapest(available, selectedCount);\n case ProviderSelectionStrategy.FASTEST:\n return this.selectFastest(available, selectedCount);\n case ProviderSelectionStrategy.HIGHEST_REPUTATION:\n return this.selectHighestReputation(available, selectedCount);\n case ProviderSelectionStrategy.ROUND_ROBIN:\n return this.selectRoundRobin(available, selectedCount);\n case ProviderSelectionStrategy.WEIGHTED:\n default:\n return this.selectWeighted(available, selectedCount, weights);\n }\n }\n\n selectCheapest(providers: ProviderScore[], count: number): ProviderScore[] {\n return [...providers]\n .sort((left, right) => compareBigInt(left.price, right.price) || compareNumber(right.reputation, left.reputation))\n .slice(0, count);\n }\n\n selectFastest(providers: ProviderScore[], count: number): ProviderScore[] {\n return [...providers]\n .sort(\n (left, right) => compareNumber(left.estimatedLatency ?? Number.POSITIVE_INFINITY, right.estimatedLatency ?? Number.POSITIVE_INFINITY)\n || compareNumber(right.reputation, left.reputation),\n )\n .slice(0, count);\n }\n\n selectHighestReputation(providers: ProviderScore[], count: number): ProviderScore[] {\n return [...providers]\n .sort((left, right) => compareNumber(right.reputation, left.reputation) || compareBigInt(left.price, right.price))\n .slice(0, count);\n }\n\n selectRoundRobin(providers: ProviderScore[], count: number): ProviderScore[] {\n if (providers.length === 0) {\n return [];\n }\n\n const start = this.roundRobinOffset % providers.length;\n const rotated = providers.slice(start).concat(providers.slice(0, start));\n this.roundRobinOffset = (this.roundRobinOffset + count) % providers.length;\n return rotated.slice(0, Math.min(count, providers.length));\n }\n\n selectWeighted(\n providers: ProviderScore[],\n count: number,\n weights: Partial<ProviderSelectionWeights> = {},\n ): ProviderScore[] {\n return this.applyCompositeScores(providers, weights)\n .sort((left, right) => compareNumber(right.compositeScore, left.compositeScore) || compareBigInt(left.price, right.price))\n .slice(0, count);\n }\n\n private toProviderScore(agent: AgentCard, capability: string): ProviderScore | null {\n const matchedCapability = agent.capabilities.find((entry) => capabilityNameEquals(entry.name, capability));\n if (!matchedCapability) {\n return null;\n }\n\n const reputationScore = this.reputationCalculator.computeScore(agent, []);\n const scopedScore = getScopedReputation(reputationScore, capability);\n const reputation = scopedScore.successRate * 100 + Math.min(scopedScore.taskCount, 100) * 0.25 - reputationScore.totalDisputes;\n const estimatedLatency = this.performanceTracker?.getEstimatedLatency(agent.did, matchedCapability.name)\n ?? scopedScore.averageLatencyMs\n ?? heuristicLatency(reputation);\n\n return {\n did: agent.did,\n price: matchedCapability.pricing.amount,\n reputation,\n estimatedLatency,\n circuitBreakerOpen: this.circuitBreaker?.isOpen(agent.did) ?? false,\n compositeScore: 0,\n };\n }\n\n private applyCompositeScores(\n providers: ProviderScore[],\n weights: Partial<ProviderSelectionWeights>,\n ): ProviderScore[] {\n const normalizedWeights = { ...DEFAULT_WEIGHTS, ...weights };\n const reputations = providers.map((entry) => entry.reputation);\n const prices = providers.map((entry) => entry.price);\n const latencies = providers.map((entry) => entry.estimatedLatency ?? heuristicLatency(entry.reputation));\n\n return providers.map((provider) => {\n const normalizedReputation = normalizeNumber(provider.reputation, reputations);\n const normalizedPrice = normalizeBigInt(provider.price, prices);\n const normalizedSpeed = 1 - normalizeNumber(provider.estimatedLatency ?? heuristicLatency(provider.reputation), latencies);\n return {\n ...provider,\n compositeScore:\n normalizedWeights.reputation * normalizedReputation\n - normalizedWeights.price * normalizedPrice\n + normalizedWeights.speed * normalizedSpeed,\n };\n });\n }\n}\n\nfunction getScopedReputation(score: ReputationScore, capability: string): { successRate: number; taskCount: number; averageLatencyMs?: number } {\n const scoped = score.capabilityScores[capability]\n ?? Object.entries(score.capabilityScores).find(([entry]) => capabilityNameEquals(entry, capability))?.[1];\n if (scoped) {\n return {\n successRate: scoped.successRate,\n taskCount: scoped.taskCount,\n averageLatencyMs: scoped.averageLatencyMs || undefined,\n };\n }\n\n return {\n successRate: score.successRate,\n taskCount: score.totalTasks,\n averageLatencyMs: score.averageLatencyMs || undefined,\n };\n}\n\nfunction heuristicLatency(reputation: number): number {\n return Math.max(100, Math.round(1_500 - Math.max(0, reputation) * 10));\n}\n\nfunction capabilityNameEquals(left: string, right: string): boolean {\n return left.toLowerCase() === right.toLowerCase();\n}\n\nfunction compareBigInt(left: bigint, right: bigint): number {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n}\n\nfunction compareNumber(left: number, right: number): number {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n}\n\nfunction normalizeNumber(value: number, values: number[]): number {\n const min = Math.min(...values);\n const max = Math.max(...values);\n if (!Number.isFinite(min) || !Number.isFinite(max) || max === min) {\n return 0.5;\n }\n\n return (value - min) / (max - min);\n}\n\nfunction normalizeBigInt(value: bigint, values: bigint[]): number {\n const min = values.reduce((current, entry) => (entry < current ? entry : current), values[0] ?? 0n);\n const max = values.reduce((current, entry) => (entry > current ? entry : current), values[0] ?? 0n);\n if (max === min) {\n return 0.5;\n }\n\n const scale = 1_000_000n;\n return Number(((value - min) * scale) / (max - min)) / Number(scale);\n}\n"],"mappings":"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","names":["etc","sha512","configureEd25519","x25519","encoder","x25519","SessionState","encoder","createHash","randomBytes","Ed25519Keypair","randomBytes","join","pino","Ed25519Keypair","logger","pino","join","consecutiveFailures","Ed25519Keypair","randomBytes","encoder","Ed25519Keypair","randomBytes","createHash","DEFAULT_ENDPOINTS","hkdf","sha256","encoder","pino","encoder","decoder","isRecord","logger","pino","isRecord","Transaction","Transaction","pino","BidStatus","PaymentScheme","RelayNodeStatus","TaskStatus","isRecord","base","asString","asBigInt","asNumber","TaskStatus","bytesToString","bytesToHex","BidStatus","RelayNodeStatus","PaymentScheme","asString","compareBigInt","compareNumber","isRecord","asNumber","asBigInt","logger","pino","extractObjectId","isObjectMissingError","compareBoolean","compareBigInt","compareNumber","pino","logger","pino","isObjectMissingError","extractObjectId","pino","BidStatus","TaskStatus","logger","pino","extractObjectId","BidStatus","isObjectMissingError","normalizeEvent","asString","compareBigInt","TaskStatus","isRecord","extractObjectId","asString","readEventField","findEvent","requireEventBigInt","isObjectMissingError","normalizeEvent","isRecord","asBigInt","pino","logger","pino","Database","Database","normalizeLimit","compareStakePreference","compareBoolean","compareBigInt","compareNumber","createHash","mkdir","readFile","rm","writeFile","join","mkdir","join","writeFile","readFile","rm","createHash","pino","createHash","pino","logger","pino","createHash","logger","pino","toHex","PaymentRail","encoder","decoder","isRecord","asOptionalString","PaymentRail","pino","RelayNodeStatus","logger","pino","findEvent","requireEventNumber","isObjectMissingError","normalizeEvent","asString","readEventField","extractObjectId","isRecord","asNumber","RelayNodeStatus","compareBoolean","compareNumber","compareBigInt","RelayNodeStatus","RelayNodeStatus","Database","getAddress","getAddress","createHash","encoder","createHash","extractObjectId","asString","randomBytes","randomUUID","isRecord","decoder","randomUUID","randomBytes","Database","Database","normalizeLimit","sha256","encoder","concatBytes","hash","bytesToHex","MAX_U64","Database","decoder","CircuitBreakerState","hash","Database","compareBigInt","compareNumber"]}
|