@antseed/cli 0.1.179 → 0.1.181

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 (678) hide show
  1. package/README.md +5 -3
  2. package/dist/buyer-identities/store.d.ts +39 -2
  3. package/dist/buyer-identities/store.d.ts.map +1 -1
  4. package/dist/buyer-identities/store.js +99 -10
  5. package/dist/buyer-identities/store.js.map +1 -1
  6. package/dist/cli/commands/apps/index.js +8 -8
  7. package/dist/cli/commands/buyer/identity.d.ts +3 -1
  8. package/dist/cli/commands/buyer/identity.d.ts.map +1 -1
  9. package/dist/cli/commands/buyer/identity.js +55 -8
  10. package/dist/cli/commands/buyer/identity.js.map +1 -1
  11. package/dist/cli/commands/buyer/identity.test.d.ts +2 -0
  12. package/dist/cli/commands/buyer/identity.test.d.ts.map +1 -0
  13. package/dist/cli/commands/buyer/identity.test.js +168 -0
  14. package/dist/cli/commands/buyer/identity.test.js.map +1 -0
  15. package/dist/cli/commands/buyer/set-authorized-wallet.d.ts +10 -0
  16. package/dist/cli/commands/buyer/set-authorized-wallet.d.ts.map +1 -1
  17. package/dist/cli/commands/buyer/set-authorized-wallet.js +26 -4
  18. package/dist/cli/commands/buyer/set-authorized-wallet.js.map +1 -1
  19. package/dist/cli/commands/buyer/set-authorized-wallet.test.js +37 -2
  20. package/dist/cli/commands/buyer/set-authorized-wallet.test.js.map +1 -1
  21. package/dist/cli/commands/buyer/start.d.ts +15 -0
  22. package/dist/cli/commands/buyer/start.d.ts.map +1 -1
  23. package/dist/cli/commands/buyer/start.js +158 -49
  24. package/dist/cli/commands/buyer/start.js.map +1 -1
  25. package/dist/cli/commands/buyer/start.test.js +16 -1
  26. package/dist/cli/commands/buyer/start.test.js.map +1 -1
  27. package/dist/cli/commands/chat.d.ts +3 -0
  28. package/dist/cli/commands/chat.d.ts.map +1 -0
  29. package/dist/cli/commands/chat.js +189 -0
  30. package/dist/cli/commands/chat.js.map +1 -0
  31. package/dist/cli/commands/gateway/activity.d.ts +15 -0
  32. package/dist/cli/commands/gateway/activity.d.ts.map +1 -0
  33. package/dist/cli/commands/gateway/activity.js +233 -0
  34. package/dist/cli/commands/gateway/activity.js.map +1 -0
  35. package/dist/cli/commands/gateway/admin-token.d.ts +3 -0
  36. package/dist/cli/commands/gateway/admin-token.d.ts.map +1 -0
  37. package/dist/cli/commands/gateway/admin-token.js +90 -0
  38. package/dist/cli/commands/gateway/admin-token.js.map +1 -0
  39. package/dist/cli/commands/gateway/console-link.d.ts +20 -0
  40. package/dist/cli/commands/gateway/console-link.d.ts.map +1 -0
  41. package/dist/cli/commands/gateway/console-link.js +92 -0
  42. package/dist/cli/commands/gateway/console-link.js.map +1 -0
  43. package/dist/cli/commands/gateway/gateway-commands.test.d.ts +2 -0
  44. package/dist/cli/commands/gateway/gateway-commands.test.d.ts.map +1 -0
  45. package/dist/cli/commands/gateway/gateway-commands.test.js +230 -0
  46. package/dist/cli/commands/gateway/gateway-commands.test.js.map +1 -0
  47. package/dist/cli/commands/gateway/gateway-console-commands.test.d.ts +2 -0
  48. package/dist/cli/commands/gateway/gateway-console-commands.test.d.ts.map +1 -0
  49. package/dist/cli/commands/gateway/gateway-console-commands.test.js +373 -0
  50. package/dist/cli/commands/gateway/gateway-console-commands.test.js.map +1 -0
  51. package/dist/cli/commands/gateway/index.d.ts +8 -0
  52. package/dist/cli/commands/gateway/index.d.ts.map +1 -1
  53. package/dist/cli/commands/gateway/index.js +93 -14
  54. package/dist/cli/commands/gateway/index.js.map +1 -1
  55. package/dist/cli/commands/gateway/key.d.ts +4 -0
  56. package/dist/cli/commands/gateway/key.d.ts.map +1 -1
  57. package/dist/cli/commands/gateway/key.js +297 -182
  58. package/dist/cli/commands/gateway/key.js.map +1 -1
  59. package/dist/cli/commands/gateway/member.d.ts +3 -0
  60. package/dist/cli/commands/gateway/member.d.ts.map +1 -0
  61. package/dist/cli/commands/gateway/member.js +302 -0
  62. package/dist/cli/commands/gateway/member.js.map +1 -0
  63. package/dist/cli/commands/gateway/migrate.d.ts +18 -0
  64. package/dist/cli/commands/gateway/migrate.d.ts.map +1 -0
  65. package/dist/cli/commands/gateway/migrate.js +158 -0
  66. package/dist/cli/commands/gateway/migrate.js.map +1 -0
  67. package/dist/cli/commands/gateway/operator.d.ts +11 -0
  68. package/dist/cli/commands/gateway/operator.d.ts.map +1 -0
  69. package/dist/cli/commands/gateway/operator.js +199 -0
  70. package/dist/cli/commands/gateway/operator.js.map +1 -0
  71. package/dist/cli/commands/gateway/operator.test.d.ts +2 -0
  72. package/dist/cli/commands/gateway/operator.test.d.ts.map +1 -0
  73. package/dist/cli/commands/gateway/operator.test.js +151 -0
  74. package/dist/cli/commands/gateway/operator.test.js.map +1 -0
  75. package/dist/cli/commands/gateway/peer-list.d.ts +3 -0
  76. package/dist/cli/commands/gateway/peer-list.d.ts.map +1 -0
  77. package/dist/cli/commands/gateway/peer-list.js +107 -0
  78. package/dist/cli/commands/gateway/peer-list.js.map +1 -0
  79. package/dist/cli/commands/gateway/policy-options.d.ts +23 -0
  80. package/dist/cli/commands/gateway/policy-options.d.ts.map +1 -0
  81. package/dist/cli/commands/gateway/policy-options.js +156 -0
  82. package/dist/cli/commands/gateway/policy-options.js.map +1 -0
  83. package/dist/cli/commands/gateway/preset.d.ts +3 -0
  84. package/dist/cli/commands/gateway/preset.d.ts.map +1 -0
  85. package/dist/cli/commands/gateway/preset.js +181 -0
  86. package/dist/cli/commands/gateway/preset.js.map +1 -0
  87. package/dist/cli/commands/gateway/routing.d.ts +3 -0
  88. package/dist/cli/commands/gateway/routing.d.ts.map +1 -0
  89. package/dist/cli/commands/gateway/routing.js +110 -0
  90. package/dist/cli/commands/gateway/routing.js.map +1 -0
  91. package/dist/cli/commands/gateway/settings.d.ts +4 -0
  92. package/dist/cli/commands/gateway/settings.d.ts.map +1 -0
  93. package/dist/cli/commands/gateway/settings.js +314 -0
  94. package/dist/cli/commands/gateway/settings.js.map +1 -0
  95. package/dist/cli/commands/gateway/shared.d.ts +55 -6
  96. package/dist/cli/commands/gateway/shared.d.ts.map +1 -1
  97. package/dist/cli/commands/gateway/shared.js +206 -26
  98. package/dist/cli/commands/gateway/shared.js.map +1 -1
  99. package/dist/cli/commands/gateway/workspace.d.ts +3 -0
  100. package/dist/cli/commands/gateway/workspace.d.ts.map +1 -0
  101. package/dist/cli/commands/gateway/workspace.js +250 -0
  102. package/dist/cli/commands/gateway/workspace.js.map +1 -0
  103. package/dist/cli/commands/network/bootstrap.js +1 -1
  104. package/dist/cli/commands/seller/setup.js +1 -1
  105. package/dist/cli/commands/seller/start.d.ts.map +1 -1
  106. package/dist/cli/commands/seller/start.js +1 -2
  107. package/dist/cli/commands/seller/start.js.map +1 -1
  108. package/dist/cli/commands/system-proxy/index.js +1 -1
  109. package/dist/cli/commands/tunnel/start.d.ts.map +1 -1
  110. package/dist/cli/commands/tunnel/start.js +23 -5
  111. package/dist/cli/commands/tunnel/start.js.map +1 -1
  112. package/dist/cli/commands/wrapped-tools.js +8 -8
  113. package/dist/cli/commands/wrapped-tools.test.js +5 -5
  114. package/dist/cli/index.js +12 -44
  115. package/dist/cli/index.js.map +1 -1
  116. package/dist/cli/program.d.ts +4 -0
  117. package/dist/cli/program.d.ts.map +1 -0
  118. package/dist/cli/program.js +49 -0
  119. package/dist/cli/program.js.map +1 -0
  120. package/dist/cli/program.test.d.ts +2 -0
  121. package/dist/cli/program.test.d.ts.map +1 -0
  122. package/dist/cli/program.test.js +38 -0
  123. package/dist/cli/program.test.js.map +1 -0
  124. package/dist/cli/prompt-hidden.d.ts +3 -0
  125. package/dist/cli/prompt-hidden.d.ts.map +1 -0
  126. package/dist/cli/prompt-hidden.js +38 -0
  127. package/dist/cli/prompt-hidden.js.map +1 -0
  128. package/dist/cli/wallet-passphrase.d.ts +48 -0
  129. package/dist/cli/wallet-passphrase.d.ts.map +1 -0
  130. package/dist/cli/wallet-passphrase.js +119 -0
  131. package/dist/cli/wallet-passphrase.js.map +1 -0
  132. package/dist/cli/wallet-passphrase.test.d.ts +2 -0
  133. package/dist/cli/wallet-passphrase.test.d.ts.map +1 -0
  134. package/dist/cli/wallet-passphrase.test.js +79 -0
  135. package/dist/cli/wallet-passphrase.test.js.map +1 -0
  136. package/dist/config/defaults.d.ts.map +1 -1
  137. package/dist/config/defaults.js +0 -1
  138. package/dist/config/defaults.js.map +1 -1
  139. package/dist/config/effective.d.ts +12 -0
  140. package/dist/config/effective.d.ts.map +1 -1
  141. package/dist/config/effective.js +39 -6
  142. package/dist/config/effective.js.map +1 -1
  143. package/dist/config/effective.test.js +9 -1
  144. package/dist/config/effective.test.js.map +1 -1
  145. package/dist/config/loader.d.ts +6 -0
  146. package/dist/config/loader.d.ts.map +1 -1
  147. package/dist/config/loader.js +12 -0
  148. package/dist/config/loader.js.map +1 -1
  149. package/dist/config/loader.test.js +7 -1
  150. package/dist/config/loader.test.js.map +1 -1
  151. package/dist/config/types.d.ts +14 -2
  152. package/dist/config/types.d.ts.map +1 -1
  153. package/dist/config/validation.d.ts.map +1 -1
  154. package/dist/config/validation.js +19 -0
  155. package/dist/config/validation.js.map +1 -1
  156. package/dist/gateway/accounting.d.ts +33 -3
  157. package/dist/gateway/accounting.d.ts.map +1 -1
  158. package/dist/gateway/accounting.js +86 -7
  159. package/dist/gateway/accounting.js.map +1 -1
  160. package/dist/gateway/admission-benchmark.test.d.ts +2 -0
  161. package/dist/gateway/admission-benchmark.test.d.ts.map +1 -0
  162. package/dist/gateway/admission-benchmark.test.js +75 -0
  163. package/dist/gateway/admission-benchmark.test.js.map +1 -0
  164. package/dist/gateway/auth/auth.test.d.ts +4 -0
  165. package/dist/gateway/auth/auth.test.d.ts.map +1 -0
  166. package/dist/gateway/auth/auth.test.js +337 -0
  167. package/dist/gateway/auth/auth.test.js.map +1 -0
  168. package/dist/gateway/auth/credentials.test.d.ts +2 -0
  169. package/dist/gateway/auth/credentials.test.d.ts.map +1 -0
  170. package/dist/gateway/auth/credentials.test.js +132 -0
  171. package/dist/gateway/auth/credentials.test.js.map +1 -0
  172. package/dist/gateway/auth/db.d.ts +156 -0
  173. package/dist/gateway/auth/db.d.ts.map +1 -0
  174. package/dist/gateway/auth/db.js +390 -0
  175. package/dist/gateway/auth/db.js.map +1 -0
  176. package/dist/gateway/auth/hardening.test.d.ts +2 -0
  177. package/dist/gateway/auth/hardening.test.d.ts.map +1 -0
  178. package/dist/gateway/auth/hardening.test.js +155 -0
  179. package/dist/gateway/auth/hardening.test.js.map +1 -0
  180. package/dist/gateway/auth/http.d.ts +53 -0
  181. package/dist/gateway/auth/http.d.ts.map +1 -0
  182. package/dist/gateway/auth/http.js +165 -0
  183. package/dist/gateway/auth/http.js.map +1 -0
  184. package/dist/gateway/auth/index.d.ts +26 -0
  185. package/dist/gateway/auth/index.d.ts.map +1 -0
  186. package/dist/gateway/auth/index.js +1014 -0
  187. package/dist/gateway/auth/index.js.map +1 -0
  188. package/dist/gateway/auth/oidc.d.ts +57 -0
  189. package/dist/gateway/auth/oidc.d.ts.map +1 -0
  190. package/dist/gateway/auth/oidc.js +159 -0
  191. package/dist/gateway/auth/oidc.js.map +1 -0
  192. package/dist/gateway/auth/oidc.test.d.ts +2 -0
  193. package/dist/gateway/auth/oidc.test.d.ts.map +1 -0
  194. package/dist/gateway/auth/oidc.test.js +223 -0
  195. package/dist/gateway/auth/oidc.test.js.map +1 -0
  196. package/dist/gateway/auth/reauth.test.d.ts +2 -0
  197. package/dist/gateway/auth/reauth.test.d.ts.map +1 -0
  198. package/dist/gateway/auth/reauth.test.js +108 -0
  199. package/dist/gateway/auth/reauth.test.js.map +1 -0
  200. package/dist/gateway/auth/store-integration.test.d.ts +2 -0
  201. package/dist/gateway/auth/store-integration.test.d.ts.map +1 -0
  202. package/dist/gateway/auth/store-integration.test.js +100 -0
  203. package/dist/gateway/auth/store-integration.test.js.map +1 -0
  204. package/dist/gateway/auth/test-helpers.d.ts +167 -0
  205. package/dist/gateway/auth/test-helpers.d.ts.map +1 -0
  206. package/dist/gateway/auth/test-helpers.js +368 -0
  207. package/dist/gateway/auth/test-helpers.js.map +1 -0
  208. package/dist/gateway/auth/types.d.ts +145 -0
  209. package/dist/gateway/auth/types.d.ts.map +1 -0
  210. package/dist/gateway/auth/types.js +2 -0
  211. package/dist/gateway/auth/types.js.map +1 -0
  212. package/dist/gateway/auth/wallet.d.ts +15 -0
  213. package/dist/gateway/auth/wallet.d.ts.map +1 -0
  214. package/dist/gateway/auth/wallet.js +43 -0
  215. package/dist/gateway/auth/wallet.js.map +1 -0
  216. package/dist/gateway/bundle.d.ts +127 -0
  217. package/dist/gateway/bundle.d.ts.map +1 -0
  218. package/dist/gateway/bundle.js +604 -0
  219. package/dist/gateway/bundle.js.map +1 -0
  220. package/dist/gateway/bundle.test.d.ts +2 -0
  221. package/dist/gateway/bundle.test.d.ts.map +1 -0
  222. package/dist/gateway/bundle.test.js +277 -0
  223. package/dist/gateway/bundle.test.js.map +1 -0
  224. package/dist/gateway/buyer-control.d.ts +33 -0
  225. package/dist/gateway/buyer-control.d.ts.map +1 -0
  226. package/dist/gateway/buyer-control.js +93 -0
  227. package/dist/gateway/buyer-control.js.map +1 -0
  228. package/dist/gateway/buyer-policy-probe.d.ts +41 -0
  229. package/dist/gateway/buyer-policy-probe.d.ts.map +1 -0
  230. package/dist/gateway/buyer-policy-probe.js +99 -0
  231. package/dist/gateway/buyer-policy-probe.js.map +1 -0
  232. package/dist/gateway/buyer-policy-probe.test.d.ts +2 -0
  233. package/dist/gateway/buyer-policy-probe.test.d.ts.map +1 -0
  234. package/dist/gateway/buyer-policy-probe.test.js +128 -0
  235. package/dist/gateway/buyer-policy-probe.test.js.map +1 -0
  236. package/dist/gateway/buyer-process.d.ts +30 -0
  237. package/dist/gateway/buyer-process.d.ts.map +1 -0
  238. package/dist/gateway/buyer-process.js +101 -0
  239. package/dist/gateway/buyer-process.js.map +1 -0
  240. package/dist/gateway/buyer-process.test.d.ts +2 -0
  241. package/dist/gateway/buyer-process.test.d.ts.map +1 -0
  242. package/dist/gateway/buyer-process.test.js +112 -0
  243. package/dist/gateway/buyer-process.test.js.map +1 -0
  244. package/dist/gateway/chat/routes.d.ts +45 -0
  245. package/dist/gateway/chat/routes.d.ts.map +1 -0
  246. package/dist/gateway/chat/routes.js +439 -0
  247. package/dist/gateway/chat/routes.js.map +1 -0
  248. package/dist/gateway/chat/routes.test.d.ts +2 -0
  249. package/dist/gateway/chat/routes.test.d.ts.map +1 -0
  250. package/dist/gateway/chat/routes.test.js +304 -0
  251. package/dist/gateway/chat/routes.test.js.map +1 -0
  252. package/dist/gateway/chat/tools.d.ts +35 -0
  253. package/dist/gateway/chat/tools.d.ts.map +1 -0
  254. package/dist/gateway/chat/tools.js +347 -0
  255. package/dist/gateway/chat/tools.js.map +1 -0
  256. package/dist/gateway/chat/tools.test.d.ts +2 -0
  257. package/dist/gateway/chat/tools.test.d.ts.map +1 -0
  258. package/dist/gateway/chat/tools.test.js +136 -0
  259. package/dist/gateway/chat/tools.test.js.map +1 -0
  260. package/dist/gateway/console-api/access.d.ts +52 -0
  261. package/dist/gateway/console-api/access.d.ts.map +1 -0
  262. package/dist/gateway/console-api/access.js +171 -0
  263. package/dist/gateway/console-api/access.js.map +1 -0
  264. package/dist/gateway/console-api/deps.d.ts +52 -0
  265. package/dist/gateway/console-api/deps.d.ts.map +1 -0
  266. package/dist/gateway/console-api/deps.js +2 -0
  267. package/dist/gateway/console-api/deps.js.map +1 -0
  268. package/dist/gateway/console-api/handlers/admin-tokens.d.ts +8 -0
  269. package/dist/gateway/console-api/handlers/admin-tokens.d.ts.map +1 -0
  270. package/dist/gateway/console-api/handlers/admin-tokens.js +48 -0
  271. package/dist/gateway/console-api/handlers/admin-tokens.js.map +1 -0
  272. package/dist/gateway/console-api/handlers/audit.d.ts +8 -0
  273. package/dist/gateway/console-api/handlers/audit.d.ts.map +1 -0
  274. package/dist/gateway/console-api/handlers/audit.js +19 -0
  275. package/dist/gateway/console-api/handlers/audit.js.map +1 -0
  276. package/dist/gateway/console-api/handlers/audit.test.d.ts +2 -0
  277. package/dist/gateway/console-api/handlers/audit.test.d.ts.map +1 -0
  278. package/dist/gateway/console-api/handlers/audit.test.js +241 -0
  279. package/dist/gateway/console-api/handlers/audit.test.js.map +1 -0
  280. package/dist/gateway/console-api/handlers/data-settings.test.d.ts +2 -0
  281. package/dist/gateway/console-api/handlers/data-settings.test.d.ts.map +1 -0
  282. package/dist/gateway/console-api/handlers/data-settings.test.js +264 -0
  283. package/dist/gateway/console-api/handlers/data-settings.test.js.map +1 -0
  284. package/dist/gateway/console-api/handlers/index.d.ts +4 -0
  285. package/dist/gateway/console-api/handlers/index.d.ts.map +1 -0
  286. package/dist/gateway/console-api/handlers/index.js +24 -0
  287. package/dist/gateway/console-api/handlers/index.js.map +1 -0
  288. package/dist/gateway/console-api/handlers/keys.d.ts +13 -0
  289. package/dist/gateway/console-api/handlers/keys.d.ts.map +1 -0
  290. package/dist/gateway/console-api/handlers/keys.js +128 -0
  291. package/dist/gateway/console-api/handlers/keys.js.map +1 -0
  292. package/dist/gateway/console-api/handlers/keys.test.d.ts +2 -0
  293. package/dist/gateway/console-api/handlers/keys.test.d.ts.map +1 -0
  294. package/dist/gateway/console-api/handlers/keys.test.js +166 -0
  295. package/dist/gateway/console-api/handlers/keys.test.js.map +1 -0
  296. package/dist/gateway/console-api/handlers/network-buyer.d.ts +22 -0
  297. package/dist/gateway/console-api/handlers/network-buyer.d.ts.map +1 -0
  298. package/dist/gateway/console-api/handlers/network-buyer.js +39 -0
  299. package/dist/gateway/console-api/handlers/network-buyer.js.map +1 -0
  300. package/dist/gateway/console-api/handlers/network-mapping.d.ts +33 -0
  301. package/dist/gateway/console-api/handlers/network-mapping.d.ts.map +1 -0
  302. package/dist/gateway/console-api/handlers/network-mapping.js +219 -0
  303. package/dist/gateway/console-api/handlers/network-mapping.js.map +1 -0
  304. package/dist/gateway/console-api/handlers/network-test-helpers.d.ts +35 -0
  305. package/dist/gateway/console-api/handlers/network-test-helpers.d.ts.map +1 -0
  306. package/dist/gateway/console-api/handlers/network-test-helpers.js +121 -0
  307. package/dist/gateway/console-api/handlers/network-test-helpers.js.map +1 -0
  308. package/dist/gateway/console-api/handlers/network.d.ts +15 -0
  309. package/dist/gateway/console-api/handlers/network.d.ts.map +1 -0
  310. package/dist/gateway/console-api/handlers/network.js +57 -0
  311. package/dist/gateway/console-api/handlers/network.js.map +1 -0
  312. package/dist/gateway/console-api/handlers/network.test.d.ts +2 -0
  313. package/dist/gateway/console-api/handlers/network.test.d.ts.map +1 -0
  314. package/dist/gateway/console-api/handlers/network.test.js +383 -0
  315. package/dist/gateway/console-api/handlers/network.test.js.map +1 -0
  316. package/dist/gateway/console-api/handlers/org.d.ts +10 -0
  317. package/dist/gateway/console-api/handlers/org.d.ts.map +1 -0
  318. package/dist/gateway/console-api/handlers/org.js +150 -0
  319. package/dist/gateway/console-api/handlers/org.js.map +1 -0
  320. package/dist/gateway/console-api/handlers/peer-lists.d.ts +5 -0
  321. package/dist/gateway/console-api/handlers/peer-lists.d.ts.map +1 -0
  322. package/dist/gateway/console-api/handlers/peer-lists.js +43 -0
  323. package/dist/gateway/console-api/handlers/peer-lists.js.map +1 -0
  324. package/dist/gateway/console-api/handlers/presets.d.ts +9 -0
  325. package/dist/gateway/console-api/handlers/presets.d.ts.map +1 -0
  326. package/dist/gateway/console-api/handlers/presets.js +79 -0
  327. package/dist/gateway/console-api/handlers/presets.js.map +1 -0
  328. package/dist/gateway/console-api/handlers/routing.d.ts +5 -0
  329. package/dist/gateway/console-api/handlers/routing.d.ts.map +1 -0
  330. package/dist/gateway/console-api/handlers/routing.js +20 -0
  331. package/dist/gateway/console-api/handlers/routing.js.map +1 -0
  332. package/dist/gateway/console-api/handlers/settings.d.ts +10 -0
  333. package/dist/gateway/console-api/handlers/settings.d.ts.map +1 -0
  334. package/dist/gateway/console-api/handlers/settings.js +38 -0
  335. package/dist/gateway/console-api/handlers/settings.js.map +1 -0
  336. package/dist/gateway/console-api/handlers/status.d.ts +9 -0
  337. package/dist/gateway/console-api/handlers/status.d.ts.map +1 -0
  338. package/dist/gateway/console-api/handlers/status.js +47 -0
  339. package/dist/gateway/console-api/handlers/status.js.map +1 -0
  340. package/dist/gateway/console-api/handlers/status.test.d.ts +2 -0
  341. package/dist/gateway/console-api/handlers/status.test.d.ts.map +1 -0
  342. package/dist/gateway/console-api/handlers/status.test.js +82 -0
  343. package/dist/gateway/console-api/handlers/status.test.js.map +1 -0
  344. package/dist/gateway/console-api/handlers/usage.d.ts +10 -0
  345. package/dist/gateway/console-api/handlers/usage.d.ts.map +1 -0
  346. package/dist/gateway/console-api/handlers/usage.js +68 -0
  347. package/dist/gateway/console-api/handlers/usage.js.map +1 -0
  348. package/dist/gateway/console-api/handlers/wallet-card-link.d.ts +29 -0
  349. package/dist/gateway/console-api/handlers/wallet-card-link.d.ts.map +1 -0
  350. package/dist/gateway/console-api/handlers/wallet-card-link.js +46 -0
  351. package/dist/gateway/console-api/handlers/wallet-card-link.js.map +1 -0
  352. package/dist/gateway/console-api/handlers/wallet-chain.d.ts +26 -0
  353. package/dist/gateway/console-api/handlers/wallet-chain.d.ts.map +1 -0
  354. package/dist/gateway/console-api/handlers/wallet-chain.js +80 -0
  355. package/dist/gateway/console-api/handlers/wallet-chain.js.map +1 -0
  356. package/dist/gateway/console-api/handlers/wallet-mapping.d.ts +45 -0
  357. package/dist/gateway/console-api/handlers/wallet-mapping.d.ts.map +1 -0
  358. package/dist/gateway/console-api/handlers/wallet-mapping.js +202 -0
  359. package/dist/gateway/console-api/handlers/wallet-mapping.js.map +1 -0
  360. package/dist/gateway/console-api/handlers/wallet-operator.d.ts +41 -0
  361. package/dist/gateway/console-api/handlers/wallet-operator.d.ts.map +1 -0
  362. package/dist/gateway/console-api/handlers/wallet-operator.js +198 -0
  363. package/dist/gateway/console-api/handlers/wallet-operator.js.map +1 -0
  364. package/dist/gateway/console-api/handlers/wallet-operator.test.d.ts +2 -0
  365. package/dist/gateway/console-api/handlers/wallet-operator.test.d.ts.map +1 -0
  366. package/dist/gateway/console-api/handlers/wallet-operator.test.js +195 -0
  367. package/dist/gateway/console-api/handlers/wallet-operator.test.js.map +1 -0
  368. package/dist/gateway/console-api/handlers/wallet.d.ts +61 -0
  369. package/dist/gateway/console-api/handlers/wallet.d.ts.map +1 -0
  370. package/dist/gateway/console-api/handlers/wallet.js +221 -0
  371. package/dist/gateway/console-api/handlers/wallet.js.map +1 -0
  372. package/dist/gateway/console-api/handlers/wallet.test.d.ts +2 -0
  373. package/dist/gateway/console-api/handlers/wallet.test.d.ts.map +1 -0
  374. package/dist/gateway/console-api/handlers/wallet.test.js +581 -0
  375. package/dist/gateway/console-api/handlers/wallet.test.js.map +1 -0
  376. package/dist/gateway/console-api/handlers/workspaces.d.ts +12 -0
  377. package/dist/gateway/console-api/handlers/workspaces.d.ts.map +1 -0
  378. package/dist/gateway/console-api/handlers/workspaces.js +96 -0
  379. package/dist/gateway/console-api/handlers/workspaces.js.map +1 -0
  380. package/dist/gateway/console-api/operator-types.d.ts +68 -0
  381. package/dist/gateway/console-api/operator-types.d.ts.map +1 -0
  382. package/dist/gateway/console-api/operator-types.js +21 -0
  383. package/dist/gateway/console-api/operator-types.js.map +1 -0
  384. package/dist/gateway/console-api/router.d.ts +97 -0
  385. package/dist/gateway/console-api/router.d.ts.map +1 -0
  386. package/dist/gateway/console-api/router.js +69 -0
  387. package/dist/gateway/console-api/router.js.map +1 -0
  388. package/dist/gateway/console-api/routes.test.d.ts +2 -0
  389. package/dist/gateway/console-api/routes.test.d.ts.map +1 -0
  390. package/dist/gateway/console-api/routes.test.js +331 -0
  391. package/dist/gateway/console-api/routes.test.js.map +1 -0
  392. package/dist/gateway/console-api/serialize.d.ts +33 -0
  393. package/dist/gateway/console-api/serialize.d.ts.map +1 -0
  394. package/dist/gateway/console-api/serialize.js +179 -0
  395. package/dist/gateway/console-api/serialize.js.map +1 -0
  396. package/dist/gateway/console-api/server.d.ts +38 -0
  397. package/dist/gateway/console-api/server.d.ts.map +1 -0
  398. package/dist/gateway/console-api/server.js +308 -0
  399. package/dist/gateway/console-api/server.js.map +1 -0
  400. package/dist/gateway/console-api/server.test.d.ts +2 -0
  401. package/dist/gateway/console-api/server.test.d.ts.map +1 -0
  402. package/dist/gateway/console-api/server.test.js +149 -0
  403. package/dist/gateway/console-api/server.test.js.map +1 -0
  404. package/dist/gateway/console-api/test-support.d.ts +59 -0
  405. package/dist/gateway/console-api/test-support.d.ts.map +1 -0
  406. package/dist/gateway/console-api/test-support.js +120 -0
  407. package/dist/gateway/console-api/test-support.js.map +1 -0
  408. package/dist/gateway/console-api/types.d.ts +779 -0
  409. package/dist/gateway/console-api/types.d.ts.map +1 -0
  410. package/dist/gateway/console-api/types.js +6 -0
  411. package/dist/gateway/console-api/types.js.map +1 -0
  412. package/dist/gateway/console-location.d.ts +21 -0
  413. package/dist/gateway/console-location.d.ts.map +1 -0
  414. package/dist/gateway/console-location.js +41 -0
  415. package/dist/gateway/console-location.js.map +1 -0
  416. package/dist/gateway/console-recovery.d.ts +34 -0
  417. package/dist/gateway/console-recovery.d.ts.map +1 -0
  418. package/dist/gateway/console-recovery.js +94 -0
  419. package/dist/gateway/console-recovery.js.map +1 -0
  420. package/dist/gateway/console-recovery.test.d.ts +2 -0
  421. package/dist/gateway/console-recovery.test.d.ts.map +1 -0
  422. package/dist/gateway/console-recovery.test.js +106 -0
  423. package/dist/gateway/console-recovery.test.js.map +1 -0
  424. package/dist/gateway/console.d.ts +18 -0
  425. package/dist/gateway/console.d.ts.map +1 -0
  426. package/dist/gateway/console.js +101 -0
  427. package/dist/gateway/console.js.map +1 -0
  428. package/dist/gateway/console.test.d.ts +2 -0
  429. package/dist/gateway/console.test.d.ts.map +1 -0
  430. package/dist/gateway/console.test.js +165 -0
  431. package/dist/gateway/console.test.js.map +1 -0
  432. package/dist/gateway/errors.d.ts +3 -0
  433. package/dist/gateway/errors.d.ts.map +1 -0
  434. package/dist/gateway/errors.js +5 -0
  435. package/dist/gateway/errors.js.map +1 -0
  436. package/dist/gateway/exposure.d.ts +33 -0
  437. package/dist/gateway/exposure.d.ts.map +1 -0
  438. package/dist/gateway/exposure.js +146 -0
  439. package/dist/gateway/exposure.js.map +1 -0
  440. package/dist/gateway/exposure.test.d.ts +2 -0
  441. package/dist/gateway/exposure.test.d.ts.map +1 -0
  442. package/dist/gateway/exposure.test.js +93 -0
  443. package/dist/gateway/exposure.test.js.map +1 -0
  444. package/dist/gateway/gateway-policy.test.d.ts +2 -0
  445. package/dist/gateway/gateway-policy.test.d.ts.map +1 -0
  446. package/dist/gateway/gateway-policy.test.js +404 -0
  447. package/dist/gateway/gateway-policy.test.js.map +1 -0
  448. package/dist/gateway/gateway.test.js +47 -25
  449. package/dist/gateway/gateway.test.js.map +1 -1
  450. package/dist/gateway/keys.d.ts +2 -0
  451. package/dist/gateway/keys.d.ts.map +1 -1
  452. package/dist/gateway/keys.js +2 -0
  453. package/dist/gateway/keys.js.map +1 -1
  454. package/dist/gateway/limits.d.ts +32 -8
  455. package/dist/gateway/limits.d.ts.map +1 -1
  456. package/dist/gateway/limits.js +27 -11
  457. package/dist/gateway/limits.js.map +1 -1
  458. package/dist/gateway/observability.d.ts +51 -0
  459. package/dist/gateway/observability.d.ts.map +1 -0
  460. package/dist/gateway/observability.js +136 -0
  461. package/dist/gateway/observability.js.map +1 -0
  462. package/dist/gateway/policy-resolver.d.ts +73 -0
  463. package/dist/gateway/policy-resolver.d.ts.map +1 -0
  464. package/dist/gateway/policy-resolver.js +142 -0
  465. package/dist/gateway/policy-resolver.js.map +1 -0
  466. package/dist/gateway/policy-resolver.test.d.ts +2 -0
  467. package/dist/gateway/policy-resolver.test.d.ts.map +1 -0
  468. package/dist/gateway/policy-resolver.test.js +273 -0
  469. package/dist/gateway/policy-resolver.test.js.map +1 -0
  470. package/dist/gateway/request-errors.test.d.ts +2 -0
  471. package/dist/gateway/request-errors.test.d.ts.map +1 -0
  472. package/dist/gateway/request-errors.test.js +108 -0
  473. package/dist/gateway/request-errors.test.js.map +1 -0
  474. package/dist/gateway/request-shaping.d.ts +25 -0
  475. package/dist/gateway/request-shaping.d.ts.map +1 -0
  476. package/dist/gateway/request-shaping.js +66 -0
  477. package/dist/gateway/request-shaping.js.map +1 -0
  478. package/dist/gateway/response-usage.d.ts +35 -0
  479. package/dist/gateway/response-usage.d.ts.map +1 -0
  480. package/dist/gateway/response-usage.js +167 -0
  481. package/dist/gateway/response-usage.js.map +1 -0
  482. package/dist/gateway/response-usage.test.d.ts +2 -0
  483. package/dist/gateway/response-usage.test.d.ts.map +1 -0
  484. package/dist/gateway/response-usage.test.js +78 -0
  485. package/dist/gateway/response-usage.test.js.map +1 -0
  486. package/dist/gateway/runtime.d.ts +25 -0
  487. package/dist/gateway/runtime.d.ts.map +1 -1
  488. package/dist/gateway/runtime.js +39 -19
  489. package/dist/gateway/runtime.js.map +1 -1
  490. package/dist/gateway/server.d.ts +68 -2
  491. package/dist/gateway/server.d.ts.map +1 -1
  492. package/dist/gateway/server.js +532 -116
  493. package/dist/gateway/server.js.map +1 -1
  494. package/dist/gateway/services/audit.d.ts +16 -0
  495. package/dist/gateway/services/audit.d.ts.map +1 -0
  496. package/dist/gateway/services/audit.js +18 -0
  497. package/dist/gateway/services/audit.js.map +1 -0
  498. package/dist/gateway/services/context.d.ts +66 -0
  499. package/dist/gateway/services/context.d.ts.map +1 -0
  500. package/dist/gateway/services/context.js +52 -0
  501. package/dist/gateway/services/context.js.map +1 -0
  502. package/dist/gateway/services/keys.d.ts +78 -0
  503. package/dist/gateway/services/keys.d.ts.map +1 -0
  504. package/dist/gateway/services/keys.js +232 -0
  505. package/dist/gateway/services/keys.js.map +1 -0
  506. package/dist/gateway/services/members.d.ts +72 -0
  507. package/dist/gateway/services/members.d.ts.map +1 -0
  508. package/dist/gateway/services/members.js +161 -0
  509. package/dist/gateway/services/members.js.map +1 -0
  510. package/dist/gateway/services/network.d.ts +36 -0
  511. package/dist/gateway/services/network.d.ts.map +1 -0
  512. package/dist/gateway/services/network.js +147 -0
  513. package/dist/gateway/services/network.js.map +1 -0
  514. package/dist/gateway/services/operator.d.ts +98 -0
  515. package/dist/gateway/services/operator.d.ts.map +1 -0
  516. package/dist/gateway/services/operator.js +170 -0
  517. package/dist/gateway/services/operator.js.map +1 -0
  518. package/dist/gateway/services/operator.test.d.ts +2 -0
  519. package/dist/gateway/services/operator.test.d.ts.map +1 -0
  520. package/dist/gateway/services/operator.test.js +184 -0
  521. package/dist/gateway/services/operator.test.js.map +1 -0
  522. package/dist/gateway/services/peer-lists.d.ts +20 -0
  523. package/dist/gateway/services/peer-lists.d.ts.map +1 -0
  524. package/dist/gateway/services/peer-lists.js +134 -0
  525. package/dist/gateway/services/peer-lists.js.map +1 -0
  526. package/dist/gateway/services/presets.d.ts +34 -0
  527. package/dist/gateway/services/presets.d.ts.map +1 -0
  528. package/dist/gateway/services/presets.js +134 -0
  529. package/dist/gateway/services/presets.js.map +1 -0
  530. package/dist/gateway/services/routing.d.ts +13 -0
  531. package/dist/gateway/services/routing.d.ts.map +1 -0
  532. package/dist/gateway/services/routing.js +18 -0
  533. package/dist/gateway/services/routing.js.map +1 -0
  534. package/dist/gateway/services/services.test.d.ts +2 -0
  535. package/dist/gateway/services/services.test.d.ts.map +1 -0
  536. package/dist/gateway/services/services.test.js +476 -0
  537. package/dist/gateway/services/services.test.js.map +1 -0
  538. package/dist/gateway/services/settings.d.ts +68 -0
  539. package/dist/gateway/services/settings.d.ts.map +1 -0
  540. package/dist/gateway/services/settings.js +580 -0
  541. package/dist/gateway/services/settings.js.map +1 -0
  542. package/dist/gateway/services/tokens.d.ts +29 -0
  543. package/dist/gateway/services/tokens.d.ts.map +1 -0
  544. package/dist/gateway/services/tokens.js +48 -0
  545. package/dist/gateway/services/tokens.js.map +1 -0
  546. package/dist/gateway/services/usage.d.ts +55 -0
  547. package/dist/gateway/services/usage.d.ts.map +1 -0
  548. package/dist/gateway/services/usage.js +225 -0
  549. package/dist/gateway/services/usage.js.map +1 -0
  550. package/dist/gateway/services/wallet-address-env.test.d.ts +2 -0
  551. package/dist/gateway/services/wallet-address-env.test.d.ts.map +1 -0
  552. package/dist/gateway/services/wallet-address-env.test.js +119 -0
  553. package/dist/gateway/services/wallet-address-env.test.js.map +1 -0
  554. package/dist/gateway/services/wallet-address.d.ts +40 -0
  555. package/dist/gateway/services/wallet-address.d.ts.map +1 -0
  556. package/dist/gateway/services/wallet-address.js +116 -0
  557. package/dist/gateway/services/wallet-address.js.map +1 -0
  558. package/dist/gateway/services/wallet-address.test.d.ts +2 -0
  559. package/dist/gateway/services/wallet-address.test.d.ts.map +1 -0
  560. package/dist/gateway/services/wallet-address.test.js +84 -0
  561. package/dist/gateway/services/wallet-address.test.js.map +1 -0
  562. package/dist/gateway/services/workspaces.d.ts +75 -0
  563. package/dist/gateway/services/workspaces.d.ts.map +1 -0
  564. package/dist/gateway/services/workspaces.js +228 -0
  565. package/dist/gateway/services/workspaces.js.map +1 -0
  566. package/dist/gateway/spend-durability.test.d.ts +2 -0
  567. package/dist/gateway/spend-durability.test.d.ts.map +1 -0
  568. package/dist/gateway/spend-durability.test.js +330 -0
  569. package/dist/gateway/spend-durability.test.js.map +1 -0
  570. package/dist/gateway/spend-feed.d.ts +11 -1
  571. package/dist/gateway/spend-feed.d.ts.map +1 -1
  572. package/dist/gateway/spend-feed.js +17 -4
  573. package/dist/gateway/spend-feed.js.map +1 -1
  574. package/dist/gateway/spend-feed.test.d.ts +2 -0
  575. package/dist/gateway/spend-feed.test.d.ts.map +1 -0
  576. package/dist/gateway/spend-feed.test.js +34 -0
  577. package/dist/gateway/spend-feed.test.js.map +1 -0
  578. package/dist/gateway/store-data.test.d.ts +2 -0
  579. package/dist/gateway/store-data.test.d.ts.map +1 -0
  580. package/dist/gateway/store-data.test.js +346 -0
  581. package/dist/gateway/store-data.test.js.map +1 -0
  582. package/dist/gateway/store-migrations.d.ts +6 -0
  583. package/dist/gateway/store-migrations.d.ts.map +1 -0
  584. package/dist/gateway/store-migrations.js +301 -0
  585. package/dist/gateway/store-migrations.js.map +1 -0
  586. package/dist/gateway/store.d.ts +595 -10
  587. package/dist/gateway/store.d.ts.map +1 -1
  588. package/dist/gateway/store.js +1242 -120
  589. package/dist/gateway/store.js.map +1 -1
  590. package/dist/gateway/store.test.d.ts +2 -0
  591. package/dist/gateway/store.test.d.ts.map +1 -0
  592. package/dist/gateway/store.test.js +185 -0
  593. package/dist/gateway/store.test.js.map +1 -0
  594. package/dist/proxy/buyer-chain-reader.d.ts +68 -0
  595. package/dist/proxy/buyer-chain-reader.d.ts.map +1 -0
  596. package/dist/proxy/buyer-chain-reader.js +152 -0
  597. package/dist/proxy/buyer-chain-reader.js.map +1 -0
  598. package/dist/proxy/buyer-chain-reader.test.d.ts +2 -0
  599. package/dist/proxy/buyer-chain-reader.test.d.ts.map +1 -0
  600. package/dist/proxy/buyer-chain-reader.test.js +102 -0
  601. package/dist/proxy/buyer-chain-reader.test.js.map +1 -0
  602. package/dist/proxy/buyer-proxy.d.ts +169 -3
  603. package/dist/proxy/buyer-proxy.d.ts.map +1 -1
  604. package/dist/proxy/buyer-proxy.js +873 -117
  605. package/dist/proxy/buyer-proxy.js.map +1 -1
  606. package/dist/proxy/buyer-proxy.test.js +31 -0
  607. package/dist/proxy/buyer-proxy.test.js.map +1 -1
  608. package/dist/proxy/chain-read-cache.d.ts +47 -0
  609. package/dist/proxy/chain-read-cache.d.ts.map +1 -0
  610. package/dist/proxy/chain-read-cache.js +110 -0
  611. package/dist/proxy/chain-read-cache.js.map +1 -0
  612. package/dist/proxy/chain-read-cache.test.d.ts +2 -0
  613. package/dist/proxy/chain-read-cache.test.d.ts.map +1 -0
  614. package/dist/proxy/chain-read-cache.test.js +75 -0
  615. package/dist/proxy/chain-read-cache.test.js.map +1 -0
  616. package/dist/proxy/chain-rpc-test-support.d.ts +31 -0
  617. package/dist/proxy/chain-rpc-test-support.d.ts.map +1 -0
  618. package/dist/proxy/chain-rpc-test-support.js +136 -0
  619. package/dist/proxy/chain-rpc-test-support.js.map +1 -0
  620. package/dist/proxy/chain-rpc.d.ts +121 -0
  621. package/dist/proxy/chain-rpc.d.ts.map +1 -0
  622. package/dist/proxy/chain-rpc.js +420 -0
  623. package/dist/proxy/chain-rpc.js.map +1 -0
  624. package/dist/proxy/chain-rpc.test.d.ts +2 -0
  625. package/dist/proxy/chain-rpc.test.d.ts.map +1 -0
  626. package/dist/proxy/chain-rpc.test.js +180 -0
  627. package/dist/proxy/chain-rpc.test.js.map +1 -0
  628. package/dist/proxy/deposit-watch-hub.d.ts +47 -0
  629. package/dist/proxy/deposit-watch-hub.d.ts.map +1 -0
  630. package/dist/proxy/deposit-watch-hub.js +111 -0
  631. package/dist/proxy/deposit-watch-hub.js.map +1 -0
  632. package/dist/proxy/deposit-watch-hub.test.d.ts +2 -0
  633. package/dist/proxy/deposit-watch-hub.test.d.ts.map +1 -0
  634. package/dist/proxy/deposit-watch-hub.test.js +133 -0
  635. package/dist/proxy/deposit-watch-hub.test.js.map +1 -0
  636. package/dist/proxy/deposit-watcher.d.ts +44 -4
  637. package/dist/proxy/deposit-watcher.d.ts.map +1 -1
  638. package/dist/proxy/deposit-watcher.js +76 -11
  639. package/dist/proxy/deposit-watcher.js.map +1 -1
  640. package/dist/proxy/deposit-watcher.test.js +54 -1
  641. package/dist/proxy/deposit-watcher.test.js.map +1 -1
  642. package/dist/proxy/gateway-policy.test.d.ts +2 -0
  643. package/dist/proxy/gateway-policy.test.d.ts.map +1 -0
  644. package/dist/proxy/gateway-policy.test.js +576 -0
  645. package/dist/proxy/gateway-policy.test.js.map +1 -0
  646. package/dist/proxy/network-models.d.ts +2 -0
  647. package/dist/proxy/network-models.d.ts.map +1 -1
  648. package/dist/proxy/network-models.js +3 -1
  649. package/dist/proxy/network-models.js.map +1 -1
  650. package/dist/proxy/route-policy.d.ts +97 -0
  651. package/dist/proxy/route-policy.d.ts.map +1 -0
  652. package/dist/proxy/route-policy.js +230 -0
  653. package/dist/proxy/route-policy.js.map +1 -0
  654. package/dist/proxy/route-policy.test.d.ts +2 -0
  655. package/dist/proxy/route-policy.test.d.ts.map +1 -0
  656. package/dist/proxy/route-policy.test.js +120 -0
  657. package/dist/proxy/route-policy.test.js.map +1 -0
  658. package/dist/proxy/spend-attribution.d.ts +41 -10
  659. package/dist/proxy/spend-attribution.d.ts.map +1 -1
  660. package/dist/proxy/spend-attribution.js +133 -37
  661. package/dist/proxy/spend-attribution.js.map +1 -1
  662. package/dist/proxy/tee-control.d.ts +3 -1
  663. package/dist/proxy/tee-control.d.ts.map +1 -1
  664. package/dist/proxy/tee-control.js +5 -3
  665. package/dist/proxy/tee-control.js.map +1 -1
  666. package/dist/proxy/telemetry.d.ts +2 -1
  667. package/dist/proxy/telemetry.d.ts.map +1 -1
  668. package/dist/proxy/telemetry.js +10 -5
  669. package/dist/proxy/telemetry.js.map +1 -1
  670. package/dist/routing-policy/policy.d.ts +149 -0
  671. package/dist/routing-policy/policy.d.ts.map +1 -0
  672. package/dist/routing-policy/policy.js +450 -0
  673. package/dist/routing-policy/policy.js.map +1 -0
  674. package/dist/routing-policy/policy.test.d.ts +2 -0
  675. package/dist/routing-policy/policy.test.d.ts.map +1 -0
  676. package/dist/routing-policy/policy.test.js +134 -0
  677. package/dist/routing-policy/policy.test.js.map +1 -0
  678. package/package.json +15 -7
