@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.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +370 -0
  3. package/dist/chains/evm/index.d.ts +2 -0
  4. package/dist/chains/evm/index.d.ts.map +1 -0
  5. package/dist/chains/evm/index.js +3 -0
  6. package/dist/chains/evm/index.js.map +1 -0
  7. package/dist/chains/evm/provider.d.ts +48 -0
  8. package/dist/chains/evm/provider.d.ts.map +1 -0
  9. package/dist/chains/evm/provider.js +446 -0
  10. package/dist/chains/evm/provider.js.map +1 -0
  11. package/dist/chains/index.d.ts +3 -0
  12. package/dist/chains/index.d.ts.map +1 -0
  13. package/dist/chains/index.js +4 -0
  14. package/dist/chains/index.js.map +1 -0
  15. package/dist/chains/solana/data-source.d.ts +17 -0
  16. package/dist/chains/solana/data-source.d.ts.map +1 -0
  17. package/dist/chains/solana/data-source.js +65 -0
  18. package/dist/chains/solana/data-source.js.map +1 -0
  19. package/dist/chains/solana/index.d.ts +8 -0
  20. package/dist/chains/solana/index.d.ts.map +1 -0
  21. package/dist/chains/solana/index.js +9 -0
  22. package/dist/chains/solana/index.js.map +1 -0
  23. package/dist/chains/solana/parsers.d.ts +11 -0
  24. package/dist/chains/solana/parsers.d.ts.map +1 -0
  25. package/dist/chains/solana/parsers.js +94 -0
  26. package/dist/chains/solana/parsers.js.map +1 -0
  27. package/dist/chains/solana/provider.d.ts +33 -0
  28. package/dist/chains/solana/provider.d.ts.map +1 -0
  29. package/dist/chains/solana/provider.js +407 -0
  30. package/dist/chains/solana/provider.js.map +1 -0
  31. package/dist/chains/solana/state.d.ts +55 -0
  32. package/dist/chains/solana/state.d.ts.map +1 -0
  33. package/dist/chains/solana/state.js +162 -0
  34. package/dist/chains/solana/state.js.map +1 -0
  35. package/dist/chains/solana/tools/atom.d.ts +45 -0
  36. package/dist/chains/solana/tools/atom.d.ts.map +1 -0
  37. package/dist/chains/solana/tools/atom.js +115 -0
  38. package/dist/chains/solana/tools/atom.js.map +1 -0
  39. package/dist/chains/solana/tools/validation.d.ts +45 -0
  40. package/dist/chains/solana/tools/validation.d.ts.map +1 -0
  41. package/dist/chains/solana/tools/validation.js +212 -0
  42. package/dist/chains/solana/tools/validation.js.map +1 -0
  43. package/dist/chains/solana/tools/wallet.d.ts +45 -0
  44. package/dist/chains/solana/tools/wallet.d.ts.map +1 -0
  45. package/dist/chains/solana/tools/wallet.js +103 -0
  46. package/dist/chains/solana/tools/wallet.js.map +1 -0
  47. package/dist/config/defaults.d.ts +68 -0
  48. package/dist/config/defaults.d.ts.map +1 -0
  49. package/dist/config/defaults.js +247 -0
  50. package/dist/config/defaults.js.map +1 -0
  51. package/dist/config/env.d.ts +33 -0
  52. package/dist/config/env.d.ts.map +1 -0
  53. package/dist/config/env.js +42 -0
  54. package/dist/config/env.js.map +1 -0
  55. package/dist/config/index.d.ts +3 -0
  56. package/dist/config/index.d.ts.map +1 -0
  57. package/dist/config/index.js +3 -0
  58. package/dist/config/index.js.map +1 -0
  59. package/dist/core/cache/agent-cache.d.ts +36 -0
  60. package/dist/core/cache/agent-cache.d.ts.map +1 -0
  61. package/dist/core/cache/agent-cache.js +87 -0
  62. package/dist/core/cache/agent-cache.js.map +1 -0
  63. package/dist/core/cache/data-source.d.ts +31 -0
  64. package/dist/core/cache/data-source.d.ts.map +1 -0
  65. package/dist/core/cache/data-source.js +6 -0
  66. package/dist/core/cache/data-source.js.map +1 -0
  67. package/dist/core/cache/index.d.ts +7 -0
  68. package/dist/core/cache/index.d.ts.map +1 -0
  69. package/dist/core/cache/index.js +9 -0
  70. package/dist/core/cache/index.js.map +1 -0
  71. package/dist/core/cache/lazy-cache.d.ts +30 -0
  72. package/dist/core/cache/lazy-cache.d.ts.map +1 -0
  73. package/dist/core/cache/lazy-cache.js +79 -0
  74. package/dist/core/cache/lazy-cache.js.map +1 -0
  75. package/dist/core/cache/slim-store.d.ts +66 -0
  76. package/dist/core/cache/slim-store.d.ts.map +1 -0
  77. package/dist/core/cache/slim-store.js +285 -0
  78. package/dist/core/cache/slim-store.js.map +1 -0
  79. package/dist/core/cache/sqlite-store.d.ts +99 -0
  80. package/dist/core/cache/sqlite-store.d.ts.map +1 -0
  81. package/dist/core/cache/sqlite-store.js +470 -0
  82. package/dist/core/cache/sqlite-store.js.map +1 -0
  83. package/dist/core/cache/sync-manager.d.ts +38 -0
  84. package/dist/core/cache/sync-manager.d.ts.map +1 -0
  85. package/dist/core/cache/sync-manager.js +213 -0
  86. package/dist/core/cache/sync-manager.js.map +1 -0
  87. package/dist/core/errors/index.d.ts +2 -0
  88. package/dist/core/errors/index.d.ts.map +1 -0
  89. package/dist/core/errors/index.js +2 -0
  90. package/dist/core/errors/index.js.map +1 -0
  91. package/dist/core/errors/mcp-error.d.ts +39 -0
  92. package/dist/core/errors/mcp-error.d.ts.map +1 -0
  93. package/dist/core/errors/mcp-error.js +79 -0
  94. package/dist/core/errors/mcp-error.js.map +1 -0
  95. package/dist/core/interfaces/agent.d.ts +84 -0
  96. package/dist/core/interfaces/agent.d.ts.map +1 -0
  97. package/dist/core/interfaces/agent.js +40 -0
  98. package/dist/core/interfaces/agent.js.map +1 -0
  99. package/dist/core/interfaces/chain-provider.d.ts +50 -0
  100. package/dist/core/interfaces/chain-provider.d.ts.map +1 -0
  101. package/dist/core/interfaces/chain-provider.js +5 -0
  102. package/dist/core/interfaces/chain-provider.js.map +1 -0
  103. package/dist/core/interfaces/feedback.d.ts +46 -0
  104. package/dist/core/interfaces/feedback.d.ts.map +1 -0
  105. package/dist/core/interfaces/feedback.js +3 -0
  106. package/dist/core/interfaces/feedback.js.map +1 -0
  107. package/dist/core/interfaces/index.d.ts +6 -0
  108. package/dist/core/interfaces/index.d.ts.map +1 -0
  109. package/dist/core/interfaces/index.js +7 -0
  110. package/dist/core/interfaces/index.js.map +1 -0
  111. package/dist/core/interfaces/reputation.d.ts +47 -0
  112. package/dist/core/interfaces/reputation.d.ts.map +1 -0
  113. package/dist/core/interfaces/reputation.js +30 -0
  114. package/dist/core/interfaces/reputation.js.map +1 -0
  115. package/dist/core/interfaces/x402.d.ts +226 -0
  116. package/dist/core/interfaces/x402.d.ts.map +1 -0
  117. package/dist/core/interfaces/x402.js +120 -0
  118. package/dist/core/interfaces/x402.js.map +1 -0
  119. package/dist/core/parsers/common.d.ts +31 -0
  120. package/dist/core/parsers/common.d.ts.map +1 -0
  121. package/dist/core/parsers/common.js +185 -0
  122. package/dist/core/parsers/common.js.map +1 -0
  123. package/dist/core/parsers/index.d.ts +2 -0
  124. package/dist/core/parsers/index.d.ts.map +1 -0
  125. package/dist/core/parsers/index.js +2 -0
  126. package/dist/core/parsers/index.js.map +1 -0
  127. package/dist/core/registry/chain-registry.d.ts +26 -0
  128. package/dist/core/registry/chain-registry.d.ts.map +1 -0
  129. package/dist/core/registry/chain-registry.js +141 -0
  130. package/dist/core/registry/chain-registry.js.map +1 -0
  131. package/dist/core/registry/index.d.ts +3 -0
  132. package/dist/core/registry/index.d.ts.map +1 -0
  133. package/dist/core/registry/index.js +3 -0
  134. package/dist/core/registry/index.js.map +1 -0
  135. package/dist/core/registry/tool-registry.d.ts +23 -0
  136. package/dist/core/registry/tool-registry.d.ts.map +1 -0
  137. package/dist/core/registry/tool-registry.js +66 -0
  138. package/dist/core/registry/tool-registry.js.map +1 -0
  139. package/dist/core/serializers/common.d.ts +20 -0
  140. package/dist/core/serializers/common.d.ts.map +1 -0
  141. package/dist/core/serializers/common.js +76 -0
  142. package/dist/core/serializers/common.js.map +1 -0
  143. package/dist/core/serializers/index.d.ts +2 -0
  144. package/dist/core/serializers/index.d.ts.map +1 -0
  145. package/dist/core/serializers/index.js +2 -0
  146. package/dist/core/serializers/index.js.map +1 -0
  147. package/dist/core/services/index.d.ts +3 -0
  148. package/dist/core/services/index.d.ts.map +1 -0
  149. package/dist/core/services/index.js +3 -0
  150. package/dist/core/services/index.js.map +1 -0
  151. package/dist/core/services/ipfs-service.d.ts +59 -0
  152. package/dist/core/services/ipfs-service.d.ts.map +1 -0
  153. package/dist/core/services/ipfs-service.js +84 -0
  154. package/dist/core/services/ipfs-service.js.map +1 -0
  155. package/dist/core/utils/tags.d.ts +38 -0
  156. package/dist/core/utils/tags.d.ts.map +1 -0
  157. package/dist/core/utils/tags.js +77 -0
  158. package/dist/core/utils/tags.js.map +1 -0
  159. package/dist/core/utils/value-encoding.d.ts +36 -0
  160. package/dist/core/utils/value-encoding.d.ts.map +1 -0
  161. package/dist/core/utils/value-encoding.js +196 -0
  162. package/dist/core/utils/value-encoding.js.map +1 -0
  163. package/dist/core/wallet/index.d.ts +2 -0
  164. package/dist/core/wallet/index.d.ts.map +1 -0
  165. package/dist/core/wallet/index.js +3 -0
  166. package/dist/core/wallet/index.js.map +1 -0
  167. package/dist/core/wallet/wallet-manager.d.ts +86 -0
  168. package/dist/core/wallet/wallet-manager.d.ts.map +1 -0
  169. package/dist/core/wallet/wallet-manager.js +783 -0
  170. package/dist/core/wallet/wallet-manager.js.map +1 -0
  171. package/dist/core/x402/index.d.ts +2 -0
  172. package/dist/core/x402/index.d.ts.map +1 -0
  173. package/dist/core/x402/index.js +3 -0
  174. package/dist/core/x402/index.js.map +1 -0
  175. package/dist/core/x402/proof-validator.d.ts +57 -0
  176. package/dist/core/x402/proof-validator.d.ts.map +1 -0
  177. package/dist/core/x402/proof-validator.js +103 -0
  178. package/dist/core/x402/proof-validator.js.map +1 -0
  179. package/dist/index.d.ts +3 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +135 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/state/global-state.d.ts +98 -0
  184. package/dist/state/global-state.d.ts.map +1 -0
  185. package/dist/state/global-state.js +258 -0
  186. package/dist/state/global-state.js.map +1 -0
  187. package/dist/tools/definitions.d.ts +10 -0
  188. package/dist/tools/definitions.d.ts.map +1 -0
  189. package/dist/tools/definitions.js +163 -0
  190. package/dist/tools/definitions.js.map +1 -0
  191. package/dist/tools/unified/agent.d.ts +5 -0
  192. package/dist/tools/unified/agent.d.ts.map +1 -0
  193. package/dist/tools/unified/agent.js +300 -0
  194. package/dist/tools/unified/agent.js.map +1 -0
  195. package/dist/tools/unified/cache.d.ts +5 -0
  196. package/dist/tools/unified/cache.d.ts.map +1 -0
  197. package/dist/tools/unified/cache.js +207 -0
  198. package/dist/tools/unified/cache.js.map +1 -0
  199. package/dist/tools/unified/collection.d.ts +5 -0
  200. package/dist/tools/unified/collection.d.ts.map +1 -0
  201. package/dist/tools/unified/collection.js +162 -0
  202. package/dist/tools/unified/collection.js.map +1 -0
  203. package/dist/tools/unified/config.d.ts +5 -0
  204. package/dist/tools/unified/config.d.ts.map +1 -0
  205. package/dist/tools/unified/config.js +217 -0
  206. package/dist/tools/unified/config.js.map +1 -0
  207. package/dist/tools/unified/crawler.d.ts +5 -0
  208. package/dist/tools/unified/crawler.d.ts.map +1 -0
  209. package/dist/tools/unified/crawler.js +212 -0
  210. package/dist/tools/unified/crawler.js.map +1 -0
  211. package/dist/tools/unified/feedback.d.ts +5 -0
  212. package/dist/tools/unified/feedback.d.ts.map +1 -0
  213. package/dist/tools/unified/feedback.js +274 -0
  214. package/dist/tools/unified/feedback.js.map +1 -0
  215. package/dist/tools/unified/ipfs.d.ts +5 -0
  216. package/dist/tools/unified/ipfs.d.ts.map +1 -0
  217. package/dist/tools/unified/ipfs.js +156 -0
  218. package/dist/tools/unified/ipfs.js.map +1 -0
  219. package/dist/tools/unified/oasf.d.ts +5 -0
  220. package/dist/tools/unified/oasf.d.ts.map +1 -0
  221. package/dist/tools/unified/oasf.js +167 -0
  222. package/dist/tools/unified/oasf.js.map +1 -0
  223. package/dist/tools/unified/registration.d.ts +5 -0
  224. package/dist/tools/unified/registration.d.ts.map +1 -0
  225. package/dist/tools/unified/registration.js +223 -0
  226. package/dist/tools/unified/registration.js.map +1 -0
  227. package/dist/tools/unified/reputation.d.ts +5 -0
  228. package/dist/tools/unified/reputation.d.ts.map +1 -0
  229. package/dist/tools/unified/reputation.js +121 -0
  230. package/dist/tools/unified/reputation.js.map +1 -0
  231. package/dist/tools/unified/wallet.d.ts +5 -0
  232. package/dist/tools/unified/wallet.d.ts.map +1 -0
  233. package/dist/tools/unified/wallet.js +434 -0
  234. package/dist/tools/unified/wallet.js.map +1 -0
  235. package/dist/tools/unified/write-operations.d.ts +5 -0
  236. package/dist/tools/unified/write-operations.d.ts.map +1 -0
  237. package/dist/tools/unified/write-operations.js +582 -0
  238. package/dist/tools/unified/write-operations.js.map +1 -0
  239. package/dist/tools/unified/x402.d.ts +5 -0
  240. package/dist/tools/unified/x402.d.ts.map +1 -0
  241. package/dist/tools/unified/x402.js +594 -0
  242. package/dist/tools/unified/x402.js.map +1 -0
  243. 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":"AAAA,+DAA+D;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWhD,MAAM,OAAO,UAAU;IACJ,KAAK,CAAc;IACnB,WAAW,CAAc;IACzB,QAAQ,CAAU;IAEnC,YAAY,MAA0B;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;IAC3C,CAAC;IAED,YAAY;IACZ,KAAK;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,yBAAyB;IACzB,kBAAkB,CAAC,UAAuB;QACxC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,oBAAoB,CAAC,QAAgB;QACnC,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,oBAAoB;IACpB,MAAM,CAAC,KAAa,EAAE,OAIrB;QACC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,YAAY,CAAC,MAAqB;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,mBAAmB;IACnB,QAAQ,CAAC,QAAgB;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,MAAM;YACjB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,SAAS,EAAE,MAAM,CAAC,UAA8B;YAChD,WAAW,EAAE,MAAM,CAAC,YAA8D;YAClF,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;YAC5C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS;YAChC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;YAC1C,SAAS,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;YACzC,YAAY,EAAE,MAAM,CAAC,aAAa,IAAI,SAAS;YAC/C,cAAc,EAAE,MAAM,CAAC,eAAe,IAAI,SAAS;SACpD,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,KAAmB;QAC7B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,iBAAiB,CAAC,MAAsB;QACtC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,OAAO,CAAC,OAA8C;QAC1D,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACvF,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,eAAe,CAAC,QAAiB;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,QAAQ;IACR,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,cAAc;IACd,QAAQ;QACN,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -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,6 @@
1
+ // Data source interface for cache sync
2
+ // Abstract base class with common functionality
3
+ export class BaseDataSource {
4
+ defaultBatchSize = 1000;
5
+ }
6
+ //# sourceMappingURL=data-source.js.map
@@ -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,7 @@
1
+ export * from './sqlite-store.js';
2
+ export * from './data-source.js';
3
+ export * from './sync-manager.js';
4
+ export * from './agent-cache.js';
5
+ export * from './slim-store.js';
6
+ export * from './lazy-cache.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}