@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,683 @@
1
+ -- ═══════════════════════════════════════════════════════════════════
2
+ -- SAP v2 — PostgreSQL Schema
3
+ -- Mirrors all 22 on-chain account types as relational tables.
4
+ --
5
+ -- Program ID: SAPTU7aUXk2AaAdktexae1iuxXpokxzNDBAYYhaVyQL
6
+ -- Generated from: synapse_agent_sap IDL (72 instructions, 22 accounts)
7
+ --
8
+ -- Usage:
9
+ -- psql -d your_database -f schema.sql
10
+ --
11
+ -- Every table includes:
12
+ -- - pda (TEXT PRIMARY KEY) — base58-encoded PDA address
13
+ -- - slot (BIGINT) — Solana slot at which the record was synced
14
+ -- - synced_at (TIMESTAMPTZ) — wall-clock time of sync
15
+ -- - raw_data (JSONB) — full deserialized account data (escape hatch)
16
+ -- ═══════════════════════════════════════════════════════════════════
17
+
18
+ -- ── Enum Types ──────────────────────────────────────
19
+
20
+ CREATE TYPE sap_token_type AS ENUM ('sol', 'usdc', 'spl');
21
+ CREATE TYPE sap_settlement_mode AS ENUM ('instant', 'escrow', 'batched', 'x402');
22
+ CREATE TYPE sap_tool_http_method AS ENUM ('get', 'post', 'put', 'delete', 'compound');
23
+ CREATE TYPE sap_tool_category AS ENUM (
24
+ 'swap', 'lend', 'stake', 'nft', 'payment',
25
+ 'data', 'governance', 'bridge', 'analytics', 'custom'
26
+ );
27
+ CREATE TYPE sap_plugin_type AS ENUM (
28
+ 'memory', 'validation', 'delegation',
29
+ 'analytics', 'governance', 'custom'
30
+ );
31
+
32
+ -- ═══════════════════════════════════════════════════════════════════
33
+ -- 1. Global Registry (singleton)
34
+ -- ═══════════════════════════════════════════════════════════════════
35
+
36
+ CREATE TABLE IF NOT EXISTS sap_global_registry (
37
+ pda TEXT PRIMARY KEY,
38
+ bump SMALLINT NOT NULL,
39
+ total_agents BIGINT NOT NULL DEFAULT 0,
40
+ active_agents BIGINT NOT NULL DEFAULT 0,
41
+ total_feedbacks BIGINT NOT NULL DEFAULT 0,
42
+ total_capabilities INTEGER NOT NULL DEFAULT 0,
43
+ total_protocols INTEGER NOT NULL DEFAULT 0,
44
+ last_registered_at BIGINT, -- unix timestamp
45
+ initialized_at BIGINT NOT NULL,
46
+ authority TEXT NOT NULL, -- base58 pubkey
47
+ total_tools INTEGER NOT NULL DEFAULT 0,
48
+ total_vaults INTEGER NOT NULL DEFAULT 0,
49
+ total_escrows INTEGER NOT NULL DEFAULT 0,
50
+ total_attestations INTEGER NOT NULL DEFAULT 0,
51
+ -- sync metadata
52
+ slot BIGINT NOT NULL DEFAULT 0,
53
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
54
+ raw_data JSONB
55
+ );
56
+
57
+ -- ═══════════════════════════════════════════════════════════════════
58
+ -- 2. Agent Account
59
+ -- ═══════════════════════════════════════════════════════════════════
60
+
61
+ CREATE TABLE IF NOT EXISTS sap_agents (
62
+ pda TEXT PRIMARY KEY,
63
+ bump SMALLINT NOT NULL,
64
+ version SMALLINT NOT NULL DEFAULT 1,
65
+ wallet TEXT NOT NULL, -- owner wallet (base58)
66
+ name VARCHAR(64) NOT NULL,
67
+ description VARCHAR(256) NOT NULL,
68
+ agent_id VARCHAR(128),
69
+ agent_uri VARCHAR(256),
70
+ x402_endpoint VARCHAR(256),
71
+ is_active BOOLEAN NOT NULL DEFAULT true,
72
+ created_at BIGINT NOT NULL,
73
+ updated_at BIGINT NOT NULL,
74
+ reputation_score SMALLINT NOT NULL DEFAULT 0,
75
+ total_feedbacks INTEGER NOT NULL DEFAULT 0,
76
+ reputation_sum BIGINT NOT NULL DEFAULT 0,
77
+ total_calls_served BIGINT NOT NULL DEFAULT 0,
78
+ avg_latency_ms INTEGER NOT NULL DEFAULT 0,
79
+ uptime_percent SMALLINT NOT NULL DEFAULT 0,
80
+ capabilities JSONB NOT NULL DEFAULT '[]',
81
+ pricing JSONB NOT NULL DEFAULT '[]',
82
+ protocols TEXT[] NOT NULL DEFAULT '{}',
83
+ active_plugins JSONB NOT NULL DEFAULT '[]',
84
+ -- sync metadata
85
+ slot BIGINT NOT NULL DEFAULT 0,
86
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
87
+ raw_data JSONB
88
+ );
89
+
90
+ CREATE INDEX IF NOT EXISTS idx_sap_agents_wallet ON sap_agents (wallet);
91
+ CREATE INDEX IF NOT EXISTS idx_sap_agents_active ON sap_agents (is_active) WHERE is_active = true;
92
+ CREATE INDEX IF NOT EXISTS idx_sap_agents_name ON sap_agents (name);
93
+
94
+ -- ═══════════════════════════════════════════════════════════════════
95
+ -- 3. Agent Stats (hot-path metrics)
96
+ -- ═══════════════════════════════════════════════════════════════════
97
+
98
+ CREATE TABLE IF NOT EXISTS sap_agent_stats (
99
+ pda TEXT PRIMARY KEY,
100
+ bump SMALLINT NOT NULL,
101
+ agent TEXT NOT NULL REFERENCES sap_agents(pda) ON DELETE CASCADE,
102
+ wallet TEXT NOT NULL,
103
+ total_calls_served BIGINT NOT NULL DEFAULT 0,
104
+ is_active BOOLEAN NOT NULL DEFAULT true,
105
+ updated_at BIGINT NOT NULL,
106
+ -- sync metadata
107
+ slot BIGINT NOT NULL DEFAULT 0,
108
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
109
+ raw_data JSONB
110
+ );
111
+
112
+ CREATE INDEX IF NOT EXISTS idx_sap_agent_stats_agent ON sap_agent_stats (agent);
113
+
114
+ -- ═══════════════════════════════════════════════════════════════════
115
+ -- 4. Feedback Account
116
+ -- ═══════════════════════════════════════════════════════════════════
117
+
118
+ CREATE TABLE IF NOT EXISTS sap_feedbacks (
119
+ pda TEXT PRIMARY KEY,
120
+ bump SMALLINT NOT NULL,
121
+ agent TEXT NOT NULL, -- agent PDA
122
+ reviewer TEXT NOT NULL, -- reviewer wallet (base58)
123
+ score SMALLINT NOT NULL CHECK (score BETWEEN 0 AND 1000),
124
+ tag VARCHAR(64) NOT NULL,
125
+ comment_hash BYTEA, -- 32 bytes, nullable
126
+ created_at BIGINT NOT NULL,
127
+ updated_at BIGINT NOT NULL,
128
+ is_revoked BOOLEAN NOT NULL DEFAULT false,
129
+ -- sync metadata
130
+ slot BIGINT NOT NULL DEFAULT 0,
131
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
132
+ raw_data JSONB
133
+ );
134
+
135
+ CREATE INDEX IF NOT EXISTS idx_sap_feedbacks_agent ON sap_feedbacks (agent);
136
+ CREATE INDEX IF NOT EXISTS idx_sap_feedbacks_reviewer ON sap_feedbacks (reviewer);
137
+
138
+ -- ═══════════════════════════════════════════════════════════════════
139
+ -- 5. Capability Index
140
+ -- ═══════════════════════════════════════════════════════════════════
141
+
142
+ CREATE TABLE IF NOT EXISTS sap_capability_indexes (
143
+ pda TEXT PRIMARY KEY,
144
+ bump SMALLINT NOT NULL,
145
+ capability_id VARCHAR(128) NOT NULL,
146
+ capability_hash BYTEA NOT NULL, -- 32 bytes
147
+ agents TEXT[] NOT NULL DEFAULT '{}',
148
+ total_pages INTEGER NOT NULL DEFAULT 0,
149
+ last_updated BIGINT NOT NULL,
150
+ -- sync metadata
151
+ slot BIGINT NOT NULL DEFAULT 0,
152
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
153
+ raw_data JSONB
154
+ );
155
+
156
+ CREATE INDEX IF NOT EXISTS idx_sap_cap_idx_id ON sap_capability_indexes (capability_id);
157
+
158
+ -- ═══════════════════════════════════════════════════════════════════
159
+ -- 6. Protocol Index
160
+ -- ═══════════════════════════════════════════════════════════════════
161
+
162
+ CREATE TABLE IF NOT EXISTS sap_protocol_indexes (
163
+ pda TEXT PRIMARY KEY,
164
+ bump SMALLINT NOT NULL,
165
+ protocol_id VARCHAR(128) NOT NULL,
166
+ protocol_hash BYTEA NOT NULL, -- 32 bytes
167
+ agents TEXT[] NOT NULL DEFAULT '{}',
168
+ total_pages INTEGER NOT NULL DEFAULT 0,
169
+ last_updated BIGINT NOT NULL,
170
+ -- sync metadata
171
+ slot BIGINT NOT NULL DEFAULT 0,
172
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
173
+ raw_data JSONB
174
+ );
175
+
176
+ CREATE INDEX IF NOT EXISTS idx_sap_proto_idx_id ON sap_protocol_indexes (protocol_id);
177
+
178
+ -- ═══════════════════════════════════════════════════════════════════
179
+ -- 7. Plugin Slot
180
+ -- ═══════════════════════════════════════════════════════════════════
181
+
182
+ CREATE TABLE IF NOT EXISTS sap_plugin_slots (
183
+ pda TEXT PRIMARY KEY,
184
+ bump SMALLINT NOT NULL,
185
+ agent TEXT NOT NULL,
186
+ plugin_type sap_plugin_type NOT NULL,
187
+ authority TEXT NOT NULL,
188
+ is_active BOOLEAN NOT NULL DEFAULT true,
189
+ created_at BIGINT NOT NULL,
190
+ updated_at BIGINT NOT NULL,
191
+ config_hash BYTEA, -- 32 bytes
192
+ -- sync metadata
193
+ slot BIGINT NOT NULL DEFAULT 0,
194
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
195
+ raw_data JSONB
196
+ );
197
+
198
+ CREATE INDEX IF NOT EXISTS idx_sap_plugin_agent ON sap_plugin_slots (agent);
199
+
200
+ -- ═══════════════════════════════════════════════════════════════════
201
+ -- 8. Memory Entry (legacy)
202
+ -- ═══════════════════════════════════════════════════════════════════
203
+
204
+ CREATE TABLE IF NOT EXISTS sap_memory_entries (
205
+ pda TEXT PRIMARY KEY,
206
+ bump SMALLINT NOT NULL,
207
+ agent TEXT NOT NULL,
208
+ entry_hash BYTEA NOT NULL, -- 32 bytes
209
+ content_type VARCHAR(64),
210
+ total_chunks SMALLINT NOT NULL DEFAULT 0,
211
+ total_size BIGINT NOT NULL DEFAULT 0,
212
+ ipfs_cid VARCHAR(128),
213
+ created_at BIGINT NOT NULL,
214
+ -- sync metadata
215
+ slot BIGINT NOT NULL DEFAULT 0,
216
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
217
+ raw_data JSONB
218
+ );
219
+
220
+ -- ═══════════════════════════════════════════════════════════════════
221
+ -- 9. Memory Chunk (legacy)
222
+ -- ═══════════════════════════════════════════════════════════════════
223
+
224
+ CREATE TABLE IF NOT EXISTS sap_memory_chunks (
225
+ pda TEXT PRIMARY KEY,
226
+ bump SMALLINT NOT NULL,
227
+ entry TEXT NOT NULL, -- memory entry PDA
228
+ chunk_index SMALLINT NOT NULL,
229
+ data BYTEA NOT NULL,
230
+ size INTEGER NOT NULL,
231
+ -- sync metadata
232
+ slot BIGINT NOT NULL DEFAULT 0,
233
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
234
+ raw_data JSONB
235
+ );
236
+
237
+ -- ═══════════════════════════════════════════════════════════════════
238
+ -- 10. Memory Vault
239
+ -- ═══════════════════════════════════════════════════════════════════
240
+
241
+ CREATE TABLE IF NOT EXISTS sap_memory_vaults (
242
+ pda TEXT PRIMARY KEY,
243
+ bump SMALLINT NOT NULL,
244
+ agent TEXT NOT NULL,
245
+ wallet TEXT NOT NULL,
246
+ vault_nonce BYTEA NOT NULL, -- 32 bytes
247
+ total_sessions INTEGER NOT NULL DEFAULT 0,
248
+ total_inscriptions BIGINT NOT NULL DEFAULT 0,
249
+ total_bytes_inscribed BIGINT NOT NULL DEFAULT 0,
250
+ created_at BIGINT NOT NULL,
251
+ protocol_version SMALLINT NOT NULL DEFAULT 1,
252
+ nonce_version SMALLINT NOT NULL DEFAULT 0,
253
+ last_nonce_rotation BIGINT,
254
+ -- sync metadata
255
+ slot BIGINT NOT NULL DEFAULT 0,
256
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
257
+ raw_data JSONB
258
+ );
259
+
260
+ CREATE INDEX IF NOT EXISTS idx_sap_vaults_agent ON sap_memory_vaults (agent);
261
+
262
+ -- ═══════════════════════════════════════════════════════════════════
263
+ -- 11. Session Ledger
264
+ -- ═══════════════════════════════════════════════════════════════════
265
+
266
+ CREATE TABLE IF NOT EXISTS sap_sessions (
267
+ pda TEXT PRIMARY KEY,
268
+ bump SMALLINT NOT NULL,
269
+ vault TEXT NOT NULL,
270
+ session_hash BYTEA NOT NULL, -- 32 bytes
271
+ sequence_counter INTEGER NOT NULL DEFAULT 0,
272
+ total_bytes BIGINT NOT NULL DEFAULT 0,
273
+ current_epoch INTEGER NOT NULL DEFAULT 0,
274
+ total_epochs INTEGER NOT NULL DEFAULT 0,
275
+ created_at BIGINT NOT NULL,
276
+ last_inscribed_at BIGINT,
277
+ is_closed BOOLEAN NOT NULL DEFAULT false,
278
+ merkle_root BYTEA NOT NULL, -- 32 bytes
279
+ total_checkpoints INTEGER NOT NULL DEFAULT 0,
280
+ tip_hash BYTEA NOT NULL, -- 32 bytes
281
+ -- sync metadata
282
+ slot BIGINT NOT NULL DEFAULT 0,
283
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
284
+ raw_data JSONB
285
+ );
286
+
287
+ CREATE INDEX IF NOT EXISTS idx_sap_sessions_vault ON sap_sessions (vault);
288
+
289
+ -- ═══════════════════════════════════════════════════════════════════
290
+ -- 12. Epoch Page
291
+ -- ═══════════════════════════════════════════════════════════════════
292
+
293
+ CREATE TABLE IF NOT EXISTS sap_epoch_pages (
294
+ pda TEXT PRIMARY KEY,
295
+ bump SMALLINT NOT NULL,
296
+ session TEXT NOT NULL,
297
+ epoch_index INTEGER NOT NULL,
298
+ start_sequence INTEGER NOT NULL,
299
+ inscription_count INTEGER NOT NULL DEFAULT 0,
300
+ total_bytes INTEGER NOT NULL DEFAULT 0,
301
+ first_ts BIGINT NOT NULL,
302
+ last_ts BIGINT NOT NULL,
303
+ -- sync metadata
304
+ slot BIGINT NOT NULL DEFAULT 0,
305
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
306
+ raw_data JSONB
307
+ );
308
+
309
+ CREATE INDEX IF NOT EXISTS idx_sap_epoch_session ON sap_epoch_pages (session);
310
+
311
+ -- ═══════════════════════════════════════════════════════════════════
312
+ -- 13. Vault Delegate
313
+ -- ═══════════════════════════════════════════════════════════════════
314
+
315
+ CREATE TABLE IF NOT EXISTS sap_vault_delegates (
316
+ pda TEXT PRIMARY KEY,
317
+ bump SMALLINT NOT NULL,
318
+ vault TEXT NOT NULL,
319
+ delegate TEXT NOT NULL, -- delegate wallet (base58)
320
+ permissions SMALLINT NOT NULL, -- bitmask
321
+ expires_at BIGINT NOT NULL,
322
+ created_at BIGINT NOT NULL,
323
+ -- sync metadata
324
+ slot BIGINT NOT NULL DEFAULT 0,
325
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
326
+ raw_data JSONB
327
+ );
328
+
329
+ CREATE INDEX IF NOT EXISTS idx_sap_delegates_vault ON sap_vault_delegates (vault);
330
+
331
+ -- ═══════════════════════════════════════════════════════════════════
332
+ -- 14. Tool Descriptor
333
+ -- ═══════════════════════════════════════════════════════════════════
334
+
335
+ CREATE TABLE IF NOT EXISTS sap_tools (
336
+ pda TEXT PRIMARY KEY,
337
+ bump SMALLINT NOT NULL,
338
+ agent TEXT NOT NULL,
339
+ tool_name_hash BYTEA NOT NULL, -- 32 bytes
340
+ tool_name VARCHAR(32) NOT NULL,
341
+ protocol_hash BYTEA NOT NULL, -- 32 bytes
342
+ version SMALLINT NOT NULL DEFAULT 1,
343
+ description_hash BYTEA NOT NULL, -- 32 bytes
344
+ input_schema_hash BYTEA NOT NULL, -- 32 bytes
345
+ output_schema_hash BYTEA NOT NULL, -- 32 bytes
346
+ http_method sap_tool_http_method NOT NULL,
347
+ category sap_tool_category NOT NULL,
348
+ params_count SMALLINT NOT NULL,
349
+ required_params SMALLINT NOT NULL,
350
+ is_compound BOOLEAN NOT NULL DEFAULT false,
351
+ is_active BOOLEAN NOT NULL DEFAULT true,
352
+ total_invocations BIGINT NOT NULL DEFAULT 0,
353
+ created_at BIGINT NOT NULL,
354
+ updated_at BIGINT NOT NULL,
355
+ previous_version TEXT, -- previous tool PDA (null if first)
356
+ -- sync metadata
357
+ slot BIGINT NOT NULL DEFAULT 0,
358
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
359
+ raw_data JSONB
360
+ );
361
+
362
+ CREATE INDEX IF NOT EXISTS idx_sap_tools_agent ON sap_tools (agent);
363
+ CREATE INDEX IF NOT EXISTS idx_sap_tools_name ON sap_tools (tool_name);
364
+ CREATE INDEX IF NOT EXISTS idx_sap_tools_category ON sap_tools (category);
365
+
366
+ -- ═══════════════════════════════════════════════════════════════════
367
+ -- 15. Session Checkpoint
368
+ -- ═══════════════════════════════════════════════════════════════════
369
+
370
+ CREATE TABLE IF NOT EXISTS sap_checkpoints (
371
+ pda TEXT PRIMARY KEY,
372
+ bump SMALLINT NOT NULL,
373
+ session TEXT NOT NULL,
374
+ checkpoint_index INTEGER NOT NULL,
375
+ merkle_root BYTEA NOT NULL, -- 32 bytes
376
+ sequence_at INTEGER NOT NULL,
377
+ epoch_at INTEGER NOT NULL,
378
+ total_bytes_at BIGINT NOT NULL,
379
+ inscriptions_at BIGINT NOT NULL,
380
+ created_at BIGINT NOT NULL,
381
+ -- sync metadata
382
+ slot BIGINT NOT NULL DEFAULT 0,
383
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
384
+ raw_data JSONB
385
+ );
386
+
387
+ CREATE INDEX IF NOT EXISTS idx_sap_checkpoints_session ON sap_checkpoints (session);
388
+
389
+ -- ═══════════════════════════════════════════════════════════════════
390
+ -- 16. Escrow Account
391
+ -- ═══════════════════════════════════════════════════════════════════
392
+
393
+ CREATE TABLE IF NOT EXISTS sap_escrows (
394
+ pda TEXT PRIMARY KEY,
395
+ bump SMALLINT NOT NULL,
396
+ agent TEXT NOT NULL, -- agent PDA
397
+ depositor TEXT NOT NULL, -- depositor wallet (base58)
398
+ agent_wallet TEXT NOT NULL, -- agent wallet (base58)
399
+ balance BIGINT NOT NULL DEFAULT 0,
400
+ total_deposited BIGINT NOT NULL DEFAULT 0,
401
+ total_settled BIGINT NOT NULL DEFAULT 0,
402
+ total_calls_settled BIGINT NOT NULL DEFAULT 0,
403
+ price_per_call BIGINT NOT NULL,
404
+ max_calls BIGINT NOT NULL,
405
+ created_at BIGINT NOT NULL,
406
+ last_settled_at BIGINT,
407
+ expires_at BIGINT,
408
+ volume_curve JSONB NOT NULL DEFAULT '[]',
409
+ token_mint TEXT, -- base58, null for SOL
410
+ token_decimals SMALLINT NOT NULL DEFAULT 9,
411
+ -- sync metadata
412
+ slot BIGINT NOT NULL DEFAULT 0,
413
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
414
+ raw_data JSONB
415
+ );
416
+
417
+ CREATE INDEX IF NOT EXISTS idx_sap_escrows_agent ON sap_escrows (agent);
418
+ CREATE INDEX IF NOT EXISTS idx_sap_escrows_depositor ON sap_escrows (depositor);
419
+
420
+ -- ═══════════════════════════════════════════════════════════════════
421
+ -- 17. Tool Category Index
422
+ -- ═══════════════════════════════════════════════════════════════════
423
+
424
+ CREATE TABLE IF NOT EXISTS sap_tool_category_indexes (
425
+ pda TEXT PRIMARY KEY,
426
+ bump SMALLINT NOT NULL,
427
+ category sap_tool_category NOT NULL,
428
+ tools TEXT[] NOT NULL DEFAULT '{}',
429
+ total_pages INTEGER NOT NULL DEFAULT 0,
430
+ last_updated BIGINT NOT NULL,
431
+ -- sync metadata
432
+ slot BIGINT NOT NULL DEFAULT 0,
433
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
434
+ raw_data JSONB
435
+ );
436
+
437
+ -- ═══════════════════════════════════════════════════════════════════
438
+ -- 18. Agent Attestation
439
+ -- ═══════════════════════════════════════════════════════════════════
440
+
441
+ CREATE TABLE IF NOT EXISTS sap_attestations (
442
+ pda TEXT PRIMARY KEY,
443
+ bump SMALLINT NOT NULL,
444
+ agent TEXT NOT NULL, -- attested agent PDA
445
+ attester TEXT NOT NULL, -- attester wallet (base58)
446
+ attestation_type VARCHAR(64) NOT NULL,
447
+ metadata_hash BYTEA NOT NULL, -- 32 bytes
448
+ is_active BOOLEAN NOT NULL DEFAULT true,
449
+ expires_at BIGINT NOT NULL,
450
+ created_at BIGINT NOT NULL,
451
+ updated_at BIGINT NOT NULL,
452
+ -- sync metadata
453
+ slot BIGINT NOT NULL DEFAULT 0,
454
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
455
+ raw_data JSONB
456
+ );
457
+
458
+ CREATE INDEX IF NOT EXISTS idx_sap_attestations_agent ON sap_attestations (agent);
459
+ CREATE INDEX IF NOT EXISTS idx_sap_attestations_attester ON sap_attestations (attester);
460
+
461
+ -- ═══════════════════════════════════════════════════════════════════
462
+ -- 19. Memory Buffer
463
+ -- ═══════════════════════════════════════════════════════════════════
464
+
465
+ CREATE TABLE IF NOT EXISTS sap_memory_buffers (
466
+ pda TEXT PRIMARY KEY,
467
+ bump SMALLINT NOT NULL,
468
+ session TEXT NOT NULL,
469
+ page_index INTEGER NOT NULL,
470
+ authority TEXT NOT NULL,
471
+ data_len INTEGER NOT NULL DEFAULT 0,
472
+ created_at BIGINT NOT NULL,
473
+ updated_at BIGINT NOT NULL,
474
+ data BYTEA,
475
+ -- sync metadata
476
+ slot BIGINT NOT NULL DEFAULT 0,
477
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
478
+ raw_data JSONB
479
+ );
480
+
481
+ -- ═══════════════════════════════════════════════════════════════════
482
+ -- 20. Memory Digest
483
+ -- ═══════════════════════════════════════════════════════════════════
484
+
485
+ CREATE TABLE IF NOT EXISTS sap_memory_digests (
486
+ pda TEXT PRIMARY KEY,
487
+ bump SMALLINT NOT NULL,
488
+ session TEXT NOT NULL,
489
+ authority TEXT NOT NULL,
490
+ merkle_root BYTEA NOT NULL, -- 32 bytes
491
+ total_entries INTEGER NOT NULL DEFAULT 0,
492
+ total_data_size BIGINT NOT NULL DEFAULT 0,
493
+ latest_hash BYTEA NOT NULL, -- 32 bytes
494
+ storage_ref BYTEA, -- 32 bytes, nullable
495
+ storage_type SMALLINT,
496
+ created_at BIGINT NOT NULL,
497
+ updated_at BIGINT NOT NULL,
498
+ -- sync metadata
499
+ slot BIGINT NOT NULL DEFAULT 0,
500
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
501
+ raw_data JSONB
502
+ );
503
+
504
+ -- ═══════════════════════════════════════════════════════════════════
505
+ -- 21. Memory Ledger (★ recommended)
506
+ -- ═══════════════════════════════════════════════════════════════════
507
+
508
+ CREATE TABLE IF NOT EXISTS sap_memory_ledgers (
509
+ pda TEXT PRIMARY KEY,
510
+ bump SMALLINT NOT NULL,
511
+ session TEXT NOT NULL,
512
+ authority TEXT NOT NULL,
513
+ num_entries INTEGER NOT NULL DEFAULT 0,
514
+ merkle_root BYTEA NOT NULL, -- 32 bytes
515
+ latest_hash BYTEA NOT NULL, -- 32 bytes
516
+ total_data_size BIGINT NOT NULL DEFAULT 0,
517
+ created_at BIGINT NOT NULL,
518
+ updated_at BIGINT NOT NULL,
519
+ num_pages INTEGER NOT NULL DEFAULT 0,
520
+ -- ring buffer stored as raw bytes (4096 max)
521
+ ring BYTEA,
522
+ -- sync metadata
523
+ slot BIGINT NOT NULL DEFAULT 0,
524
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
525
+ raw_data JSONB
526
+ );
527
+
528
+ CREATE INDEX IF NOT EXISTS idx_sap_ledgers_session ON sap_memory_ledgers (session);
529
+
530
+ -- ═══════════════════════════════════════════════════════════════════
531
+ -- 22. Ledger Page (sealed, permanent)
532
+ -- ═══════════════════════════════════════════════════════════════════
533
+
534
+ CREATE TABLE IF NOT EXISTS sap_ledger_pages (
535
+ pda TEXT PRIMARY KEY,
536
+ bump SMALLINT NOT NULL,
537
+ ledger TEXT NOT NULL,
538
+ page_index INTEGER NOT NULL,
539
+ sealed_at BIGINT NOT NULL,
540
+ entries_in_page INTEGER NOT NULL,
541
+ data_size INTEGER NOT NULL,
542
+ merkle_root_at_seal BYTEA NOT NULL, -- 32 bytes
543
+ data BYTEA, -- archived ring buffer bytes
544
+ -- sync metadata
545
+ slot BIGINT NOT NULL DEFAULT 0,
546
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
547
+ raw_data JSONB
548
+ );
549
+
550
+ CREATE INDEX IF NOT EXISTS idx_sap_ledger_pages_ledger ON sap_ledger_pages (ledger);
551
+
552
+ -- ═══════════════════════════════════════════════════════════════════
553
+ -- Events Log (denormalized event store for audit trail)
554
+ -- ═══════════════════════════════════════════════════════════════════
555
+
556
+ CREATE TABLE IF NOT EXISTS sap_events (
557
+ id BIGSERIAL PRIMARY KEY,
558
+ event_name VARCHAR(64) NOT NULL,
559
+ tx_signature TEXT NOT NULL,
560
+ slot BIGINT NOT NULL,
561
+ block_time BIGINT,
562
+ data JSONB NOT NULL,
563
+ -- derived fields for fast queries
564
+ agent_pda TEXT,
565
+ wallet TEXT,
566
+ synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
567
+ );
568
+
569
+ CREATE INDEX IF NOT EXISTS idx_sap_events_name ON sap_events (event_name);
570
+ CREATE INDEX IF NOT EXISTS idx_sap_events_agent ON sap_events (agent_pda) WHERE agent_pda IS NOT NULL;
571
+ CREATE INDEX IF NOT EXISTS idx_sap_events_tx ON sap_events (tx_signature);
572
+ CREATE INDEX IF NOT EXISTS idx_sap_events_slot ON sap_events (slot);
573
+
574
+ -- ═══════════════════════════════════════════════════════════════════
575
+ -- Sync Cursor (tracks last synced slot per account type)
576
+ -- ═══════════════════════════════════════════════════════════════════
577
+
578
+ CREATE TABLE IF NOT EXISTS sap_sync_cursors (
579
+ account_type VARCHAR(64) PRIMARY KEY,
580
+ last_slot BIGINT NOT NULL DEFAULT 0,
581
+ last_signature TEXT,
582
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
583
+ );
584
+
585
+ -- Pre-populate cursor entries for all account types
586
+ INSERT INTO sap_sync_cursors (account_type) VALUES
587
+ ('global_registry'),
588
+ ('agents'),
589
+ ('agent_stats'),
590
+ ('feedbacks'),
591
+ ('capability_indexes'),
592
+ ('protocol_indexes'),
593
+ ('plugin_slots'),
594
+ ('memory_entries'),
595
+ ('memory_chunks'),
596
+ ('memory_vaults'),
597
+ ('sessions'),
598
+ ('epoch_pages'),
599
+ ('vault_delegates'),
600
+ ('tools'),
601
+ ('checkpoints'),
602
+ ('escrows'),
603
+ ('tool_category_indexes'),
604
+ ('attestations'),
605
+ ('memory_buffers'),
606
+ ('memory_digests'),
607
+ ('memory_ledgers'),
608
+ ('ledger_pages'),
609
+ ('events')
610
+ ON CONFLICT (account_type) DO NOTHING;
611
+
612
+ -- ═══════════════════════════════════════════════════════════════════
613
+ -- Useful Views
614
+ -- ═══════════════════════════════════════════════════════════════════
615
+
616
+ -- Active agents with stats
617
+ CREATE OR REPLACE VIEW sap_active_agents AS
618
+ SELECT
619
+ a.pda,
620
+ a.wallet,
621
+ a.name,
622
+ a.description,
623
+ a.agent_id,
624
+ a.agent_uri,
625
+ a.x402_endpoint,
626
+ a.reputation_score,
627
+ a.total_feedbacks,
628
+ a.total_calls_served,
629
+ a.avg_latency_ms,
630
+ a.uptime_percent,
631
+ a.capabilities,
632
+ a.pricing,
633
+ a.protocols,
634
+ s.total_calls_served AS stats_calls,
635
+ a.created_at,
636
+ a.updated_at
637
+ FROM sap_agents a
638
+ LEFT JOIN sap_agent_stats s ON s.agent = a.pda
639
+ WHERE a.is_active = true;
640
+
641
+ -- Escrow balances with agent name
642
+ CREATE OR REPLACE VIEW sap_escrow_balances AS
643
+ SELECT
644
+ e.pda,
645
+ a.name AS agent_name,
646
+ e.agent,
647
+ e.depositor,
648
+ e.balance,
649
+ e.total_deposited,
650
+ e.total_settled,
651
+ e.total_calls_settled,
652
+ e.price_per_call,
653
+ e.max_calls,
654
+ e.expires_at,
655
+ e.token_mint,
656
+ e.token_decimals,
657
+ CASE
658
+ WHEN e.max_calls > 0
659
+ THEN e.max_calls - e.total_calls_settled
660
+ ELSE -1 -- unlimited
661
+ END AS calls_remaining
662
+ FROM sap_escrows e
663
+ LEFT JOIN sap_agents a ON a.pda = e.agent;
664
+
665
+ -- Agent tools summary
666
+ CREATE OR REPLACE VIEW sap_agent_tools AS
667
+ SELECT
668
+ t.pda,
669
+ a.name AS agent_name,
670
+ t.agent,
671
+ t.tool_name,
672
+ t.version,
673
+ t.http_method,
674
+ t.category,
675
+ t.params_count,
676
+ t.required_params,
677
+ t.is_compound,
678
+ t.is_active,
679
+ t.total_invocations,
680
+ t.created_at
681
+ FROM sap_tools t
682
+ LEFT JOIN sap_agents a ON a.pda = t.agent
683
+ WHERE t.is_active = true;