@@ -0,0 +1,121 @@
1
+ /** Test doubles shared by the wallet and network handler tests: a fake buyer daemon and a request runner. */
2
+ import * as http from 'node:http';
3
+ import { encodePolicyHeader, GATEWAY_CONTROL_HEADER, ROUTING_POLICY_HEADER } from '../../../routing-policy/policy.js';
4
+ import { ConsoleError } from '../router.js';
5
+ export const TEST_SECRET = 'test-control-secret';
6
+ /** A node:http server on an ephemeral port answering `/_antseed/*` from `routes` (keyed by "METHOD /path"). */
7
+ export async function startFakeBuyer(routes) {
8
+ const requests = [];
9
+ const server = http.createServer((req, res) => {
10
+ const chunks = [];
11
+ req.on('data', (chunk) => chunks.push(chunk));
12
+ req.on('end', () => {
13
+ const text = Buffer.concat(chunks).toString('utf8');
14
+ const recorded = { method: req.method ?? 'GET', url: req.url ?? '/', headers: req.headers, body: text ? JSON.parse(text) : undefined };
15
+ requests.push(recorded);
16
+ const path = recorded.url.split('?')[0];
17
+ const reply = routes[`${recorded.method} ${path}`]?.(recorded) ?? { status: 404, body: { ok: false, error: 'not found' } };
18
+ res.writeHead(reply.status ?? 200, { 'content-type': 'application/json' });
19
+ res.end(JSON.stringify(reply.body));
20
+ });
21
+ });
22
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
23
+ const port = server.address().port;
24
+ const client = (path, init = {}) => fetch(`http://127.0.0.1:${port}${path}`, {
25
+ method: init.method ?? 'GET',
26
+ headers: {
27
+ [GATEWAY_CONTROL_HEADER]: TEST_SECRET,
28
+ ...(init.body !== undefined ? { 'content-type': 'application/json' } : {}),
29
+ ...(init.policy ? { [ROUTING_POLICY_HEADER]: encodePolicyHeader(init.policy) } : {}),
30
+ },
31
+ ...(init.body !== undefined ? { body: JSON.stringify(init.body) } : {}),
32
+ });
33
+ return {
34
+ port,
35
+ requests,
36
+ client,
37
+ close: () => new Promise((resolve) => server.close(() => resolve())),
38
+ };
39
+ }
40
+ export function fakeDeps(store, now = () => 1_700_000_000_000) {
41
+ return {
42
+ store: store,
43
+ dataDir: '/nonexistent/antseed-test',
44
+ configPath: '/nonexistent/antseed-test/config.json',
45
+ buyerPort: 1,
46
+ controlSecret: TEST_SECRET,
47
+ publicUrl: null,
48
+ version: 'test',
49
+ now,
50
+ log: () => { },
51
+ };
52
+ }
53
+ export function memberPrincipal(memberId, roles, orgRole = 'member') {
54
+ return { kind: 'member', memberId, orgRole, workspaceRoles: new Map(Object.entries(roles)), sessionId: `session-${memberId}` };
55
+ }
56
+ /** Spec semantics of `requireWorkspaceAccess`, for handler tests. */
57
+ export function fakeRequireWorkspaceAccess(_store, principal, workspaceId, minRole = 'member') {
58
+ if (!principal)
59
+ throw new ConsoleError(401, 'unauthenticated', 'Sign in.');
60
+ if (principal.kind === 'token' && principal.scope === 'admin')
61
+ return;
62
+ if (principal.kind === 'member' && principal.orgRole !== 'member')
63
+ return;
64
+ const role = principal.kind === 'member' ? principal.workspaceRoles.get(workspaceId) : undefined;
65
+ if (!role || (minRole === 'admin' && role !== 'admin'))
66
+ throw new ConsoleError(403, 'forbidden', 'No access.');
67
+ }
68
+ export function fakeCanSeeWorkspace(_store, principal, workspaceId) {
69
+ try {
70
+ fakeRequireWorkspaceAccess(_store, principal, workspaceId);
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ export function fakeRequireOrgAdmin(principal) {
78
+ if (!principal)
79
+ throw new ConsoleError(401, 'unauthenticated', 'Sign in.');
80
+ if (principal.kind === 'token' && principal.scope === 'admin')
81
+ return;
82
+ if (principal.kind === 'member' && principal.orgRole !== 'member')
83
+ return;
84
+ throw new ConsoleError(403, 'forbidden', 'Organization admins only.');
85
+ }
86
+ /** Runs a registered route the way the console server would, minus auth. */
87
+ export async function call(router, method, pathWithQuery, principal, body) {
88
+ const [path, query = ''] = pathWithQuery.split('?');
89
+ const matched = router.match(method, path);
90
+ if (!matched)
91
+ throw new Error(`no route for ${method} ${path}`);
92
+ return matched.route.handler({
93
+ method,
94
+ path: path,
95
+ params: matched.params,
96
+ query: new URLSearchParams(query),
97
+ body,
98
+ headers: {},
99
+ principal,
100
+ raw: {},
101
+ res: {},
102
+ });
103
+ }
104
+ export async function rejectsWith(promise, status, code) {
105
+ try {
106
+ await promise;
107
+ }
108
+ catch (err) {
109
+ if (!(err instanceof ConsoleError))
110
+ throw err;
111
+ if (err.status !== status || (code !== undefined && err.code !== code)) {
112
+ throw new Error(`expected ${status}${code ? ` ${code}` : ''}, got ${err.status} ${err.code}: ${err.message}`);
113
+ }
114
+ return;
115
+ }
116
+ throw new Error(`expected ConsoleError ${status}, but it resolved`);
117
+ }
118
+ export function lastRequest(buyer, match) {
119
+ return [...buyer.requests].reverse().find((request) => match(request.url));
120
+ }
121
+ //# sourceMappingURL=network-test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-test-helpers.js","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/network-test-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** Sellers the buyer knows about, and which of them a request would route to. */
2
+ import { resolvePolicy } from '../../policy-resolver.js';
3
+ import { canSeeWorkspace, requireOrgAdmin } from '../access.js';
4
+ import type { ConsoleDeps } from '../deps.js';
5
+ import { type ConsoleRouter } from '../router.js';
6
+ import { type BuyerClient } from './network-buyer.js';
7
+ /** Seams for tests; production uses the defaults. */
8
+ export interface NetworkRouteOverrides {
9
+ buyer?: BuyerClient;
10
+ canSeeWorkspace?: typeof canSeeWorkspace;
11
+ requireOrgAdmin?: typeof requireOrgAdmin;
12
+ resolvePolicy?: typeof resolvePolicy;
13
+ }
14
+ export declare function registerNetworkRoutes(router: ConsoleRouter, deps: ConsoleDeps, overrides?: NetworkRouteOverrides): void;
15
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/network.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAExD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAEpF,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEzE,qDAAqD;AACrD,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,eAAe,CAAA;IACxC,eAAe,CAAC,EAAE,OAAO,eAAe,CAAA;IACxC,aAAa,CAAC,EAAE,OAAO,aAAa,CAAA;CACrC;AAOD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,GAAE,qBAA0B,GAAG,IAAI,CA6C3H"}
@@ -0,0 +1,57 @@
1
+ /** Sellers the buyer knows about, and which of them a request would route to. */
2
+ import { resolvePolicy } from '../../policy-resolver.js';
3
+ import { buyerLimits, listNetworkModels, listNetworkPeers, previewRoute } from '../../services/network.js';
4
+ import { canSeeWorkspace, requireOrgAdmin } from '../access.js';
5
+ import { ConsoleError } from '../router.js';
6
+ import { defaultBuyerClient } from './network-buyer.js';
7
+ function param(request, name) {
8
+ const value = request.query.get(name)?.trim();
9
+ return value ? value : undefined;
10
+ }
11
+ export function registerNetworkRoutes(router, deps, overrides = {}) {
12
+ const buyer = overrides.buyer ?? defaultBuyerClient(deps);
13
+ const canSee = overrides.canSeeWorkspace ?? canSeeWorkspace;
14
+ const orgAdmin = overrides.requireOrgAdmin ?? requireOrgAdmin;
15
+ const resolve = overrides.resolvePolicy ?? resolvePolicy;
16
+ router.add('GET', '/peers', async () => listNetworkPeers(deps.store, buyer, deps.now()));
17
+ /** Every model on the network with the sellers offering it; unfiltered, like `/peers`. */
18
+ router.add('GET', '/models', async () => listNetworkModels(deps.store, buyer, deps.now()));
19
+ /** Checks the caller may see the policy of every level it names. */
20
+ const previewTarget = (request) => {
21
+ const principal = request.principal;
22
+ const target = {
23
+ keyId: param(request, 'key'),
24
+ workspaceId: param(request, 'workspace'),
25
+ memberId: param(request, 'member'),
26
+ presetSlug: param(request, 'preset'),
27
+ };
28
+ if (principal?.kind === 'key') {
29
+ if (target.keyId && target.keyId !== principal.keyId)
30
+ throw new ConsoleError(403, 'forbidden', 'A key session can preview only its own key.');
31
+ return { keyId: principal.keyId, ...(target.presetSlug ? { presetSlug: target.presetSlug } : {}) };
32
+ }
33
+ if (target.keyId) {
34
+ const keyWorkspace = deps.store.workspaceForKey(target.keyId)?.id;
35
+ if (!keyWorkspace || !canSee(deps.store, principal, keyWorkspace))
36
+ throw new ConsoleError(404, 'not_found', 'Key not found.');
37
+ if (target.workspaceId && target.workspaceId !== keyWorkspace)
38
+ throw new ConsoleError(400, 'bad_request', 'That key belongs to another workspace.');
39
+ target.workspaceId = keyWorkspace;
40
+ }
41
+ if (target.workspaceId && !canSee(deps.store, principal, target.workspaceId)) {
42
+ throw new ConsoleError(403, 'forbidden', 'You do not have access to this workspace.');
43
+ }
44
+ if (target.memberId && !(principal?.kind === 'member' && principal.memberId === target.memberId))
45
+ orgAdmin(principal);
46
+ return Object.fromEntries(Object.entries(target).filter(([, value]) => value !== undefined));
47
+ };
48
+ router.add('GET', '/route-preview', async (request) => {
49
+ const requested = param(request, 'model');
50
+ if (!requested)
51
+ throw new ConsoleError(400, 'bad_request', 'model is required.');
52
+ return previewRoute(deps.store, buyer, requested, previewTarget(request), resolve, deps.configPath);
53
+ }, { allow: ['member', 'token', 'key'] });
54
+ /** The buyer's hard limits, which apply to every key whatever its policy. */
55
+ router.add('GET', '/routing/buyer-limits', async () => buyerLimits(deps.configPath, buyer), { allow: ['member', 'token', 'key'] });
56
+ }
57
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=network.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.test.d.ts","sourceRoot":"","sources":["../../../../src/gateway/console-api/handlers/network.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,383 @@
1
+ import assert from 'node:assert/strict';
2
+ import { after, before, test } from 'node:test';
3
+ import { decodePolicyHeader, GATEWAY_CONTROL_HEADER, ROUTING_POLICY_HEADER } from '../../../routing-policy/policy.js';
4
+ import { ConsoleRouter } from '../router.js';
5
+ import { registerNetworkRoutes } from './network.js';
6
+ import { enrichCandidates, mapNetworkModels, mapPeers, peerServices, teeVerifiedPeers } from './network-mapping.js';
7
+ import { call, fakeCanSeeWorkspace, fakeDeps, fakeRequireOrgAdmin, memberPrincipal, rejectsWith, startFakeBuyer, TEST_SECRET, lastRequest, } from './network-test-helpers.js';
8
+ // Obvious fake peer ids.
9
+ const PEER_A = 'aa'.repeat(20);
10
+ const PEER_B = 'bb'.repeat(20);
11
+ const PEER_C = 'cc'.repeat(20);
12
+ const NOW = 1_700_000_000_000;
13
+ const PEERS_BODY = {
14
+ ok: true,
15
+ peers: [
16
+ {
17
+ peerId: PEER_A,
18
+ displayName: 'Fake TEE Seller',
19
+ providers: ['openai'],
20
+ capabilities: ['verifier.antseed-verifier'],
21
+ providerPricing: {
22
+ openai: {
23
+ defaults: { inputUsdPerMillion: 1, outputUsdPerMillion: 2 },
24
+ services: { 'open-model-a': { inputUsdPerMillion: 0.5, outputUsdPerMillion: 1.5, cachedInputUsdPerMillion: 0.1 } },
25
+ },
26
+ },
27
+ providerServiceCategories: { openai: { services: { 'open-model-a': ['chat', 'coding'], 'open-model-b': ['chat'] } } },
28
+ reputationScore: 80,
29
+ onChainReputationScore: 61,
30
+ trust: { score: 72, washFlagged: false },
31
+ onChainPoolStakeAnts: 1200,
32
+ onChainUsageShareBps: 250,
33
+ onChainWashFlagged: false,
34
+ verificationResults: { verified: false, checkedAtMs: 1, domains: [], github: [] },
35
+ lastSeen: NOW - 5_000,
36
+ },
37
+ {
38
+ peerId: PEER_B,
39
+ providers: ['anthropic'],
40
+ capabilities: [],
41
+ providerPricing: { anthropic: { defaults: { inputUsdPerMillion: 3, outputUsdPerMillion: 15 } } },
42
+ onChainWashFlagged: true,
43
+ verificationResults: {
44
+ verified: true,
45
+ checkedAtMs: 1,
46
+ domains: [{ domain: 'Seller.Example.com', verified: true }, { domain: 'unchecked.example.com', verified: false }],
47
+ github: [{ username: 'fake-seller', repository: 'models', verified: true }, { username: 'bad name!', verified: true }],
48
+ },
49
+ lastSeen: NOW - 60_000,
50
+ },
51
+ ],
52
+ };
53
+ const HEALTH_BODY = {
54
+ ok: true,
55
+ peers: [
56
+ { peerId: PEER_B, failureStreak: 3, cooldownUntil: NOW + 30_000, coolingDown: true },
57
+ { peerId: PEER_A, failureStreak: 0, cooldownUntil: 0, coolingDown: false },
58
+ ],
59
+ };
60
+ const TEE_SNAPSHOT = {
61
+ sessionId: 's',
62
+ verificationEnabled: true,
63
+ evidence: [{ peerId: PEER_A, verifierId: 'antseed-verifier', fingerprint: 'f', checkedAt: NOW - 1000, expiresAt: NOW + 60_000, sellerNodeVerified: true, claims: [] }],
64
+ };
65
+ // The buyer's `/v1/models`, trimmed to the fields the console reads.
66
+ const MODELS_BODY = {
67
+ object: 'list',
68
+ data: [
69
+ {
70
+ id: 'open-model-a',
71
+ name: 'Open Model A',
72
+ aliases: ['open-model-a', 'open-model-a-latest'],
73
+ type: 'text',
74
+ context_length: 32_000,
75
+ peers: [
76
+ {
77
+ peerId: PEER_A, displayName: 'Fake TEE Seller', provider: 'openai', serviceId: 'open-model-a', protocol: 'openai-chat-completions', protocols: ['openai-chat-completions', 'openai-responses'],
78
+ type: 'text', advertisedVerifierIds: ['antseed-verifier'], capabilities: { contextWindow: 128_000, toolUse: true, inputs: ['text', 'image'] },
79
+ reputationScore: 61, effectiveReputationScore: 64, onChainReputationScore: 61, inputUsdPerMillion: 0.5, outputUsdPerMillion: 1.5, cachedInputUsdPerMillion: 0.1,
80
+ },
81
+ {
82
+ peerId: PEER_B, provider: 'anthropic', serviceId: 'Open-Model-A', protocol: null, protocols: [], type: 'text', capabilities: { contextWindow: 32_000, reasoning: false },
83
+ reputationScore: null, effectiveReputationScore: null, onChainReputationScore: null, inputUsdPerMillion: 0, outputUsdPerMillion: 0,
84
+ },
85
+ ],
86
+ },
87
+ {
88
+ id: 'open-image-model',
89
+ name: 'Open Image Model',
90
+ aliases: [],
91
+ type: 'image',
92
+ peers: [{ peerId: PEER_C, provider: 'fal', serviceId: 'open-image-model', protocol: null, protocols: [], type: 'image', reputationScore: 30, effectiveReputationScore: 30, onChainReputationScore: null, minImageUsdPerImage: 0.04, maxImageUsdPerImage: 0.02 }],
93
+ },
94
+ { name: 'no id' },
95
+ ],
96
+ };
97
+ let buyer;
98
+ let verificationAllowed = false;
99
+ let modelsStatus = 200;
100
+ let peersDown = false;
101
+ before(async () => {
102
+ buyer = await startFakeBuyer({
103
+ 'GET /_antseed/peers': () => (peersDown ? { status: 500, body: { error: 'boom' } } : { body: PEERS_BODY }),
104
+ 'GET /_antseed/peer-health': () => ({ body: HEALTH_BODY }),
105
+ 'GET /v1/models': () => modelsStatus === 200
106
+ ? { body: MODELS_BODY }
107
+ : { status: modelsStatus, body: { error: 'Buyer is not ready yet.' } },
108
+ 'GET /_antseed/verification': () => verificationAllowed
109
+ ? { body: TEE_SNAPSHOT }
110
+ : { status: 403, body: { error: 'Local verification authorization required' } },
111
+ 'GET /_antseed/route-preview': (req) => ({
112
+ body: {
113
+ model: new URL(req.url, 'http://x').searchParams.get('model'),
114
+ candidates: [
115
+ { peerId: PEER_A, displayName: null, rank: 1, eligible: true, reasons: ['cheapest'], inputUsdPerMillion: 0.5, outputUsdPerMillion: 1.5, trustScore: null },
116
+ { peerId: PEER_C, displayName: 'Named By Buyer', rank: null, eligible: false, reasons: ['blocked by workspace'], inputUsdPerMillion: null, outputUsdPerMillion: null, trustScore: 40 },
117
+ ],
118
+ buyer: { minReputation: 40, requireVerified: true },
119
+ },
120
+ }),
121
+ });
122
+ });
123
+ after(async () => {
124
+ await buyer.close();
125
+ });
126
+ const KEY_WORKSPACES = { key_team: 'ws_team', key_other: 'ws_other' };
127
+ const store = {
128
+ peerStats: (since) => {
129
+ assert.equal(since, NOW - 24 * 60 * 60 * 1000);
130
+ return [{ peerId: PEER_A, requests: 17, latencyMsP50: 840 }];
131
+ },
132
+ workspaceForKey: (keyId) => (KEY_WORKSPACES[keyId] ? { id: KEY_WORKSPACES[keyId] } : null),
133
+ };
134
+ const member = memberPrincipal('m_member', { ws_team: 'member' });
135
+ const orgAdmin = memberPrincipal('m_admin', {}, 'admin');
136
+ const keySession = { kind: 'key', keyId: 'key_team', sessionId: 'ks' };
137
+ const resolveCalls = [];
138
+ function fakeResolvePolicy(_store, target) {
139
+ resolveCalls.push({ ...target });
140
+ const policy = { allowedModels: ['open-model-a'], blockedPeerIds: [PEER_C], sort: 'price' };
141
+ return {
142
+ policy,
143
+ sources: [
144
+ { level: 'buyer', id: null, policy: null },
145
+ { level: 'gateway', id: null, policy: null },
146
+ ...(target.workspaceId ? [{ level: 'workspace', id: target.workspaceId, policy }] : []),
147
+ ],
148
+ };
149
+ }
150
+ function setup(extra = {}) {
151
+ const router = new ConsoleRouter();
152
+ registerNetworkRoutes(router, fakeDeps(store, () => NOW), {
153
+ buyer: buyer.client,
154
+ canSeeWorkspace: fakeCanSeeWorkspace,
155
+ requireOrgAdmin: fakeRequireOrgAdmin,
156
+ resolvePolicy: fakeResolvePolicy,
157
+ ...extra,
158
+ });
159
+ return router;
160
+ }
161
+ // ── Peers ────────────────────────────────────────────────────────────────
162
+ test('peer services price each service from its own entry or the provider default', () => {
163
+ assert.deepEqual(peerServices(PEERS_BODY.peers[0]), [
164
+ { provider: 'openai', service: 'open-model-a', inputUsdPerMillion: 0.5, outputUsdPerMillion: 1.5, cachedInputUsdPerMillion: 0.1, categories: ['chat', 'coding'] },
165
+ { provider: 'openai', service: 'open-model-b', inputUsdPerMillion: 1, outputUsdPerMillion: 2, cachedInputUsdPerMillion: null, categories: ['chat'] },
166
+ ]);
167
+ });
168
+ test('TEE snapshot: only current passing attestations count', () => {
169
+ const verified = teeVerifiedPeers({
170
+ evidence: [
171
+ ...TEE_SNAPSHOT.evidence,
172
+ { peerId: PEER_B, verifierId: 'antseed-verifier', sellerNodeVerified: true, expiresAt: NOW - 1 },
173
+ { peerId: PEER_C, verifierId: 'antseed-verifier', sellerNodeVerified: false, expiresAt: NOW + 1 },
174
+ ],
175
+ }, NOW);
176
+ assert.deepEqual([...verified], [PEER_A]);
177
+ });
178
+ test('GET peers merges buyer peers, health and gateway stats', async () => {
179
+ verificationAllowed = false;
180
+ const peers = await call(setup(), 'GET', '/peers', member);
181
+ assert.equal(peers.length, 2);
182
+ const [a, b] = peers;
183
+ assert.deepEqual({ ...a, services: a.services.length }, {
184
+ peerId: PEER_A,
185
+ displayName: 'Fake TEE Seller',
186
+ services: 2,
187
+ trustScore: 72,
188
+ // The buyer's own score wins over the seller-reported 80.
189
+ reputationScore: 61,
190
+ // No verification snapshot and no verified claims.
191
+ verified: false,
192
+ verificationLinks: [],
193
+ tee: true,
194
+ stakeAnts: '1200',
195
+ usageShareBps: 250,
196
+ washFlagged: false,
197
+ lastSeen: NOW - 5_000,
198
+ health: { failureStreak: 0, coolingDownUntil: null },
199
+ latencyMsP50: 840,
200
+ requests24h: 17,
201
+ });
202
+ assert.equal(b.verified, true);
203
+ // Only claims that checked out, sanitised, as links.
204
+ assert.deepEqual(b.verificationLinks, [
205
+ { kind: 'domain', label: 'seller.example.com', href: 'https://seller.example.com' },
206
+ { kind: 'github', label: '@fake-seller/models', href: 'https://github.com/fake-seller/models' },
207
+ ]);
208
+ assert.equal(b.tee, false);
209
+ assert.equal(b.washFlagged, true);
210
+ assert.equal(b.trustScore, null);
211
+ assert.equal(b.reputationScore, null);
212
+ assert.deepEqual(b.health, { failureStreak: 3, coolingDownUntil: NOW + 30_000 });
213
+ assert.equal(b.requests24h, 0);
214
+ assert.equal(b.latencyMsP50, null);
215
+ const sent = lastRequest(buyer, (url) => url === '/_antseed/peers');
216
+ assert.equal(sent?.headers[GATEWAY_CONTROL_HEADER], TEST_SECRET);
217
+ });
218
+ test('GET peers uses the TEE snapshot when the buyer shares it', async () => {
219
+ verificationAllowed = true;
220
+ try {
221
+ const peers = await call(setup(), 'GET', '/peers', member);
222
+ // A by its TEE attestation, B by its verified ownership claims.
223
+ assert.deepEqual(peers.map((peer) => peer.verified), [true, true]);
224
+ }
225
+ finally {
226
+ verificationAllowed = false;
227
+ }
228
+ });
229
+ test('GET peers still answers without peer health', () => {
230
+ const peers = mapPeers({ peers: PEERS_BODY, health: null, verification: null, stats: [], now: NOW });
231
+ assert.deepEqual(peers[1].health, { failureStreak: 0, coolingDownUntil: null });
232
+ });
233
+ // ── Models ───────────────────────────────────────────────────────────────
234
+ test('network models merge the buyer catalog with the peer list', () => {
235
+ const peers = mapPeers({ peers: PEERS_BODY, health: HEALTH_BODY, verification: null, stats: [{ peerId: PEER_A, requests: 1, latencyMsP50: 840 }], now: NOW });
236
+ const [text, image] = mapNetworkModels(MODELS_BODY, peers);
237
+ assert.equal(mapNetworkModels(MODELS_BODY, peers).length, 2, 'entries without an id are skipped');
238
+ assert.deepEqual({ ...text, offers: text.offers.length }, {
239
+ id: 'open-model-a',
240
+ name: 'Open Model A',
241
+ aliases: ['open-model-a-latest'],
242
+ type: 'text',
243
+ contextLength: 128_000,
244
+ capabilities: ['toolUse', 'vision'],
245
+ sellers: 2,
246
+ inputUsdPerMillion: { min: 0, max: 0.5 },
247
+ outputUsdPerMillion: { min: 0, max: 1.5 },
248
+ free: true,
249
+ teeSellers: 1,
250
+ verifiedSellers: 1,
251
+ offers: 2,
252
+ });
253
+ assert.deepEqual(text.offers[0], {
254
+ peerId: PEER_A,
255
+ displayName: 'Fake TEE Seller',
256
+ serviceId: 'open-model-a',
257
+ provider: 'openai',
258
+ protocols: ['openai-chat-completions', 'openai-responses'],
259
+ inputUsdPerMillion: 0.5,
260
+ outputUsdPerMillion: 1.5,
261
+ cachedInputUsdPerMillion: 0.1,
262
+ usdPerImage: null,
263
+ contextLength: 128_000,
264
+ free: false,
265
+ reputationScore: 64,
266
+ trustScore: 72,
267
+ verified: false,
268
+ verificationLinks: [],
269
+ tee: true,
270
+ latencyMsP50: 840,
271
+ });
272
+ // B's name and verification come from the peer list; it keeps its own service id for pinning.
273
+ const b = text.offers[1];
274
+ assert.deepEqual([b.serviceId, b.verified, b.free, b.trustScore, b.latencyMsP50], ['Open-Model-A', true, true, null, null]);
275
+ assert.deepEqual(b.verificationLinks.map((link) => link.label), ['seller.example.com', '@fake-seller/models']);
276
+ // A seller the peer list does not know yet, priced per image.
277
+ assert.equal(image.type, 'image');
278
+ assert.equal(image.contextLength, null);
279
+ assert.equal(image.inputUsdPerMillion, null);
280
+ assert.deepEqual(image.offers[0].usdPerImage, { min: 0.02, max: 0.04 });
281
+ assert.deepEqual([image.offers[0].displayName, image.offers[0].verified, image.offers[0].free], [null, false, false]);
282
+ assert.deepEqual(image.offers[0].verificationLinks, []);
283
+ });
284
+ test('GET models lists the unfiltered network catalog to members and tokens', async () => {
285
+ modelsStatus = 200;
286
+ const router = setup();
287
+ const models = await call(router, 'GET', '/models', member);
288
+ assert.deepEqual(models.map((model) => model.id), ['open-model-a', 'open-image-model']);
289
+ assert.equal(models[0].offers[0].latencyMsP50, 840);
290
+ const sent = lastRequest(buyer, (url) => url === '/v1/models');
291
+ assert.equal(sent?.headers[GATEWAY_CONTROL_HEADER], TEST_SECRET);
292
+ assert.equal(sent?.headers[ROUTING_POLICY_HEADER], undefined, 'no routing policy, like /peers');
293
+ assert.equal(router.match('GET', '/models').route.options.allow, router.match('GET', '/peers').route.options.allow);
294
+ });
295
+ test('GET models reports a buyer that is down or not ready', async () => {
296
+ modelsStatus = 503;
297
+ try {
298
+ await rejectsWith(call(setup(), 'GET', '/models', member), 503, 'buyer_unavailable');
299
+ }
300
+ finally {
301
+ modelsStatus = 200;
302
+ }
303
+ const unreachable = setup({ buyer: () => Promise.reject(new Error('connect ECONNREFUSED')) });
304
+ await rejectsWith(call(unreachable, 'GET', '/models', member), 502, 'buyer_unreachable');
305
+ });
306
+ test('GET models still answers when the peer list fails', async () => {
307
+ peersDown = true;
308
+ try {
309
+ const models = await call(setup(), 'GET', '/models', member);
310
+ assert.equal(models.length, 2);
311
+ assert.equal(models[0].offers[1].verified, false);
312
+ assert.equal(models[0].offers[0].tee, true, 'TEE still comes from the offer');
313
+ }
314
+ finally {
315
+ peersDown = false;
316
+ }
317
+ });
318
+ // ── Route preview ────────────────────────────────────────────────────────
319
+ test('candidate enrichment fills names and trust from the peer list', () => {
320
+ const candidates = enrichCandidates([{ peerId: PEER_A, eligible: true, reasons: [] }, { eligible: true }], PEERS_BODY);
321
+ assert.deepEqual(candidates, [{ peerId: PEER_A, displayName: 'Fake TEE Seller', rank: null, eligible: true, reasons: [], inputUsdPerMillion: null, outputUsdPerMillion: null, trustScore: 72 }]);
322
+ });
323
+ test('GET route-preview sends the resolved policy and enriches candidates', async () => {
324
+ resolveCalls.length = 0;
325
+ const preview = await call(setup(), 'GET', '/route-preview?model=open-model-a&key=key_team', member);
326
+ assert.deepEqual(resolveCalls, [{ keyId: 'key_team', workspaceId: 'ws_team' }]);
327
+ assert.equal(preview.model, 'open-model-a');
328
+ assert.equal(preview.modelAllowed, true);
329
+ assert.deepEqual(preview.policy, { allowedModels: ['open-model-a'], blockedPeerIds: [PEER_C], sort: 'price' });
330
+ assert.deepEqual(preview.sources.map((source) => source.level), ['buyer', 'gateway', 'workspace']);
331
+ assert.deepEqual(preview.candidates, [
332
+ { peerId: PEER_A, displayName: 'Fake TEE Seller', rank: 1, eligible: true, reasons: ['cheapest'], inputUsdPerMillion: 0.5, outputUsdPerMillion: 1.5, trustScore: 72 },
333
+ { peerId: PEER_C, displayName: 'Named By Buyer', rank: null, eligible: false, reasons: ['blocked by workspace'], inputUsdPerMillion: null, outputUsdPerMillion: null, trustScore: 40 },
334
+ ]);
335
+ const sent = lastRequest(buyer, (url) => url.startsWith('/_antseed/route-preview'));
336
+ assert.equal(sent?.url, '/_antseed/route-preview?model=open-model-a');
337
+ assert.deepEqual(decodePolicyHeader(String(sent?.headers[ROUTING_POLICY_HEADER])), preview.policy);
338
+ });
339
+ test('GET route-preview shows the buyer hard limits as the buyer source', async () => {
340
+ const preview = await call(setup(), 'GET', '/route-preview?model=open-model-a&workspace=ws_team', member);
341
+ const source = preview.sources.find((entry) => entry.level === 'buyer');
342
+ assert.equal(source?.policy?.minReputation, 40);
343
+ assert.equal(source?.policy?.requireVerified, true);
344
+ // Max pricing comes from the buyer config (defaults: the test config file does not exist).
345
+ assert.equal(typeof source?.policy?.maxInputUsdPerMillion, 'number');
346
+ assert.equal(source?.policy?.minTrustScore, undefined, 'routing preferences are not buyer limits');
347
+ // The buyer limits are not folded into the policy the gateway sends.
348
+ assert.equal(preview.policy.minReputation, undefined);
349
+ });
350
+ test('GET routing/buyer-limits reports the running buyer\'s hard limits to any member or key', async () => {
351
+ const limits = await call(setup(), 'GET', '/routing/buyer-limits', keySession);
352
+ assert.equal(limits.minPeerReputation, 40);
353
+ assert.equal(limits.requireVerifier, true);
354
+ assert.equal(typeof limits.maxPricing?.inputUsdPerMillion, 'number');
355
+ });
356
+ test('GET route-preview with a disallowed model skips the buyer', async () => {
357
+ const before = buyer.requests.length;
358
+ const preview = await call(setup(), 'GET', `/route-preview?model=${PEER_A}@closed-model&workspace=ws_team`, member);
359
+ assert.equal(preview.model, 'closed-model');
360
+ assert.equal(preview.modelAllowed, false);
361
+ assert.deepEqual(preview.candidates, []);
362
+ assert.equal(buyer.requests.length, before);
363
+ });
364
+ test('GET route-preview checks what the caller may see', async () => {
365
+ const router = setup();
366
+ await rejectsWith(call(router, 'GET', '/route-preview', member), 400);
367
+ await rejectsWith(call(router, 'GET', '/route-preview?model=open-model-a&workspace=ws_other', member), 403);
368
+ await rejectsWith(call(router, 'GET', '/route-preview?model=open-model-a&key=key_other', member), 404);
369
+ await rejectsWith(call(router, 'GET', '/route-preview?model=open-model-a&key=key_missing', member), 404);
370
+ await rejectsWith(call(router, 'GET', '/route-preview?model=open-model-a&key=key_team&workspace=ws_other', orgAdmin), 400);
371
+ await rejectsWith(call(router, 'GET', '/route-preview?model=open-model-a&member=m_someone', member), 403);
372
+ // Own member policy, and anything for an org admin.
373
+ await call(router, 'GET', '/route-preview?model=open-model-a&member=m_member', member);
374
+ await call(router, 'GET', '/route-preview?model=open-model-a&member=m_someone&key=key_other', orgAdmin);
375
+ // Key sessions see their own key only.
376
+ await rejectsWith(call(router, 'GET', '/route-preview?model=open-model-a&key=key_other', keySession), 403);
377
+ resolveCalls.length = 0;
378
+ await call(router, 'GET', '/route-preview?model=open-model-a&workspace=ws_other', keySession);
379
+ assert.deepEqual(resolveCalls, [{ keyId: 'key_team' }]);
380
+ const route = router.match('GET', '/route-preview').route;
381
+ assert.deepEqual(route.options.allow, ['member', 'token', 'key']);
382
+ });
383
+ //# sourceMappingURL=network.test.js.map