tapimo 0.4.1 → 0.4.3

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/README.md +1 -1
  2. package/dist/ApiKey.d.ts +1 -9
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +2 -3
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +53 -27
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +32 -17
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +2451 -1533
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +23 -9
  13. package/dist/App.js.map +1 -1
  14. package/dist/Assets.d.ts +10 -0
  15. package/dist/Assets.d.ts.map +1 -1
  16. package/dist/Assets.js +4 -0
  17. package/dist/Assets.js.map +1 -1
  18. package/dist/Auth.d.ts +2 -1
  19. package/dist/Auth.d.ts.map +1 -1
  20. package/dist/Auth.js +2 -1
  21. package/dist/Auth.js.map +1 -1
  22. package/dist/Scope.d.ts +40 -15
  23. package/dist/Scope.d.ts.map +1 -1
  24. package/dist/Scope.js +44 -13
  25. package/dist/Scope.js.map +1 -1
  26. package/dist/admin/App.d.ts +560 -9
  27. package/dist/admin/App.d.ts.map +1 -1
  28. package/dist/admin/App.js +38 -6
  29. package/dist/admin/App.js.map +1 -1
  30. package/dist/admin/apps/api-keys.d.ts +10 -24
  31. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  32. package/dist/admin/apps/api-keys.js +10 -3
  33. package/dist/admin/apps/api-keys.js.map +1 -1
  34. package/dist/admin/apps/organizations.d.ts +833 -0
  35. package/dist/admin/apps/organizations.d.ts.map +1 -0
  36. package/dist/admin/apps/organizations.js +733 -0
  37. package/dist/admin/apps/organizations.js.map +1 -0
  38. package/dist/admin/apps/scopes.d.ts +8 -0
  39. package/dist/admin/apps/scopes.d.ts.map +1 -1
  40. package/dist/admin/ui.generated.d.ts +1 -1
  41. package/dist/admin/ui.generated.d.ts.map +1 -1
  42. package/dist/admin/ui.generated.js +53 -13
  43. package/dist/admin/ui.generated.js.map +1 -1
  44. package/dist/analytics/Analytics.d.ts +10 -0
  45. package/dist/analytics/Analytics.d.ts.map +1 -1
  46. package/dist/analytics/Analytics.js +8 -0
  47. package/dist/analytics/Analytics.js.map +1 -1
  48. package/dist/analytics/tables/requestEvents.d.ts +9 -0
  49. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  50. package/dist/analytics/tables/requestEvents.js +14 -0
  51. package/dist/analytics/tables/requestEvents.js.map +1 -1
  52. package/dist/apps/data/App.d.ts +1354 -984
  53. package/dist/apps/data/App.d.ts.map +1 -1
  54. package/dist/apps/data/FundingRouteProviders.d.ts +94 -5
  55. package/dist/apps/data/FundingRouteProviders.d.ts.map +1 -1
  56. package/dist/apps/data/FundingRouteProviders.js +196 -5
  57. package/dist/apps/data/FundingRouteProviders.js.map +1 -1
  58. package/dist/apps/data/routes/activities.d.ts +38 -38
  59. package/dist/apps/data/routes/addresses.d.ts +24 -24
  60. package/dist/apps/data/routes/blocks.d.ts +39 -39
  61. package/dist/apps/data/routes/exchanges.d.ts +453 -453
  62. package/dist/apps/data/routes/fee-amm.d.ts +101 -101
  63. package/dist/apps/data/routes/funding.d.ts +730 -138
  64. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  65. package/dist/apps/data/routes/funding.js +234 -0
  66. package/dist/apps/data/routes/funding.js.map +1 -1
  67. package/dist/apps/data/routes/indexer.d.ts +5 -5
  68. package/dist/apps/data/routes/transactions.d.ts +281 -281
  69. package/dist/apps/data/routes/transfers.d.ts +58 -58
  70. package/dist/apps/data/routes/verified-tokens.d.ts +81 -81
  71. package/dist/apps/management/App.d.ts +1156 -615
  72. package/dist/apps/management/App.d.ts.map +1 -1
  73. package/dist/apps/management/App.js +2 -2
  74. package/dist/apps/management/Billing.d.ts +3 -0
  75. package/dist/apps/management/Billing.d.ts.map +1 -1
  76. package/dist/apps/management/Billing.js +7 -2
  77. package/dist/apps/management/Billing.js.map +1 -1
  78. package/dist/apps/management/routes/api-keys.d.ts +106 -90
  79. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  80. package/dist/apps/management/routes/api-keys.js +41 -30
  81. package/dist/apps/management/routes/api-keys.js.map +1 -1
  82. package/dist/apps/management/routes/billing.d.ts +278 -146
  83. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  84. package/dist/apps/management/routes/billing.js +14 -14
  85. package/dist/apps/management/routes/billing.js.map +1 -1
  86. package/dist/apps/management/routes/invitations.d.ts +93 -20
  87. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  88. package/dist/apps/management/routes/invitations.js +12 -15
  89. package/dist/apps/management/routes/invitations.js.map +1 -1
  90. package/dist/apps/management/routes/me.d.ts +6 -6
  91. package/dist/apps/management/routes/members.d.ts +89 -18
  92. package/dist/apps/management/routes/members.d.ts.map +1 -1
  93. package/dist/apps/management/routes/members.js +10 -10
  94. package/dist/apps/management/routes/members.js.map +1 -1
  95. package/dist/apps/management/routes/orgs.d.ts +130 -70
  96. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  97. package/dist/apps/management/routes/orgs.js +19 -19
  98. package/dist/apps/management/routes/orgs.js.map +1 -1
  99. package/dist/apps/management/routes/projects.d.ts +137 -48
  100. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  101. package/dist/apps/management/routes/projects.js +12 -13
  102. package/dist/apps/management/routes/projects.js.map +1 -1
  103. package/dist/apps/management/routes/scopes.d.ts +4 -18
  104. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  105. package/dist/apps/management/routes/scopes.js +6 -7
  106. package/dist/apps/management/routes/scopes.js.map +1 -1
  107. package/dist/apps/management/routes/usage.d.ts +63 -19
  108. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  109. package/dist/apps/management/routes/usage.js +9 -10
  110. package/dist/apps/management/routes/usage.js.map +1 -1
  111. package/dist/apps/mcp.d.ts.map +1 -1
  112. package/dist/apps/mcp.js +35 -3
  113. package/dist/apps/mcp.js.map +1 -1
  114. package/dist/apps/relay/App.d.ts +26 -4
  115. package/dist/apps/relay/App.d.ts.map +1 -1
  116. package/dist/apps/relay/App.js +17 -14
  117. package/dist/apps/relay/App.js.map +1 -1
  118. package/dist/db/Db.d.ts +5 -3
  119. package/dist/db/Db.d.ts.map +1 -1
  120. package/dist/db/Db.js +52 -0
  121. package/dist/db/Db.js.map +1 -1
  122. package/dist/db/Schema.d.ts +13 -0
  123. package/dist/db/Schema.d.ts.map +1 -1
  124. package/dist/db/Schema.js +16 -1
  125. package/dist/db/Schema.js.map +1 -1
  126. package/dist/db/tables/adminAuditLogs.d.ts +27 -0
  127. package/dist/db/tables/adminAuditLogs.d.ts.map +1 -0
  128. package/dist/db/tables/adminAuditLogs.js +19 -0
  129. package/dist/db/tables/adminAuditLogs.js.map +1 -0
  130. package/dist/db/tables/invitations.d.ts +1 -1
  131. package/dist/db/tables/invitations.d.ts.map +1 -1
  132. package/dist/db/tables/memberships.d.ts +32 -4
  133. package/dist/db/tables/memberships.d.ts.map +1 -1
  134. package/dist/db/tables/memberships.js +31 -0
  135. package/dist/db/tables/memberships.js.map +1 -1
  136. package/dist/db/tables/organizations.d.ts +43 -1
  137. package/dist/db/tables/organizations.d.ts.map +1 -1
  138. package/dist/db/tables/organizations.js +103 -0
  139. package/dist/db/tables/organizations.js.map +1 -1
  140. package/dist/db/tables/projects.d.ts +25 -0
  141. package/dist/db/tables/projects.d.ts.map +1 -1
  142. package/dist/db/tables/projects.js +22 -0
  143. package/dist/db/tables/projects.js.map +1 -1
  144. package/dist/db/tables/webhookDeliveries.d.ts +26 -0
  145. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
  146. package/dist/db/tables/webhookDeliveries.js +37 -0
  147. package/dist/db/tables/webhookDeliveries.js.map +1 -1
  148. package/dist/internal/Auth.d.ts +13 -18
  149. package/dist/internal/Auth.d.ts.map +1 -1
  150. package/dist/internal/Auth.js +78 -58
  151. package/dist/internal/Auth.js.map +1 -1
  152. package/dist/internal/Cursor.d.ts +1 -1
  153. package/dist/internal/Cursor.d.ts.map +1 -1
  154. package/dist/internal/Cursor.js +4 -0
  155. package/dist/internal/Cursor.js.map +1 -1
  156. package/dist/internal/EdgeCache.d.ts.map +1 -1
  157. package/dist/internal/EdgeCache.js +2 -0
  158. package/dist/internal/EdgeCache.js.map +1 -1
  159. package/dist/internal/FundingRoutes.d.ts +170 -0
  160. package/dist/internal/FundingRoutes.d.ts.map +1 -1
  161. package/dist/internal/FundingRoutes.js +68 -6
  162. package/dist/internal/FundingRoutes.js.map +1 -1
  163. package/dist/internal/Log.d.ts +16 -1
  164. package/dist/internal/Log.d.ts.map +1 -1
  165. package/dist/internal/Log.js +5 -3
  166. package/dist/internal/Log.js.map +1 -1
  167. package/package.json +2 -2
  168. package/src/ApiKey.ts +2 -3
  169. package/src/ApiKeys.ts +95 -17
  170. package/src/App.test.ts +44 -2
  171. package/src/App.ts +29 -9
  172. package/src/Assets.ts +8 -0
  173. package/src/Auth.test-d.ts +36 -0
  174. package/src/Auth.ts +20 -1
  175. package/src/Client.test-d.ts +64 -17
  176. package/src/Scope.test.ts +34 -0
  177. package/src/Scope.ts +53 -17
  178. package/src/admin/App.test.ts +33 -3
  179. package/src/admin/App.ts +49 -14
  180. package/src/admin/apps/api-keys.ts +10 -3
  181. package/src/admin/apps/organizations.test.ts +455 -0
  182. package/src/admin/apps/organizations.ts +953 -0
  183. package/src/admin/apps/scopes.test.ts +10 -0
  184. package/src/admin/ui/plugin.ts +1 -1
  185. package/src/admin/ui/src/components/MobileProfile.tsx +2 -0
  186. package/src/admin/ui/src/components/ThemeToggle.tsx +20 -0
  187. package/src/admin/ui/src/lib/api-keys.ts +36 -19
  188. package/src/admin/ui/src/lib/config.ts +2 -3
  189. package/src/admin/ui/src/lib/organizations.test.ts +89 -0
  190. package/src/admin/ui/src/lib/organizations.ts +262 -0
  191. package/src/admin/ui/src/lib/query-client.ts +3 -1
  192. package/src/admin/ui/src/lib/theme.ts +57 -0
  193. package/src/admin/ui/src/routeTree.gen.ts +47 -4
  194. package/src/admin/ui/src/routes/__root.tsx +18 -3
  195. package/src/admin/ui/src/routes/api-keys.tsx +52 -7
  196. package/src/admin/ui/src/routes/index.tsx +1 -1
  197. package/src/admin/ui/src/routes/organizations.tsx +158 -0
  198. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +710 -0
  199. package/src/admin/ui/src/start.ts +6 -0
  200. package/src/admin/ui.generated.ts +63 -13
  201. package/src/analytics/Analytics.ts +25 -0
  202. package/src/analytics/tables/requestEvents.ts +33 -0
  203. package/src/apps/composition.test.ts +82 -2
  204. package/src/apps/data/FundingRouteProviders.test.ts +204 -0
  205. package/src/apps/data/FundingRouteProviders.ts +294 -9
  206. package/src/apps/data/routes/funding.test.ts +90 -23
  207. package/src/apps/data/routes/funding.ts +315 -0
  208. package/src/apps/management/App.ts +2 -2
  209. package/src/apps/management/Billing.ts +10 -2
  210. package/src/apps/management/routes/api-keys.test.ts +137 -1
  211. package/src/apps/management/routes/api-keys.ts +63 -38
  212. package/src/apps/management/routes/billing.ts +14 -14
  213. package/src/apps/management/routes/invitations.test.ts +102 -1
  214. package/src/apps/management/routes/invitations.ts +13 -15
  215. package/src/apps/management/routes/members.ts +10 -10
  216. package/src/apps/management/routes/orgs.test.ts +78 -16
  217. package/src/apps/management/routes/orgs.ts +21 -20
  218. package/src/apps/management/routes/projects.ts +12 -13
  219. package/src/apps/management/routes/scopes.test.ts +16 -0
  220. package/src/apps/management/routes/scopes.ts +6 -7
  221. package/src/apps/management/routes/usage.ts +9 -14
  222. package/src/apps/mcp.test.ts +25 -1
  223. package/src/apps/mcp.ts +43 -3
  224. package/src/apps/relay/App.test.ts +23 -18
  225. package/src/apps/relay/App.ts +35 -14
  226. package/src/db/Db.ts +59 -3
  227. package/src/db/Schema.ts +20 -1
  228. package/src/db/tables/adminAuditLogs.ts +47 -0
  229. package/src/db/tables/invitations.ts +1 -1
  230. package/src/db/tables/memberships.ts +59 -3
  231. package/src/db/tables/organizations.ts +148 -1
  232. package/src/db/tables/projects.ts +47 -0
  233. package/src/db/tables/webhookDeliveries.ts +83 -0
  234. package/src/internal/Auth.test.ts +174 -7
  235. package/src/internal/Auth.ts +90 -62
  236. package/src/internal/Cursor.test.ts +10 -0
  237. package/src/internal/Cursor.ts +5 -1
  238. package/src/internal/EdgeCache.test.ts +11 -0
  239. package/src/internal/EdgeCache.ts +2 -0
  240. package/src/internal/FundingRoutes.test.ts +26 -0
  241. package/src/internal/FundingRoutes.ts +187 -18
  242. package/src/internal/Log.test.ts +41 -3
  243. package/src/internal/Log.ts +23 -4
