@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.
- package/dist/index.d.ts +287 -0
- package/dist/index.js +2429 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { AgentCard, Task, TaskStatus, Bid, BidStatus, Dispute, DisputeStatus } from '@hivemind-os/collective-types';
|
|
3
|
+
import pino from 'pino';
|
|
4
|
+
import { MeshSuiClient } from '@hivemind-os/collective-core';
|
|
5
|
+
import { SuiEvent } from '@mysten/sui/client';
|
|
6
|
+
import { Server } from 'node:http';
|
|
7
|
+
import { createSchema } from 'graphql-yoga';
|
|
8
|
+
|
|
9
|
+
interface IndexerConfig {
|
|
10
|
+
rpcUrl: string;
|
|
11
|
+
packageId: string;
|
|
12
|
+
sqlitePath: string;
|
|
13
|
+
pollingIntervalMs: number;
|
|
14
|
+
server: {
|
|
15
|
+
host: string;
|
|
16
|
+
port: number;
|
|
17
|
+
};
|
|
18
|
+
backfill: {
|
|
19
|
+
fromCheckpoint?: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
declare function getDefaultIndexerConfig(baseDir?: string): IndexerConfig;
|
|
23
|
+
declare function loadIndexerConfig(overrides?: Partial<IndexerConfig>): IndexerConfig;
|
|
24
|
+
declare function validateIndexerConfig(config: IndexerConfig): void;
|
|
25
|
+
|
|
26
|
+
interface AgentQueryFilters {
|
|
27
|
+
capability?: string;
|
|
28
|
+
minReputation?: number;
|
|
29
|
+
category?: string;
|
|
30
|
+
search?: string;
|
|
31
|
+
limit?: number;
|
|
32
|
+
offset?: number;
|
|
33
|
+
sortBy?: 'stake' | 'reputation';
|
|
34
|
+
activeOnly?: boolean;
|
|
35
|
+
}
|
|
36
|
+
interface TaskQueryFilters {
|
|
37
|
+
status?: TaskStatus;
|
|
38
|
+
requester?: string;
|
|
39
|
+
provider?: string;
|
|
40
|
+
category?: string;
|
|
41
|
+
after?: string;
|
|
42
|
+
limit?: number;
|
|
43
|
+
}
|
|
44
|
+
interface DisputeQueryFilters {
|
|
45
|
+
status?: DisputeStatus;
|
|
46
|
+
agent?: string;
|
|
47
|
+
}
|
|
48
|
+
interface StoredEvent {
|
|
49
|
+
eventId: string;
|
|
50
|
+
eventType: string;
|
|
51
|
+
packageId: string;
|
|
52
|
+
txDigest: string;
|
|
53
|
+
timestampMs: number;
|
|
54
|
+
payload: unknown;
|
|
55
|
+
checkpoint?: number;
|
|
56
|
+
module?: string;
|
|
57
|
+
}
|
|
58
|
+
interface IndexedTaskTransition {
|
|
59
|
+
taskId: string;
|
|
60
|
+
eventType: string;
|
|
61
|
+
status: TaskStatus;
|
|
62
|
+
txDigest: string;
|
|
63
|
+
timestampMs: number;
|
|
64
|
+
payload: Record<string, unknown>;
|
|
65
|
+
}
|
|
66
|
+
interface IndexedTask extends Task {
|
|
67
|
+
releasedAt?: number;
|
|
68
|
+
disputedAt?: number;
|
|
69
|
+
cancelledAt?: number;
|
|
70
|
+
bidCount: number;
|
|
71
|
+
gasCostMistTotal: bigint;
|
|
72
|
+
transitions?: IndexedTaskTransition[];
|
|
73
|
+
}
|
|
74
|
+
interface ProviderStatsRecord {
|
|
75
|
+
did: string;
|
|
76
|
+
owner: string;
|
|
77
|
+
name: string;
|
|
78
|
+
completedTasks: number;
|
|
79
|
+
earningsMist: bigint;
|
|
80
|
+
disputeCount: number;
|
|
81
|
+
successRate: number;
|
|
82
|
+
reputation: number;
|
|
83
|
+
}
|
|
84
|
+
declare class IndexerStore {
|
|
85
|
+
readonly db: Database.Database;
|
|
86
|
+
private readonly scoreCalculator;
|
|
87
|
+
constructor(dbPath: string);
|
|
88
|
+
close(): void;
|
|
89
|
+
getCursor(streamKey: string): {
|
|
90
|
+
txDigest: string;
|
|
91
|
+
eventSeq: string;
|
|
92
|
+
} | null;
|
|
93
|
+
setCursor(streamKey: string, cursor: {
|
|
94
|
+
txDigest: string;
|
|
95
|
+
eventSeq: string;
|
|
96
|
+
}): void;
|
|
97
|
+
recordEvent(event: StoredEvent): boolean;
|
|
98
|
+
upsertAgent(agent: AgentCard): void;
|
|
99
|
+
markAgentInactive(agentId: string): void;
|
|
100
|
+
getAgentByDid(did: string): AgentCard | null;
|
|
101
|
+
queryAgents(filters?: AgentQueryFilters): AgentCard[];
|
|
102
|
+
countAgents(filters?: AgentQueryFilters): number;
|
|
103
|
+
upsertTask(task: Task, txDigest: string, gasCostMist?: bigint): void;
|
|
104
|
+
updateTaskStatus(params: {
|
|
105
|
+
taskId: string;
|
|
106
|
+
status: TaskStatus;
|
|
107
|
+
txDigest: string;
|
|
108
|
+
timestampMs: number;
|
|
109
|
+
provider?: string;
|
|
110
|
+
requester?: string;
|
|
111
|
+
resultBlobId?: string;
|
|
112
|
+
price?: bigint;
|
|
113
|
+
paymentScheme?: Task['paymentScheme'];
|
|
114
|
+
meteredUnits?: number;
|
|
115
|
+
maxPrice?: bigint;
|
|
116
|
+
unitPrice?: bigint;
|
|
117
|
+
verificationHash?: string;
|
|
118
|
+
gasCostMist?: bigint;
|
|
119
|
+
eventType: string;
|
|
120
|
+
payload: Record<string, unknown>;
|
|
121
|
+
}): void;
|
|
122
|
+
getTask(taskId: string, includeTransitions?: boolean): IndexedTask | null;
|
|
123
|
+
queryTasks(filters?: TaskQueryFilters): IndexedTask[];
|
|
124
|
+
getTaskTransitions(taskId: string): IndexedTaskTransition[];
|
|
125
|
+
upsertBid(bid: Bid): void;
|
|
126
|
+
updateBidStatus(bidId: string, status: BidStatus, timestampMs: number): void;
|
|
127
|
+
getBids(taskId: string, status?: BidStatus): Bid[];
|
|
128
|
+
upsertDispute(dispute: Dispute): void;
|
|
129
|
+
updateDispute(params: {
|
|
130
|
+
disputeId: string;
|
|
131
|
+
status: DisputeStatus;
|
|
132
|
+
respondedAt?: number;
|
|
133
|
+
resolvedAt?: number;
|
|
134
|
+
providerEvidenceBlob?: string;
|
|
135
|
+
providerProposedSplit?: bigint;
|
|
136
|
+
arbitrator?: string;
|
|
137
|
+
rulingSplit?: bigint;
|
|
138
|
+
}): void;
|
|
139
|
+
getDisputes(filters?: DisputeQueryFilters): Dispute[];
|
|
140
|
+
upsertStake(params: {
|
|
141
|
+
stakeId: string;
|
|
142
|
+
owner: string;
|
|
143
|
+
amountMist?: bigint;
|
|
144
|
+
stakeType?: 'agent' | 'relay';
|
|
145
|
+
stakedAt?: number;
|
|
146
|
+
deactivatedAt?: number;
|
|
147
|
+
withdrawnAt?: number;
|
|
148
|
+
slashedAmountMist?: bigint;
|
|
149
|
+
active?: boolean;
|
|
150
|
+
}): void;
|
|
151
|
+
addStakeSlash(stakeId: string, amountMist: bigint): void;
|
|
152
|
+
upsertReputationAnchor(params: {
|
|
153
|
+
anchorId: string;
|
|
154
|
+
author: string;
|
|
155
|
+
merkleRoot: string;
|
|
156
|
+
eventCount: number;
|
|
157
|
+
blobId?: string;
|
|
158
|
+
fromTimestamp?: number;
|
|
159
|
+
toTimestamp?: number;
|
|
160
|
+
createdAt: number;
|
|
161
|
+
txDigest: string;
|
|
162
|
+
}): void;
|
|
163
|
+
getDatabase(): Database.Database;
|
|
164
|
+
private recordTaskTransition;
|
|
165
|
+
private syncAgentStake;
|
|
166
|
+
}
|
|
167
|
+
declare function encodeCursor(task: Pick<Task, 'id' | 'createdAt'>): string;
|
|
168
|
+
|
|
169
|
+
type TimePeriod = 'hour' | 'day' | 'week';
|
|
170
|
+
type ProviderSortField = 'completedTasks' | 'earnings' | 'reputation';
|
|
171
|
+
interface TimeBucket {
|
|
172
|
+
label: string;
|
|
173
|
+
count: number;
|
|
174
|
+
volumeMist: bigint;
|
|
175
|
+
}
|
|
176
|
+
interface GasCostStat {
|
|
177
|
+
capability: string;
|
|
178
|
+
averageGasMist: bigint;
|
|
179
|
+
taskCount: number;
|
|
180
|
+
}
|
|
181
|
+
interface CategoryPopularity {
|
|
182
|
+
category: string;
|
|
183
|
+
taskCount: number;
|
|
184
|
+
}
|
|
185
|
+
interface MarketplaceStats {
|
|
186
|
+
averageBidCount: number;
|
|
187
|
+
acceptanceRate: number;
|
|
188
|
+
categoryPopularity: CategoryPopularity[];
|
|
189
|
+
}
|
|
190
|
+
interface ReputationTrend {
|
|
191
|
+
label: string;
|
|
192
|
+
completed: number;
|
|
193
|
+
failed: number;
|
|
194
|
+
disputed: number;
|
|
195
|
+
successRate: number;
|
|
196
|
+
}
|
|
197
|
+
interface AnalyticsSummary {
|
|
198
|
+
totalAgents: number;
|
|
199
|
+
activeAgents: number;
|
|
200
|
+
totalTasks: number;
|
|
201
|
+
completedTasks: number;
|
|
202
|
+
disputedTasks: number;
|
|
203
|
+
totalVolumeMist: bigint;
|
|
204
|
+
averageGasCosts: GasCostStat[];
|
|
205
|
+
marketplace: MarketplaceStats;
|
|
206
|
+
}
|
|
207
|
+
declare class AnalyticsEngine {
|
|
208
|
+
private readonly store;
|
|
209
|
+
constructor(store: IndexerStore);
|
|
210
|
+
getSummary(): AnalyticsSummary;
|
|
211
|
+
getTaskVolume(period?: TimePeriod, buckets?: number): TimeBucket[];
|
|
212
|
+
getAverageGasCostsByTaskType(): GasCostStat[];
|
|
213
|
+
getMarketplaceStats(): MarketplaceStats;
|
|
214
|
+
getReputationTrends(agentDid: string, period?: TimePeriod, buckets?: number): ReputationTrend[];
|
|
215
|
+
getTopProviders(limit?: number, sortBy?: ProviderSortField): ProviderStatsRecord[];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
declare const logger: pino.Logger<never, boolean>;
|
|
219
|
+
declare const SUPPORTED_EVENT_TYPES: ("registry::AgentRegistered" | "registry::AgentUpdated" | "registry::AgentDeactivated" | "task::TaskPosted" | "task::TaskAccepted" | "task::TaskCompleted" | "task::TaskPaymentReleased" | "task::TaskDisputed" | "task::TaskCancelled" | "task::TaskExpiredRefunded" | "marketplace::BidPlaced" | "marketplace::BidAccepted" | "marketplace::BidWithdrawn" | "marketplace::BidRejected" | "dispute::DisputeOpened" | "dispute::DisputeResponded" | "dispute::DisputeMutuallyResolved" | "dispute::DisputeArbitrated" | "dispute::DisputeExpired" | "staking::StakeDeposited" | "staking::StakeWithdrawn" | "staking::StakeSlashed" | "staking::DeactivationStarted" | "reputation::AnchorPublished")[];
|
|
220
|
+
interface TransactionMetadata {
|
|
221
|
+
checkpoint?: number;
|
|
222
|
+
gasCostMist: bigint;
|
|
223
|
+
}
|
|
224
|
+
interface MeshIndexerOptions {
|
|
225
|
+
suiClient: MeshSuiClient;
|
|
226
|
+
store: IndexerStore;
|
|
227
|
+
packageId: string;
|
|
228
|
+
pollIntervalMs?: number;
|
|
229
|
+
startCheckpoint?: number;
|
|
230
|
+
logger?: Pick<typeof logger, 'info' | 'warn' | 'error'>;
|
|
231
|
+
}
|
|
232
|
+
declare class MeshIndexer {
|
|
233
|
+
private readonly options;
|
|
234
|
+
private readonly logger;
|
|
235
|
+
private readonly txMetadataCache;
|
|
236
|
+
private running;
|
|
237
|
+
private timer?;
|
|
238
|
+
private pollLoopPromise?;
|
|
239
|
+
constructor(options: MeshIndexerOptions);
|
|
240
|
+
start(): void;
|
|
241
|
+
stop(): Promise<void>;
|
|
242
|
+
isRunning(): boolean;
|
|
243
|
+
backfill(fromCheckpoint?: number | undefined): Promise<number>;
|
|
244
|
+
pollOnce(): Promise<number>;
|
|
245
|
+
processEvent(rawEvent: SuiEvent, metadata?: TransactionMetadata): Promise<void>;
|
|
246
|
+
private pollLoop;
|
|
247
|
+
private indexAllStreams;
|
|
248
|
+
private indexEventType;
|
|
249
|
+
private handleParsedEvent;
|
|
250
|
+
private handleExtendedEvent;
|
|
251
|
+
private parseExtendedEvent;
|
|
252
|
+
private getTransactionMetadata;
|
|
253
|
+
private loadTransactionMetadata;
|
|
254
|
+
private fetchDispute;
|
|
255
|
+
private fetchAnchor;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
interface IndexerGraphQLServerOptions {
|
|
259
|
+
store: IndexerStore;
|
|
260
|
+
analytics?: AnalyticsEngine;
|
|
261
|
+
host?: string;
|
|
262
|
+
port?: number;
|
|
263
|
+
logger?: {
|
|
264
|
+
info?: (payload: unknown, message?: string) => void;
|
|
265
|
+
warn?: (payload: unknown, message?: string) => void;
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
interface IndexerGraphQLServer {
|
|
269
|
+
schema: ReturnType<typeof createSchema>;
|
|
270
|
+
server: Server;
|
|
271
|
+
fetch: typeof fetch;
|
|
272
|
+
start: () => Promise<string>;
|
|
273
|
+
stop: () => Promise<void>;
|
|
274
|
+
}
|
|
275
|
+
declare function createIndexerGraphQLServer(options: IndexerGraphQLServerOptions): IndexerGraphQLServer;
|
|
276
|
+
|
|
277
|
+
declare function startIndexerService(): Promise<{
|
|
278
|
+
config: IndexerConfig;
|
|
279
|
+
store: IndexerStore;
|
|
280
|
+
analytics: AnalyticsEngine;
|
|
281
|
+
indexer: MeshIndexer;
|
|
282
|
+
graphql: IndexerGraphQLServer;
|
|
283
|
+
address: string;
|
|
284
|
+
stop: () => Promise<void>;
|
|
285
|
+
}>;
|
|
286
|
+
|
|
287
|
+
export { type AgentQueryFilters, AnalyticsEngine, type AnalyticsSummary, type CategoryPopularity, type DisputeQueryFilters, type GasCostStat, type IndexedTask, type IndexedTaskTransition, type IndexerConfig, type IndexerGraphQLServer, type IndexerGraphQLServerOptions, IndexerStore, type MarketplaceStats, MeshIndexer, type MeshIndexerOptions, type ProviderSortField, type ProviderStatsRecord, type ReputationTrend, SUPPORTED_EVENT_TYPES, type StoredEvent, type TaskQueryFilters, type TimeBucket, type TimePeriod, createIndexerGraphQLServer, encodeCursor, getDefaultIndexerConfig, loadIndexerConfig, startIndexerService, validateIndexerConfig };
|