@oobe-protocol-labs/synapse-sap-sdk 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 (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +882 -0
  3. package/dist/cjs/constants/index.js +43 -0
  4. package/dist/cjs/constants/index.js.map +1 -0
  5. package/dist/cjs/constants/limits.js +161 -0
  6. package/dist/cjs/constants/limits.js.map +1 -0
  7. package/dist/cjs/constants/programs.js +78 -0
  8. package/dist/cjs/constants/programs.js.map +1 -0
  9. package/dist/cjs/constants/seeds.js +57 -0
  10. package/dist/cjs/constants/seeds.js.map +1 -0
  11. package/dist/cjs/core/client.js +391 -0
  12. package/dist/cjs/core/client.js.map +1 -0
  13. package/dist/cjs/core/connection.js +319 -0
  14. package/dist/cjs/core/connection.js.map +1 -0
  15. package/dist/cjs/core/index.js +24 -0
  16. package/dist/cjs/core/index.js.map +1 -0
  17. package/dist/cjs/errors/index.js +334 -0
  18. package/dist/cjs/errors/index.js.map +1 -0
  19. package/dist/cjs/events/index.js +136 -0
  20. package/dist/cjs/events/index.js.map +1 -0
  21. package/dist/cjs/idl/index.js +63 -0
  22. package/dist/cjs/idl/index.js.map +1 -0
  23. package/dist/cjs/idl/synapse_agent_sap.json +9710 -0
  24. package/dist/cjs/index.js +147 -0
  25. package/dist/cjs/index.js.map +1 -0
  26. package/dist/cjs/modules/agent.js +272 -0
  27. package/dist/cjs/modules/agent.js.map +1 -0
  28. package/dist/cjs/modules/attestation.js +147 -0
  29. package/dist/cjs/modules/attestation.js.map +1 -0
  30. package/dist/cjs/modules/base.js +128 -0
  31. package/dist/cjs/modules/base.js.map +1 -0
  32. package/dist/cjs/modules/escrow.js +246 -0
  33. package/dist/cjs/modules/escrow.js.map +1 -0
  34. package/dist/cjs/modules/feedback.js +166 -0
  35. package/dist/cjs/modules/feedback.js.map +1 -0
  36. package/dist/cjs/modules/index.js +35 -0
  37. package/dist/cjs/modules/index.js.map +1 -0
  38. package/dist/cjs/modules/indexing.js +375 -0
  39. package/dist/cjs/modules/indexing.js.map +1 -0
  40. package/dist/cjs/modules/ledger.js +234 -0
  41. package/dist/cjs/modules/ledger.js.map +1 -0
  42. package/dist/cjs/modules/tools.js +319 -0
  43. package/dist/cjs/modules/tools.js.map +1 -0
  44. package/dist/cjs/modules/vault.js +410 -0
  45. package/dist/cjs/modules/vault.js.map +1 -0
  46. package/dist/cjs/pda/index.js +377 -0
  47. package/dist/cjs/pda/index.js.map +1 -0
  48. package/dist/cjs/plugin/index.js +934 -0
  49. package/dist/cjs/plugin/index.js.map +1 -0
  50. package/dist/cjs/plugin/protocols.js +282 -0
  51. package/dist/cjs/plugin/protocols.js.map +1 -0
  52. package/dist/cjs/plugin/schemas.js +831 -0
  53. package/dist/cjs/plugin/schemas.js.map +1 -0
  54. package/dist/cjs/postgres/adapter.js +715 -0
  55. package/dist/cjs/postgres/adapter.js.map +1 -0
  56. package/dist/cjs/postgres/index.js +50 -0
  57. package/dist/cjs/postgres/index.js.map +1 -0
  58. package/dist/cjs/postgres/serializers.js +381 -0
  59. package/dist/cjs/postgres/serializers.js.map +1 -0
  60. package/dist/cjs/postgres/sync.js +221 -0
  61. package/dist/cjs/postgres/sync.js.map +1 -0
  62. package/dist/cjs/postgres/types.js +44 -0
  63. package/dist/cjs/postgres/types.js.map +1 -0
  64. package/dist/cjs/registries/builder.js +414 -0
  65. package/dist/cjs/registries/builder.js.map +1 -0
  66. package/dist/cjs/registries/discovery.js +362 -0
  67. package/dist/cjs/registries/discovery.js.map +1 -0
  68. package/dist/cjs/registries/index.js +51 -0
  69. package/dist/cjs/registries/index.js.map +1 -0
  70. package/dist/cjs/registries/session.js +433 -0
  71. package/dist/cjs/registries/session.js.map +1 -0
  72. package/dist/cjs/registries/x402.js +577 -0
  73. package/dist/cjs/registries/x402.js.map +1 -0
  74. package/dist/cjs/types/accounts.js +13 -0
  75. package/dist/cjs/types/accounts.js.map +1 -0
  76. package/dist/cjs/types/common.js +13 -0
  77. package/dist/cjs/types/common.js.map +1 -0
  78. package/dist/cjs/types/enums.js +174 -0
  79. package/dist/cjs/types/enums.js.map +1 -0
  80. package/dist/cjs/types/index.js +36 -0
  81. package/dist/cjs/types/index.js.map +1 -0
  82. package/dist/cjs/types/instructions.js +92 -0
  83. package/dist/cjs/types/instructions.js.map +1 -0
  84. package/dist/cjs/utils/hash.js +58 -0
  85. package/dist/cjs/utils/hash.js.map +1 -0
  86. package/dist/cjs/utils/index.js +27 -0
  87. package/dist/cjs/utils/index.js.map +1 -0
  88. package/dist/cjs/utils/serialization.js +105 -0
  89. package/dist/cjs/utils/serialization.js.map +1 -0
  90. package/dist/cjs/utils/validation.js +36 -0
  91. package/dist/cjs/utils/validation.js.map +1 -0
  92. package/dist/esm/constants/index.js +29 -0
  93. package/dist/esm/constants/index.js.map +1 -0
  94. package/dist/esm/constants/limits.js +158 -0
  95. package/dist/esm/constants/limits.js.map +1 -0
  96. package/dist/esm/constants/programs.js +75 -0
  97. package/dist/esm/constants/programs.js.map +1 -0
  98. package/dist/esm/constants/seeds.js +54 -0
  99. package/dist/esm/constants/seeds.js.map +1 -0
  100. package/dist/esm/core/client.js +384 -0
  101. package/dist/esm/core/client.js.map +1 -0
  102. package/dist/esm/core/connection.js +315 -0
  103. package/dist/esm/core/connection.js.map +1 -0
  104. package/dist/esm/core/index.js +19 -0
  105. package/dist/esm/core/index.js.map +1 -0
  106. package/dist/esm/errors/index.js +325 -0
  107. package/dist/esm/errors/index.js.map +1 -0
  108. package/dist/esm/events/index.js +132 -0
  109. package/dist/esm/events/index.js.map +1 -0
  110. package/dist/esm/idl/index.js +57 -0
  111. package/dist/esm/idl/index.js.map +1 -0
  112. package/dist/esm/idl/synapse_agent_sap.json +9710 -0
  113. package/dist/esm/index.js +70 -0
  114. package/dist/esm/index.js.map +1 -0
  115. package/dist/esm/modules/agent.js +268 -0
  116. package/dist/esm/modules/agent.js.map +1 -0
  117. package/dist/esm/modules/attestation.js +143 -0
  118. package/dist/esm/modules/attestation.js.map +1 -0
  119. package/dist/esm/modules/base.js +124 -0
  120. package/dist/esm/modules/base.js.map +1 -0
  121. package/dist/esm/modules/escrow.js +242 -0
  122. package/dist/esm/modules/escrow.js.map +1 -0
  123. package/dist/esm/modules/feedback.js +162 -0
  124. package/dist/esm/modules/feedback.js.map +1 -0
  125. package/dist/esm/modules/index.js +23 -0
  126. package/dist/esm/modules/index.js.map +1 -0
  127. package/dist/esm/modules/indexing.js +371 -0
  128. package/dist/esm/modules/indexing.js.map +1 -0
  129. package/dist/esm/modules/ledger.js +230 -0
  130. package/dist/esm/modules/ledger.js.map +1 -0
  131. package/dist/esm/modules/tools.js +315 -0
  132. package/dist/esm/modules/tools.js.map +1 -0
  133. package/dist/esm/modules/vault.js +406 -0
  134. package/dist/esm/modules/vault.js.map +1 -0
  135. package/dist/esm/pda/index.js +357 -0
  136. package/dist/esm/pda/index.js.map +1 -0
  137. package/dist/esm/plugin/index.js +927 -0
  138. package/dist/esm/plugin/index.js.map +1 -0
  139. package/dist/esm/plugin/protocols.js +279 -0
  140. package/dist/esm/plugin/protocols.js.map +1 -0
  141. package/dist/esm/plugin/schemas.js +828 -0
  142. package/dist/esm/plugin/schemas.js.map +1 -0
  143. package/dist/esm/postgres/adapter.js +678 -0
  144. package/dist/esm/postgres/adapter.js.map +1 -0
  145. package/dist/esm/postgres/index.js +27 -0
  146. package/dist/esm/postgres/index.js.map +1 -0
  147. package/dist/esm/postgres/serializers.js +362 -0
  148. package/dist/esm/postgres/serializers.js.map +1 -0
  149. package/dist/esm/postgres/sync.js +217 -0
  150. package/dist/esm/postgres/sync.js.map +1 -0
  151. package/dist/esm/postgres/types.js +41 -0
  152. package/dist/esm/postgres/types.js.map +1 -0
  153. package/dist/esm/registries/builder.js +410 -0
  154. package/dist/esm/registries/builder.js.map +1 -0
  155. package/dist/esm/registries/discovery.js +358 -0
  156. package/dist/esm/registries/discovery.js.map +1 -0
  157. package/dist/esm/registries/index.js +44 -0
  158. package/dist/esm/registries/index.js.map +1 -0
  159. package/dist/esm/registries/session.js +429 -0
  160. package/dist/esm/registries/session.js.map +1 -0
  161. package/dist/esm/registries/x402.js +573 -0
  162. package/dist/esm/registries/x402.js.map +1 -0
  163. package/dist/esm/types/accounts.js +12 -0
  164. package/dist/esm/types/accounts.js.map +1 -0
  165. package/dist/esm/types/common.js +12 -0
  166. package/dist/esm/types/common.js.map +1 -0
  167. package/dist/esm/types/enums.js +171 -0
  168. package/dist/esm/types/enums.js.map +1 -0
  169. package/dist/esm/types/index.js +25 -0
  170. package/dist/esm/types/index.js.map +1 -0
  171. package/dist/esm/types/instructions.js +89 -0
  172. package/dist/esm/types/instructions.js.map +1 -0
  173. package/dist/esm/utils/hash.js +53 -0
  174. package/dist/esm/utils/hash.js.map +1 -0
  175. package/dist/esm/utils/index.js +19 -0
  176. package/dist/esm/utils/index.js.map +1 -0
  177. package/dist/esm/utils/serialization.js +98 -0
  178. package/dist/esm/utils/serialization.js.map +1 -0
  179. package/dist/esm/utils/validation.js +33 -0
  180. package/dist/esm/utils/validation.js.map +1 -0
  181. package/dist/types/constants/index.d.ts +27 -0
  182. package/dist/types/constants/index.d.ts.map +1 -0
  183. package/dist/types/constants/limits.d.ts +149 -0
  184. package/dist/types/constants/limits.d.ts.map +1 -0
  185. package/dist/types/constants/programs.d.ts +69 -0
  186. package/dist/types/constants/programs.d.ts.map +1 -0
  187. package/dist/types/constants/seeds.d.ts +61 -0
  188. package/dist/types/constants/seeds.d.ts.map +1 -0
  189. package/dist/types/core/client.d.ts +323 -0
  190. package/dist/types/core/client.d.ts.map +1 -0
  191. package/dist/types/core/connection.d.ts +279 -0
  192. package/dist/types/core/connection.d.ts.map +1 -0
  193. package/dist/types/core/index.d.ts +20 -0
  194. package/dist/types/core/index.d.ts.map +1 -0
  195. package/dist/types/errors/index.d.ts +276 -0
  196. package/dist/types/errors/index.d.ts.map +1 -0
  197. package/dist/types/events/index.d.ts +248 -0
  198. package/dist/types/events/index.d.ts.map +1 -0
  199. package/dist/types/idl/index.d.ts +70 -0
  200. package/dist/types/idl/index.d.ts.map +1 -0
  201. package/dist/types/index.d.ts +68 -0
  202. package/dist/types/index.d.ts.map +1 -0
  203. package/dist/types/modules/agent.d.ts +166 -0
  204. package/dist/types/modules/agent.d.ts.map +1 -0
  205. package/dist/types/modules/attestation.d.ts +96 -0
  206. package/dist/types/modules/attestation.d.ts.map +1 -0
  207. package/dist/types/modules/base.d.ts +126 -0
  208. package/dist/types/modules/base.d.ts.map +1 -0
  209. package/dist/types/modules/escrow.d.ts +151 -0
  210. package/dist/types/modules/escrow.d.ts.map +1 -0
  211. package/dist/types/modules/feedback.d.ts +105 -0
  212. package/dist/types/modules/feedback.d.ts.map +1 -0
  213. package/dist/types/modules/index.d.ts +24 -0
  214. package/dist/types/modules/index.d.ts.map +1 -0
  215. package/dist/types/modules/indexing.d.ts +200 -0
  216. package/dist/types/modules/indexing.d.ts.map +1 -0
  217. package/dist/types/modules/ledger.d.ts +150 -0
  218. package/dist/types/modules/ledger.d.ts.map +1 -0
  219. package/dist/types/modules/tools.d.ts +182 -0
  220. package/dist/types/modules/tools.d.ts.map +1 -0
  221. package/dist/types/modules/vault.d.ts +240 -0
  222. package/dist/types/modules/vault.d.ts.map +1 -0
  223. package/dist/types/pda/index.d.ts +296 -0
  224. package/dist/types/pda/index.d.ts.map +1 -0
  225. package/dist/types/plugin/index.d.ts +171 -0
  226. package/dist/types/plugin/index.d.ts.map +1 -0
  227. package/dist/types/plugin/protocols.d.ts +152 -0
  228. package/dist/types/plugin/protocols.d.ts.map +1 -0
  229. package/dist/types/plugin/schemas.d.ts +823 -0
  230. package/dist/types/plugin/schemas.d.ts.map +1 -0
  231. package/dist/types/postgres/adapter.d.ts +355 -0
  232. package/dist/types/postgres/adapter.d.ts.map +1 -0
  233. package/dist/types/postgres/index.d.ts +24 -0
  234. package/dist/types/postgres/index.d.ts.map +1 -0
  235. package/dist/types/postgres/serializers.d.ts +30 -0
  236. package/dist/types/postgres/serializers.d.ts.map +1 -0
  237. package/dist/types/postgres/sync.d.ts +132 -0
  238. package/dist/types/postgres/sync.d.ts.map +1 -0
  239. package/dist/types/postgres/types.d.ts +167 -0
  240. package/dist/types/postgres/types.d.ts.map +1 -0
  241. package/dist/types/registries/builder.d.ts +340 -0
  242. package/dist/types/registries/builder.d.ts.map +1 -0
  243. package/dist/types/registries/discovery.d.ts +333 -0
  244. package/dist/types/registries/discovery.d.ts.map +1 -0
  245. package/dist/types/registries/index.d.ts +48 -0
  246. package/dist/types/registries/index.d.ts.map +1 -0
  247. package/dist/types/registries/session.d.ts +323 -0
  248. package/dist/types/registries/session.d.ts.map +1 -0
  249. package/dist/types/registries/x402.d.ts +463 -0
  250. package/dist/types/registries/x402.d.ts.map +1 -0
  251. package/dist/types/types/accounts.d.ts +565 -0
  252. package/dist/types/types/accounts.d.ts.map +1 -0
  253. package/dist/types/types/common.d.ts +166 -0
  254. package/dist/types/types/common.d.ts.map +1 -0
  255. package/dist/types/types/enums.d.ts +238 -0
  256. package/dist/types/types/enums.d.ts.map +1 -0
  257. package/dist/types/types/index.d.ts +28 -0
  258. package/dist/types/types/index.d.ts.map +1 -0
  259. package/dist/types/types/instructions.d.ts +366 -0
  260. package/dist/types/types/instructions.d.ts.map +1 -0
  261. package/dist/types/utils/hash.d.ts +48 -0
  262. package/dist/types/utils/hash.d.ts.map +1 -0
  263. package/dist/types/utils/index.d.ts +19 -0
  264. package/dist/types/utils/index.d.ts.map +1 -0
  265. package/dist/types/utils/serialization.d.ts +69 -0
  266. package/dist/types/utils/serialization.d.ts.map +1 -0
  267. package/dist/types/utils/validation.d.ts +29 -0
  268. package/dist/types/utils/validation.d.ts.map +1 -0
  269. package/package.json +178 -0
  270. package/src/constants/index.ts +44 -0
  271. package/src/constants/limits.ts +165 -0
  272. package/src/constants/programs.ts +83 -0
  273. package/src/constants/seeds.ts +66 -0
  274. package/src/core/client.ts +416 -0
  275. package/src/core/connection.ts +409 -0
  276. package/src/core/index.ts +20 -0
  277. package/src/errors/index.ts +346 -0
  278. package/src/events/index.ts +335 -0
  279. package/src/idl/index.ts +76 -0
  280. package/src/idl/synapse_agent_sap.json +9710 -0
  281. package/src/index.ts +253 -0
  282. package/src/modules/agent.ts +319 -0
  283. package/src/modules/attestation.ts +168 -0
  284. package/src/modules/base.ts +158 -0
  285. package/src/modules/escrow.ts +308 -0
  286. package/src/modules/feedback.ts +186 -0
  287. package/src/modules/index.ts +24 -0
  288. package/src/modules/indexing.ts +444 -0
  289. package/src/modules/ledger.ts +262 -0
  290. package/src/modules/tools.ts +411 -0
  291. package/src/modules/vault.ts +533 -0
  292. package/src/pda/index.ts +512 -0
  293. package/src/plugin/index.ts +1202 -0
  294. package/src/plugin/protocols.ts +404 -0
  295. package/src/plugin/schemas.ts +909 -0
  296. package/src/postgres/adapter.ts +904 -0
  297. package/src/postgres/index.ts +59 -0
  298. package/src/postgres/schema.sql +683 -0
  299. package/src/postgres/serializers.ts +485 -0
  300. package/src/postgres/sync.ts +254 -0
  301. package/src/postgres/types.ts +245 -0
  302. package/src/registries/builder.ts +607 -0
  303. package/src/registries/discovery.ts +572 -0
  304. package/src/registries/index.ts +77 -0
  305. package/src/registries/session.ts +613 -0
  306. package/src/registries/x402.ts +906 -0
  307. package/src/types/accounts.ts +618 -0
  308. package/src/types/common.ts +187 -0
  309. package/src/types/enums.ts +214 -0
  310. package/src/types/index.ts +92 -0
  311. package/src/types/instructions.ts +413 -0
  312. package/src/utils/hash.ts +57 -0
  313. package/src/utils/index.ts +19 -0
  314. package/src/utils/serialization.ts +98 -0
  315. package/src/utils/validation.ts +36 -0
@@ -0,0 +1,572 @@
1
+ /**
2
+ * @module registries/discovery
3
+ * @description High-level agent and tool discovery registry.
4
+ *
5
+ * Abstracts the raw PDA-level indexing + fetching into a single
6
+ * developer-friendly interface for finding agents, tools, and
7
+ * services across the SAP network.
8
+ *
9
+ * Use cases:
10
+ * - "Find all agents that support Jupiter swaps"
11
+ * - "Find all Swap tools across all agents"
12
+ * - "Get the full profile of agent X (identity + stats + tools)"
13
+ * - "Get network-wide statistics"
14
+ *
15
+ * @category Registries
16
+ * @since v0.1.0
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const discovery = client.discovery;
21
+ *
22
+ * // Find agents that support Jupiter protocol
23
+ * const agents = await discovery.findAgentsByProtocol("jupiter");
24
+ *
25
+ * // Get full agent profile (identity + stats + attestations)
26
+ * const profile = await discovery.getAgentProfile(agentWallet);
27
+ *
28
+ * // Find all Swap tools across the network
29
+ * const tools = await discovery.findToolsByCategory("swap");
30
+ *
31
+ * // Network overview
32
+ * const stats = await discovery.getNetworkOverview();
33
+ * ```
34
+ */
35
+
36
+ import type { PublicKey } from "@solana/web3.js";
37
+ import type BN from "bn.js";
38
+ import type { SapProgram } from "../modules/base";
39
+ import {
40
+ deriveAgent,
41
+ deriveAgentStats,
42
+ deriveCapabilityIndex,
43
+ deriveProtocolIndex,
44
+ deriveToolCategoryIndex,
45
+ deriveGlobalRegistry,
46
+ } from "../pda";
47
+ import { sha256 } from "../utils";
48
+ import { TOOL_CATEGORY_VALUES } from "../constants";
49
+ import type {
50
+ AgentAccountData,
51
+ AgentStatsData,
52
+ CapabilityIndexData,
53
+ ProtocolIndexData,
54
+ ToolCategoryIndexData,
55
+ ToolDescriptorData,
56
+ GlobalRegistryData,
57
+ } from "../types";
58
+
59
+ // ═══════════════════════════════════════════════════════════════════
60
+ // Public Types
61
+ // ═══════════════════════════════════════════════════════════════════
62
+
63
+ /**
64
+ * @interface DiscoveredAgent
65
+ * @name DiscoveredAgent
66
+ * @description Compact agent identity returned by discovery queries.
67
+ * Contains the agent PDA, optional identity data, and optional stats.
68
+ * Returned by {@link DiscoveryRegistry.findAgentsByCapability},
69
+ * {@link DiscoveryRegistry.findAgentsByProtocol}, and
70
+ * {@link DiscoveryRegistry.findAgentsByCapabilities}.
71
+ * @category Registries
72
+ * @since v0.1.0
73
+ */
74
+ export interface DiscoveredAgent {
75
+ /** Agent PDA address. */
76
+ readonly pda: PublicKey;
77
+ /** Agent identity data (null if account not found). */
78
+ readonly identity: AgentAccountData | null;
79
+ /** Agent stats (null if account not found). */
80
+ readonly stats: AgentStatsData | null;
81
+ }
82
+
83
+ /**
84
+ * @interface AgentProfile
85
+ * @name AgentProfile
86
+ * @description Full agent profile with all discoverable data.
87
+ * Combines identity, stats, and computed fields into a single
88
+ * display-ready structure. Returned by {@link DiscoveryRegistry.getAgentProfile}.
89
+ * @category Registries
90
+ * @since v0.1.0
91
+ */
92
+ export interface AgentProfile {
93
+ /** Agent PDA. */
94
+ readonly pda: PublicKey;
95
+ /** Agent identity (name, description, capabilities, pricing, etc.). */
96
+ readonly identity: AgentAccountData;
97
+ /** Lightweight metrics (total calls, active status). */
98
+ readonly stats: AgentStatsData | null;
99
+ /** Computed fields for display. */
100
+ readonly computed: {
101
+ /** Is the agent currently active? */
102
+ readonly isActive: boolean;
103
+ /** Total calls served (from stats or identity fallback). */
104
+ readonly totalCalls: string;
105
+ /** Reputation score (0-1000). */
106
+ readonly reputationScore: number;
107
+ /** Has x402 endpoint configured? */
108
+ readonly hasX402: boolean;
109
+ /** Number of capabilities. */
110
+ readonly capabilityCount: number;
111
+ /** Number of pricing tiers. */
112
+ readonly pricingTierCount: number;
113
+ /** Protocol list. */
114
+ readonly protocols: string[];
115
+ };
116
+ }
117
+
118
+ /**
119
+ * @interface DiscoveredTool
120
+ * @name DiscoveredTool
121
+ * @description Discovered tool with agent context.
122
+ * Contains the tool PDA and optional descriptor data.
123
+ * Returned by {@link DiscoveryRegistry.findToolsByCategory}.
124
+ * @category Registries
125
+ * @since v0.1.0
126
+ */
127
+ export interface DiscoveredTool {
128
+ /** Tool PDA address. */
129
+ readonly pda: PublicKey;
130
+ /** Tool descriptor data (null if not found). */
131
+ readonly descriptor: ToolDescriptorData | null;
132
+ }
133
+
134
+ /**
135
+ * @interface NetworkOverview
136
+ * @name NetworkOverview
137
+ * @description Network-wide statistics aggregated from the GlobalRegistry account.
138
+ * Provides counts of agents, tools, vaults, attestations, and more.
139
+ * Returned by {@link DiscoveryRegistry.getNetworkOverview}.
140
+ * @category Registries
141
+ * @since v0.1.0
142
+ */
143
+ export interface NetworkOverview {
144
+ /** Total registered agents. */
145
+ readonly totalAgents: string;
146
+ /** Currently active agents. */
147
+ readonly activeAgents: string;
148
+ /** Total feedback entries. */
149
+ readonly totalFeedbacks: string;
150
+ /** Total registered tools. */
151
+ readonly totalTools: number;
152
+ /** Total memory vaults. */
153
+ readonly totalVaults: number;
154
+ /** Total attestations. */
155
+ readonly totalAttestations: number;
156
+ /** Total capability indexes. */
157
+ readonly totalCapabilities: number;
158
+ /** Total protocol indexes. */
159
+ readonly totalProtocols: number;
160
+ /** Protocol authority. */
161
+ readonly authority: PublicKey;
162
+ }
163
+
164
+ /**
165
+ * @typedef {string} ToolCategoryName
166
+ * @name ToolCategoryName
167
+ * @description Tool category string literal type derived from `TOOL_CATEGORY_VALUES`.
168
+ * Valid values include: `"swap"`, `"data"`, `"lending"`, `"governance"`, etc.
169
+ * @category Registries
170
+ * @since v0.1.0
171
+ * @see {@link DiscoveryRegistry.findToolsByCategory}
172
+ */
173
+ export type ToolCategoryName = keyof typeof TOOL_CATEGORY_VALUES;
174
+
175
+ // ═══════════════════════════════════════════════════════════════════
176
+ // Discovery Registry
177
+ // ═══════════════════════════════════════════════════════════════════
178
+
179
+ /**
180
+ * @name DiscoveryRegistry
181
+ * @description High-level agent and tool discovery registry for the SAP network.
182
+ *
183
+ * Provides a developer-friendly API for finding agents by capability,
184
+ * protocol, or tool category, fetching full agent profiles, and
185
+ * retrieving network-wide statistics.
186
+ *
187
+ * @category Registries
188
+ * @since v0.1.0
189
+ *
190
+ * @example
191
+ * ```ts
192
+ * const discovery = client.discovery;
193
+ *
194
+ * // Find agents by capability
195
+ * const swapAgents = await discovery.findAgentsByCapability("jupiter:swap");
196
+ *
197
+ * // Get agent profile
198
+ * const profile = await discovery.getAgentProfile(agentWallet);
199
+ *
200
+ * // Network statistics
201
+ * const overview = await discovery.getNetworkOverview();
202
+ * ```
203
+ */
204
+ export class DiscoveryRegistry {
205
+ constructor(private readonly program: SapProgram) {}
206
+
207
+ // ── Agent Discovery ──────────────────────────────────
208
+
209
+ /**
210
+ * @name findAgentsByCapability
211
+ * @description Find all agent PDAs registered for a specific capability.
212
+ * Hashes the capability ID with SHA-256 and looks up the capability index PDA.
213
+ *
214
+ * @param capabilityId - The capability identifier string (e.g. `"jupiter:swap"`).
215
+ * @param opts - Optional settings.
216
+ * @param opts.hydrate - If `false`, returns only PDAs without fetching identity/stats. Defaults to `true`.
217
+ * @returns An array of {@link DiscoveredAgent} matching the capability.
218
+ * @since v0.1.0
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * const agents = await discovery.findAgentsByCapability("jupiter:swap");
223
+ * ```
224
+ */
225
+ async findAgentsByCapability(
226
+ capabilityId: string,
227
+ opts?: { hydrate?: boolean },
228
+ ): Promise<DiscoveredAgent[]> {
229
+ const capHash = sha256(capabilityId);
230
+ const [pda] = deriveCapabilityIndex(capHash);
231
+
232
+ const index = await this.fetchNullable<CapabilityIndexData>(
233
+ "capabilityIndex",
234
+ pda,
235
+ );
236
+ if (!index) return [];
237
+
238
+ if (opts?.hydrate === false) {
239
+ return index.agents.map((agentPda) => ({
240
+ pda: agentPda,
241
+ identity: null,
242
+ stats: null,
243
+ }));
244
+ }
245
+
246
+ return this.hydrateAgents(index.agents);
247
+ }
248
+
249
+ /**
250
+ * @name findAgentsByProtocol
251
+ * @description Find all agent PDAs registered for a specific protocol.
252
+ * Hashes the protocol ID with SHA-256 and looks up the protocol index PDA.
253
+ *
254
+ * @param protocolId - The protocol identifier string (e.g. `"jupiter"`).
255
+ * @param opts - Optional settings.
256
+ * @param opts.hydrate - If `false`, returns only PDAs without fetching identity/stats. Defaults to `true`.
257
+ * @returns An array of {@link DiscoveredAgent} matching the protocol.
258
+ * @since v0.1.0
259
+ *
260
+ * @example
261
+ * ```ts
262
+ * const agents = await discovery.findAgentsByProtocol("jupiter");
263
+ * ```
264
+ */
265
+ async findAgentsByProtocol(
266
+ protocolId: string,
267
+ opts?: { hydrate?: boolean },
268
+ ): Promise<DiscoveredAgent[]> {
269
+ const protoHash = sha256(protocolId);
270
+ const [pda] = deriveProtocolIndex(protoHash);
271
+
272
+ const index = await this.fetchNullable<ProtocolIndexData>(
273
+ "protocolIndex",
274
+ pda,
275
+ );
276
+ if (!index) return [];
277
+
278
+ if (opts?.hydrate === false) {
279
+ return index.agents.map((agentPda) => ({
280
+ pda: agentPda,
281
+ identity: null,
282
+ stats: null,
283
+ }));
284
+ }
285
+
286
+ return this.hydrateAgents(index.agents);
287
+ }
288
+
289
+ /**
290
+ * @name findToolsByCategory
291
+ * @description Find all tool PDAs registered in a specific category.
292
+ * Accepts either a category name string or a numeric category value.
293
+ *
294
+ * @param category - Tool category name (e.g. `"swap"`) or numeric category value.
295
+ * @param opts - Optional settings.
296
+ * @param opts.hydrate - If `false`, returns only PDAs without fetching descriptors. Defaults to `true`.
297
+ * @returns An array of {@link DiscoveredTool} matching the category.
298
+ * @since v0.1.0
299
+ *
300
+ * @example
301
+ * ```ts
302
+ * const tools = await discovery.findToolsByCategory("swap");
303
+ * const tools = await discovery.findToolsByCategory(0); // numeric
304
+ * ```
305
+ */
306
+ async findToolsByCategory(
307
+ category: ToolCategoryName | number,
308
+ opts?: { hydrate?: boolean },
309
+ ): Promise<DiscoveredTool[]> {
310
+ const categoryNum =
311
+ typeof category === "number"
312
+ ? category
313
+ : TOOL_CATEGORY_VALUES[category] ?? 9;
314
+
315
+ const [pda] = deriveToolCategoryIndex(categoryNum);
316
+ const index = await this.fetchNullable<ToolCategoryIndexData>(
317
+ "toolCategoryIndex",
318
+ pda,
319
+ );
320
+ if (!index) return [];
321
+
322
+ if (opts?.hydrate === false) {
323
+ return index.tools.map((toolPda) => ({
324
+ pda: toolPda,
325
+ descriptor: null,
326
+ }));
327
+ }
328
+
329
+ return this.hydrateTools(index.tools);
330
+ }
331
+
332
+ // ── Agent Profile ────────────────────────────────────
333
+
334
+ /**
335
+ * @name getAgentProfile
336
+ * @description Get the full profile of an agent by wallet address.
337
+ * Combines identity + stats into a single response with computed fields
338
+ * for easy display (active status, total calls, reputation, etc.).
339
+ *
340
+ * @param wallet - The agent owner's wallet public key.
341
+ * @returns The full {@link AgentProfile}, or `null` if the agent does not exist.
342
+ * @since v0.1.0
343
+ *
344
+ * @example
345
+ * ```ts
346
+ * const profile = await discovery.getAgentProfile(agentWallet);
347
+ * console.log(profile.identity.name);
348
+ * console.log(profile.computed.isActive);
349
+ * console.log(profile.computed.totalCalls);
350
+ * ```
351
+ */
352
+ async getAgentProfile(wallet: PublicKey): Promise<AgentProfile | null> {
353
+ const [agentPda] = deriveAgent(wallet);
354
+ const [statsPda] = deriveAgentStats(agentPda);
355
+
356
+ const [identity, stats] = await Promise.all([
357
+ this.fetchNullable<AgentAccountData>("agentAccount", agentPda),
358
+ this.fetchNullable<AgentStatsData>("agentStats", statsPda),
359
+ ]);
360
+
361
+ if (!identity) return null;
362
+
363
+ const totalCallsBN: BN = stats?.totalCallsServed ?? identity.totalCallsServed;
364
+
365
+ return {
366
+ pda: agentPda,
367
+ identity,
368
+ stats,
369
+ computed: {
370
+ isActive: identity.isActive,
371
+ totalCalls: totalCallsBN.toString(),
372
+ reputationScore: identity.reputationScore,
373
+ hasX402: !!identity.x402Endpoint,
374
+ capabilityCount: identity.capabilities.length,
375
+ pricingTierCount: identity.pricing.length,
376
+ protocols: [...identity.protocols],
377
+ },
378
+ };
379
+ }
380
+
381
+ /**
382
+ * @name isAgentActive
383
+ * @description Check if an agent exists and is currently active.
384
+ * Reads the agent stats account to determine active status.
385
+ *
386
+ * @param wallet - The agent owner's wallet public key.
387
+ * @returns `true` if the agent exists and is active, `false` otherwise.
388
+ * @since v0.1.0
389
+ */
390
+ async isAgentActive(wallet: PublicKey): Promise<boolean> {
391
+ const [agentPda] = deriveAgent(wallet);
392
+ const [statsPda] = deriveAgentStats(agentPda);
393
+
394
+ const stats = await this.fetchNullable<AgentStatsData>(
395
+ "agentStats",
396
+ statsPda,
397
+ );
398
+ return stats?.isActive ?? false;
399
+ }
400
+
401
+ // ── Network Overview ─────────────────────────────────
402
+
403
+ /**
404
+ * @name getNetworkOverview
405
+ * @description Get network-wide statistics from the GlobalRegistry account.
406
+ * Returns aggregated counts and metadata for the entire SAP network.
407
+ *
408
+ * @returns A {@link NetworkOverview} with all network-level statistics.
409
+ * @since v0.1.0
410
+ */
411
+ async getNetworkOverview(): Promise<NetworkOverview> {
412
+ const [pda] = deriveGlobalRegistry();
413
+ const reg = await this.fetch<GlobalRegistryData>("globalRegistry", pda);
414
+
415
+ return {
416
+ totalAgents: reg.totalAgents.toString(),
417
+ activeAgents: reg.activeAgents.toString(),
418
+ totalFeedbacks: reg.totalFeedbacks.toString(),
419
+ totalTools: reg.totalTools,
420
+ totalVaults: reg.totalVaults,
421
+ totalAttestations: reg.totalAttestations,
422
+ totalCapabilities: reg.totalCapabilities,
423
+ totalProtocols: reg.totalProtocols,
424
+ authority: reg.authority,
425
+ };
426
+ }
427
+
428
+ // ── Multi-category Search ────────────────────────────
429
+
430
+ /**
431
+ * @name findAgentsByCapabilities
432
+ * @description Search across multiple capability IDs at once.
433
+ * Returns deduplicated agent PDAs aggregated from all matching capability indexes.
434
+ *
435
+ * @param capabilityIds - Array of capability identifier strings to search.
436
+ * @param opts - Optional settings.
437
+ * @param opts.hydrate - If `false`, returns only PDAs without fetching identity/stats. Defaults to `true`.
438
+ * @returns A deduplicated array of {@link DiscoveredAgent} matching any of the capabilities.
439
+ * @since v0.1.0
440
+ */
441
+ async findAgentsByCapabilities(
442
+ capabilityIds: string[],
443
+ opts?: { hydrate?: boolean },
444
+ ): Promise<DiscoveredAgent[]> {
445
+ const seen = new Set<string>();
446
+ const results: DiscoveredAgent[] = [];
447
+
448
+ for (const capId of capabilityIds) {
449
+ const agents = await this.findAgentsByCapability(capId, opts);
450
+ for (const agent of agents) {
451
+ const key = agent.pda.toBase58();
452
+ if (!seen.has(key)) {
453
+ seen.add(key);
454
+ results.push(agent);
455
+ }
456
+ }
457
+ }
458
+
459
+ return results;
460
+ }
461
+
462
+ /**
463
+ * @name getToolCategorySummary
464
+ * @description Search across all 10 tool categories and return a summary.
465
+ * Lists each category with its name, numeric value, and tool count.
466
+ *
467
+ * @returns An array of category summary objects with `category`, `categoryNum`, and `toolCount`.
468
+ * @since v0.1.0
469
+ */
470
+ async getToolCategorySummary(): Promise<
471
+ Array<{ category: string; categoryNum: number; toolCount: number }>
472
+ > {
473
+ const categories = Object.entries(TOOL_CATEGORY_VALUES) as Array<
474
+ [ToolCategoryName, number]
475
+ >;
476
+
477
+ const results: Array<{
478
+ category: string;
479
+ categoryNum: number;
480
+ toolCount: number;
481
+ }> = [];
482
+
483
+ for (const [name, num] of categories) {
484
+ const [pda] = deriveToolCategoryIndex(num);
485
+ const index = await this.fetchNullable<ToolCategoryIndexData>(
486
+ "toolCategoryIndex",
487
+ pda,
488
+ );
489
+ results.push({
490
+ category: name,
491
+ categoryNum: num,
492
+ toolCount: index?.tools.length ?? 0,
493
+ });
494
+ }
495
+
496
+ return results;
497
+ }
498
+
499
+ // ── Internals ────────────────────────────────────────
500
+
501
+ /**
502
+ * @name hydrateAgents
503
+ * @description Hydrate an array of agent PDAs by fetching identity and stats data.
504
+ * @param agentPdas - Array of agent PDA public keys.
505
+ * @returns An array of {@link DiscoveredAgent} with populated identity and stats fields.
506
+ * @private
507
+ */
508
+ private async hydrateAgents(
509
+ agentPdas: PublicKey[],
510
+ ): Promise<DiscoveredAgent[]> {
511
+ return Promise.all(
512
+ agentPdas.map(async (agentPda) => {
513
+ const [statsPda] = deriveAgentStats(agentPda);
514
+ const [identity, stats] = await Promise.all([
515
+ this.fetchNullable<AgentAccountData>("agentAccount", agentPda),
516
+ this.fetchNullable<AgentStatsData>("agentStats", statsPda),
517
+ ]);
518
+ return { pda: agentPda, identity, stats };
519
+ }),
520
+ );
521
+ }
522
+
523
+ /**
524
+ * @name hydrateTools
525
+ * @description Hydrate an array of tool PDAs by fetching descriptor data.
526
+ * @param toolPdas - Array of tool PDA public keys.
527
+ * @returns An array of {@link DiscoveredTool} with populated descriptor fields.
528
+ * @private
529
+ */
530
+ private async hydrateTools(
531
+ toolPdas: PublicKey[],
532
+ ): Promise<DiscoveredTool[]> {
533
+ return Promise.all(
534
+ toolPdas.map(async (toolPda) => {
535
+ const descriptor = await this.fetchNullable<ToolDescriptorData>(
536
+ "toolDescriptor",
537
+ toolPda,
538
+ );
539
+ return { pda: toolPda, descriptor };
540
+ }),
541
+ );
542
+ }
543
+
544
+ /**
545
+ * @name fetch
546
+ * @description Fetch an on-chain account by name and PDA. Throws if not found.
547
+ * @param name - Anchor account discriminator name.
548
+ * @param pda - Account public key to fetch.
549
+ * @returns The deserialized account data.
550
+ * @throws If the account does not exist.
551
+ * @private
552
+ */
553
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
554
+ private async fetch<T>(name: string, pda: PublicKey): Promise<T> {
555
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
556
+ return (this.program.account as any)[name].fetch(pda) as Promise<T>;
557
+ }
558
+
559
+ /**
560
+ * @name fetchNullable
561
+ * @description Fetch an on-chain account by name and PDA. Returns `null` if not found.
562
+ * @param name - Anchor account discriminator name.
563
+ * @param pda - Account public key to fetch.
564
+ * @returns The deserialized account data, or `null` if the account does not exist.
565
+ * @private
566
+ */
567
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
568
+ private async fetchNullable<T>(name: string, pda: PublicKey): Promise<T | null> {
569
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
570
+ return (this.program.account as any)[name].fetchNullable(pda) as Promise<T | null>;
571
+ }
572
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @module registries
3
+ * @description High-level registry barrel export.
4
+ *
5
+ * Registries are developer-facing abstractions that combine
6
+ * multiple raw SDK modules into cohesive, workflow-oriented APIs:
7
+ *
8
+ * - **DiscoveryRegistry** — Find agents, tools, and services across
9
+ * the SAP network by capability, protocol, or tool category.
10
+ *
11
+ * - **X402Registry** — Full x402 micropayment lifecycle: pricing
12
+ * estimation, escrow management, HTTP header generation,
13
+ * settlement, and balance monitoring.
14
+ *
15
+ * - **SessionManager** — Unified memory session lifecycle: create
16
+ * vault, open session, write data, read ring buffer, seal
17
+ * archives, and close sessions in a single API.
18
+ *
19
+ * - **AgentBuilder** — Fluent builder for agent registration with
20
+ * capabilities, pricing tiers, tools, and x402 endpoint config.
21
+ *
22
+ * All registries are accessible as lazy singletons on `SapClient`:
23
+ *
24
+ * ```ts
25
+ * const client = SapClient.from(provider);
26
+ *
27
+ * client.discovery // → DiscoveryRegistry
28
+ * client.x402 // → X402Registry
29
+ * client.session // → SessionManager
30
+ * client.builder // → AgentBuilder (fresh instance each access)
31
+ * ```
32
+ *
33
+ * @category Registries
34
+ * @since v0.1.0
35
+ * @see {@link DiscoveryRegistry}
36
+ * @see {@link X402Registry}
37
+ * @see {@link SessionManager}
38
+ * @see {@link AgentBuilder}
39
+ */
40
+
41
+ export { DiscoveryRegistry } from "./discovery";
42
+ export type {
43
+ DiscoveredAgent,
44
+ AgentProfile,
45
+ DiscoveredTool,
46
+ NetworkOverview,
47
+ ToolCategoryName,
48
+ } from "./discovery";
49
+
50
+ export { X402Registry } from "./x402";
51
+ export type {
52
+ CostEstimate,
53
+ PaymentContext,
54
+ PreparePaymentOptions,
55
+ X402Headers,
56
+ EscrowBalance,
57
+ SettlementResult,
58
+ BatchSettlementResult,
59
+ } from "./x402";
60
+
61
+ export { SessionManager } from "./session";
62
+ export type {
63
+ SessionContext,
64
+ WriteResult,
65
+ SealResult,
66
+ RingBufferEntry,
67
+ SessionStatus,
68
+ } from "./session";
69
+
70
+ export { AgentBuilder } from "./builder";
71
+ export type {
72
+ CapabilityInput,
73
+ PricingTierInput,
74
+ ToolInput,
75
+ RegisterResult,
76
+ RegisterWithToolsResult,
77
+ } from "./builder";