@@ -1,6 +1,7 @@
1
1
  import { type RequestIdVariables } from 'hono/request-id';
2
2
  import type * as Assets from '../Assets.js';
3
- import type * as Db from '../db/Db.js';
3
+ import type * as Analytics from '../analytics/Analytics.js';
4
+ import * as Db from '../db/Db.js';
4
5
  import type * as Store from '../internal/Store.js';
5
6
  import * as Response from '../internal/Response.js';
6
7
  /** A verified admin identity, as returned by {@link create.Options.identify}. */
@@ -11,6 +12,8 @@ export type Identity = {
11
12
  /** Hono environment for the admin app. */
12
13
  export type Environment = {
13
14
  Variables: RequestIdVariables & {
15
+ /** ClickHouse analytics source used by operational usage reads. */
16
+ analytics: Analytics.Source;
14
17
  /** Static-asset writer (e.g. the R2 icon bucket), when configured. */
15
18
  assets: create.Assets | undefined;
16
19
  /** Authoritative Postgres store, or a per-request factory. Resolve at the leaf with `Db.get`. */
@@ -38,6 +41,14 @@ export declare function create(options: create.Options): import("hono/hono-base"
38
41
  readonly description: 'Run ad-hoc queries against the raw indexer passthrough.';
39
42
  readonly scope: 'indexer:query';
40
43
  readonly selfServe: true;
44
+ }, {
45
+ readonly description: 'Read organization resources across projects and environments.';
46
+ readonly scope: 'management:read';
47
+ readonly selfServe: true;
48
+ }, {
49
+ readonly description: 'Create, update, and delete organization resources across projects and environments.';
50
+ readonly scope: 'management:write';
51
+ readonly selfServe: true;
41
52
  }, {
42
53
  readonly description: 'Fill and submit transactions through the relay.';
43
54
  readonly scope: 'rpc-relay:read';
@@ -88,7 +99,7 @@ export declare function create(options: create.Options): import("hono/hono-base"
88
99
  perMinute: number;
89
100
  };
90
101
  } | undefined;
91
- scopes: readonly ("*" | "data:read" | "indexer:query" | "rpc-relay:read" | "rpc-relay:sponsor" | "webhooks:read" | "webhooks:write")[];
102
+ scopes: readonly string[];
92
103
  createdAt: string;
93
104
  createdBy?: string | undefined;
94
105
  expiresAt?: string | undefined;
@@ -106,9 +117,9 @@ export declare function create(options: create.Options): import("hono/hono-base"
106
117
  rateLimits?: Record<string, {
107
118
  perMinute: number;
108
119
  }> | undefined;
109
- scopes: readonly ("*" | "data:read" | "indexer:query" | "rpc-relay:read" | "rpc-relay:sponsor" | "webhooks:read" | "webhooks:write")[];
110
120
  expiresAt?: string | undefined;
111
121
  orgId?: string | undefined;
122
+ scopes: readonly ("*" | "data:read" | "indexer:query" | "management:read" | "management:write" | "rpc-relay:read" | "rpc-relay:sponsor" | "webhooks:read" | "webhooks:write")[];
112
123
  };
113
124
  };
114
125
  };
@@ -129,7 +140,7 @@ export declare function create(options: create.Options): import("hono/hono-base"
129
140
  perMinute: number;
130
141
  };
131
142
  } | undefined;
