@hivemind-os/collective-indexer 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/analytics.ts","../src/config.ts","../src/graphql/server.ts","../src/store.ts","../src/indexer.ts"],"sourcesContent":["import { mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport pino from 'pino';\n\nimport { MeshSuiClient } from '@hivemind-os/collective-core';\n\nimport { AnalyticsEngine } from './analytics.js';\nimport { loadIndexerConfig } from './config.js';\nimport { createIndexerGraphQLServer } from './graphql/server.js';\nimport { MeshIndexer } from './indexer.js';\nimport { IndexerStore } from './store.js';\n\nexport * from './analytics.js';\nexport * from './config.js';\nexport * from './graphql/server.js';\nexport * from './indexer.js';\nexport * from './store.js';\n\nexport async function startIndexerService() {\n const config = loadIndexerConfig();\n const logger = pino({ name: '@hivemind-os/collective-indexer', level: 'info' });\n\n await mkdir(dirname(config.sqlitePath), { recursive: true });\n\n const store = new IndexerStore(config.sqlitePath);\n const analytics = new AnalyticsEngine(store);\n const suiClient = new MeshSuiClient({\n rpcUrl: config.rpcUrl,\n faucetUrl: '',\n packageId: config.packageId,\n registryId: '',\n });\n const indexer = new MeshIndexer({\n suiClient,\n store,\n packageId: config.packageId,\n pollIntervalMs: config.pollingIntervalMs,\n startCheckpoint: config.backfill.fromCheckpoint,\n logger,\n });\n const graphql = createIndexerGraphQLServer({\n store,\n analytics,\n host: config.server.host,\n port: config.server.port,\n logger,\n });\n\n await indexer.backfill(config.backfill.fromCheckpoint);\n indexer.start();\n const address = await graphql.start();\n\n const stop = async () => {\n await indexer.stop();\n await graphql.stop();\n store.close();\n };\n\n return {\n config,\n store,\n analytics,\n indexer,\n graphql,\n address,\n stop,\n };\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n try {\n const service = await startIndexerService();\n console.log(service.address);\n\n const shutdown = async () => {\n await service.stop();\n process.exit(0);\n };\n\n process.once('SIGINT', () => {\n void shutdown();\n });\n process.once('SIGTERM', () => {\n void shutdown();\n });\n } catch (error) {\n console.error(error);\n process.exitCode = 1;\n }\n}\n","import { BidStatus } from '@hivemind-os/collective-types';\n\nimport type { IndexerStore, ProviderStatsRecord } from './store.js';\n\nexport type TimePeriod = 'hour' | 'day' | 'week';\nexport type ProviderSortField = 'completedTasks' | 'earnings' | 'reputation';\n\nexport interface TimeBucket {\n label: string;\n count: number;\n volumeMist: bigint;\n}\n\nexport interface GasCostStat {\n capability: string;\n averageGasMist: bigint;\n taskCount: number;\n}\n\nexport interface CategoryPopularity {\n category: string;\n taskCount: number;\n}\n\nexport interface MarketplaceStats {\n averageBidCount: number;\n acceptanceRate: number;\n categoryPopularity: CategoryPopularity[];\n}\n\nexport interface ReputationTrend {\n label: string;\n completed: number;\n failed: number;\n disputed: number;\n successRate: number;\n}\n\nexport interface AnalyticsSummary {\n totalAgents: number;\n activeAgents: number;\n totalTasks: number;\n completedTasks: number;\n disputedTasks: number;\n totalVolumeMist: bigint;\n averageGasCosts: GasCostStat[];\n marketplace: MarketplaceStats;\n}\n\nexport class AnalyticsEngine {\n constructor(private readonly store: IndexerStore) {}\n\n getSummary(): AnalyticsSummary {\n const db = this.store.getDatabase();\n const totals = db\n .prepare(\n `SELECT\n COUNT(*) AS total_agents,\n SUM(CASE WHEN active = 1 THEN 1 ELSE 0 END) AS active_agents,\n COALESCE((SELECT COUNT(*) FROM tasks), 0) AS total_tasks,\n COALESCE((SELECT SUM(CASE WHEN completed_at IS NOT NULL THEN 1 ELSE 0 END) FROM tasks), 0) AS completed_tasks,\n COALESCE((SELECT SUM(CASE WHEN disputed_at IS NOT NULL THEN 1 ELSE 0 END) FROM tasks), 0) AS disputed_tasks\n FROM agents`,\n )\n .get() as {\n total_agents?: number | bigint | null;\n active_agents?: number | bigint | null;\n total_tasks?: number | bigint | null;\n completed_tasks?: number | bigint | null;\n disputed_tasks?: number | bigint | null;\n };\n\n return {\n totalAgents: Number(totals.total_agents ?? 0),\n activeAgents: Number(totals.active_agents ?? 0),\n totalTasks: Number(totals.total_tasks ?? 0),\n completedTasks: Number(totals.completed_tasks ?? 0),\n disputedTasks: Number(totals.disputed_tasks ?? 0),\n totalVolumeMist: sumBigIntRows(db.prepare('SELECT price FROM tasks').all() as Array<{ price: string | number | bigint | null }>),\n averageGasCosts: this.getAverageGasCostsByTaskType(),\n marketplace: this.getMarketplaceStats(),\n };\n }\n\n getTaskVolume(period: TimePeriod = 'day', buckets = 14): TimeBucket[] {\n const db = this.store.getDatabase();\n const rows = db\n .prepare(\n `SELECT ${bucketSql(period)} AS label, created_at, price\n FROM tasks\n ORDER BY created_at DESC`,\n )\n .all() as Array<{ label: string; created_at: number | bigint; price: string | number | bigint | null }>;\n\n const grouped = new Map<string, { count: number; volumeMist: bigint; createdAt: number }>();\n for (const row of rows) {\n const current = grouped.get(row.label) ?? { count: 0, volumeMist: 0n, createdAt: Number(row.created_at) };\n current.count += 1;\n current.volumeMist += toBigInt(row.price);\n current.createdAt = Math.min(current.createdAt, Number(row.created_at));\n grouped.set(row.label, current);\n }\n\n return [...grouped.entries()]\n .sort((left, right) => right[1].createdAt - left[1].createdAt)\n .slice(0, normalizeBucketCount(buckets))\n .reverse()\n .map(([label, row]) => ({\n label,\n count: row.count,\n volumeMist: row.volumeMist,\n }));\n }\n\n getAverageGasCostsByTaskType(): GasCostStat[] {\n const db = this.store.getDatabase();\n const rows = db\n .prepare(\n `SELECT capability, gas_cost_mist_total\n FROM tasks\n ORDER BY capability ASC`,\n )\n .all() as Array<{ capability: string; gas_cost_mist_total: string | number | bigint | null }>;\n\n const grouped = new Map<string, { total: bigint; count: number }>();\n for (const row of rows) {\n const current = grouped.get(row.capability) ?? { total: 0n, count: 0 };\n current.total += toBigInt(row.gas_cost_mist_total);\n current.count += 1;\n grouped.set(row.capability, current);\n }\n\n return [...grouped.entries()]\n .map(([capability, stats]) => ({\n capability,\n averageGasMist: stats.count === 0 ? 0n : stats.total / BigInt(stats.count),\n taskCount: stats.count,\n }))\n .sort((left, right) => compareNumber(right.taskCount, left.taskCount) || left.capability.localeCompare(right.capability));\n }\n\n getMarketplaceStats(): MarketplaceStats {\n const db = this.store.getDatabase();\n const aggregates = db\n .prepare(\n `SELECT\n COALESCE(AVG(bid_count), 0) AS average_bid_count,\n COALESCE((SELECT CAST(SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) AS REAL) / NULLIF(COUNT(*), 0) FROM bids), 0) AS acceptance_rate\n FROM tasks`,\n )\n .get(BidStatus.ACCEPTED) as { average_bid_count?: number | bigint | null; acceptance_rate?: number | null };\n\n const categories = db\n .prepare('SELECT category, COUNT(*) AS task_count FROM tasks GROUP BY category ORDER BY task_count DESC, category ASC')\n .all() as Array<{ category: string; task_count: number | bigint }>;\n\n return {\n averageBidCount: Number(aggregates.average_bid_count ?? 0),\n acceptanceRate: Number(aggregates.acceptance_rate ?? 0),\n categoryPopularity: categories.map((row) => ({ category: row.category, taskCount: Number(row.task_count) })),\n };\n }\n\n getReputationTrends(agentDid: string, period: TimePeriod = 'day', buckets = 12): ReputationTrend[] {\n const agent = this.store.getAgentByDid(agentDid);\n if (!agent) {\n return [];\n }\n\n const db = this.store.getDatabase();\n const rows = db\n .prepare(\n `SELECT\n ${bucketSql(period)} AS label,\n created_at,\n completed_at,\n disputed_at\n FROM tasks\n WHERE provider = ?\n ORDER BY created_at DESC`,\n )\n .all(agent.owner) as Array<{\n label: string;\n created_at: number | bigint;\n completed_at: number | bigint | null;\n disputed_at: number | bigint | null;\n }>;\n\n const grouped = new Map<string, { completed: number; failed: number; disputed: number; createdAt: number }>();\n for (const row of rows) {\n const current = grouped.get(row.label) ?? { completed: 0, failed: 0, disputed: 0, createdAt: Number(row.created_at) };\n if (row.disputed_at != null) {\n current.failed += 1;\n current.disputed += 1;\n } else if (row.completed_at != null) {\n current.completed += 1;\n }\n current.createdAt = Math.min(current.createdAt, Number(row.created_at));\n grouped.set(row.label, current);\n }\n\n return [...grouped.entries()]\n .sort((left, right) => right[1].createdAt - left[1].createdAt)\n .slice(0, normalizeBucketCount(buckets))\n .reverse()\n .map(([label, row]) => ({\n label,\n completed: row.completed,\n failed: row.failed,\n disputed: row.disputed,\n successRate: row.completed + row.failed === 0 ? 0 : row.completed / (row.completed + row.failed),\n }));\n }\n\n getTopProviders(limit = 10, sortBy: ProviderSortField = 'completedTasks'): ProviderStatsRecord[] {\n const db = this.store.getDatabase();\n const rows = db\n .prepare(\n `SELECT\n did,\n owner,\n name,\n COALESCE(total_tasks_completed, 0) AS completed_tasks,\n COALESCE(total_tasks_failed, 0) AS failed_tasks,\n COALESCE(total_tasks_disputed, 0) AS dispute_count,\n COALESCE(total_earnings_mist, '0') AS earnings_mist\n FROM agents\n WHERE active = 1\n ORDER BY updated_at DESC`,\n )\n .all() as Array<{\n did: string;\n owner: string;\n name: string;\n completed_tasks: number | bigint | null;\n failed_tasks: number | bigint | null;\n dispute_count: number | bigint | null;\n earnings_mist: string | null;\n }>;\n\n const scored = rows.map((row) => {\n const completedTasks = Number(row.completed_tasks ?? 0);\n const failedTasks = Number(row.failed_tasks ?? 0);\n const disputeCount = Number(row.dispute_count ?? 0);\n const earningsMist = BigInt(row.earnings_mist ?? '0');\n const successRate = completedTasks + failedTasks === 0 ? 0 : completedTasks / (completedTasks + failedTasks);\n const reputation = successRate * 100 + completedTasks + Number(earningsMist > 0n ? 1n : 0n) - disputeCount;\n return {\n did: row.did,\n owner: row.owner,\n name: row.name,\n completedTasks,\n earningsMist,\n disputeCount,\n successRate,\n reputation,\n } satisfies ProviderStatsRecord;\n });\n\n return [...scored]\n .sort((left, right) => {\n if (sortBy === 'earnings') {\n return compareBigInt(right.earningsMist, left.earningsMist) || compareNumber(right.completedTasks, left.completedTasks);\n }\n if (sortBy === 'reputation') {\n return compareNumber(right.reputation, left.reputation) || compareNumber(right.completedTasks, left.completedTasks);\n }\n return compareNumber(right.completedTasks, left.completedTasks) || compareBigInt(right.earningsMist, left.earningsMist);\n })\n .slice(0, Math.max(1, Math.floor(limit)));\n }\n}\n\nfunction normalizeBucketCount(buckets: number): number {\n return Number.isFinite(buckets) ? Math.max(1, Math.floor(buckets)) : 14;\n}\n\nfunction bucketSql(period: TimePeriod): string {\n switch (period) {\n case 'hour':\n return \"strftime('%Y-%m-%dT%H:00:00Z', created_at / 1000, 'unixepoch')\";\n case 'week':\n return \"strftime('%Y-W%W', created_at / 1000, 'unixepoch')\";\n case 'day':\n default:\n return \"strftime('%Y-%m-%d', created_at / 1000, 'unixepoch')\";\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 sumBigIntRows(rows: Array<{ price: string | number | bigint | null }>): bigint {\n return rows.reduce((sum, row) => sum + toBigInt(row.price), 0n);\n}\n\nfunction toBigInt(value: string | number | bigint | null | undefined): 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","import { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\n\nexport interface IndexerConfig {\n rpcUrl: string;\n packageId: string;\n sqlitePath: string;\n pollingIntervalMs: number;\n server: {\n host: string;\n port: number;\n };\n backfill: {\n fromCheckpoint?: number;\n };\n}\n\nexport function getDefaultIndexerConfig(baseDir = resolve(homedir(), '.hivemind-os/collective', 'indexer')): IndexerConfig {\n return {\n rpcUrl: 'http://127.0.0.1:9000',\n packageId: '',\n sqlitePath: join(baseDir, 'indexer.sqlite'),\n pollingIntervalMs: 5_000,\n server: {\n host: '0.0.0.0',\n port: 4000,\n },\n backfill: {},\n };\n}\n\nexport function loadIndexerConfig(overrides: Partial<IndexerConfig> = {}): IndexerConfig {\n const baseDir = process.env.COLLECTIVE_INDEXER_DATA_DIR ? resolve(process.env.COLLECTIVE_INDEXER_DATA_DIR) : undefined;\n const defaults = getDefaultIndexerConfig(baseDir);\n const config: IndexerConfig = {\n rpcUrl: process.env.COLLECTIVE_RPC_URL ?? process.env.COLLECTIVE_INDEXER_RPC_URL ?? overrides.rpcUrl ?? defaults.rpcUrl,\n packageId: process.env.COLLECTIVE_PACKAGE_ID ?? process.env.COLLECTIVE_INDEXER_PACKAGE_ID ?? overrides.packageId ?? defaults.packageId,\n sqlitePath: resolve(overrides.sqlitePath ?? process.env.COLLECTIVE_INDEXER_SQLITE_PATH ?? defaults.sqlitePath),\n pollingIntervalMs:\n readNumber(process.env.COLLECTIVE_INDEXER_POLLING_INTERVAL_MS) ?? overrides.pollingIntervalMs ?? defaults.pollingIntervalMs,\n server: {\n host: overrides.server?.host ?? process.env.COLLECTIVE_INDEXER_HOST ?? defaults.server.host,\n port: readNumber(process.env.COLLECTIVE_INDEXER_PORT) ?? overrides.server?.port ?? defaults.server.port,\n },\n backfill:\n overrides.backfill || process.env.COLLECTIVE_INDEXER_START_CHECKPOINT\n ? {\n fromCheckpoint:\n overrides.backfill?.fromCheckpoint ?? readNumber(process.env.COLLECTIVE_INDEXER_START_CHECKPOINT),\n }\n : defaults.backfill,\n };\n\n validateIndexerConfig(config);\n return config;\n}\n\nexport function validateIndexerConfig(config: IndexerConfig): void {\n if (!config.rpcUrl) {\n throw new Error('Indexer rpcUrl is required.');\n }\n if (!Number.isInteger(config.pollingIntervalMs) || config.pollingIntervalMs <= 0) {\n throw new Error('Indexer polling interval must be a positive integer.');\n }\n if (!config.server.host) {\n throw new Error('Indexer server host is required.');\n }\n if (!Number.isInteger(config.server.port) || config.server.port <= 0) {\n throw new Error('Indexer server port must be a positive integer.');\n }\n if (!config.sqlitePath) {\n throw new Error('Indexer sqlitePath is required.');\n }\n}\n\nfunction readNumber(value: string | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n","import { createServer, type Server as HttpServer } from 'node:http';\n\nimport { createSchema, createYoga } from 'graphql-yoga';\nimport { BidStatus, DisputeStatus, PaymentScheme, TaskStatus, type AgentCard, type Capability } from '@hivemind-os/collective-types';\n\nimport { AnalyticsEngine, type ProviderSortField, type TimePeriod } from '../analytics.js';\nimport { type AgentQueryFilters, encodeCursor, type IndexedTask, type IndexerStore } from '../store.js';\n\nexport interface IndexerGraphQLServerOptions {\n store: IndexerStore;\n analytics?: AnalyticsEngine;\n host?: string;\n port?: number;\n logger?: {\n info?: (payload: unknown, message?: string) => void;\n warn?: (payload: unknown, message?: string) => void;\n };\n}\n\nexport interface IndexerGraphQLServer {\n schema: ReturnType<typeof createSchema>;\n server: HttpServer;\n fetch: typeof fetch;\n start: () => Promise<string>;\n stop: () => Promise<void>;\n}\n\nconst MAX_PAGE_SIZE = 100;\n\nexport function createIndexerGraphQLServer(options: IndexerGraphQLServerOptions): IndexerGraphQLServer {\n const analytics = options.analytics ?? new AnalyticsEngine(options.store);\n const schema = createSchema({\n typeDefs: /* GraphQL */ `\n enum TaskStatus {\n OPEN\n ACCEPTED\n COMPLETED\n RELEASED\n DISPUTED\n CANCELLED\n }\n\n enum PaymentScheme {\n EXACT\n UPTO\n STREAM\n }\n\n enum BidStatus {\n ACTIVE\n ACCEPTED\n REJECTED\n WITHDRAWN\n }\n\n enum DisputeStatus {\n OPEN\n RESPONDED\n MUTUAL_RESOLVED\n ARBITRATED\n EXPIRED\n }\n\n enum TimePeriod {\n HOUR\n DAY\n WEEK\n }\n\n enum ProviderSortField {\n COMPLETED_TASKS\n EARNINGS\n REPUTATION\n }\n\n type PageInfo {\n hasNextPage: Boolean!\n endCursor: String\n }\n\n type AgentConnection {\n nodes: [Agent!]!\n totalCount: Int!\n pageInfo: PageInfo!\n }\n\n type TaskConnection {\n nodes: [Task!]!\n pageInfo: PageInfo!\n }\n\n type PricingInfo {\n rail: String!\n amount: String!\n currency: String!\n }\n\n type Capability {\n name: String!\n description: String!\n version: String!\n pricing: PricingInfo!\n executionMode: String\n paymentRails: [String!]!\n }\n\n type AgentReputation {\n successRate: Float!\n totalTasks: Int!\n totalDisputes: Int!\n totalEarningsMist: String!\n stakeAmountMist: String!\n }\n\n type Agent {\n id: ID!\n owner: String!\n did: String!\n name: String!\n description: String!\n endpoint: String\n active: Boolean!\n version: Int!\n registeredAt: String!\n updatedAt: String!\n capabilities: [Capability!]!\n totalTasksCompleted: Int!\n totalTasksFailed: Int!\n totalTasksDisputed: Int!\n totalEarningsMist: String!\n hasStake: Boolean!\n stakeMist: String\n stakeType: String\n categories: [String!]!\n reputation: AgentReputation!\n }\n\n type TaskTransition {\n eventType: String!\n status: TaskStatus!\n txDigest: String!\n timestampMs: String!\n }\n\n type Task {\n id: ID!\n requester: String!\n provider: String\n capability: String!\n category: String!\n inputBlobId: String!\n resultBlobId: String\n price: String!\n paymentScheme: PaymentScheme\n maxPrice: String\n meteredUnits: Int\n unitPrice: String\n verificationHash: String\n status: TaskStatus!\n disputeWindowMs: Int!\n createdAt: String!\n acceptedAt: String\n completedAt: String\n releasedAt: String\n disputedAt: String\n cancelledAt: String\n expiresAt: String!\n agreementHash: String\n bidCount: Int!\n gasCostMistTotal: String!\n transitions: [TaskTransition!]!\n }\n\n type Bid {\n id: ID!\n taskId: String!\n bidder: String!\n bidPrice: String!\n reputationScore: String!\n evidenceBlob: String\n createdAt: String!\n status: BidStatus!\n }\n\n type Dispute {\n id: ID!\n taskId: String!\n requester: String!\n provider: String!\n escrowAmount: String!\n status: DisputeStatus!\n requesterEvidenceBlob: String!\n providerEvidenceBlob: String\n requesterProposedSplit: String!\n providerProposedSplit: String!\n arbitrator: String\n rulingSplit: String!\n openedAt: String!\n respondedAt: String\n resolvedAt: String\n resolutionDeadline: String!\n }\n\n type GasCostStat {\n capability: String!\n averageGasMist: String!\n taskCount: Int!\n }\n\n type CategoryStat {\n category: String!\n taskCount: Int!\n }\n\n type MarketplaceStats {\n averageBidCount: Float!\n acceptanceRate: Float!\n categoryPopularity: [CategoryStat!]!\n }\n\n type Analytics {\n totalAgents: Int!\n activeAgents: Int!\n totalTasks: Int!\n completedTasks: Int!\n disputedTasks: Int!\n totalVolumeMist: String!\n averageGasCosts: [GasCostStat!]!\n marketplace: MarketplaceStats!\n }\n\n type TimeBucket {\n label: String!\n count: Int!\n volumeMist: String!\n }\n\n type ProviderStats {\n did: String!\n owner: String!\n name: String!\n completedTasks: Int!\n earningsMist: String!\n disputeCount: Int!\n successRate: Float!\n reputation: Float!\n }\n\n type Query {\n agents(capability: String, minReputation: Float, category: String, limit: Int, offset: Int): AgentConnection!\n agent(did: String!): Agent\n tasks(status: TaskStatus, requester: String, provider: String, category: String, after: String, limit: Int): TaskConnection!\n task(id: String!): Task\n bids(taskId: String!, status: BidStatus): [Bid!]!\n disputes(status: DisputeStatus, agent: String): [Dispute!]!\n analytics: Analytics!\n taskVolume(period: TimePeriod!, buckets: Int): [TimeBucket!]!\n topProviders(limit: Int, sortBy: ProviderSortField): [ProviderStats!]!\n }\n `,\n resolvers: {\n TaskStatus: {\n OPEN: TaskStatus.OPEN,\n ACCEPTED: TaskStatus.ACCEPTED,\n COMPLETED: TaskStatus.COMPLETED,\n RELEASED: TaskStatus.RELEASED,\n DISPUTED: TaskStatus.DISPUTED,\n CANCELLED: TaskStatus.CANCELLED,\n },\n BidStatus: {\n ACTIVE: BidStatus.ACTIVE,\n ACCEPTED: BidStatus.ACCEPTED,\n REJECTED: BidStatus.REJECTED,\n WITHDRAWN: BidStatus.WITHDRAWN,\n },\n PaymentScheme: {\n EXACT: PaymentScheme.EXACT,\n UPTO: PaymentScheme.UPTO,\n STREAM: PaymentScheme.STREAM,\n },\n DisputeStatus: {\n OPEN: DisputeStatus.OPEN,\n RESPONDED: DisputeStatus.RESPONDED,\n MUTUAL_RESOLVED: DisputeStatus.MUTUAL_RESOLVED,\n ARBITRATED: DisputeStatus.ARBITRATED,\n EXPIRED: DisputeStatus.EXPIRED,\n },\n TimePeriod: {\n HOUR: 'hour' satisfies TimePeriod,\n DAY: 'day' satisfies TimePeriod,\n WEEK: 'week' satisfies TimePeriod,\n },\n ProviderSortField: {\n COMPLETED_TASKS: 'completedTasks' satisfies ProviderSortField,\n EARNINGS: 'earnings' satisfies ProviderSortField,\n REPUTATION: 'reputation' satisfies ProviderSortField,\n },\n Query: {\n agents: (_root: unknown, args: AgentQueryFilters) => {\n const limit = normalizeLimit(args.limit, 20);\n const offset = normalizeOffset(args.offset);\n const capability = trimOptional(args.capability);\n const category = trimOptional(args.category);\n const nodes = options.store.queryAgents({\n capability,\n minReputation: normalizeOptionalFloat(args.minReputation, 'minReputation'),\n category,\n limit,\n offset,\n sortBy: 'reputation',\n });\n const totalCount = options.store.countAgents({\n capability,\n minReputation: normalizeOptionalFloat(args.minReputation, 'minReputation'),\n category,\n sortBy: 'reputation',\n });\n return {\n nodes,\n totalCount,\n pageInfo: {\n hasNextPage: offset + nodes.length < totalCount,\n endCursor: nodes.length > 0 ? Buffer.from(String(offset + nodes.length)).toString('base64url') : null,\n },\n };\n },\n agent: (_root: unknown, args: { did: string }) => options.store.getAgentByDid(requireNonEmpty(args.did, 'did')),\n tasks: (_root: unknown, args: { status?: TaskStatus; requester?: string; provider?: string; category?: string; after?: string; limit?: number }) => {\n const limit = normalizeLimit(args.limit, 20);\n const rows = options.store.queryTasks({\n status: args.status,\n requester: trimOptional(args.requester),\n provider: trimOptional(args.provider),\n category: trimOptional(args.category),\n after: trimOptional(args.after),\n limit: limit + 1,\n });\n const nodes = rows.slice(0, limit);\n const endCursor = nodes.length > 0 ? encodeCursor(nodes[nodes.length - 1] as IndexedTask) : null;\n return {\n nodes,\n pageInfo: {\n hasNextPage: rows.length > limit,\n endCursor,\n },\n };\n },\n task: (_root: unknown, args: { id: string }) => options.store.getTask(requireNonEmpty(args.id, 'id')),\n bids: (_root: unknown, args: { taskId: string; status?: BidStatus }) => options.store.getBids(requireNonEmpty(args.taskId, 'taskId'), args.status),\n disputes: (_root: unknown, args: { status?: DisputeStatus; agent?: string }) =>\n options.store.getDisputes({ status: args.status, agent: trimOptional(args.agent) }),\n analytics: () => analytics.getSummary(),\n taskVolume: (_root: unknown, args: { period: TimePeriod; buckets?: number }) => analytics.getTaskVolume(args.period, args.buckets),\n topProviders: (_root: unknown, args: { limit?: number; sortBy?: ProviderSortField }) =>\n analytics.getTopProviders(normalizeLimit(args.limit, 10), args.sortBy),\n },\n Agent: {\n registeredAt: (agent: AgentCard) => String(agent.registeredAt),\n updatedAt: (agent: AgentCard) => String(agent.updatedAt),\n totalTasksCompleted: (agent: AgentCard) => agent.totalTasksCompleted ?? 0,\n totalTasksFailed: (agent: AgentCard) => agent.totalTasksFailed ?? 0,\n totalTasksDisputed: (agent: AgentCard) => agent.totalTasksDisputed ?? 0,\n totalEarningsMist: (agent: AgentCard) => (agent.totalEarningsMist ?? 0n).toString(),\n hasStake: (agent: AgentCard) => Boolean(agent.hasStake),\n stakeMist: (agent: AgentCard) => agent.stakeMist?.toString() ?? null,\n categories: (agent: AgentCard) => listAgentCategories(options.store, agent.owner),\n reputation: (agent: AgentCard) => buildAgentReputation(agent),\n },\n Capability: {\n paymentRails: (capability: Capability) => capability.paymentRails ?? [],\n },\n PricingInfo: {\n amount: (pricing: Capability['pricing']) => pricing.amount.toString(),\n },\n Task: {\n price: (task: IndexedTask) => task.price.toString(),\n maxPrice: (task: IndexedTask) => task.maxPrice?.toString() ?? null,\n meteredUnits: (task: IndexedTask) => task.meteredUnits ?? null,\n unitPrice: (task: IndexedTask) => task.unitPrice?.toString() ?? null,\n verificationHash: (task: IndexedTask) => task.verificationHash ?? null,\n createdAt: (task: IndexedTask) => String(task.createdAt),\n acceptedAt: (task: IndexedTask) => nullableString(task.acceptedAt),\n completedAt: (task: IndexedTask) => nullableString(task.completedAt),\n releasedAt: (task: IndexedTask) => nullableString(task.releasedAt),\n disputedAt: (task: IndexedTask) => nullableString(task.disputedAt),\n cancelledAt: (task: IndexedTask) => nullableString(task.cancelledAt),\n expiresAt: (task: IndexedTask) => String(task.expiresAt),\n gasCostMistTotal: (task: IndexedTask) => task.gasCostMistTotal.toString(),\n transitions: (task: IndexedTask) => task.transitions ?? options.store.getTaskTransitions(task.id),\n },\n TaskTransition: {\n timestampMs: (transition: { timestampMs: number }) => String(transition.timestampMs),\n },\n Bid: {\n taskId: (bid: { taskId: string }) => bid.taskId,\n bidPrice: (bid: { bidPrice: bigint }) => bid.bidPrice.toString(),\n reputationScore: (bid: { reputationScore: bigint }) => bid.reputationScore.toString(),\n createdAt: (bid: { createdAt: number }) => String(bid.createdAt),\n },\n Dispute: {\n taskId: (dispute: { taskId: string }) => dispute.taskId,\n escrowAmount: (dispute: { escrowAmount: bigint }) => dispute.escrowAmount.toString(),\n requesterProposedSplit: (dispute: { requesterProposedSplit: bigint }) => dispute.requesterProposedSplit.toString(),\n providerProposedSplit: (dispute: { providerProposedSplit: bigint }) => dispute.providerProposedSplit.toString(),\n rulingSplit: (dispute: { rulingSplit: bigint }) => dispute.rulingSplit.toString(),\n openedAt: (dispute: { openedAt: number }) => String(dispute.openedAt),\n respondedAt: (dispute: { respondedAt?: number }) => nullableString(dispute.respondedAt),\n resolvedAt: (dispute: { resolvedAt?: number }) => nullableString(dispute.resolvedAt),\n resolutionDeadline: (dispute: { resolutionDeadline: number }) => String(dispute.resolutionDeadline),\n },\n GasCostStat: {\n averageGasMist: (row: { averageGasMist: bigint }) => row.averageGasMist.toString(),\n },\n Analytics: {\n totalVolumeMist: (summary: { totalVolumeMist: bigint }) => summary.totalVolumeMist.toString(),\n },\n TimeBucket: {\n volumeMist: (bucket: { volumeMist: bigint }) => bucket.volumeMist.toString(),\n },\n ProviderStats: {\n earningsMist: (row: { earningsMist: bigint }) => row.earningsMist.toString(),\n },\n },\n });\n\n const yoga = createYoga({\n schema,\n graphqlEndpoint: '/graphql',\n maskedErrors: true,\n });\n const server = createServer(yoga);\n\n return {\n schema,\n server,\n fetch: yoga.fetch.bind(yoga) as typeof fetch,\n start: async () => await startServer(server, options.host ?? '0.0.0.0', options.port ?? 4000, options.logger),\n stop: async () => {\n if (!server.listening) {\n return;\n }\n await new Promise<void>((resolvePromise, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolvePromise();\n });\n });\n },\n };\n}\n\nfunction listAgentCategories(store: IndexerStore, owner: string): string[] {\n const rows = store\n .getDatabase()\n .prepare('SELECT DISTINCT category FROM tasks WHERE provider = ? ORDER BY category ASC')\n .all(owner) as Array<{ category: string }>;\n return rows.map((row) => row.category);\n}\n\nfunction buildAgentReputation(agent: AgentCard): {\n successRate: number;\n totalTasks: number;\n totalDisputes: number;\n totalEarningsMist: string;\n stakeAmountMist: string;\n} {\n const completed = agent.totalTasksCompleted ?? 0;\n const failed = agent.totalTasksFailed ?? 0;\n const totalTasks = completed + failed;\n return {\n successRate: totalTasks === 0 ? 0 : completed / totalTasks,\n totalTasks,\n totalDisputes: agent.totalTasksDisputed ?? 0,\n totalEarningsMist: (agent.totalEarningsMist ?? 0n).toString(),\n stakeAmountMist: (agent.stakeMist ?? 0n).toString(),\n };\n}\n\nfunction nullableString(value?: number | null): string | null {\n return typeof value === 'number' && Number.isFinite(value) ? String(value) : null;\n}\n\nasync function startServer(\n server: HttpServer,\n host: string,\n port: number,\n logger?: IndexerGraphQLServerOptions['logger'],\n): Promise<string> {\n const address = await new Promise<string>((resolvePromise, reject) => {\n server.once('error', reject);\n server.listen(port, host, () => {\n server.off('error', reject);\n const boundAddress = server.address();\n const resolvedPort = typeof boundAddress === 'object' && boundAddress ? boundAddress.port : port;\n resolvePromise(`http://${host}:${resolvedPort}/graphql`);\n });\n });\n logger?.info?.({ address }, 'Indexer GraphQL server started');\n return address;\n}\n\nfunction normalizeLimit(limit: number | undefined, fallback: number): number {\n return typeof limit === 'number' && Number.isFinite(limit)\n ? Math.min(MAX_PAGE_SIZE, Math.max(1, Math.floor(limit)))\n : Math.min(MAX_PAGE_SIZE, fallback);\n}\n\nfunction normalizeOffset(offset: number | undefined): number {\n return typeof offset === 'number' && Number.isFinite(offset) ? Math.max(0, Math.floor(offset)) : 0;\n}\n\nfunction normalizeOptionalFloat(value: number | undefined, field: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${field} must be a non-negative finite number.`);\n }\n return value;\n}\n\nfunction trimOptional(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nfunction requireNonEmpty(value: string, field: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n return normalized;\n}\n","import Database from 'better-sqlite3';\n\nimport { ReputationScoreCalculator } from '@hivemind-os/collective-core';\nimport type { AgentCard, Bid, Capability, Dispute, Task } from '@hivemind-os/collective-types';\nimport { BidStatus, DisputeStatus, PaymentScheme, TaskStatus } from '@hivemind-os/collective-types';\n\nexport interface AgentQueryFilters {\n capability?: string;\n minReputation?: number;\n category?: string;\n search?: string;\n limit?: number;\n offset?: number;\n sortBy?: 'stake' | 'reputation';\n activeOnly?: boolean;\n}\n\nexport interface TaskQueryFilters {\n status?: TaskStatus;\n requester?: string;\n provider?: string;\n category?: string;\n after?: string;\n limit?: number;\n}\n\nexport interface DisputeQueryFilters {\n status?: DisputeStatus;\n agent?: string;\n}\n\nexport interface StoredEvent {\n eventId: string;\n eventType: string;\n packageId: string;\n txDigest: string;\n timestampMs: number;\n payload: unknown;\n checkpoint?: number;\n module?: string;\n}\n\nexport interface IndexedTaskTransition {\n taskId: string;\n eventType: string;\n status: TaskStatus;\n txDigest: string;\n timestampMs: number;\n payload: Record<string, unknown>;\n}\n\nexport interface IndexedTask extends Task {\n releasedAt?: number;\n disputedAt?: number;\n cancelledAt?: number;\n bidCount: number;\n gasCostMistTotal: bigint;\n transitions?: IndexedTaskTransition[];\n}\n\nexport interface ProviderStatsRecord {\n did: string;\n owner: string;\n name: string;\n completedTasks: number;\n earningsMist: bigint;\n disputeCount: number;\n successRate: number;\n reputation: number;\n}\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: string | null;\n has_stake: number | bigint | null;\n stake_mist: string | null;\n stake_type: string | null;\n}\n\ninterface TaskRow {\n id: string;\n requester: string;\n provider: string | null;\n capability: string;\n category: string;\n input_blob_id: string;\n result_blob_id: string | null;\n price: string;\n payment_scheme: string | null;\n max_price: string | null;\n metered_units: number | bigint | null;\n unit_price: string | null;\n verification_hash: string | null;\n status: number | bigint;\n dispute_window_ms: number | bigint | null;\n created_at: number | bigint;\n accepted_at: number | bigint | null;\n completed_at: number | bigint | null;\n released_at: number | bigint | null;\n disputed_at: number | bigint | null;\n cancelled_at: number | bigint | null;\n expires_at: number | bigint;\n agreement_hash: string | null;\n posted_tx_digest: string | null;\n accepted_tx_digest: string | null;\n completed_tx_digest: string | null;\n released_tx_digest: string | null;\n disputed_tx_digest: string | null;\n cancelled_tx_digest: string | null;\n gas_cost_mist_total: string | null;\n bid_count: number | bigint | null;\n}\n\ninterface BidRow {\n id: string;\n task_id: string;\n bidder: string;\n bid_price: string;\n reputation_score: string;\n evidence_blob: string | null;\n created_at: number | bigint;\n accepted_at: number | bigint | null;\n rejected_at: number | bigint | null;\n withdrawn_at: number | bigint | null;\n status: number | bigint;\n}\n\ninterface DisputeRow {\n id: string;\n task_id: string;\n requester: string;\n provider: string;\n escrow_amount: string;\n status: number | bigint;\n requester_evidence_blob: string;\n provider_evidence_blob: string | null;\n requester_proposed_split: string;\n provider_proposed_split: string;\n arbitrator: string | null;\n ruling_split: string;\n opened_at: number | bigint;\n responded_at: number | bigint | null;\n resolved_at: number | bigint | null;\n resolution_deadline: number | bigint;\n}\n\ninterface TransitionRow {\n task_id: string;\n event_type: string;\n status: number | bigint;\n tx_digest: string;\n timestamp_ms: number | bigint;\n payload_json: string;\n}\n\nexport class IndexerStore {\n readonly db: Database.Database;\n\n private readonly scoreCalculator = new ReputationScoreCalculator();\n\n constructor(dbPath: string) {\n this.db = new Database(dbPath);\n this.db.defaultSafeIntegers(true);\n this.db.function('add_bigint', { deterministic: true }, (left: string | number | bigint | null, right: string | number | bigint | null) => {\n return (toBigInt(left) + toBigInt(right)).toString();\n });\n this.db.function('subtract_bigint', { deterministic: true }, (left: string | number | bigint | null, right: string | number | bigint | null) => {\n const value = toBigInt(left) - toBigInt(right);\n return value < 0n ? '0' : value.toString();\n });\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS indexer_cursors (\n stream_key TEXT PRIMARY KEY,\n cursor_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n event_type TEXT NOT NULL,\n package_id TEXT NOT NULL,\n tx_digest TEXT NOT NULL,\n module_name TEXT,\n checkpoint INTEGER,\n timestamp_ms INTEGER NOT NULL,\n payload_json TEXT NOT NULL,\n indexed_at INTEGER NOT NULL\n );\n CREATE INDEX IF NOT EXISTS events_type_timestamp_idx ON events (event_type, timestamp_ms DESC);\n CREATE INDEX IF NOT EXISTS events_tx_digest_idx ON events (tx_digest);\n\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 NOT NULL DEFAULT 1,\n version INTEGER NOT NULL 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 INDEX IF NOT EXISTS agents_owner_idx ON agents (owner);\n CREATE INDEX IF NOT EXISTS agents_did_idx ON agents (did);\n CREATE VIRTUAL TABLE IF NOT EXISTS agents_fts USING fts5(agent_id UNINDEXED, name, description, capabilities_text);\n\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n requester TEXT NOT NULL,\n provider TEXT,\n capability TEXT NOT NULL,\n category TEXT NOT NULL,\n input_blob_id TEXT NOT NULL,\n result_blob_id TEXT,\n price TEXT NOT NULL,\n payment_scheme TEXT,\n max_price TEXT,\n metered_units INTEGER,\n unit_price TEXT,\n verification_hash TEXT,\n status INTEGER NOT NULL,\n dispute_window_ms INTEGER,\n created_at INTEGER NOT NULL,\n accepted_at INTEGER,\n completed_at INTEGER,\n released_at INTEGER,\n disputed_at INTEGER,\n cancelled_at INTEGER,\n expires_at INTEGER NOT NULL,\n agreement_hash TEXT,\n posted_tx_digest TEXT,\n accepted_tx_digest TEXT,\n completed_tx_digest TEXT,\n released_tx_digest TEXT,\n disputed_tx_digest TEXT,\n cancelled_tx_digest TEXT,\n gas_cost_mist_total TEXT DEFAULT '0',\n bid_count INTEGER NOT NULL DEFAULT 0\n );\n CREATE INDEX IF NOT EXISTS tasks_status_created_idx ON tasks (status, created_at DESC);\n CREATE INDEX IF NOT EXISTS tasks_provider_created_idx ON tasks (provider, created_at DESC);\n CREATE INDEX IF NOT EXISTS tasks_requester_created_idx ON tasks (requester, created_at DESC);\n CREATE INDEX IF NOT EXISTS tasks_category_created_idx ON tasks (category, created_at DESC);\n CREATE INDEX IF NOT EXISTS tasks_capability_created_idx ON tasks (capability, created_at DESC);\n CREATE INDEX IF NOT EXISTS tasks_created_cursor_idx ON tasks (created_at DESC, id DESC);\n\n CREATE TABLE IF NOT EXISTS task_transitions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL,\n event_type TEXT NOT NULL,\n status INTEGER NOT NULL,\n tx_digest TEXT NOT NULL,\n timestamp_ms INTEGER NOT NULL,\n payload_json TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS task_transitions_task_idx ON task_transitions (task_id, timestamp_ms ASC, id ASC);\n\n CREATE TABLE IF NOT EXISTS bids (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL,\n bidder TEXT NOT NULL,\n bid_price TEXT NOT NULL,\n reputation_score TEXT NOT NULL,\n evidence_blob TEXT,\n created_at INTEGER NOT NULL,\n accepted_at INTEGER,\n rejected_at INTEGER,\n withdrawn_at INTEGER,\n status INTEGER NOT NULL\n );\n CREATE INDEX IF NOT EXISTS bids_task_idx ON bids (task_id, created_at DESC);\n CREATE INDEX IF NOT EXISTS bids_status_idx ON bids (status);\n\n CREATE TABLE IF NOT EXISTS disputes (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL,\n requester TEXT NOT NULL,\n provider TEXT NOT NULL,\n escrow_amount TEXT NOT NULL,\n status INTEGER NOT NULL,\n requester_evidence_blob TEXT NOT NULL,\n provider_evidence_blob TEXT,\n requester_proposed_split TEXT NOT NULL,\n provider_proposed_split TEXT NOT NULL,\n arbitrator TEXT,\n ruling_split TEXT NOT NULL,\n opened_at INTEGER NOT NULL,\n responded_at INTEGER,\n resolved_at INTEGER,\n resolution_deadline INTEGER NOT NULL\n );\n CREATE INDEX IF NOT EXISTS disputes_task_idx ON disputes (task_id);\n CREATE INDEX IF NOT EXISTS disputes_status_idx ON disputes (status);\n\n CREATE TABLE IF NOT EXISTS stakes (\n id TEXT PRIMARY KEY,\n owner TEXT NOT NULL,\n amount_mist TEXT NOT NULL DEFAULT '0',\n active INTEGER NOT NULL DEFAULT 1,\n stake_type TEXT,\n staked_at INTEGER,\n deactivated_at INTEGER,\n withdrawn_at INTEGER,\n slashed_amount_mist TEXT NOT NULL DEFAULT '0',\n last_updated_at INTEGER NOT NULL\n );\n CREATE INDEX IF NOT EXISTS stakes_owner_idx ON stakes (owner);\n\n CREATE TABLE IF NOT EXISTS reputation_anchors (\n anchor_id TEXT PRIMARY KEY,\n author TEXT NOT NULL,\n merkle_root TEXT NOT NULL,\n event_count INTEGER NOT NULL,\n blob_id TEXT,\n from_timestamp INTEGER,\n to_timestamp INTEGER,\n created_at INTEGER NOT NULL,\n tx_digest TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS reputation_anchors_author_idx ON reputation_anchors (author, created_at DESC);\n `);\n ensureTaskColumns(this.db);\n }\n\n close(): void {\n this.db.close();\n }\n\n getCursor(streamKey: string): { txDigest: string; eventSeq: string } | null {\n const row = this.db.prepare('SELECT cursor_json FROM indexer_cursors WHERE stream_key = ?').get(streamKey) as\n | { cursor_json: string }\n | undefined;\n if (!row) {\n return null;\n }\n\n try {\n return JSON.parse(row.cursor_json) as { txDigest: string; eventSeq: string };\n } catch {\n return null;\n }\n }\n\n setCursor(streamKey: string, cursor: { txDigest: string; eventSeq: string }): void {\n this.db\n .prepare(\n `INSERT INTO indexer_cursors (stream_key, cursor_json, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(stream_key)\n DO UPDATE SET cursor_json = excluded.cursor_json, updated_at = excluded.updated_at`,\n )\n .run(streamKey, JSON.stringify(cursor), Date.now());\n }\n\n recordEvent(event: StoredEvent): boolean {\n const result = this.db\n .prepare(\n `INSERT OR IGNORE INTO events (\n event_id, event_type, package_id, tx_digest, module_name, checkpoint, timestamp_ms, payload_json, indexed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n event.eventId,\n event.eventType,\n event.packageId,\n event.txDigest,\n event.module ?? null,\n event.checkpoint ?? null,\n event.timestampMs,\n JSON.stringify(event.payload, bigintReplacer),\n Date.now(),\n );\n return result.changes > 0;\n }\n\n upsertAgent(agent: AgentCard): void {\n const capabilitiesJson = JSON.stringify(agent.capabilities, bigintReplacer);\n const capabilitiesText = buildCapabilitiesText(agent.capabilities);\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 = COALESCE(excluded.total_tasks_completed, agents.total_tasks_completed),\n total_tasks_failed = COALESCE(excluded.total_tasks_failed, agents.total_tasks_failed),\n total_tasks_disputed = COALESCE(excluded.total_tasks_disputed, agents.total_tasks_disputed),\n total_earnings_mist = COALESCE(excluded.total_earnings_mist, agents.total_earnings_mist),\n has_stake = COALESCE(excluded.has_stake, agents.has_stake),\n stake_mist = COALESCE(excluded.stake_mist, agents.stake_mist),\n stake_type = COALESCE(excluded.stake_type, agents.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('INSERT INTO agents_fts (agent_id, name, description, capabilities_text) VALUES (?, ?, ?, ?)')\n .run(agent.id, agent.name, agent.description, capabilitiesText);\n }\n\n markAgentInactive(agentId: string): void {\n this.db.prepare('UPDATE agents SET active = 0 WHERE id = ?').run(agentId);\n }\n\n getAgentByDid(did: string): AgentCard | null {\n const row = this.db.prepare('SELECT rowid, * FROM agents WHERE did = ?').get(did) as AgentRow | undefined;\n return row ? mapAgentRow(row) : null;\n }\n\n queryAgents(filters: AgentQueryFilters = {}): AgentCard[] {\n const limit = normalizeLimit(filters.limit, 20);\n const offset = normalizeOffset(filters.offset);\n const clauses: string[] = [];\n const values: Array<string | number> = [];\n\n if (filters.activeOnly !== false) {\n clauses.push('a.active = 1');\n }\n if (filters.category) {\n clauses.push('EXISTS (SELECT 1 FROM tasks t WHERE t.provider = a.owner AND t.category = ?)');\n values.push(filters.category);\n }\n\n const search = filters.search?.trim();\n const capability = filters.capability?.trim();\n const searchQuery = search ?? capability;\n let rows: AgentRow[] = [];\n\n if (searchQuery) {\n const ftsQuery = buildFtsQuery(searchQuery);\n const where = clauses.length > 0 ? `AND ${clauses.join(' AND ')}` : '';\n try {\n 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 ? ${where}\n LIMIT ? OFFSET ?`,\n )\n .all(ftsQuery, ...values, Math.max(limit * 4, 50), offset) as AgentRow[];\n } catch {\n const like = `%${searchQuery}%`;\n const whereClause = clauses.length > 0 ? `AND ${clauses.join(' AND ')}` : '';\n rows = this.db\n .prepare(\n `SELECT rowid, * FROM agents a\n WHERE (a.name LIKE ? OR a.description LIKE ? OR a.capabilities_text LIKE ? OR a.capabilities_json LIKE ?)\n ${whereClause}\n LIMIT ? OFFSET ?`,\n )\n .all(like, like, like, like, ...values, Math.max(limit * 4, 50), offset) as AgentRow[];\n }\n } else {\n const whereClause = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';\n rows = this.db\n .prepare(`SELECT rowid, * FROM agents a ${whereClause} ORDER BY updated_at DESC LIMIT ? OFFSET ?`)\n .all(Math.max(limit * 4, 50), offset) as AgentRow[];\n }\n\n let agents = rows.map(mapAgentRow);\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\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 = filters.sortBy === 'reputation'\n ? this.scoreCalculator.rankByReputation(agents, scores)\n : [...agents].sort(compareStakePreference);\n return ranked.slice(0, limit);\n }\n\n countAgents(filters: AgentQueryFilters = {}): number {\n return this.queryAgents({ ...filters, limit: 10_000, offset: 0 }).length;\n }\n\n upsertTask(task: Task, txDigest: string, gasCostMist = 0n): void {\n this.db\n .prepare(\n `INSERT INTO tasks (\n id, requester, provider, capability, category, input_blob_id, result_blob_id, price,\n payment_scheme, max_price, metered_units, unit_price, verification_hash,\n status, dispute_window_ms, created_at, accepted_at, completed_at, released_at, disputed_at, cancelled_at,\n expires_at, agreement_hash, posted_tx_digest, gas_cost_mist_total, bid_count\n ) VALUES (\n ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,\n ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,\n COALESCE((SELECT bid_count FROM tasks WHERE id = ?), 0)\n )\n ON CONFLICT(id) DO UPDATE SET\n requester = excluded.requester,\n provider = COALESCE(excluded.provider, tasks.provider),\n capability = excluded.capability,\n category = excluded.category,\n input_blob_id = excluded.input_blob_id,\n result_blob_id = COALESCE(excluded.result_blob_id, tasks.result_blob_id),\n price = excluded.price,\n payment_scheme = COALESCE(excluded.payment_scheme, tasks.payment_scheme),\n max_price = COALESCE(excluded.max_price, tasks.max_price),\n metered_units = COALESCE(excluded.metered_units, tasks.metered_units),\n unit_price = COALESCE(excluded.unit_price, tasks.unit_price),\n verification_hash = COALESCE(excluded.verification_hash, tasks.verification_hash),\n status = excluded.status,\n dispute_window_ms = excluded.dispute_window_ms,\n created_at = excluded.created_at,\n accepted_at = COALESCE(excluded.accepted_at, tasks.accepted_at),\n completed_at = COALESCE(excluded.completed_at, tasks.completed_at),\n expires_at = excluded.expires_at,\n agreement_hash = COALESCE(excluded.agreement_hash, tasks.agreement_hash),\n posted_tx_digest = COALESCE(excluded.posted_tx_digest, tasks.posted_tx_digest),\n gas_cost_mist_total = add_bigint(tasks.gas_cost_mist_total, excluded.gas_cost_mist_total)`,\n )\n .run(\n task.id,\n task.requester,\n task.provider ?? null,\n task.capability,\n task.category,\n task.inputBlobId,\n task.resultBlobId ?? null,\n task.price.toString(),\n task.paymentScheme ?? null,\n task.maxPrice?.toString() ?? null,\n task.meteredUnits ?? null,\n task.unitPrice?.toString() ?? null,\n task.verificationHash ?? null,\n task.status,\n task.disputeWindowMs,\n task.createdAt,\n task.acceptedAt ?? null,\n task.completedAt ?? null,\n null,\n null,\n null,\n task.expiresAt,\n task.agreementHash ?? null,\n txDigest,\n gasCostMist.toString(),\n task.id,\n );\n this.recordTaskTransition(task.id, 'task.posted', TaskStatus.OPEN, txDigest, task.createdAt, task as unknown as Record<string, unknown>);\n }\n\n updateTaskStatus(params: {\n taskId: string;\n status: TaskStatus;\n txDigest: string;\n timestampMs: number;\n provider?: string;\n requester?: string;\n resultBlobId?: string;\n price?: bigint;\n paymentScheme?: Task['paymentScheme'];\n meteredUnits?: number;\n maxPrice?: bigint;\n unitPrice?: bigint;\n verificationHash?: string;\n gasCostMist?: bigint;\n eventType: string;\n payload: Record<string, unknown>;\n }): void {\n const gasCost = params.gasCostMist?.toString() ?? '0';\n const columnUpdates: string[] = ['status = ?', 'provider = COALESCE(?, provider)', 'gas_cost_mist_total = add_bigint(gas_cost_mist_total, ?)'];\n const values: Array<number | string | null> = [params.status, params.provider ?? null, gasCost];\n\n if (params.requester !== undefined) {\n columnUpdates.push('requester = COALESCE(?, requester)');\n values.push(params.requester || null);\n }\n if (params.resultBlobId !== undefined) {\n columnUpdates.push('result_blob_id = COALESCE(?, result_blob_id)');\n values.push(params.resultBlobId || null);\n }\n if (params.price !== undefined) {\n columnUpdates.push('price = COALESCE(?, price)');\n values.push(params.price?.toString() ?? null);\n }\n if (params.paymentScheme !== undefined) {\n columnUpdates.push('payment_scheme = COALESCE(?, payment_scheme)');\n values.push(params.paymentScheme ?? null);\n }\n if (params.meteredUnits !== undefined) {\n columnUpdates.push('metered_units = COALESCE(?, metered_units)');\n values.push(params.meteredUnits);\n }\n if (params.maxPrice !== undefined) {\n columnUpdates.push('max_price = COALESCE(?, max_price)');\n values.push(params.maxPrice?.toString() ?? null);\n }\n if (params.unitPrice !== undefined) {\n columnUpdates.push('unit_price = COALESCE(?, unit_price)');\n values.push(params.unitPrice?.toString() ?? null);\n }\n if (params.verificationHash !== undefined) {\n columnUpdates.push('verification_hash = COALESCE(?, verification_hash)');\n values.push(params.verificationHash || null);\n }\n\n switch (params.status) {\n case TaskStatus.ACCEPTED:\n columnUpdates.push('accepted_at = ?', 'accepted_tx_digest = ?');\n values.push(params.timestampMs, params.txDigest);\n break;\n case TaskStatus.COMPLETED:\n columnUpdates.push('completed_at = ?', 'completed_tx_digest = ?');\n values.push(params.timestampMs, params.txDigest);\n break;\n case TaskStatus.RELEASED:\n columnUpdates.push('released_at = ?', 'released_tx_digest = ?');\n values.push(params.timestampMs, params.txDigest);\n break;\n case TaskStatus.DISPUTED:\n columnUpdates.push('disputed_at = ?', 'disputed_tx_digest = ?');\n values.push(params.timestampMs, params.txDigest);\n break;\n case TaskStatus.CANCELLED:\n columnUpdates.push('cancelled_at = ?', 'cancelled_tx_digest = ?');\n values.push(params.timestampMs, params.txDigest);\n break;\n default:\n break;\n }\n\n this.db.prepare(`UPDATE tasks SET ${columnUpdates.join(', ')} WHERE id = ?`).run(...values, params.taskId);\n this.recordTaskTransition(params.taskId, params.eventType, params.status, params.txDigest, params.timestampMs, params.payload);\n }\n\n getTask(taskId: string, includeTransitions = true): IndexedTask | null {\n const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(taskId) as TaskRow | undefined;\n if (!row) {\n return null;\n }\n return mapTaskRow(row, includeTransitions ? this.getTaskTransitions(taskId) : undefined);\n }\n\n queryTasks(filters: TaskQueryFilters = {}): IndexedTask[] {\n const limit = normalizeLimit(filters.limit, 20);\n const clauses: string[] = [];\n const values: Array<number | string> = [];\n if (filters.status !== undefined) {\n clauses.push('status = ?');\n values.push(filters.status);\n }\n if (filters.requester) {\n clauses.push('requester = ?');\n values.push(filters.requester);\n }\n if (filters.provider) {\n clauses.push('provider = ?');\n values.push(filters.provider);\n }\n if (filters.category) {\n clauses.push('category = ?');\n values.push(filters.category);\n }\n const cursor = decodeCursor(filters.after);\n if (cursor) {\n clauses.push('(created_at < ? OR (created_at = ? AND id < ?))');\n values.push(cursor.createdAt, cursor.createdAt, cursor.id);\n }\n const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';\n const rows = this.db\n .prepare(`SELECT * FROM tasks ${where} ORDER BY created_at DESC, id DESC LIMIT ?`)\n .all(...values, limit) as TaskRow[];\n return rows.map((row) => mapTaskRow(row));\n }\n\n getTaskTransitions(taskId: string): IndexedTaskTransition[] {\n const rows = this.db\n .prepare(\n 'SELECT task_id, event_type, status, tx_digest, timestamp_ms, payload_json FROM task_transitions WHERE task_id = ? ORDER BY timestamp_ms ASC, id ASC',\n )\n .all(taskId) as TransitionRow[];\n return rows.map((row) => ({\n taskId: row.task_id,\n eventType: row.event_type,\n status: Number(row.status) as TaskStatus,\n txDigest: row.tx_digest,\n timestampMs: Number(row.timestamp_ms),\n payload: JSON.parse(row.payload_json) as Record<string, unknown>,\n }));\n }\n\n upsertBid(bid: Bid): void {\n const existing = this.db.prepare('SELECT 1 FROM bids WHERE id = ?').get(bid.id);\n this.db\n .prepare(\n `INSERT INTO bids (\n id, task_id, bidder, bid_price, reputation_score, evidence_blob, created_at, accepted_at, rejected_at, withdrawn_at, status\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n task_id = excluded.task_id,\n bidder = excluded.bidder,\n bid_price = excluded.bid_price,\n reputation_score = excluded.reputation_score,\n evidence_blob = excluded.evidence_blob,\n created_at = excluded.created_at,\n status = excluded.status`,\n )\n .run(\n bid.id,\n bid.taskId,\n bid.bidder,\n bid.bidPrice.toString(),\n bid.reputationScore.toString(),\n bid.evidenceBlob ?? null,\n bid.createdAt,\n null,\n null,\n null,\n bid.status,\n );\n if (!existing) {\n this.db.prepare('UPDATE tasks SET bid_count = bid_count + 1 WHERE id = ?').run(bid.taskId);\n }\n }\n\n updateBidStatus(bidId: string, status: BidStatus, timestampMs: number): void {\n const columns: string[] = ['status = ?'];\n const values: Array<number | string> = [status];\n if (status === BidStatus.ACCEPTED) {\n columns.push('accepted_at = ?');\n values.push(timestampMs);\n } else if (status === BidStatus.REJECTED) {\n columns.push('rejected_at = ?');\n values.push(timestampMs);\n } else if (status === BidStatus.WITHDRAWN) {\n columns.push('withdrawn_at = ?');\n values.push(timestampMs);\n }\n this.db.prepare(`UPDATE bids SET ${columns.join(', ')} WHERE id = ?`).run(...values, bidId);\n }\n\n getBids(taskId: string, status?: BidStatus): Bid[] {\n const rows = (status === undefined\n ? this.db.prepare('SELECT * FROM bids WHERE task_id = ? ORDER BY created_at DESC').all(taskId)\n : this.db.prepare('SELECT * FROM bids WHERE task_id = ? AND status = ? ORDER BY created_at DESC').all(taskId, status)) as BidRow[];\n return rows.map(mapBidRow);\n }\n\n upsertDispute(dispute: Dispute): void {\n this.db\n .prepare(\n `INSERT INTO disputes (\n id, task_id, requester, provider, escrow_amount, status, requester_evidence_blob,\n provider_evidence_blob, requester_proposed_split, provider_proposed_split, arbitrator,\n ruling_split, opened_at, responded_at, resolved_at, resolution_deadline\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n task_id = excluded.task_id,\n requester = excluded.requester,\n provider = excluded.provider,\n escrow_amount = excluded.escrow_amount,\n status = excluded.status,\n requester_evidence_blob = excluded.requester_evidence_blob,\n provider_evidence_blob = COALESCE(excluded.provider_evidence_blob, disputes.provider_evidence_blob),\n requester_proposed_split = excluded.requester_proposed_split,\n provider_proposed_split = COALESCE(excluded.provider_proposed_split, disputes.provider_proposed_split),\n arbitrator = COALESCE(excluded.arbitrator, disputes.arbitrator),\n ruling_split = COALESCE(excluded.ruling_split, disputes.ruling_split),\n opened_at = excluded.opened_at,\n responded_at = COALESCE(excluded.responded_at, disputes.responded_at),\n resolved_at = COALESCE(excluded.resolved_at, disputes.resolved_at),\n resolution_deadline = excluded.resolution_deadline`,\n )\n .run(\n dispute.id,\n dispute.taskId,\n dispute.requester,\n dispute.provider,\n dispute.escrowAmount.toString(),\n dispute.status,\n dispute.requesterEvidenceBlob,\n dispute.providerEvidenceBlob ?? null,\n dispute.requesterProposedSplit.toString(),\n dispute.providerProposedSplit.toString(),\n dispute.arbitrator ?? null,\n dispute.rulingSplit.toString(),\n dispute.openedAt,\n dispute.respondedAt ?? null,\n dispute.resolvedAt ?? null,\n dispute.resolutionDeadline,\n );\n }\n\n updateDispute(params: {\n disputeId: string;\n status: DisputeStatus;\n respondedAt?: number;\n resolvedAt?: number;\n providerEvidenceBlob?: string;\n providerProposedSplit?: bigint;\n arbitrator?: string;\n rulingSplit?: bigint;\n }): void {\n const clauses: string[] = ['status = ?'];\n const values: Array<number | string | null> = [params.status];\n if (params.respondedAt !== undefined) {\n clauses.push('responded_at = ?');\n values.push(params.respondedAt);\n }\n if (params.resolvedAt !== undefined) {\n clauses.push('resolved_at = ?');\n values.push(params.resolvedAt);\n }\n if (params.providerEvidenceBlob !== undefined) {\n clauses.push('provider_evidence_blob = ?');\n values.push(params.providerEvidenceBlob);\n }\n if (params.providerProposedSplit !== undefined) {\n clauses.push('provider_proposed_split = ?');\n values.push(params.providerProposedSplit.toString());\n }\n if (params.arbitrator !== undefined) {\n clauses.push('arbitrator = ?');\n values.push(params.arbitrator);\n }\n if (params.rulingSplit !== undefined) {\n clauses.push('ruling_split = ?');\n values.push(params.rulingSplit.toString());\n }\n this.db.prepare(`UPDATE disputes SET ${clauses.join(', ')} WHERE id = ?`).run(...values, params.disputeId);\n }\n\n getDisputes(filters: DisputeQueryFilters = {}): Dispute[] {\n const clauses: string[] = [];\n const values: Array<string | number> = [];\n if (filters.status !== undefined) {\n clauses.push('status = ?');\n values.push(filters.status);\n }\n if (filters.agent) {\n clauses.push('(requester = ? OR provider = ? OR arbitrator = ?)');\n values.push(filters.agent, filters.agent, filters.agent);\n }\n const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';\n const rows = this.db.prepare(`SELECT * FROM disputes ${where} ORDER BY opened_at DESC`).all(...values) as DisputeRow[];\n return rows.map(mapDisputeRow);\n }\n\n upsertStake(params: {\n stakeId: string;\n owner: string;\n amountMist?: bigint;\n stakeType?: 'agent' | 'relay';\n stakedAt?: number;\n deactivatedAt?: number;\n withdrawnAt?: number;\n slashedAmountMist?: bigint;\n active?: boolean;\n }): void {\n this.db\n .prepare(\n `INSERT INTO stakes (\n id, owner, amount_mist, active, stake_type, staked_at, deactivated_at, withdrawn_at, slashed_amount_mist, last_updated_at\n ) VALUES (?, ?, COALESCE(?, (SELECT amount_mist FROM stakes WHERE id = ?), '0'), ?, ?, ?, ?, ?, COALESCE(?, (SELECT slashed_amount_mist FROM stakes WHERE id = ?), '0'), ?)\n ON CONFLICT(id) DO UPDATE SET\n owner = excluded.owner,\n amount_mist = COALESCE(excluded.amount_mist, stakes.amount_mist),\n active = excluded.active,\n stake_type = COALESCE(excluded.stake_type, stakes.stake_type),\n staked_at = COALESCE(excluded.staked_at, stakes.staked_at),\n deactivated_at = COALESCE(excluded.deactivated_at, stakes.deactivated_at),\n withdrawn_at = COALESCE(excluded.withdrawn_at, stakes.withdrawn_at),\n slashed_amount_mist = COALESCE(excluded.slashed_amount_mist, stakes.slashed_amount_mist),\n last_updated_at = excluded.last_updated_at`,\n )\n .run(\n params.stakeId,\n params.owner,\n params.amountMist?.toString() ?? null,\n params.stakeId,\n params.active === false ? 0 : 1,\n params.stakeType ?? null,\n params.stakedAt ?? null,\n params.deactivatedAt ?? null,\n params.withdrawnAt ?? null,\n params.slashedAmountMist?.toString() ?? null,\n params.stakeId,\n Date.now(),\n );\n this.syncAgentStake(params.owner);\n }\n\n addStakeSlash(stakeId: string, amountMist: bigint): void {\n this.db\n .prepare(\n `UPDATE stakes\n SET slashed_amount_mist = add_bigint(slashed_amount_mist, ?),\n amount_mist = subtract_bigint(amount_mist, ?),\n last_updated_at = ?\n WHERE id = ?`,\n )\n .run(amountMist.toString(), amountMist.toString(), Date.now(), stakeId);\n const owner = this.db.prepare('SELECT owner FROM stakes WHERE id = ?').get(stakeId) as { owner: string } | undefined;\n if (owner) {\n this.syncAgentStake(owner.owner);\n }\n }\n\n upsertReputationAnchor(params: {\n anchorId: string;\n author: string;\n merkleRoot: string;\n eventCount: number;\n blobId?: string;\n fromTimestamp?: number;\n toTimestamp?: number;\n createdAt: number;\n txDigest: string;\n }): void {\n this.db\n .prepare(\n `INSERT OR REPLACE INTO reputation_anchors (\n anchor_id, author, merkle_root, event_count, blob_id, from_timestamp, to_timestamp, created_at, tx_digest\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n params.anchorId,\n params.author,\n params.merkleRoot,\n params.eventCount,\n params.blobId ?? null,\n params.fromTimestamp ?? null,\n params.toTimestamp ?? null,\n params.createdAt,\n params.txDigest,\n );\n }\n\n getDatabase(): Database.Database {\n return this.db;\n }\n\n private recordTaskTransition(\n taskId: string,\n eventType: string,\n status: TaskStatus,\n txDigest: string,\n timestampMs: number,\n payload: Record<string, unknown>,\n ): void {\n const exists = this.db\n .prepare('SELECT 1 FROM task_transitions WHERE task_id = ? AND event_type = ? AND tx_digest = ? LIMIT 1')\n .get(taskId, eventType, txDigest);\n if (exists) {\n return;\n }\n\n this.db\n .prepare(\n 'INSERT INTO task_transitions (task_id, event_type, status, tx_digest, timestamp_ms, payload_json) VALUES (?, ?, ?, ?, ?, ?)',\n )\n .run(taskId, eventType, status, txDigest, timestampMs, JSON.stringify(payload, bigintReplacer));\n }\n\n private syncAgentStake(owner: string): void {\n const stake = this.db\n .prepare('SELECT amount_mist, active, stake_type FROM stakes WHERE owner = ? ORDER BY last_updated_at DESC LIMIT 1')\n .get(owner) as { amount_mist: string; active: number | bigint; stake_type: string | null } | undefined;\n if (!stake) {\n this.db.prepare('UPDATE agents SET has_stake = 0, stake_mist = NULL, stake_type = NULL WHERE owner = ?').run(owner);\n return;\n }\n this.db\n .prepare('UPDATE agents SET has_stake = ?, stake_mist = ?, stake_type = ? WHERE owner = ?')\n .run(Number(stake.active) === 1 ? 1 : 0, stake.amount_mist, stake.stake_type, owner);\n }\n}\n\nexport function encodeCursor(task: Pick<Task, 'id' | 'createdAt'>): string {\n return Buffer.from(JSON.stringify({ id: task.id, createdAt: task.createdAt })).toString('base64url');\n}\n\nfunction decodeCursor(cursor?: string): { id: string; createdAt: number } | null {\n if (!cursor) {\n return null;\n }\n try {\n const parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8')) as { id?: string; createdAt?: number };\n return typeof parsed.id === 'string' && typeof parsed.createdAt === 'number'\n ? { id: parsed.id, createdAt: parsed.createdAt }\n : null;\n } catch {\n return null;\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 mapTaskRow(row: TaskRow, transitions?: IndexedTaskTransition[]): IndexedTask {\n return {\n id: row.id,\n requester: row.requester,\n provider: row.provider ?? undefined,\n capability: row.capability,\n category: row.category,\n inputBlobId: row.input_blob_id,\n resultBlobId: row.result_blob_id ?? undefined,\n price: BigInt(row.price),\n paymentScheme: normalizePaymentScheme(row.payment_scheme),\n maxPrice: row.max_price == null ? undefined : BigInt(row.max_price),\n meteredUnits: row.metered_units == null ? undefined : Number(row.metered_units),\n unitPrice: row.unit_price == null ? undefined : BigInt(row.unit_price),\n verificationHash: row.verification_hash ?? undefined,\n status: Number(row.status) as TaskStatus,\n disputeWindowMs: Number(row.dispute_window_ms ?? 0),\n createdAt: Number(row.created_at),\n acceptedAt: row.accepted_at == null ? undefined : Number(row.accepted_at),\n completedAt: row.completed_at == null ? undefined : Number(row.completed_at),\n releasedAt: row.released_at == null ? undefined : Number(row.released_at),\n disputedAt: row.disputed_at == null ? undefined : Number(row.disputed_at),\n cancelledAt: row.cancelled_at == null ? undefined : Number(row.cancelled_at),\n expiresAt: Number(row.expires_at),\n agreementHash: row.agreement_hash ?? undefined,\n bidCount: Number(row.bid_count ?? 0),\n gasCostMistTotal: BigInt(row.gas_cost_mist_total ?? '0'),\n transitions,\n };\n}\n\nfunction mapBidRow(row: BidRow): Bid {\n return {\n id: row.id,\n taskId: row.task_id,\n bidder: row.bidder,\n bidPrice: BigInt(row.bid_price),\n reputationScore: BigInt(row.reputation_score),\n evidenceBlob: row.evidence_blob ?? undefined,\n createdAt: Number(row.created_at),\n status: Number(row.status) as BidStatus,\n };\n}\n\nfunction mapDisputeRow(row: DisputeRow): Dispute {\n return {\n id: row.id,\n taskId: row.task_id,\n requester: row.requester,\n provider: row.provider,\n escrowAmount: BigInt(row.escrow_amount),\n status: Number(row.status) as DisputeStatus,\n requesterEvidenceBlob: row.requester_evidence_blob,\n providerEvidenceBlob: row.provider_evidence_blob ?? undefined,\n requesterProposedSplit: BigInt(row.requester_proposed_split),\n providerProposedSplit: BigInt(row.provider_proposed_split),\n arbitrator: row.arbitrator ?? undefined,\n rulingSplit: BigInt(row.ruling_split),\n openedAt: Number(row.opened_at),\n respondedAt: row.responded_at == null ? undefined : Number(row.responded_at),\n resolvedAt: row.resolved_at == null ? undefined : Number(row.resolved_at),\n resolutionDeadline: Number(row.resolution_deadline),\n };\n}\n\nfunction parseCapabilities(value: string | null): Capability[] {\n if (!value) {\n return [];\n }\n\n try {\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 } catch {\n return [];\n }\n}\n\nfunction buildCapabilitiesText(capabilities: Capability[]): string {\n return capabilities.map((entry) => `${entry.name} ${entry.description} ${entry.version}`).join(' ');\n}\n\nfunction buildFtsQuery(query: string): string {\n return query\n .trim()\n .split(/\\s+/)\n .map((term) => term.replace(/[^\\p{L}\\p{N}_-]/gu, ''))\n .filter(Boolean)\n .map((term) => `\"${term}\"*`)\n .join(' OR ');\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 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}\n\nfunction equalsIgnoreCase(left: string, right: string): boolean {\n return left.toLowerCase() === right.toLowerCase();\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 bigintReplacer(_key: string, value: unknown): unknown {\n return typeof value === 'bigint' ? value.toString() : value;\n}\n\nfunction toBigInt(value: string | number | bigint | null | undefined): 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 normalizePaymentScheme(value: string | null): PaymentScheme | undefined {\n switch (value) {\n case PaymentScheme.EXACT:\n return PaymentScheme.EXACT;\n case PaymentScheme.UPTO:\n return PaymentScheme.UPTO;\n case PaymentScheme.STREAM:\n return PaymentScheme.STREAM;\n default:\n return undefined;\n }\n}\n\nfunction ensureTaskColumns(db: Database.Database): void {\n const rows = db.prepare('PRAGMA table_info(tasks)').all() as Array<{ name?: string }>;\n const existing = new Set(rows.map((row) => row.name).filter((name): name is string => typeof name === 'string'));\n const missingColumns = [\n ['payment_scheme', 'TEXT'],\n ['max_price', 'TEXT'],\n ['metered_units', 'INTEGER'],\n ['unit_price', 'TEXT'],\n ['verification_hash', 'TEXT'],\n ] as const;\n\n for (const [column, type] of missingColumns) {\n if (!existing.has(column)) {\n db.exec(`ALTER TABLE tasks ADD COLUMN ${column} ${type}`);\n }\n }\n}\n","import pino from 'pino';\n\nimport { MeshSuiClient, parseRawEvent } from '@hivemind-os/collective-core';\nimport type { Dispute, MeshEvent, ReputationAnchor } from '@hivemind-os/collective-types';\nimport { DisputeStatus, TaskStatus } from '@hivemind-os/collective-types';\nimport type { SuiEvent, SuiTransactionBlockResponse } from '@mysten/sui/client';\n\nimport type { IndexerStore } from './store.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-indexer' });\n\nconst EVENT_NAMES = {\n agentRegistered: 'registry::AgentRegistered',\n agentUpdated: 'registry::AgentUpdated',\n agentDeactivated: 'registry::AgentDeactivated',\n taskPosted: 'task::TaskPosted',\n taskAccepted: 'task::TaskAccepted',\n taskCompleted: 'task::TaskCompleted',\n taskReleased: 'task::TaskPaymentReleased',\n taskDisputed: 'task::TaskDisputed',\n taskCancelled: 'task::TaskCancelled',\n taskExpiredRefunded: 'task::TaskExpiredRefunded',\n bidPlaced: 'marketplace::BidPlaced',\n bidAccepted: 'marketplace::BidAccepted',\n bidWithdrawn: 'marketplace::BidWithdrawn',\n bidRejected: 'marketplace::BidRejected',\n disputeOpened: 'dispute::DisputeOpened',\n disputeResponded: 'dispute::DisputeResponded',\n disputeMutuallyResolved: 'dispute::DisputeMutuallyResolved',\n disputeArbitrated: 'dispute::DisputeArbitrated',\n disputeExpired: 'dispute::DisputeExpired',\n stakeDeposited: 'staking::StakeDeposited',\n stakeWithdrawn: 'staking::StakeWithdrawn',\n stakeSlashed: 'staking::StakeSlashed',\n deactivationStarted: 'staking::DeactivationStarted',\n anchorPublished: 'reputation::AnchorPublished',\n} as const;\n\nexport const SUPPORTED_EVENT_TYPES = Object.values(EVENT_NAMES);\n\ninterface TransactionMetadata {\n checkpoint?: number;\n gasCostMist: bigint;\n}\n\ninterface ExtendedEventBase<TType extends string> {\n type: TType;\n txDigest: string;\n timestampMs: number;\n}\n\ninterface DisputeOpenedEvent extends ExtendedEventBase<'dispute.opened'> {\n disputeId: string;\n dispute: Dispute;\n}\n\ninterface DisputeUpdatedEvent extends ExtendedEventBase<'dispute.updated'> {\n disputeId: string;\n dispute?: Dispute;\n status: DisputeStatus;\n providerEvidenceBlob?: string;\n providerProposedSplit?: bigint;\n arbitrator?: string;\n rulingSplit?: bigint;\n}\n\ninterface StakeDepositedEvent extends ExtendedEventBase<'stake.deposited'> {\n stakeId: string;\n owner: string;\n amountMist: bigint;\n stakeType?: 'agent' | 'relay';\n}\n\ninterface StakeWithdrawnEvent extends ExtendedEventBase<'stake.withdrawn'> {\n stakeId: string;\n owner: string;\n amountMist: bigint;\n}\n\ninterface StakeSlashedEvent extends ExtendedEventBase<'stake.slashed'> {\n stakeId: string;\n target: string;\n amountMist: bigint;\n taskId: string;\n}\n\ninterface DeactivationStartedEvent extends ExtendedEventBase<'stake.deactivation_started'> {\n stakeId: string;\n owner: string;\n cooldownEndsAt: number;\n}\n\ninterface AnchorPublishedEvent extends ExtendedEventBase<'reputation.anchor_published'> {\n anchor: ReputationAnchor;\n}\n\ntype IndexedExtendedEvent =\n | DisputeOpenedEvent\n | DisputeUpdatedEvent\n | StakeDepositedEvent\n | StakeWithdrawnEvent\n | StakeSlashedEvent\n | DeactivationStartedEvent\n | AnchorPublishedEvent;\n\nexport interface MeshIndexerOptions {\n suiClient: MeshSuiClient;\n store: IndexerStore;\n packageId: string;\n pollIntervalMs?: number;\n startCheckpoint?: number;\n logger?: Pick<typeof logger, 'info' | 'warn' | 'error'>;\n}\n\nexport class MeshIndexer {\n private readonly logger: Pick<typeof logger, 'info' | 'warn' | 'error'>;\n\n private readonly txMetadataCache = new Map<string, Promise<TransactionMetadata>>();\n\n private running = false;\n private timer?: NodeJS.Timeout;\n private pollLoopPromise?: Promise<void>;\n\n constructor(private readonly options: MeshIndexerOptions) {\n this.logger = options.logger ?? logger;\n }\n\n start(): void {\n if (this.running) {\n return;\n }\n this.running = true;\n this.pollLoopPromise = this.pollLoop().finally(() => {\n this.pollLoopPromise = undefined;\n });\n }\n\n async stop(): Promise<void> {\n this.running = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n await this.pollLoopPromise?.catch(() => undefined);\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n async backfill(fromCheckpoint = this.options.startCheckpoint): Promise<number> {\n return await this.indexAllStreams(fromCheckpoint);\n }\n\n async pollOnce(): Promise<number> {\n return await this.indexAllStreams(this.options.startCheckpoint);\n }\n\n async processEvent(rawEvent: SuiEvent, metadata?: TransactionMetadata): Promise<void> {\n const txMetadata = metadata ?? (await this.getTransactionMetadata(rawEvent.id.txDigest));\n const wasInserted = this.options.store.recordEvent({\n eventId: formatEventId(rawEvent),\n eventType: rawEvent.type,\n packageId: this.options.packageId,\n txDigest: rawEvent.id.txDigest,\n timestampMs: readNumber(rawEvent.timestampMs),\n payload: normalizeMoveValue(rawEvent.parsedJson),\n checkpoint: txMetadata.checkpoint,\n module: rawEvent.transactionModule,\n });\n if (!wasInserted) {\n return;\n }\n\n const parsed = parseRawEvent(rawEvent, this.options.packageId);\n if (parsed) {\n this.handleParsedEvent(parsed, txMetadata);\n return;\n }\n\n const extended = await this.parseExtendedEvent(rawEvent);\n if (extended) {\n this.handleExtendedEvent(extended, txMetadata);\n }\n }\n\n private async pollLoop(): Promise<void> {\n if (!this.running) {\n return;\n }\n\n let nextDelay = this.options.pollIntervalMs ?? 5_000;\n try {\n const processed = await this.pollOnce();\n if (processed > 0) {\n nextDelay = 0;\n }\n } catch (error) {\n this.logger.error({ err: error }, 'Indexer polling failed.');\n }\n\n if (this.running) {\n this.timer = setTimeout(() => {\n void this.pollLoop();\n }, nextDelay);\n }\n }\n\n private async indexAllStreams(fromCheckpoint?: number): Promise<number> {\n let processed = 0;\n for (const suffix of SUPPORTED_EVENT_TYPES) {\n processed += await this.indexEventType(`${this.options.packageId}::${suffix}`, fromCheckpoint);\n }\n return processed;\n }\n\n private async indexEventType(eventType: string, fromCheckpoint?: number): Promise<number> {\n const cursorKey = `event:${eventType}`;\n let cursor = this.options.store.getCursor(cursorKey);\n let processed = 0;\n\n while (true) {\n const page = await this.options.suiClient.queryEvents(eventType, cursor, 100);\n for (const event of page.events) {\n const metadata = await this.getTransactionMetadata(event.id.txDigest);\n if (typeof fromCheckpoint === 'number' && typeof metadata.checkpoint === 'number' && metadata.checkpoint < fromCheckpoint) {\n cursor = event.id;\n this.options.store.setCursor(cursorKey, event.id);\n continue;\n }\n\n await this.processEvent(event, metadata);\n cursor = event.id;\n this.options.store.setCursor(cursorKey, event.id);\n processed += 1;\n }\n\n if (!page.hasMore || !page.nextCursor) {\n break;\n }\n cursor = page.nextCursor;\n }\n\n return processed;\n }\n\n private handleParsedEvent(event: MeshEvent, metadata: TransactionMetadata): void {\n switch (event.type) {\n case 'agent.registered':\n case 'agent.updated':\n this.options.store.upsertAgent(event.agent);\n break;\n case 'agent.deactivated':\n this.options.store.markAgentInactive(event.agentId);\n break;\n case 'task.posted':\n this.options.store.upsertTask(event.task, event.txDigest, metadata.gasCostMist);\n break;\n case 'task.accepted':\n this.options.store.updateTaskStatus({\n taskId: event.taskId,\n status: event.status,\n txDigest: event.txDigest,\n timestampMs: event.acceptedAt,\n provider: event.provider,\n requester: event.requester,\n price: event.price,\n gasCostMist: metadata.gasCostMist,\n eventType: event.type,\n payload: event as unknown as Record<string, unknown>,\n });\n break;\n case 'task.completed':\n this.options.store.updateTaskStatus({\n taskId: event.taskId,\n status: event.status,\n txDigest: event.txDigest,\n timestampMs: event.completedAt,\n provider: event.provider,\n resultBlobId: event.resultBlobId,\n price: event.price,\n paymentScheme: event.paymentScheme,\n meteredUnits: event.meteredUnits,\n verificationHash: event.verificationHash,\n gasCostMist: metadata.gasCostMist,\n eventType: event.type,\n payload: event as unknown as Record<string, unknown>,\n });\n break;\n case 'task.released':\n this.options.store.updateTaskStatus({\n taskId: event.taskId,\n status: event.status,\n txDigest: event.txDigest,\n timestampMs: event.releasedAt,\n provider: event.provider,\n requester: event.requester,\n price: event.price,\n gasCostMist: metadata.gasCostMist,\n eventType: event.type,\n payload: event as unknown as Record<string, unknown>,\n });\n break;\n case 'task.disputed':\n this.options.store.updateTaskStatus({\n taskId: event.taskId,\n status: event.status,\n txDigest: event.txDigest,\n timestampMs: event.disputedAt,\n provider: event.provider,\n requester: event.requester,\n gasCostMist: metadata.gasCostMist,\n eventType: event.type,\n payload: event as unknown as Record<string, unknown>,\n });\n break;\n case 'task.cancelled':\n this.options.store.updateTaskStatus({\n taskId: event.taskId,\n status: event.status,\n txDigest: event.txDigest,\n timestampMs: event.cancelledAt,\n requester: event.requester,\n gasCostMist: metadata.gasCostMist,\n eventType: event.type,\n payload: event as unknown as Record<string, unknown>,\n });\n break;\n case 'bid.placed':\n this.options.store.upsertBid(event.bid);\n break;\n case 'bid.accepted':\n this.options.store.updateBidStatus(event.bidId, event.status, event.acceptedAt);\n break;\n case 'bid.withdrawn':\n this.options.store.updateBidStatus(event.bidId, event.status, event.withdrawnAt);\n break;\n case 'bid.rejected':\n this.options.store.updateBidStatus(event.bidId, event.status, event.rejectedAt);\n break;\n default:\n break;\n }\n }\n\n private handleExtendedEvent(event: IndexedExtendedEvent, metadata: TransactionMetadata): void {\n switch (event.type) {\n case 'dispute.opened':\n this.options.store.upsertDispute(event.dispute);\n break;\n case 'dispute.updated': {\n const dispute = event.dispute;\n if (dispute) {\n this.options.store.upsertDispute(dispute);\n } else {\n this.options.store.updateDispute({\n disputeId: event.disputeId,\n status: event.status,\n respondedAt: event.status === DisputeStatus.RESPONDED ? event.timestampMs : undefined,\n resolvedAt: event.status !== DisputeStatus.RESPONDED ? event.timestampMs : undefined,\n providerEvidenceBlob: event.providerEvidenceBlob,\n providerProposedSplit: event.providerProposedSplit,\n arbitrator: event.arbitrator,\n rulingSplit: event.rulingSplit,\n });\n }\n if (event.status !== DisputeStatus.RESPONDED) {\n const taskId = dispute?.taskId;\n if (taskId) {\n this.options.store.updateTaskStatus({\n taskId,\n status: TaskStatus.RELEASED,\n txDigest: event.txDigest,\n timestampMs: event.timestampMs,\n requester: dispute.requester,\n provider: dispute.provider,\n gasCostMist: metadata.gasCostMist,\n eventType: `task.released_after_${event.type}`,\n payload: event as unknown as Record<string, unknown>,\n });\n }\n }\n break;\n }\n case 'stake.deposited':\n this.options.store.upsertStake({\n stakeId: event.stakeId,\n owner: event.owner,\n amountMist: event.amountMist,\n stakeType: event.stakeType,\n stakedAt: event.timestampMs,\n active: true,\n });\n break;\n case 'stake.withdrawn':\n this.options.store.upsertStake({\n stakeId: event.stakeId,\n owner: event.owner,\n amountMist: 0n,\n withdrawnAt: event.timestampMs,\n active: false,\n });\n break;\n case 'stake.slashed':\n this.options.store.addStakeSlash(event.stakeId, event.amountMist);\n break;\n case 'stake.deactivation_started':\n this.options.store.upsertStake({\n stakeId: event.stakeId,\n owner: event.owner,\n deactivatedAt: event.timestampMs,\n active: false,\n });\n break;\n case 'reputation.anchor_published':\n this.options.store.upsertReputationAnchor({\n anchorId: event.anchor.anchorId,\n author: event.anchor.author,\n merkleRoot: event.anchor.merkleRoot,\n eventCount: event.anchor.eventCount,\n blobId: event.anchor.blobId,\n fromTimestamp: event.anchor.fromTimestamp,\n toTimestamp: event.anchor.toTimestamp,\n createdAt: event.timestampMs,\n txDigest: event.txDigest,\n });\n break;\n default:\n break;\n }\n }\n\n private async parseExtendedEvent(rawEvent: SuiEvent): Promise<IndexedExtendedEvent | null> {\n const payload = toRecord(normalizeMoveValue(rawEvent.parsedJson)) ?? {};\n const base = {\n txDigest: rawEvent.id.txDigest,\n timestampMs: readNumber(rawEvent.timestampMs),\n };\n\n switch (rawEvent.type) {\n case `${this.options.packageId}::${EVENT_NAMES.disputeOpened}`: {\n const disputeId = readString(payload.dispute_id, payload.disputeId);\n const dispute = (await this.fetchDispute(disputeId)) ?? buildFallbackDispute(payload, disputeId, base.timestampMs);\n return { ...base, type: 'dispute.opened', disputeId, dispute };\n }\n case `${this.options.packageId}::${EVENT_NAMES.disputeResponded}`: {\n const disputeId = readString(payload.dispute_id, payload.disputeId);\n return {\n ...base,\n type: 'dispute.updated',\n disputeId,\n dispute: await this.fetchDispute(disputeId),\n status: DisputeStatus.RESPONDED,\n providerEvidenceBlob: readBytes(payload.provider_evidence_blob, payload.providerEvidenceBlob),\n };\n }\n case `${this.options.packageId}::${EVENT_NAMES.disputeMutuallyResolved}`: {\n const disputeId = readString(payload.dispute_id, payload.disputeId);\n return {\n ...base,\n type: 'dispute.updated',\n disputeId,\n dispute: await this.fetchDispute(disputeId),\n status: DisputeStatus.MUTUAL_RESOLVED,\n rulingSplit: readBigInt(payload.provider_amount, payload.providerAmount),\n };\n }\n case `${this.options.packageId}::${EVENT_NAMES.disputeArbitrated}`: {\n const disputeId = readString(payload.dispute_id, payload.disputeId);\n return {\n ...base,\n type: 'dispute.updated',\n disputeId,\n dispute: await this.fetchDispute(disputeId),\n status: DisputeStatus.ARBITRATED,\n arbitrator: readString(payload.arbitrator),\n rulingSplit: readBigInt(payload.provider_amount, payload.providerAmount),\n };\n }\n case `${this.options.packageId}::${EVENT_NAMES.disputeExpired}`: {\n const disputeId = readString(payload.dispute_id, payload.disputeId);\n return {\n ...base,\n type: 'dispute.updated',\n disputeId,\n dispute: await this.fetchDispute(disputeId),\n status: DisputeStatus.EXPIRED,\n };\n }\n case `${this.options.packageId}::${EVENT_NAMES.stakeDeposited}`:\n return {\n ...base,\n type: 'stake.deposited',\n stakeId: readString(payload.stake_id, payload.stakeId),\n owner: readString(payload.owner),\n amountMist: readBigInt(payload.amount),\n stakeType: normalizeStakeType(payload.stake_type, payload.stakeType),\n };\n case `${this.options.packageId}::${EVENT_NAMES.stakeWithdrawn}`:\n return {\n ...base,\n type: 'stake.withdrawn',\n stakeId: readString(payload.stake_id, payload.stakeId),\n owner: readString(payload.owner),\n amountMist: readBigInt(payload.amount),\n };\n case `${this.options.packageId}::${EVENT_NAMES.stakeSlashed}`:\n return {\n ...base,\n type: 'stake.slashed',\n stakeId: readString(payload.stake_id, payload.stakeId),\n target: readString(payload.target),\n amountMist: readBigInt(payload.amount),\n taskId: readString(payload.task_id, payload.taskId),\n };\n case `${this.options.packageId}::${EVENT_NAMES.deactivationStarted}`:\n return {\n ...base,\n type: 'stake.deactivation_started',\n stakeId: readString(payload.stake_id, payload.stakeId),\n owner: readString(payload.owner),\n cooldownEndsAt: readNumber(payload.cooldown_ends_at, payload.cooldownEndsAt),\n };\n case `${this.options.packageId}::${EVENT_NAMES.anchorPublished}`: {\n const anchorId = readString(payload.anchor_id, payload.anchorId);\n const anchor = (await this.fetchAnchor(anchorId)) ?? {\n anchorId,\n author: readString(payload.author),\n merkleRoot: readHex(payload.merkle_root, payload.merkleRoot),\n eventCount: readNumber(payload.event_count, payload.eventCount),\n blobId: '',\n fromTimestamp: 0,\n toTimestamp: 0,\n };\n return { ...base, type: 'reputation.anchor_published', anchor };\n }\n default:\n return null;\n }\n }\n\n private async getTransactionMetadata(txDigest: string): Promise<TransactionMetadata> {\n const cached = this.txMetadataCache.get(txDigest);\n if (cached) {\n return await cached;\n }\n\n const pending = this.loadTransactionMetadata(txDigest);\n this.txMetadataCache.set(txDigest, pending);\n pending.finally(() => {\n if (this.txMetadataCache.get(txDigest) === pending) {\n this.txMetadataCache.delete(txDigest);\n }\n });\n return await pending;\n }\n\n private async loadTransactionMetadata(txDigest: string): Promise<TransactionMetadata> {\n try {\n const response = await this.options.suiClient.client.getTransactionBlock({\n digest: txDigest,\n options: { showEffects: true },\n });\n return {\n checkpoint: response.checkpoint == null ? undefined : Number(response.checkpoint),\n gasCostMist: computeGasCost(response),\n };\n } catch (error) {\n this.logger.warn({ err: error, txDigest }, 'Failed to load transaction metadata.');\n return { gasCostMist: 0n };\n }\n }\n\n private async fetchDispute(disputeId: string): Promise<Dispute | undefined> {\n if (!disputeId) {\n return undefined;\n }\n try {\n const object = await this.options.suiClient.getObject<Record<string, unknown>>(disputeId);\n return parseDisputeObject(object, disputeId);\n } catch {\n return undefined;\n }\n }\n\n private async fetchAnchor(anchorId: string): Promise<ReputationAnchor | undefined> {\n if (!anchorId) {\n return undefined;\n }\n try {\n const object = await this.options.suiClient.getObject<Record<string, unknown>>(anchorId);\n return {\n anchorId,\n author: readString(object.author),\n merkleRoot: readHex(object.merkle_root, object.merkleRoot),\n eventCount: readNumber(object.event_count, object.eventCount),\n blobId: readBytes(object.blob_id, object.blobId),\n fromTimestamp: readNumber(object.from_timestamp, object.fromTimestamp),\n toTimestamp: readNumber(object.to_timestamp, object.toTimestamp),\n };\n } catch {\n return undefined;\n }\n }\n}\n\nfunction buildFallbackDispute(payload: Record<string, unknown>, disputeId: string, timestampMs: number): Dispute {\n return {\n id: disputeId,\n taskId: readString(payload.task_id, payload.taskId),\n requester: readString(payload.requester),\n provider: readString(payload.provider),\n escrowAmount: readBigInt(payload.escrow_amount, payload.escrowAmount),\n status: DisputeStatus.OPEN,\n requesterEvidenceBlob: '',\n providerEvidenceBlob: undefined,\n requesterProposedSplit: 0n,\n providerProposedSplit: 0n,\n arbitrator: undefined,\n rulingSplit: 0n,\n openedAt: timestampMs,\n respondedAt: undefined,\n resolvedAt: undefined,\n resolutionDeadline: timestampMs,\n };\n}\n\nfunction parseDisputeObject(object: Record<string, unknown>, disputeId: string): Dispute {\n const respondedAt = readNumber(object.responded_at, object.respondedAt);\n const resolvedAt = readNumber(object.resolved_at, object.resolvedAt);\n return {\n id: disputeId,\n taskId: readString(object.task_id, object.taskId),\n requester: readString(object.requester),\n provider: readString(object.provider),\n escrowAmount: readBigInt(object.escrow_amount, object.escrowAmount),\n status: readNumber(object.status) as DisputeStatus,\n requesterEvidenceBlob: readBytes(object.requester_evidence_blob, object.requesterEvidenceBlob),\n providerEvidenceBlob: readBytes(object.provider_evidence_blob, object.providerEvidenceBlob) || undefined,\n requesterProposedSplit: readBigInt(object.requester_proposed_split, object.requesterProposedSplit),\n providerProposedSplit: readBigInt(object.provider_proposed_split, object.providerProposedSplit),\n arbitrator: readString(object.arbitrator) || undefined,\n rulingSplit: readBigInt(object.ruling_split, object.rulingSplit),\n openedAt: readNumber(object.opened_at, object.openedAt),\n respondedAt: respondedAt > 0 ? respondedAt : undefined,\n resolvedAt: resolvedAt > 0 ? resolvedAt : undefined,\n resolutionDeadline: readNumber(object.resolution_deadline, object.resolutionDeadline),\n };\n}\n\nfunction formatEventId(event: SuiEvent): string {\n return `${event.id.txDigest}:${event.id.eventSeq}`;\n}\n\nfunction computeGasCost(response: SuiTransactionBlockResponse): bigint {\n const gasUsed = response.effects?.gasUsed;\n if (!gasUsed) {\n return 0n;\n }\n const computationCost = readBigInt(gasUsed.computationCost);\n const storageCost = readBigInt(gasUsed.storageCost);\n const storageRebate = readBigInt(gasUsed.storageRebate);\n const nonRefundable = readBigInt(gasUsed.nonRefundableStorageFee);\n const total = computationCost + storageCost + nonRefundable - storageRebate;\n return total > 0n ? total : 0n;\n}\n\nfunction normalizeMoveValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeMoveValue(entry));\n }\n if (!toRecord(value)) {\n return value;\n }\n if (typeof (value as { id?: unknown }).id === 'string' && Object.keys(value as Record<string, unknown>).length === 1) {\n return (value as { id: string }).id;\n }\n if (toRecord((value as { fields?: unknown }).fields)) {\n return normalizeMoveValue((value as { fields: unknown }).fields);\n }\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, entry]) => [key, normalizeMoveValue(entry)]),\n );\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : null;\n}\n\nfunction readString(...values: unknown[]): string {\n const match = values.find((value) => typeof value === 'string');\n return typeof match === 'string' ? match : '';\n}\n\nfunction readBytes(...values: unknown[]): string {\n for (const value of values) {\n if (typeof value === 'string') {\n return value;\n }\n if (value instanceof Uint8Array) {\n return new TextDecoder().decode(value);\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 readHex(...values: unknown[]): string {\n for (const value of values) {\n if (typeof value === 'string' && /^[a-f0-9]+$/i.test(value)) {\n return value;\n }\n if (value instanceof Uint8Array) {\n return Buffer.from(value).toString('hex');\n }\n if (Array.isArray(value) && value.every((entry) => typeof entry === 'number')) {\n return Buffer.from(value).toString('hex');\n }\n }\n return '';\n}\n\nfunction readNumber(...values: unknown[]): number {\n for (const value of values) {\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 }\n return 0;\n}\n\nfunction readBigInt(...values: unknown[]): bigint {\n for (const value of values) {\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 }\n return 0n;\n}\n\nfunction normalizeStakeType(...values: unknown[]): 'agent' | 'relay' | undefined {\n const value = values.find((entry) => entry !== undefined);\n if (value === 'agent' || value === 0 || value === '0') {\n return 'agent';\n }\n if (value === 'relay' || value === 1 || value === '1') {\n return 'relay';\n }\n return undefined;\n}\n\n"],"mappings":"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","names":["pino","MeshSuiClient","BidStatus","DisputeStatus","PaymentScheme","TaskStatus","BidStatus","toBigInt","compareBigInt","compareNumber","TaskStatus","BidStatus","PaymentScheme","DisputeStatus","normalizeLimit","normalizeOffset","logger","DisputeStatus","TaskStatus","readNumber","logger","pino","MeshSuiClient"]}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@hivemind-os/collective-indexer",
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "bin": {
11
+ "collective-indexer": "./dist/index.js"
12
+ },
13
+ "dependencies": {
14
+ "@mysten/sui": "^1.30.0",
15
+ "better-sqlite3": "^11.0.0",
16
+ "graphql": "^16.11.0",
17
+ "graphql-yoga": "^5.16.0",
18
+ "pino": "^9.0.0",
19
+ "@hivemind-os/collective-core": "0.2.0",
20
+ "@hivemind-os/collective-types": "0.2.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/better-sqlite3": "^7.6.0",
24
+ "tsup": "^8.0.0",
25
+ "typescript": "^5.7.0",
26
+ "vitest": "^3.0.0"
27
+ },
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "test": "vitest",
31
+ "lint": "eslint src/ tests/ vitest.config.ts tsup.config.ts",
32
+ "start": "node dist/index.js"
33
+ }
34
+ }