@quantulabs/8004-mcp 0.1.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/LICENSE +21 -0
- package/README.md +370 -0
- package/dist/chains/evm/index.d.ts +2 -0
- package/dist/chains/evm/index.d.ts.map +1 -0
- package/dist/chains/evm/index.js +3 -0
- package/dist/chains/evm/index.js.map +1 -0
- package/dist/chains/evm/provider.d.ts +48 -0
- package/dist/chains/evm/provider.d.ts.map +1 -0
- package/dist/chains/evm/provider.js +446 -0
- package/dist/chains/evm/provider.js.map +1 -0
- package/dist/chains/index.d.ts +3 -0
- package/dist/chains/index.d.ts.map +1 -0
- package/dist/chains/index.js +4 -0
- package/dist/chains/index.js.map +1 -0
- package/dist/chains/solana/data-source.d.ts +17 -0
- package/dist/chains/solana/data-source.d.ts.map +1 -0
- package/dist/chains/solana/data-source.js +65 -0
- package/dist/chains/solana/data-source.js.map +1 -0
- package/dist/chains/solana/index.d.ts +8 -0
- package/dist/chains/solana/index.d.ts.map +1 -0
- package/dist/chains/solana/index.js +9 -0
- package/dist/chains/solana/index.js.map +1 -0
- package/dist/chains/solana/parsers.d.ts +11 -0
- package/dist/chains/solana/parsers.d.ts.map +1 -0
- package/dist/chains/solana/parsers.js +94 -0
- package/dist/chains/solana/parsers.js.map +1 -0
- package/dist/chains/solana/provider.d.ts +33 -0
- package/dist/chains/solana/provider.d.ts.map +1 -0
- package/dist/chains/solana/provider.js +407 -0
- package/dist/chains/solana/provider.js.map +1 -0
- package/dist/chains/solana/state.d.ts +55 -0
- package/dist/chains/solana/state.d.ts.map +1 -0
- package/dist/chains/solana/state.js +162 -0
- package/dist/chains/solana/state.js.map +1 -0
- package/dist/chains/solana/tools/atom.d.ts +45 -0
- package/dist/chains/solana/tools/atom.d.ts.map +1 -0
- package/dist/chains/solana/tools/atom.js +115 -0
- package/dist/chains/solana/tools/atom.js.map +1 -0
- package/dist/chains/solana/tools/validation.d.ts +45 -0
- package/dist/chains/solana/tools/validation.d.ts.map +1 -0
- package/dist/chains/solana/tools/validation.js +212 -0
- package/dist/chains/solana/tools/validation.js.map +1 -0
- package/dist/chains/solana/tools/wallet.d.ts +45 -0
- package/dist/chains/solana/tools/wallet.d.ts.map +1 -0
- package/dist/chains/solana/tools/wallet.js +103 -0
- package/dist/chains/solana/tools/wallet.js.map +1 -0
- package/dist/config/defaults.d.ts +68 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +247 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/env.d.ts +33 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +42 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/cache/agent-cache.d.ts +36 -0
- package/dist/core/cache/agent-cache.d.ts.map +1 -0
- package/dist/core/cache/agent-cache.js +87 -0
- package/dist/core/cache/agent-cache.js.map +1 -0
- package/dist/core/cache/data-source.d.ts +31 -0
- package/dist/core/cache/data-source.d.ts.map +1 -0
- package/dist/core/cache/data-source.js +6 -0
- package/dist/core/cache/data-source.js.map +1 -0
- package/dist/core/cache/index.d.ts +7 -0
- package/dist/core/cache/index.d.ts.map +1 -0
- package/dist/core/cache/index.js +9 -0
- package/dist/core/cache/index.js.map +1 -0
- package/dist/core/cache/lazy-cache.d.ts +30 -0
- package/dist/core/cache/lazy-cache.d.ts.map +1 -0
- package/dist/core/cache/lazy-cache.js +79 -0
- package/dist/core/cache/lazy-cache.js.map +1 -0
- package/dist/core/cache/slim-store.d.ts +66 -0
- package/dist/core/cache/slim-store.d.ts.map +1 -0
- package/dist/core/cache/slim-store.js +285 -0
- package/dist/core/cache/slim-store.js.map +1 -0
- package/dist/core/cache/sqlite-store.d.ts +99 -0
- package/dist/core/cache/sqlite-store.d.ts.map +1 -0
- package/dist/core/cache/sqlite-store.js +470 -0
- package/dist/core/cache/sqlite-store.js.map +1 -0
- package/dist/core/cache/sync-manager.d.ts +38 -0
- package/dist/core/cache/sync-manager.d.ts.map +1 -0
- package/dist/core/cache/sync-manager.js +213 -0
- package/dist/core/cache/sync-manager.js.map +1 -0
- package/dist/core/errors/index.d.ts +2 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +2 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/errors/mcp-error.d.ts +39 -0
- package/dist/core/errors/mcp-error.d.ts.map +1 -0
- package/dist/core/errors/mcp-error.js +79 -0
- package/dist/core/errors/mcp-error.js.map +1 -0
- package/dist/core/interfaces/agent.d.ts +84 -0
- package/dist/core/interfaces/agent.d.ts.map +1 -0
- package/dist/core/interfaces/agent.js +40 -0
- package/dist/core/interfaces/agent.js.map +1 -0
- package/dist/core/interfaces/chain-provider.d.ts +50 -0
- package/dist/core/interfaces/chain-provider.d.ts.map +1 -0
- package/dist/core/interfaces/chain-provider.js +5 -0
- package/dist/core/interfaces/chain-provider.js.map +1 -0
- package/dist/core/interfaces/feedback.d.ts +46 -0
- package/dist/core/interfaces/feedback.d.ts.map +1 -0
- package/dist/core/interfaces/feedback.js +3 -0
- package/dist/core/interfaces/feedback.js.map +1 -0
- package/dist/core/interfaces/index.d.ts +6 -0
- package/dist/core/interfaces/index.d.ts.map +1 -0
- package/dist/core/interfaces/index.js +7 -0
- package/dist/core/interfaces/index.js.map +1 -0
- package/dist/core/interfaces/reputation.d.ts +47 -0
- package/dist/core/interfaces/reputation.d.ts.map +1 -0
- package/dist/core/interfaces/reputation.js +30 -0
- package/dist/core/interfaces/reputation.js.map +1 -0
- package/dist/core/interfaces/x402.d.ts +226 -0
- package/dist/core/interfaces/x402.d.ts.map +1 -0
- package/dist/core/interfaces/x402.js +120 -0
- package/dist/core/interfaces/x402.js.map +1 -0
- package/dist/core/parsers/common.d.ts +31 -0
- package/dist/core/parsers/common.d.ts.map +1 -0
- package/dist/core/parsers/common.js +185 -0
- package/dist/core/parsers/common.js.map +1 -0
- package/dist/core/parsers/index.d.ts +2 -0
- package/dist/core/parsers/index.d.ts.map +1 -0
- package/dist/core/parsers/index.js +2 -0
- package/dist/core/parsers/index.js.map +1 -0
- package/dist/core/registry/chain-registry.d.ts +26 -0
- package/dist/core/registry/chain-registry.d.ts.map +1 -0
- package/dist/core/registry/chain-registry.js +141 -0
- package/dist/core/registry/chain-registry.js.map +1 -0
- package/dist/core/registry/index.d.ts +3 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +3 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/tool-registry.d.ts +23 -0
- package/dist/core/registry/tool-registry.d.ts.map +1 -0
- package/dist/core/registry/tool-registry.js +66 -0
- package/dist/core/registry/tool-registry.js.map +1 -0
- package/dist/core/serializers/common.d.ts +20 -0
- package/dist/core/serializers/common.d.ts.map +1 -0
- package/dist/core/serializers/common.js +76 -0
- package/dist/core/serializers/common.js.map +1 -0
- package/dist/core/serializers/index.d.ts +2 -0
- package/dist/core/serializers/index.d.ts.map +1 -0
- package/dist/core/serializers/index.js +2 -0
- package/dist/core/serializers/index.js.map +1 -0
- package/dist/core/services/index.d.ts +3 -0
- package/dist/core/services/index.d.ts.map +1 -0
- package/dist/core/services/index.js +3 -0
- package/dist/core/services/index.js.map +1 -0
- package/dist/core/services/ipfs-service.d.ts +59 -0
- package/dist/core/services/ipfs-service.d.ts.map +1 -0
- package/dist/core/services/ipfs-service.js +84 -0
- package/dist/core/services/ipfs-service.js.map +1 -0
- package/dist/core/utils/tags.d.ts +38 -0
- package/dist/core/utils/tags.d.ts.map +1 -0
- package/dist/core/utils/tags.js +77 -0
- package/dist/core/utils/tags.js.map +1 -0
- package/dist/core/utils/value-encoding.d.ts +36 -0
- package/dist/core/utils/value-encoding.d.ts.map +1 -0
- package/dist/core/utils/value-encoding.js +196 -0
- package/dist/core/utils/value-encoding.js.map +1 -0
- package/dist/core/wallet/index.d.ts +2 -0
- package/dist/core/wallet/index.d.ts.map +1 -0
- package/dist/core/wallet/index.js +3 -0
- package/dist/core/wallet/index.js.map +1 -0
- package/dist/core/wallet/wallet-manager.d.ts +86 -0
- package/dist/core/wallet/wallet-manager.d.ts.map +1 -0
- package/dist/core/wallet/wallet-manager.js +783 -0
- package/dist/core/wallet/wallet-manager.js.map +1 -0
- package/dist/core/x402/index.d.ts +2 -0
- package/dist/core/x402/index.d.ts.map +1 -0
- package/dist/core/x402/index.js +3 -0
- package/dist/core/x402/index.js.map +1 -0
- package/dist/core/x402/proof-validator.d.ts +57 -0
- package/dist/core/x402/proof-validator.d.ts.map +1 -0
- package/dist/core/x402/proof-validator.js +103 -0
- package/dist/core/x402/proof-validator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +135 -0
- package/dist/index.js.map +1 -0
- package/dist/state/global-state.d.ts +98 -0
- package/dist/state/global-state.d.ts.map +1 -0
- package/dist/state/global-state.js +258 -0
- package/dist/state/global-state.js.map +1 -0
- package/dist/tools/definitions.d.ts +10 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +163 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/unified/agent.d.ts +5 -0
- package/dist/tools/unified/agent.d.ts.map +1 -0
- package/dist/tools/unified/agent.js +300 -0
- package/dist/tools/unified/agent.js.map +1 -0
- package/dist/tools/unified/cache.d.ts +5 -0
- package/dist/tools/unified/cache.d.ts.map +1 -0
- package/dist/tools/unified/cache.js +207 -0
- package/dist/tools/unified/cache.js.map +1 -0
- package/dist/tools/unified/collection.d.ts +5 -0
- package/dist/tools/unified/collection.d.ts.map +1 -0
- package/dist/tools/unified/collection.js +162 -0
- package/dist/tools/unified/collection.js.map +1 -0
- package/dist/tools/unified/config.d.ts +5 -0
- package/dist/tools/unified/config.d.ts.map +1 -0
- package/dist/tools/unified/config.js +217 -0
- package/dist/tools/unified/config.js.map +1 -0
- package/dist/tools/unified/crawler.d.ts +5 -0
- package/dist/tools/unified/crawler.d.ts.map +1 -0
- package/dist/tools/unified/crawler.js +212 -0
- package/dist/tools/unified/crawler.js.map +1 -0
- package/dist/tools/unified/feedback.d.ts +5 -0
- package/dist/tools/unified/feedback.d.ts.map +1 -0
- package/dist/tools/unified/feedback.js +274 -0
- package/dist/tools/unified/feedback.js.map +1 -0
- package/dist/tools/unified/ipfs.d.ts +5 -0
- package/dist/tools/unified/ipfs.d.ts.map +1 -0
- package/dist/tools/unified/ipfs.js +156 -0
- package/dist/tools/unified/ipfs.js.map +1 -0
- package/dist/tools/unified/oasf.d.ts +5 -0
- package/dist/tools/unified/oasf.d.ts.map +1 -0
- package/dist/tools/unified/oasf.js +167 -0
- package/dist/tools/unified/oasf.js.map +1 -0
- package/dist/tools/unified/registration.d.ts +5 -0
- package/dist/tools/unified/registration.d.ts.map +1 -0
- package/dist/tools/unified/registration.js +223 -0
- package/dist/tools/unified/registration.js.map +1 -0
- package/dist/tools/unified/reputation.d.ts +5 -0
- package/dist/tools/unified/reputation.d.ts.map +1 -0
- package/dist/tools/unified/reputation.js +121 -0
- package/dist/tools/unified/reputation.js.map +1 -0
- package/dist/tools/unified/wallet.d.ts +5 -0
- package/dist/tools/unified/wallet.d.ts.map +1 -0
- package/dist/tools/unified/wallet.js +434 -0
- package/dist/tools/unified/wallet.js.map +1 -0
- package/dist/tools/unified/write-operations.d.ts +5 -0
- package/dist/tools/unified/write-operations.d.ts.map +1 -0
- package/dist/tools/unified/write-operations.js +582 -0
- package/dist/tools/unified/write-operations.js.map +1 -0
- package/dist/tools/unified/x402.d.ts +5 -0
- package/dist/tools/unified/x402.d.ts.map +1 -0
- package/dist/tools/unified/x402.js +594 -0
- package/dist/tools/unified/x402.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Agent cache facade - combines SQLite store with sync manager
|
|
2
|
+
import { SqliteStore } from './sqlite-store.js';
|
|
3
|
+
import { SyncManager } from './sync-manager.js';
|
|
4
|
+
export class AgentCache {
|
|
5
|
+
store;
|
|
6
|
+
syncManager;
|
|
7
|
+
autoSync;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.store = new SqliteStore(config?.dbPath);
|
|
10
|
+
this.syncManager = new SyncManager(this.store, config?.sync);
|
|
11
|
+
this.autoSync = config?.autoSync ?? true;
|
|
12
|
+
}
|
|
13
|
+
// Lifecycle
|
|
14
|
+
start() {
|
|
15
|
+
if (this.autoSync) {
|
|
16
|
+
this.syncManager.startBackgroundSync();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
stop() {
|
|
20
|
+
this.syncManager.stopBackgroundSync();
|
|
21
|
+
this.store.close();
|
|
22
|
+
}
|
|
23
|
+
// Data source management
|
|
24
|
+
registerDataSource(dataSource) {
|
|
25
|
+
this.syncManager.registerDataSource(dataSource);
|
|
26
|
+
}
|
|
27
|
+
unregisterDataSource(sourceId) {
|
|
28
|
+
this.syncManager.unregisterDataSource(sourceId);
|
|
29
|
+
}
|
|
30
|
+
// Search operations
|
|
31
|
+
search(query, options) {
|
|
32
|
+
return this.store.searchByName(query, options);
|
|
33
|
+
}
|
|
34
|
+
searchAgents(params) {
|
|
35
|
+
return this.store.searchAgents(params);
|
|
36
|
+
}
|
|
37
|
+
// Agent operations
|
|
38
|
+
getAgent(globalId) {
|
|
39
|
+
const cached = this.store.getAgent(globalId);
|
|
40
|
+
if (!cached)
|
|
41
|
+
return null;
|
|
42
|
+
return {
|
|
43
|
+
id: cached.raw_id,
|
|
44
|
+
globalId: cached.id,
|
|
45
|
+
chainType: cached.chain_type,
|
|
46
|
+
chainPrefix: cached.chain_prefix,
|
|
47
|
+
name: cached.name,
|
|
48
|
+
description: cached.description ?? undefined,
|
|
49
|
+
image: cached.image ?? undefined,
|
|
50
|
+
owner: cached.owner,
|
|
51
|
+
collection: cached.collection ?? undefined,
|
|
52
|
+
trustTier: cached.trust_tier ?? undefined,
|
|
53
|
+
qualityScore: cached.quality_score ?? undefined,
|
|
54
|
+
totalFeedbacks: cached.total_feedbacks ?? undefined,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
upsertAgent(agent) {
|
|
58
|
+
this.store.upsertAgent(agent);
|
|
59
|
+
}
|
|
60
|
+
upsertAgentsBatch(agents) {
|
|
61
|
+
this.store.upsertAgentsBatch(agents);
|
|
62
|
+
}
|
|
63
|
+
deleteAgent(globalId) {
|
|
64
|
+
return this.store.deleteAgent(globalId);
|
|
65
|
+
}
|
|
66
|
+
// Sync operations
|
|
67
|
+
async refresh(options) {
|
|
68
|
+
if (options?.sourceId) {
|
|
69
|
+
const result = await this.syncManager.syncSource(options.sourceId, undefined, options);
|
|
70
|
+
return new Map([[options.sourceId, result]]);
|
|
71
|
+
}
|
|
72
|
+
return this.syncManager.syncAll(options);
|
|
73
|
+
}
|
|
74
|
+
getSyncProgress(sourceId) {
|
|
75
|
+
return this.syncManager.getProgress(sourceId);
|
|
76
|
+
}
|
|
77
|
+
// Stats
|
|
78
|
+
getStats() {
|
|
79
|
+
return this.store.getStats();
|
|
80
|
+
}
|
|
81
|
+
// Maintenance
|
|
82
|
+
optimize() {
|
|
83
|
+
this.store.optimizeFts();
|
|
84
|
+
this.store.vacuum();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=agent-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-cache.js","sourceRoot":"","sources":["../../../src/core/cache/agent-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { IUpsertAgent } from './sqlite-store.js';
|
|
2
|
+
export interface ISyncBatch {
|
|
3
|
+
agents: IUpsertAgent[];
|
|
4
|
+
cursor?: string;
|
|
5
|
+
hasMore: boolean;
|
|
6
|
+
total?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface IDataSource {
|
|
9
|
+
readonly sourceId: string;
|
|
10
|
+
readonly chainPrefix: string;
|
|
11
|
+
isAvailable(): Promise<boolean>;
|
|
12
|
+
fetchBatch(options: {
|
|
13
|
+
cursor?: string;
|
|
14
|
+
updatedSince?: number;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}): Promise<ISyncBatch>;
|
|
17
|
+
getTotalCount(): Promise<number>;
|
|
18
|
+
}
|
|
19
|
+
export declare abstract class BaseDataSource implements IDataSource {
|
|
20
|
+
abstract readonly sourceId: string;
|
|
21
|
+
abstract readonly chainPrefix: string;
|
|
22
|
+
abstract isAvailable(): Promise<boolean>;
|
|
23
|
+
abstract fetchBatch(options: {
|
|
24
|
+
cursor?: string;
|
|
25
|
+
updatedSince?: number;
|
|
26
|
+
limit?: number;
|
|
27
|
+
}): Promise<ISyncBatch>;
|
|
28
|
+
abstract getTotalCount(): Promise<number>;
|
|
29
|
+
protected defaultBatchSize: number;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../../src/core/cache/data-source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAG7B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAGhC,UAAU,CAAC,OAAO,EAAE;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAGxB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;AAGD,8BAAsB,cAAe,YAAW,WAAW;IACzD,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEtC,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,UAAU,CAAC;IACvB,QAAQ,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAEzC,SAAS,CAAC,gBAAgB,SAAQ;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../../src/core/cache/data-source.ts"],"names":[],"mappings":"AAAA,uCAAuC;AA6BvC,gDAAgD;AAChD,MAAM,OAAgB,cAAc;IAYxB,gBAAgB,GAAG,IAAI,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/cache/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Legacy full cache (heavy, background sync)
|
|
2
|
+
export * from './sqlite-store.js';
|
|
3
|
+
export * from './data-source.js';
|
|
4
|
+
export * from './sync-manager.js';
|
|
5
|
+
export * from './agent-cache.js';
|
|
6
|
+
// New lazy cache (lightweight, on-demand)
|
|
7
|
+
export * from './slim-store.js';
|
|
8
|
+
export * from './lazy-cache.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/cache/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAEjC,0CAA0C;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ISlimCacheConfig } from './slim-store.js';
|
|
2
|
+
import type { IAgentSummary, ISearchResult } from '../interfaces/agent.js';
|
|
3
|
+
export interface ILazyCacheConfig extends ISlimCacheConfig {
|
|
4
|
+
}
|
|
5
|
+
export declare class LazyCache {
|
|
6
|
+
private readonly store;
|
|
7
|
+
constructor(config?: ILazyCacheConfig);
|
|
8
|
+
cacheAgent(agent: IAgentSummary): void;
|
|
9
|
+
cacheSearchResults(results: IAgentSummary[]): void;
|
|
10
|
+
getAgent(globalId: string): IAgentSummary | null;
|
|
11
|
+
search(query: string, options?: {
|
|
12
|
+
chainPrefix?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
offset?: number;
|
|
15
|
+
}): ISearchResult;
|
|
16
|
+
list(chain?: string, options?: {
|
|
17
|
+
limit?: number;
|
|
18
|
+
offset?: number;
|
|
19
|
+
}): ISearchResult;
|
|
20
|
+
getStats(): {
|
|
21
|
+
total: number;
|
|
22
|
+
byChain: Record<string, number>;
|
|
23
|
+
dbSize: string;
|
|
24
|
+
expired: number;
|
|
25
|
+
};
|
|
26
|
+
evictExpired(): number;
|
|
27
|
+
clear(): void;
|
|
28
|
+
stop(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=lazy-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-cache.d.ts","sourceRoot":"","sources":["../../../src/core/cache/lazy-cache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAe,MAAM,wBAAwB,CAAC;AAExF,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;CAEzD;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,MAAM,CAAC,EAAE,gBAAgB;IAKrC,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAatC,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI;IAiBlD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAiBhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,aAAa;IASjB,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa;IAKlF,QAAQ;;;;;;IAKR,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;CAGb"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Lazy cache - caches search results on-demand, no background sync
|
|
2
|
+
// Optimized for low memory footprint with TTL eviction
|
|
3
|
+
import { SlimStore } from './slim-store.js';
|
|
4
|
+
export class LazyCache {
|
|
5
|
+
store;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.store = new SlimStore(config);
|
|
8
|
+
}
|
|
9
|
+
// Cache a single agent (called when agent is fetched)
|
|
10
|
+
cacheAgent(agent) {
|
|
11
|
+
this.store.cache({
|
|
12
|
+
id: agent.globalId,
|
|
13
|
+
chain: agent.chainPrefix,
|
|
14
|
+
rawId: agent.id,
|
|
15
|
+
name: agent.name,
|
|
16
|
+
owner: agent.owner,
|
|
17
|
+
trustTier: agent.trustTier,
|
|
18
|
+
qualityScore: agent.qualityScore,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
// Cache search results (called after provider search)
|
|
22
|
+
cacheSearchResults(results) {
|
|
23
|
+
if (results.length === 0)
|
|
24
|
+
return;
|
|
25
|
+
const toCache = results.map(agent => ({
|
|
26
|
+
id: agent.globalId,
|
|
27
|
+
chain: agent.chainPrefix,
|
|
28
|
+
rawId: agent.id,
|
|
29
|
+
name: agent.name,
|
|
30
|
+
owner: agent.owner,
|
|
31
|
+
trustTier: agent.trustTier,
|
|
32
|
+
qualityScore: agent.qualityScore,
|
|
33
|
+
}));
|
|
34
|
+
this.store.cacheBatch(toCache);
|
|
35
|
+
}
|
|
36
|
+
// Get cached agent
|
|
37
|
+
getAgent(globalId) {
|
|
38
|
+
const cached = this.store.get(globalId);
|
|
39
|
+
if (!cached)
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
id: cached.raw_id,
|
|
43
|
+
globalId: cached.id,
|
|
44
|
+
chainType: cached.chain === 'sol' ? 'solana' : 'evm',
|
|
45
|
+
chainPrefix: cached.chain,
|
|
46
|
+
name: cached.name,
|
|
47
|
+
owner: cached.owner,
|
|
48
|
+
trustTier: cached.trust_tier ?? undefined,
|
|
49
|
+
qualityScore: cached.quality_score ?? undefined,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Search cached agents by name
|
|
53
|
+
search(query, options) {
|
|
54
|
+
return this.store.search(query, {
|
|
55
|
+
chain: options?.chainPrefix,
|
|
56
|
+
limit: options?.limit,
|
|
57
|
+
offset: options?.offset,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// List cached agents
|
|
61
|
+
list(chain, options) {
|
|
62
|
+
return this.store.list(chain, options);
|
|
63
|
+
}
|
|
64
|
+
// Stats
|
|
65
|
+
getStats() {
|
|
66
|
+
return this.store.getStats();
|
|
67
|
+
}
|
|
68
|
+
// Maintenance
|
|
69
|
+
evictExpired() {
|
|
70
|
+
return this.store.evictExpired();
|
|
71
|
+
}
|
|
72
|
+
clear() {
|
|
73
|
+
this.store.clear();
|
|
74
|
+
}
|
|
75
|
+
stop() {
|
|
76
|
+
this.store.close();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=lazy-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-cache.js","sourceRoot":"","sources":["../../../src/core/cache/lazy-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ChainPrefix, ISearchResult } from '../interfaces/agent.js';
|
|
2
|
+
export interface ISlimAgent {
|
|
3
|
+
id: string;
|
|
4
|
+
chain: string;
|
|
5
|
+
raw_id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
owner: string;
|
|
8
|
+
trust_tier: number | null;
|
|
9
|
+
quality_score: number | null;
|
|
10
|
+
expires_at: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ISlimCacheConfig {
|
|
13
|
+
dbPath?: string;
|
|
14
|
+
ttlMs?: number;
|
|
15
|
+
maxEntries?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class SlimStore {
|
|
18
|
+
private db;
|
|
19
|
+
private readonly dbPath;
|
|
20
|
+
private readonly ttlMs;
|
|
21
|
+
private readonly maxEntries;
|
|
22
|
+
constructor(config?: ISlimCacheConfig);
|
|
23
|
+
private initialize;
|
|
24
|
+
cache(agent: {
|
|
25
|
+
id: string;
|
|
26
|
+
chain: ChainPrefix;
|
|
27
|
+
rawId: string;
|
|
28
|
+
name: string;
|
|
29
|
+
owner: string;
|
|
30
|
+
trustTier?: number;
|
|
31
|
+
qualityScore?: number;
|
|
32
|
+
}): void;
|
|
33
|
+
cacheBatch(agents: Array<{
|
|
34
|
+
id: string;
|
|
35
|
+
chain: ChainPrefix;
|
|
36
|
+
rawId: string;
|
|
37
|
+
name: string;
|
|
38
|
+
owner: string;
|
|
39
|
+
trustTier?: number;
|
|
40
|
+
qualityScore?: number;
|
|
41
|
+
}>): void;
|
|
42
|
+
get(id: string): ISlimAgent | null;
|
|
43
|
+
search(query: string, options?: {
|
|
44
|
+
chain?: string;
|
|
45
|
+
limit?: number;
|
|
46
|
+
offset?: number;
|
|
47
|
+
}): ISearchResult;
|
|
48
|
+
private searchLike;
|
|
49
|
+
list(chain?: string, options?: {
|
|
50
|
+
limit?: number;
|
|
51
|
+
offset?: number;
|
|
52
|
+
}): ISearchResult;
|
|
53
|
+
evictExpired(): number;
|
|
54
|
+
private evictIfNeeded;
|
|
55
|
+
getStats(): {
|
|
56
|
+
total: number;
|
|
57
|
+
byChain: Record<string, number>;
|
|
58
|
+
dbSize: string;
|
|
59
|
+
expired: number;
|
|
60
|
+
};
|
|
61
|
+
clear(): void;
|
|
62
|
+
close(): void;
|
|
63
|
+
private formatBytes;
|
|
64
|
+
private toSummary;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=slim-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slim-store.d.ts","sourceRoot":"","sources":["../../../src/core/cache/slim-store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAA4B,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnG,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,qBAAa,SAAS;IACpB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,CAAC,EAAE,gBAAgB;IAcrC,OAAO,CAAC,UAAU;IAkDlB,KAAK,CAAC,KAAK,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,WAAW,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,IAAI;IA4BR,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,WAAW,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC,GAAG,IAAI;IAUT,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IASlC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,aAAa;IA+DjB,OAAO,CAAC,UAAU;IAsClB,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa;IAiClF,YAAY,IAAI,MAAM;IAMtB,OAAO,CAAC,aAAa;IAerB,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAyB/F,KAAK,IAAI,IAAI;IAIb,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,SAAS;CAYlB"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// Slim SQLite store with TTL - optimized for on-demand caching
|
|
2
|
+
// ~50 bytes per agent instead of ~900 bytes
|
|
3
|
+
import Database from 'better-sqlite3';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { mkdirSync, existsSync } from 'fs';
|
|
7
|
+
const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
8
|
+
const DEFAULT_MAX_ENTRIES = 10000;
|
|
9
|
+
const DEFAULT_CACHE_DIR = join(homedir(), '.8004-mcp');
|
|
10
|
+
const DEFAULT_DB_NAME = 'slim-cache.db';
|
|
11
|
+
export class SlimStore {
|
|
12
|
+
db;
|
|
13
|
+
dbPath;
|
|
14
|
+
ttlMs;
|
|
15
|
+
maxEntries;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.dbPath = config?.dbPath ?? join(DEFAULT_CACHE_DIR, DEFAULT_DB_NAME);
|
|
18
|
+
this.ttlMs = config?.ttlMs ?? DEFAULT_TTL_MS;
|
|
19
|
+
this.maxEntries = config?.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
20
|
+
const dir = this.dbPath.substring(0, this.dbPath.lastIndexOf('/'));
|
|
21
|
+
if (!existsSync(dir)) {
|
|
22
|
+
mkdirSync(dir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
this.db = new Database(this.dbPath);
|
|
25
|
+
this.initialize();
|
|
26
|
+
}
|
|
27
|
+
initialize() {
|
|
28
|
+
// Optimize for speed over durability (cache can be rebuilt)
|
|
29
|
+
this.db.pragma('journal_mode = WAL');
|
|
30
|
+
this.db.pragma('synchronous = OFF');
|
|
31
|
+
this.db.pragma('cache_size = -8000'); // 8MB cache
|
|
32
|
+
this.db.exec(`
|
|
33
|
+
-- Slim agents table (~50 bytes per row)
|
|
34
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
35
|
+
id TEXT PRIMARY KEY,
|
|
36
|
+
chain TEXT NOT NULL,
|
|
37
|
+
raw_id TEXT NOT NULL,
|
|
38
|
+
name TEXT NOT NULL,
|
|
39
|
+
owner TEXT NOT NULL,
|
|
40
|
+
trust_tier INTEGER,
|
|
41
|
+
quality_score REAL,
|
|
42
|
+
expires_at INTEGER NOT NULL
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
-- Indexes for common queries
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_chain ON agents(chain);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_expires ON agents(expires_at);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_name ON agents(name COLLATE NOCASE);
|
|
49
|
+
|
|
50
|
+
-- FTS5 for fast name search
|
|
51
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS agents_fts USING fts5(
|
|
52
|
+
id,
|
|
53
|
+
name,
|
|
54
|
+
content='agents',
|
|
55
|
+
content_rowid='rowid',
|
|
56
|
+
tokenize='unicode61'
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
-- Triggers to keep FTS in sync
|
|
60
|
+
CREATE TRIGGER IF NOT EXISTS agents_ai AFTER INSERT ON agents BEGIN
|
|
61
|
+
INSERT INTO agents_fts(rowid, id, name) VALUES (NEW.rowid, NEW.id, NEW.name);
|
|
62
|
+
END;
|
|
63
|
+
|
|
64
|
+
CREATE TRIGGER IF NOT EXISTS agents_ad AFTER DELETE ON agents BEGIN
|
|
65
|
+
INSERT INTO agents_fts(agents_fts, rowid, id, name) VALUES ('delete', OLD.rowid, OLD.id, OLD.name);
|
|
66
|
+
END;
|
|
67
|
+
|
|
68
|
+
CREATE TRIGGER IF NOT EXISTS agents_au AFTER UPDATE ON agents BEGIN
|
|
69
|
+
INSERT INTO agents_fts(agents_fts, rowid, id, name) VALUES ('delete', OLD.rowid, OLD.id, OLD.name);
|
|
70
|
+
INSERT INTO agents_fts(rowid, id, name) VALUES (NEW.rowid, NEW.id, NEW.name);
|
|
71
|
+
END;
|
|
72
|
+
`);
|
|
73
|
+
}
|
|
74
|
+
// Cache an agent (upsert with TTL refresh)
|
|
75
|
+
cache(agent) {
|
|
76
|
+
const expiresAt = Date.now() + this.ttlMs;
|
|
77
|
+
this.db.prepare(`
|
|
78
|
+
INSERT INTO agents (id, chain, raw_id, name, owner, trust_tier, quality_score, expires_at)
|
|
79
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
80
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
81
|
+
name = excluded.name,
|
|
82
|
+
owner = excluded.owner,
|
|
83
|
+
trust_tier = excluded.trust_tier,
|
|
84
|
+
quality_score = excluded.quality_score,
|
|
85
|
+
expires_at = excluded.expires_at
|
|
86
|
+
`).run(agent.id, agent.chain, agent.rawId, agent.name, agent.owner, agent.trustTier ?? null, agent.qualityScore ?? null, expiresAt);
|
|
87
|
+
// Evict if over limit
|
|
88
|
+
this.evictIfNeeded();
|
|
89
|
+
}
|
|
90
|
+
// Cache multiple agents
|
|
91
|
+
cacheBatch(agents) {
|
|
92
|
+
const insertMany = this.db.transaction((items) => {
|
|
93
|
+
for (const agent of items) {
|
|
94
|
+
this.cache(agent);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
insertMany(agents);
|
|
98
|
+
}
|
|
99
|
+
// Get cached agent (returns null if expired)
|
|
100
|
+
get(id) {
|
|
101
|
+
const row = this.db.prepare('SELECT * FROM agents WHERE id = ? AND expires_at > ?').get(id, Date.now());
|
|
102
|
+
return row ?? null;
|
|
103
|
+
}
|
|
104
|
+
// Search by name using FTS5
|
|
105
|
+
search(query, options) {
|
|
106
|
+
const limit = Math.min(options?.limit ?? 20, 100);
|
|
107
|
+
const offset = options?.offset ?? 0;
|
|
108
|
+
const now = Date.now();
|
|
109
|
+
// Escape query for FTS5
|
|
110
|
+
const ftsQuery = `"${query.replace(/"/g, '""')}"`;
|
|
111
|
+
let sql;
|
|
112
|
+
let countSql;
|
|
113
|
+
const params = [];
|
|
114
|
+
if (options?.chain) {
|
|
115
|
+
sql = `
|
|
116
|
+
SELECT a.* FROM agents a
|
|
117
|
+
INNER JOIN agents_fts fts ON fts.id = a.id
|
|
118
|
+
WHERE agents_fts MATCH ? AND a.chain = ? AND a.expires_at > ?
|
|
119
|
+
ORDER BY bm25(agents_fts)
|
|
120
|
+
LIMIT ? OFFSET ?
|
|
121
|
+
`;
|
|
122
|
+
countSql = `
|
|
123
|
+
SELECT COUNT(*) as count FROM agents a
|
|
124
|
+
INNER JOIN agents_fts fts ON fts.id = a.id
|
|
125
|
+
WHERE agents_fts MATCH ? AND a.chain = ? AND a.expires_at > ?
|
|
126
|
+
`;
|
|
127
|
+
params.push(ftsQuery, options.chain, now, limit, offset);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
sql = `
|
|
131
|
+
SELECT a.* FROM agents a
|
|
132
|
+
INNER JOIN agents_fts fts ON fts.id = a.id
|
|
133
|
+
WHERE agents_fts MATCH ? AND a.expires_at > ?
|
|
134
|
+
ORDER BY bm25(agents_fts)
|
|
135
|
+
LIMIT ? OFFSET ?
|
|
136
|
+
`;
|
|
137
|
+
countSql = `
|
|
138
|
+
SELECT COUNT(*) as count FROM agents a
|
|
139
|
+
INNER JOIN agents_fts fts ON fts.id = a.id
|
|
140
|
+
WHERE agents_fts MATCH ? AND a.expires_at > ?
|
|
141
|
+
`;
|
|
142
|
+
params.push(ftsQuery, now, limit, offset);
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
146
|
+
const countParams = options?.chain
|
|
147
|
+
? [ftsQuery, options.chain, now]
|
|
148
|
+
: [ftsQuery, now];
|
|
149
|
+
const countResult = this.db.prepare(countSql).get(...countParams);
|
|
150
|
+
return {
|
|
151
|
+
results: rows.map(row => this.toSummary(row)),
|
|
152
|
+
total: countResult.count,
|
|
153
|
+
hasMore: offset + rows.length < countResult.count,
|
|
154
|
+
offset,
|
|
155
|
+
limit,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// FTS query failed (e.g., syntax error), fallback to LIKE
|
|
160
|
+
return this.searchLike(query, options);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Fallback search using LIKE
|
|
164
|
+
searchLike(query, options) {
|
|
165
|
+
const limit = Math.min(options?.limit ?? 20, 100);
|
|
166
|
+
const offset = options?.offset ?? 0;
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
const pattern = `%${query}%`;
|
|
169
|
+
let sql;
|
|
170
|
+
let countSql;
|
|
171
|
+
const params = [];
|
|
172
|
+
if (options?.chain) {
|
|
173
|
+
sql = `SELECT * FROM agents WHERE name LIKE ? AND chain = ? AND expires_at > ? LIMIT ? OFFSET ?`;
|
|
174
|
+
countSql = `SELECT COUNT(*) as count FROM agents WHERE name LIKE ? AND chain = ? AND expires_at > ?`;
|
|
175
|
+
params.push(pattern, options.chain, now, limit, offset);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
sql = `SELECT * FROM agents WHERE name LIKE ? AND expires_at > ? LIMIT ? OFFSET ?`;
|
|
179
|
+
countSql = `SELECT COUNT(*) as count FROM agents WHERE name LIKE ? AND expires_at > ?`;
|
|
180
|
+
params.push(pattern, now, limit, offset);
|
|
181
|
+
}
|
|
182
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
183
|
+
const countParams = options?.chain ? [pattern, options.chain, now] : [pattern, now];
|
|
184
|
+
const countResult = this.db.prepare(countSql).get(...countParams);
|
|
185
|
+
return {
|
|
186
|
+
results: rows.map(row => this.toSummary(row)),
|
|
187
|
+
total: countResult.count,
|
|
188
|
+
hasMore: offset + rows.length < countResult.count,
|
|
189
|
+
offset,
|
|
190
|
+
limit,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// List all cached agents for a chain
|
|
194
|
+
list(chain, options) {
|
|
195
|
+
const limit = Math.min(options?.limit ?? 20, 100);
|
|
196
|
+
const offset = options?.offset ?? 0;
|
|
197
|
+
const now = Date.now();
|
|
198
|
+
let sql;
|
|
199
|
+
let countSql;
|
|
200
|
+
const params = [];
|
|
201
|
+
if (chain) {
|
|
202
|
+
sql = `SELECT * FROM agents WHERE chain = ? AND expires_at > ? ORDER BY quality_score DESC NULLS LAST LIMIT ? OFFSET ?`;
|
|
203
|
+
countSql = `SELECT COUNT(*) as count FROM agents WHERE chain = ? AND expires_at > ?`;
|
|
204
|
+
params.push(chain, now, limit, offset);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
sql = `SELECT * FROM agents WHERE expires_at > ? ORDER BY quality_score DESC NULLS LAST LIMIT ? OFFSET ?`;
|
|
208
|
+
countSql = `SELECT COUNT(*) as count FROM agents WHERE expires_at > ?`;
|
|
209
|
+
params.push(now, limit, offset);
|
|
210
|
+
}
|
|
211
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
212
|
+
const countParams = chain ? [chain, now] : [now];
|
|
213
|
+
const countResult = this.db.prepare(countSql).get(...countParams);
|
|
214
|
+
return {
|
|
215
|
+
results: rows.map(row => this.toSummary(row)),
|
|
216
|
+
total: countResult.count,
|
|
217
|
+
hasMore: offset + rows.length < countResult.count,
|
|
218
|
+
offset,
|
|
219
|
+
limit,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// Evict expired entries
|
|
223
|
+
evictExpired() {
|
|
224
|
+
const result = this.db.prepare('DELETE FROM agents WHERE expires_at < ?').run(Date.now());
|
|
225
|
+
return result.changes;
|
|
226
|
+
}
|
|
227
|
+
// Evict oldest entries if over limit
|
|
228
|
+
evictIfNeeded() {
|
|
229
|
+
const count = this.db.prepare('SELECT COUNT(*) as c FROM agents').get().c;
|
|
230
|
+
if (count > this.maxEntries) {
|
|
231
|
+
// Delete oldest 10% of entries
|
|
232
|
+
const toDelete = Math.ceil(count * 0.1);
|
|
233
|
+
this.db.prepare(`
|
|
234
|
+
DELETE FROM agents WHERE id IN (
|
|
235
|
+
SELECT id FROM agents ORDER BY expires_at ASC LIMIT ?
|
|
236
|
+
)
|
|
237
|
+
`).run(toDelete);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Stats
|
|
241
|
+
getStats() {
|
|
242
|
+
const now = Date.now();
|
|
243
|
+
const total = this.db.prepare('SELECT COUNT(*) as c FROM agents WHERE expires_at > ?').get(now).c;
|
|
244
|
+
const expired = this.db.prepare('SELECT COUNT(*) as c FROM agents WHERE expires_at <= ?').get(now).c;
|
|
245
|
+
const byChainRows = this.db.prepare('SELECT chain, COUNT(*) as count FROM agents WHERE expires_at > ? GROUP BY chain').all(now);
|
|
246
|
+
const byChain = {};
|
|
247
|
+
for (const row of byChainRows) {
|
|
248
|
+
byChain[row.chain] = row.count;
|
|
249
|
+
}
|
|
250
|
+
// Get database file size
|
|
251
|
+
const sizeStmt = this.db.prepare("SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size()");
|
|
252
|
+
const sizeResult = sizeStmt.get();
|
|
253
|
+
const sizeBytes = sizeResult?.size ?? 0;
|
|
254
|
+
const dbSize = this.formatBytes(sizeBytes);
|
|
255
|
+
return { total, byChain, dbSize, expired };
|
|
256
|
+
}
|
|
257
|
+
// Clear all cache
|
|
258
|
+
clear() {
|
|
259
|
+
this.db.exec('DELETE FROM agents');
|
|
260
|
+
}
|
|
261
|
+
close() {
|
|
262
|
+
this.db.close();
|
|
263
|
+
}
|
|
264
|
+
formatBytes(bytes) {
|
|
265
|
+
if (bytes === 0)
|
|
266
|
+
return '0 B';
|
|
267
|
+
const k = 1024;
|
|
268
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
269
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
270
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
|
|
271
|
+
}
|
|
272
|
+
toSummary(row) {
|
|
273
|
+
return {
|
|
274
|
+
id: row.raw_id,
|
|
275
|
+
globalId: row.id,
|
|
276
|
+
chainType: (row.chain === 'sol' ? 'solana' : 'evm'),
|
|
277
|
+
chainPrefix: row.chain,
|
|
278
|
+
name: row.name,
|
|
279
|
+
owner: row.owner,
|
|
280
|
+
trustTier: row.trust_tier ?? undefined,
|
|
281
|
+
qualityScore: row.quality_score ?? undefined,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=slim-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slim-store.js","sourceRoot":"","sources":["../../../src/core/cache/slim-store.ts"],"names":[],"mappings":"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"}
|