132
- scopes: readonly ("*" | "data:read" | "indexer:query" | "rpc-relay:read" | "rpc-relay:sponsor" | "webhooks:read" | "webhooks:write")[];
143
+ scopes: readonly string[];
133
144
  createdAt: string;
134
145
  createdBy?: string | undefined;
135
146
  expiresAt?: string | undefined;
@@ -212,7 +223,7 @@ export declare function create(options: create.Options): import("hono/hono-base"
212
223
  perMinute: number;
213
224
  };
214
225
  } | undefined;
215
- scopes: readonly ("*" | "data:read" | "indexer:query" | "rpc-relay:read" | "rpc-relay:sponsor" | "webhooks:read" | "webhooks:write")[];
226
+ scopes: readonly string[];
216
227
  createdAt: string;
217
228
  createdBy?: string | undefined;
218
229
  expiresAt?: string | undefined;
@@ -1125,7 +1136,545 @@ export declare function create(options: create.Options): import("hono/hono-base"
1125
1136
  };
1126
1137
  };
1127
1138
  };
1128
- }, "/verified-tokens"> | {
1139
+ }, "/verified-tokens"> | import("hono/types").MergeSchemaPath<{
1140
+ "/": {
1141
+ $get: {
1142
+ output: {
1143
+ error: {
1144
+ code: "upstream_error";
1145
+ details?: readonly Response.error.Detail[] | undefined;
1146
+ message: string;
1147
+ };
1148
+ requestId: string;
1149
+ };
1150
+ outputFormat: "json";
1151
+ status: 502;
1152
+ input: {
1153
+ query?: {
1154
+ cursor?: string | string[];
1155
+ limit?: string | string[];
1156
+ query?: string | string[];
1157
+ } | undefined;
1158
+ };
1159
+ } | {
1160
+ output: {
1161
+ data: {
1162
+ createdAt: string;
1163
+ createdBy: string | null;
1164
+ id: string;
1165
+ name: string;
1166
+ updatedAt: string;
1167
+ userId: string | null;
1168
+ memberCount: number;
1169
+ projectCount: number;
1170
+ }[];
1171
+ nextCursor: string | null;
1172
+ };
1173
+ outputFormat: "json";
1174
+ status: 200;
1175
+ input: {
1176
+ query?: {
1177
+ cursor?: string | string[];
1178
+ limit?: string | string[];
1179
+ query?: string | string[];
1180
+ } | undefined;
1181
+ };
1182
+ };
1183
+ };
1184
+ } & {
1185
+ "/:orgId": {
1186
+ $get: {
1187
+ output: {
1188
+ error: {
1189
+ code: "upstream_error";
1190
+ details?: readonly Response.error.Detail[] | undefined;
1191
+ message: string;
1192
+ };
1193
+ requestId: string;
1194
+ };
1195
+ outputFormat: "json";
1196
+ status: 502;
1197
+ input: {
1198
+ param: {
1199
+ orgId: string;
1200
+ };
1201
+ };
1202
+ } | {
1203
+ output: {
1204
+ error: {
1205
+ code: "not_found";
1206
+ details?: readonly Response.error.Detail[] | undefined;
1207
+ message: string;
1208
+ };
1209
+ requestId: string;
1210
+ };
1211
+ outputFormat: "json";
1212
+ status: 404;
1213
+ input: {
1214
+ param: {
1215
+ orgId: string;
1216
+ };
1217
+ };
1218
+ } | {
1219
+ output: {
1220
+ createdAt: string;
1221
+ createdBy: string | null;
1222
+ id: string;
1223
+ name: string;
1224
+ updatedAt: string;
1225
+ userId: string | null;
1226
+ memberCount: number;
1227
+ projectCount: number;
1228
+ billing: {
1229
+ production: {
1230
+ settings: {
1231
+ currency: "usd";
1232
+ period: "month";
1233
+ spendLimit: string | null;
1234
+ txFeeLimit: string | null;
1235
+ updatedAt: string;
1236
+ } | null;
1237
+ source: {
1238
+ status: "active" | "canceled" | "none" | "past_due";
1239
+ stripeCustomerId: string;
1240
+ updatedAt: string;
1241
+ } | null;
1242
+ };
1243
+ sandbox: {
1244
+ settings: {
1245
+ currency: "usd";
1246
+ period: "month";
1247
+ spendLimit: string | null;
1248
+ txFeeLimit: string | null;
1249
+ updatedAt: string;
1250
+ } | null;
1251
+ source: {
1252
+ status: "active" | "canceled" | "none" | "past_due";
1253
+ stripeCustomerId: string;
1254
+ updatedAt: string;
1255
+ } | null;
1256
+ };
1257
+ };
1258
+ };
1259
+ outputFormat: "json";
1260
+ status: 200;
1261
+ input: {
1262
+ param: {
1263
+ orgId: string;
1264
+ };
1265
+ };
1266
+ };
1267
+ };
1268
+ } & {
1269
+ "/:orgId/members": {
1270
+ $get: {
1271
+ output: {
1272
+ error: {
1273
+ code: "upstream_error";
1274
+ details?: readonly Response.error.Detail[] | undefined;
1275
+ message: string;
1276
+ };
1277
+ requestId: string;
1278
+ };
1279
+ outputFormat: "json";
1280
+ status: 502;
1281
+ input: {
1282
+ param: {
1283
+ orgId: string;
1284
+ };
1285
+ } & {
1286
+ query?: {
1287
+ cursor?: string | string[];
1288
+ limit?: string | string[];
1289
+ } | undefined;
1290
+ };
1291
+ } | {
1292
+ output: {
1293
+ error: {
1294
+ code: "not_found";
1295
+ details?: readonly Response.error.Detail[] | undefined;
1296
+ message: string;
1297
+ };
1298
+ requestId: string;
1299
+ };
1300
+ outputFormat: "json";
1301
+ status: 404;
1302
+ input: {
1303
+ param: {
1304
+ orgId: string;
1305
+ };
1306
+ } & {
1307
+ query?: {
1308
+ cursor?: string | string[];
1309
+ limit?: string | string[];
1310
+ } | undefined;
1311
+ };
1312
+ } | {
1313
+ output: {
1314
+ data: {
1315
+ address: string | null;
1316
+ createdAt: string;
1317
+ email: string | null;
1318
+ role: "admin" | "member" | "owner";
1319
+ updatedAt: string;
1320
+ userId: string;
1321
+ }[];
1322
+ nextCursor: string | null;
1323
+ };
1324
+ outputFormat: "json";
1325
+ status: 200;
1326
+ input: {
1327
+ param: {
1328
+ orgId: string;
1329
+ };
1330
+ } & {
1331
+ query?: {
1332
+ cursor?: string | string[];
1333
+ limit?: string | string[];
1334
+ } | undefined;
1335
+ };
1336
+ };
1337
+ };
1338
+ } & {
1339
+ "/:orgId/projects": {
1340
+ $get: {
1341
+ output: {
1342
+ error: {
1343
+ code: "upstream_error";
1344
+ details?: readonly Response.error.Detail[] | undefined;
1345
+ message: string;
1346
+ };
1347
+ requestId: string;
1348
+ };
1349
+ outputFormat: "json";
1350
+ status: 502;
1351
+ input: {
1352
+ param: {
1353
+ orgId: string;
1354
+ };
1355
+ } & {
1356
+ query?: {
1357
+ cursor?: string | string[];
1358
+ limit?: string | string[];
1359
+ } | undefined;
1360
+ };
1361
+ } | {
1362
+ output: {
1363
+ error: {
1364
+ code: "not_found";
1365
+ details?: readonly Response.error.Detail[] | undefined;
1366
+ message: string;
1367
+ };
1368
+ requestId: string;
1369
+ };
1370
+ outputFormat: "json";
1371
+ status: 404;
1372
+ input: {
1373
+ param: {
1374
+ orgId: string;
1375
+ };
1376
+ } & {
1377
+ query?: {
1378
+ cursor?: string | string[];
1379
+ limit?: string | string[];
1380
+ } | undefined;
1381
+ };
1382
+ } | {
1383
+ output: {
1384
+ data: {
1385
+ createdAt: string;
1386
+ id: string;
1387
+ name: string;
1388
+ updatedAt: string;
1389
+ }[];
1390
+ nextCursor: string | null;
1391
+ };
1392
+ outputFormat: "json";
1393
+ status: 200;
1394
+ input: {
1395
+ param: {
1396
+ orgId: string;
1397
+ };
1398
+ } & {
1399
+ query?: {
1400
+ cursor?: string | string[];
1401
+ limit?: string | string[];
1402
+ } | undefined;
1403
+ };
1404
+ };
1405
+ };
1406
+ } & {
1407
+ "/:orgId/api-keys": {
1408
+ $get: {
1409
+ output: {
1410
+ error: {
1411
+ code: "upstream_error";
1412
+ details?: readonly Response.error.Detail[] | undefined;
1413
+ message: string;
1414
+ };
1415
+ requestId: string;
1416
+ };
1417
+ outputFormat: "json";
1418
+ status: 502;
1419
+ input: {
1420
+ param: {
1421
+ orgId: string;
1422
+ };
1423
+ };
1424
+ } | {
1425
+ output: {
1426
+ error: {
1427
+ code: "not_found";
1428
+ details?: readonly Response.error.Detail[] | undefined;
1429
+ message: string;
1430
+ };
1431
+ requestId: string;
1432
+ };
1433
+ outputFormat: "json";
1434
+ status: 404;
1435
+ input: {
1436
+ param: {
1437
+ orgId: string;
1438
+ };
1439
+ };
1440
+ } | {
1441
+ output: {
1442
+ data: {
1443
+ billingActive?: boolean | undefined;
1444
+ environment: "production" | "sandbox";
1445
+ id: string;
1446
+ name?: string | undefined;
1447
+ orgId: string;
1448
+ projectId?: string | undefined;
1449
+ rateLimits?: {
1450
+ [x: string]: {
1451
+ perMinute: number;
1452
+ };
1453
+ } | undefined;
1454
+ scopes: readonly string[];
1455
+ createdAt: string;
1456
+ createdBy?: string | undefined;
1457
+ expiresAt?: string | undefined;
1458
+ tokenLast4: string;
1459
+ }[];
1460
+ };
1461
+ outputFormat: "json";
1462
+ status: 200;
1463
+ input: {
1464
+ param: {
1465
+ orgId: string;
1466
+ };
1467
+ };
1468
+ };
1469
+ };
1470
+ } & {
1471
+ "/:orgId/usage": {
1472
+ $get: {
1473
+ output: {
1474
+ error: {
1475
+ code: "upstream_error";
1476
+ details?: readonly Response.error.Detail[] | undefined;
1477
+ message: string;
1478
+ };
1479
+ requestId: string;
1480
+ };
1481
+ outputFormat: "json";
1482
+ status: 502;
1483
+ input: {
1484
+ param: {
1485
+ orgId: string;
1486
+ };
1487
+ } & {
1488
+ query?: {
1489
+ period?: string | string[];
1490
+ } | undefined;
1491
+ };
1492
+ } | {
1493
+ output: {
1494
+ error: {
1495
+ code: "not_found";
1496
+ details?: readonly Response.error.Detail[] | undefined;
1497
+ message: string;
1498
+ };
1499
+ requestId: string;
1500
+ };
1501
+ outputFormat: "json";
1502
+ status: 404;
1503
+ input: {
1504
+ param: {
1505
+ orgId: string;
1506
+ };
1507
+ } & {
1508
+ query?: {
1509
+ period?: string | string[];
1510
+ } | undefined;
1511
+ };
1512
+ } | {
1513
+ output: {
1514
+ byError: {
1515
+ code: string;
1516
+ requests: number;
1517
+ }[];
1518
+ byRoute: {
1519
+ errors: number;
1520
+ requests: number;
1521
+ averageDurationMs: number;
1522
+ route: string;
1523
+ }[];
1524
+ byStatus: {
1525
+ requests: number;
1526
+ status: number;
1527
+ }[];
1528
+ from: string;
1529
+ period: "24h" | "30d" | "7d";
1530
+ to: string;
1531
+ totals: {
1532
+ errors: number;
1533
+ requests: number;
1534
+ averageDurationMs: number;
1535
+ };
1536
+ };
1537
+ outputFormat: "json";
1538
+ status: 200;
1539
+ input: {
1540
+ param: {
1541
+ orgId: string;
1542
+ };
1543
+ } & {
1544
+ query?: {
1545
+ period?: string | string[];
1546
+ } | undefined;
1547
+ };
1548
+ };
1549
+ };
1550
+ } & {
1551
+ "/:orgId/sponsorship": {
1552
+ $get: {
1553
+ output: {
1554
+ error: {
1555
+ code: "upstream_error";
1556
+ details?: readonly Response.error.Detail[] | undefined;
1557
+ message: string;
1558
+ };
1559
+ requestId: string;
1560
+ };
1561
+ outputFormat: "json";
1562
+ status: 502;
1563
+ input: {
1564
+ param: {
1565
+ orgId: string;
1566
+ };
1567
+ };
1568
+ } | {
1569
+ output: {
1570
+ error: {
1571
+ code: "not_found";
1572
+ details?: readonly Response.error.Detail[] | undefined;
1573
+ message: string;
1574
+ };
1575
+ requestId: string;
1576
+ };
1577
+ outputFormat: "json";
1578
+ status: 404;
1579
+ input: {
1580
+ param: {
1581
+ orgId: string;
1582
+ };
1583
+ };
1584
+ } | {
1585
+ output: {
1586
+ production: {
1587
+ committedSpend: string;
1588
+ currency: "usd";
1589
+ from: string;
1590
+ period: "month";
1591
+ };
1592
+ sandbox: {
1593
+ committedSpend: string;
1594
+ currency: "usd";
1595
+ from: string;
1596
+ period: "month";
1597
+ };
1598
+ to: string;
1599
+ };
1600
+ outputFormat: "json";
1601
+ status: 200;
1602
+ input: {
1603
+ param: {
1604
+ orgId: string;
1605
+ };
1606
+ };
1607
+ };
1608
+ };
1609
+ } & {
1610
+ "/:orgId/webhooks": {
1611
+ $get: {
1612
+ output: {
1613
+ error: {
1614
+ code: "upstream_error";
1615
+ details?: readonly Response.error.Detail[] | undefined;
1616
+ message: string;
1617
+ };
1618
+ requestId: string;
1619
+ };
1620
+ outputFormat: "json";
1621
+ status: 502;
1622
+ input: {
1623
+ param: {
1624
+ orgId: string;
1625
+ };
1626
+ };
1627
+ } | {
1628
+ output: {
1629
+ error: {
1630
+ code: "not_found";
1631
+ details?: readonly Response.error.Detail[] | undefined;
1632
+ message: string;
1633
+ };
1634
+ requestId: string;
1635
+ };
1636
+ outputFormat: "json";
1637
+ status: 404;
1638
+ input: {
1639
+ param: {
1640
+ orgId: string;
1641
+ };
1642
+ };
1643
+ } | {
1644
+ output: {
1645
+ failureCount: number;
1646
+ failures: {
1647
+ attempt: number;
1648
+ createdAt: string;
1649
+ error: string | null;
1650
+ id: string;
1651
+ responseStatus: number | null;
1652
+ subscriptionId: string;
1653
+ }[];
1654
+ failuresTruncated: boolean;
1655
+ from: string;
1656
+ subscriptions: {
1657
+ chainId: number;
1658
+ createdAt: string;
1659
+ destination: string;
1660
+ eventType: string;
1661
+ failureCount: number;
1662
+ id: string;
1663
+ lastDeliveryAt: string | null;
1664
+ status: "active" | "disabled" | "paused";
1665
+ }[];
1666
+ to: string;
1667
+ };
1668
+ outputFormat: "json";
1669
+ status: 200;
1670
+ input: {
1671
+ param: {
1672
+ orgId: string;
1673
+ };
1674
+ };
1675
+ };
1676
+ };
1677
+ }, "/organizations"> | {
1129
1678
  "/config.json": {
1130
1679
  $get: {
1131
1680
  output: {
@@ -1152,15 +1701,17 @@ export declare namespace create {
1152
1701
  type Assets = Assets.Assets;
1153
1702
  /** Options for {@link create}. */
1154
1703
  type Options = {
1704
+ /** ClickHouse analytics source used by operational usage reads. */
1705
+ analytics: Analytics.Source;
1155
1706
  /**
1156
1707
  * Static-asset writer for logo uploads (shared with the main API's `assets`
1157
1708
  * loader) to enable `PUT /verified-tokens/:address/logo`; omit for `404`.
1158
1709
  */
1159
1710
  assets?: Assets | undefined;
1160
1711
  /**
1161
- * Authoritative Postgres store shared with the main API (verified
1162
- * tokens). Pass a long-lived `Db.postgres(...)` singleton on Node, or a
1163
- * factory (`() => Db.postgres(...)`) on Workers.
1712
+ * Authoritative Postgres store shared with the main API. Pass a long-lived
1713
+ * `Db.postgres(...)` singleton on Node, or a factory
1714
+ * (`() => Db.postgres(...)`) on Workers.
1164
1715
  */
1165
1716
  db: Db.Source;
1166
1717
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/admin/App.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/admin/App.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpE,OAAO,KAAK,KAAK,MAAM,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,KAAK,SAAS,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AAEjC,OAAO,KAAK,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAA;AAQnD,iFAAiF;AACjF,MAAM,MAAM,QAAQ,GAAG;IACrB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,0CAA0C;AAC1C,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,kBAAkB,GAAG;QAC9B,mEAAmE;QACnE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAA;QAC3B,sEAAsE;QACtE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAA;QACjC,iGAAiG;QACjG,EAAE,EAAE,EAAE,CAAC,MAAM,CAAA;QACb,iEAAiE;QACjE,EAAE,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAA;SAAE,CAAA;QAC1B,gFAAgF;QAChF,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;KAC1B,CAAA;CACF,CAAA;AAED,+DAA+D;AAC/D,MAAM,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAA;AAE3C,yCAAyC;AACzC,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAvBrC,MAAM;;;;;;;;;;;wBA+Jd;AAiBD,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B;;;;OAIG;IACH,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAE3B,kCAAkC;IAClC,KAAK,OAAO,GAAG;QACb,mEAAmE;QACnE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAA;QAC3B;;;WAGG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;;;WAIG;QACH,EAAE,EAAE,EAAE,CAAC,MAAM,CAAA;QACb;;;WAGG;QACH,EAAE,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAA;SAAE,CAAA;QAC1B;;;;WAIG;QACH,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;QAC1E;;;WAGG;QACH,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,GAAG,SAAS,CAAA;KAC5B,CAAA;IAED,mEAAmE;IACnE,KAAK,EAAE,GAAG;QACR,2EAA2E;QAC3E,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B,0EAA0E;QAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC/B,CAAA;CACF"}